diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-27 16:51:28 +0000 |
commit | 940b4d1848e8c70ab7642901a68594e8016caffc (patch) | |
tree | eb72f344ee6c3d9b80a7ecc079ea79e9fba8676d /wizards | |
parent | Initial commit. (diff) | |
download | libreoffice-upstream/1%7.0.4.tar.xz libreoffice-upstream/1%7.0.4.zip |
Adding upstream version 1:7.0.4.upstream/1%7.0.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
365 files changed, 90052 insertions, 0 deletions
diff --git a/wizards/AllLangMoTarget_wiz.mk b/wizards/AllLangMoTarget_wiz.mk new file mode 100644 index 000000000..661689da1 --- /dev/null +++ b/wizards/AllLangMoTarget_wiz.mk @@ -0,0 +1,13 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +$(eval $(call gb_AllLangMoTarget_AllLangMoTarget,wiz)) + +$(eval $(call gb_AllLangMoTarget_set_polocation,wiz,wizards)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/CustomTarget_share.mk b/wizards/CustomTarget_share.mk new file mode 100644 index 000000000..1c4ce3391 --- /dev/null +++ b/wizards/CustomTarget_share.mk @@ -0,0 +1,27 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CustomTarget_CustomTarget,wizards/share)) + +$(call gb_CustomTarget_get_target,wizards/share): \ + $(call gb_CustomTarget_get_workdir,wizards/share)/dialog.xlc \ + $(call gb_CustomTarget_get_workdir,wizards/share)/script.xlc + +$(call gb_CustomTarget_get_workdir,wizards/share)/%.xlc: \ + $(SRCDIR)/wizards/source/configshare/%.xlc \ + | $(call gb_CustomTarget_get_workdir,wizards/share)/.dir + $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),SED,1) + $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),SED) + sed -e 's/@LIBO_SHARE_FOLDER@/$(LIBO_SHARE_FOLDER)/' $< > $@ + $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),SED) + +# vim:set shiftwidth=4 tabstop=4 noexpandtab: + + +# vim: set noet sw=4 ts=4: diff --git a/wizards/CustomTarget_wizards.mk b/wizards/CustomTarget_wizards.mk new file mode 100644 index 000000000..6dac016e6 --- /dev/null +++ b/wizards/CustomTarget_wizards.mk @@ -0,0 +1,60 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_CustomTarget_CustomTarget,wizards/locproperties)) + +wizards_DIR := $(call gb_CustomTarget_get_workdir,wizards/locproperties) + +define wizards_Properties_Properties +$(call wizards_Properties__Properties_impl,$(wizards_DIR)/resources_$(1).properties,$(SRCDIR)/wizards/source/resources/resources_en_US.properties,$(gb_POLOCATION)/$(2)/wizards/source/resources.po,$(2)) + +endef + +define wizards_Properties__Properties_impl +$(1) : LANGUAGE := $(4) +$(1) : POFILE := $(3) +$(1) : SOURCE := $(2) + +$(call gb_CustomTarget_get_target,wizards/locproperties) : $(1) +$(1) : $(2) \ + $(wildcard $(3)) + +endef + +ifneq ($(strip $(gb_WITH_LANG)),) +wizards_LANGS := $(filter-out en-US,$(gb_WITH_LANG)) +$(eval $(foreach lang,$(wizards_LANGS),$(call wizards_Properties_Properties,$(subst -,_,$(lang)),$(lang)))) +endif + +$(wizards_DIR)/resources_%.properties : \ + $(call gb_Executable_get_runtime_dependencies,propex) \ + | $(wizards_DIR)/.dir + $(call gb_Output_announce,$(subst $(WORKDIR)/,,$@),$(true),PRP,1) + $(call gb_Trace_StartRange,$(subst $(WORKDIR)/,,$@),PRP) + $(call gb_Helper_abbreviate_dirs, \ + $(if $(filter-out qtz,$(LANGUAGE)), \ + MERGEINPUT=$(call var2file,$(shell $(gb_MKTEMP)),100,$(POFILE)) && \ + $(call gb_Executable_get_command,propex) \ + -i $(SOURCE) \ + -o $@ \ + -m $${MERGEINPUT} \ + -l $(LANGUAGE) && \ + rm -rf $${MERGEINPUT} \ + , \ + $(call gb_Executable_get_command,propex) \ + -i $(SOURCE) \ + -o $@ \ + -m \ + -l $(LANGUAGE) \ + ) \ + ) + $(call gb_Trace_EndRange,$(subst $(WORKDIR)/,,$@),PRP) + + +# vim:set shiftwidth=4 tabstop=4 noexpandtab: diff --git a/wizards/Jar_commonwizards.mk b/wizards/Jar_commonwizards.mk new file mode 100644 index 000000000..e2f92031d --- /dev/null +++ b/wizards/Jar_commonwizards.mk @@ -0,0 +1,99 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,commonwizards)) + +$(eval $(call gb_Jar_use_jars,commonwizards,\ + libreoffice \ + java_uno \ +)) + +$(eval $(call gb_Jar_set_packageroot,commonwizards,com)) + +$(eval $(call gb_Jar_set_manifest,commonwizards,$(SRCDIR)/wizards/com/sun/star/wizards/common/MANIFEST.MF)) + +$(eval $(call gb_Jar_add_sourcefiles,commonwizards,\ + wizards/com/sun/star/wizards/common/HelpIds \ + wizards/com/sun/star/wizards/common/Desktop \ + wizards/com/sun/star/wizards/common/NumberFormatter \ + wizards/com/sun/star/wizards/common/FileAccess \ + wizards/com/sun/star/wizards/common/Helper \ + wizards/com/sun/star/wizards/common/InvalidQueryException \ + wizards/com/sun/star/wizards/common/JavaTools \ + wizards/com/sun/star/wizards/common/NoValidPathException \ + wizards/com/sun/star/wizards/common/Properties \ + wizards/com/sun/star/wizards/common/PropertyNames \ + wizards/com/sun/star/wizards/common/Resource \ + wizards/com/sun/star/wizards/common/SystemDialog \ + wizards/com/sun/star/wizards/common/Configuration \ + wizards/com/sun/star/wizards/common/IRenderer \ + wizards/com/sun/star/wizards/common/DebugHelper \ + wizards/com/sun/star/wizards/common/PropertySetHelper \ + wizards/com/sun/star/wizards/common/NumericalHelper \ + wizards/com/sun/star/wizards/common/NamedValueCollection \ + wizards/com/sun/star/wizards/common/ParaStyled \ + wizards/com/sun/star/wizards/common/PlaceholderTextElement \ + wizards/com/sun/star/wizards/common/TextElement \ + wizards/com/sun/star/wizards/db/DBMetaData \ + wizards/com/sun/star/wizards/db/CommandMetaData \ + wizards/com/sun/star/wizards/db/QueryMetaData \ + wizards/com/sun/star/wizards/db/BlindtextCreator \ + wizards/com/sun/star/wizards/db/FieldColumn \ + wizards/com/sun/star/wizards/db/CommandName \ + wizards/com/sun/star/wizards/db/RecordParser \ + wizards/com/sun/star/wizards/db/TypeInspector \ + wizards/com/sun/star/wizards/db/ColumnPropertySet \ + wizards/com/sun/star/wizards/db/RelationController \ + wizards/com/sun/star/wizards/db/TableDescriptor \ + wizards/com/sun/star/wizards/db/SQLQueryComposer \ + wizards/com/sun/star/wizards/db/DatabaseObjectWizard \ + wizards/com/sun/star/wizards/ui/event/XActionListenerAdapter \ + wizards/com/sun/star/wizards/ui/event/XItemListenerAdapter \ + wizards/com/sun/star/wizards/ui/event/XTextListenerAdapter \ + wizards/com/sun/star/wizards/ui/AggregateComponent \ + wizards/com/sun/star/wizards/ui/CommandFieldSelection \ + wizards/com/sun/star/wizards/ui/ControlScroller \ + wizards/com/sun/star/wizards/ui/DBLimitedFieldSelection \ + wizards/com/sun/star/wizards/ui/FilterComponent \ + wizards/com/sun/star/wizards/ui/FieldSelection \ + wizards/com/sun/star/wizards/ui/ButtonList \ + wizards/com/sun/star/wizards/ui/PeerConfig \ + wizards/com/sun/star/wizards/ui/SortingComponent \ + wizards/com/sun/star/wizards/ui/TitlesComponent \ + wizards/com/sun/star/wizards/ui/WizardDialog \ + wizards/com/sun/star/wizards/ui/UIConsts \ + wizards/com/sun/star/wizards/ui/UnoDialog \ + wizards/com/sun/star/wizards/ui/UnoDialog2 \ + wizards/com/sun/star/wizards/ui/XFieldSelectionListener \ + wizards/com/sun/star/wizards/document/Control \ + wizards/com/sun/star/wizards/document/DatabaseControl \ + wizards/com/sun/star/wizards/document/FormHandler \ + wizards/com/sun/star/wizards/document/GridControl \ + wizards/com/sun/star/wizards/document/OfficeDocument \ + wizards/com/sun/star/wizards/document/Shape \ + wizards/com/sun/star/wizards/document/TimeStampControl \ + wizards/com/sun/star/wizards/text/TextDocument \ + wizards/com/sun/star/wizards/text/TextFieldHandler \ + wizards/com/sun/star/wizards/text/TextSectionHandler \ + wizards/com/sun/star/wizards/text/TextStyleHandler \ + wizards/com/sun/star/wizards/text/TextTableHandler \ + wizards/com/sun/star/wizards/text/ViewHandler \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Jar_form.mk b/wizards/Jar_form.mk new file mode 100644 index 000000000..caad29b16 --- /dev/null +++ b/wizards/Jar_form.mk @@ -0,0 +1,47 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,form)) + +$(eval $(call gb_Jar_use_jars,form,\ + libreoffice \ + java_uno \ + commonwizards \ +)) + +$(eval $(call gb_Jar_set_manifest,form,$(SRCDIR)/wizards/com/sun/star/wizards/form/MANIFEST.MF)) + +$(eval $(call gb_Jar_set_packageroot,form,com)) + +$(eval $(call gb_Jar_add_sourcefiles,form,\ + wizards/com/sun/star/wizards/form/CallFormWizard \ + wizards/com/sun/star/wizards/form/DataEntrySetter \ + wizards/com/sun/star/wizards/form/FieldLinker \ + wizards/com/sun/star/wizards/form/Finalizer \ + wizards/com/sun/star/wizards/form/FormConfiguration \ + wizards/com/sun/star/wizards/form/FormControlArranger \ + wizards/com/sun/star/wizards/form/FormDocument \ + wizards/com/sun/star/wizards/form/FormWizard \ + wizards/com/sun/star/wizards/form/StyleApplier \ + wizards/com/sun/star/wizards/form/UIControlArranger \ +)) + +$(eval $(call gb_Jar_set_componentfile,form,wizards/com/sun/star/wizards/form/form,OOO)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Jar_query.mk b/wizards/Jar_query.mk new file mode 100644 index 000000000..16c27e991 --- /dev/null +++ b/wizards/Jar_query.mk @@ -0,0 +1,40 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,query)) + +$(eval $(call gb_Jar_use_jars,query,\ + libreoffice \ + java_uno \ + commonwizards \ +)) +$(eval $(call gb_Jar_set_manifest,query,$(SRCDIR)/wizards/com/sun/star/wizards/query/MANIFEST.MF)) + +$(eval $(call gb_Jar_set_packageroot,query,com)) + +$(eval $(call gb_Jar_add_sourcefiles,query,\ + wizards/com/sun/star/wizards/query/CallQueryWizard \ + wizards/com/sun/star/wizards/query/Finalizer \ + wizards/com/sun/star/wizards/query/QuerySummary \ + wizards/com/sun/star/wizards/query/QueryWizard \ +)) + +$(eval $(call gb_Jar_set_componentfile,query,wizards/com/sun/star/wizards/query/query,OOO)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Jar_report.mk b/wizards/Jar_report.mk new file mode 100644 index 000000000..db16bc657 --- /dev/null +++ b/wizards/Jar_report.mk @@ -0,0 +1,53 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,report)) + +$(eval $(call gb_Jar_use_jars,report,\ + libreoffice \ + java_uno \ + commonwizards \ +)) + +$(eval $(call gb_Jar_set_manifest,report,$(SRCDIR)/wizards/com/sun/star/wizards/report/MANIFEST.MF)) + +$(eval $(call gb_Jar_add_manifest_classpath,report,reportbuilderwizard.jar)) + +$(eval $(call gb_Jar_set_packageroot,report,com)) + +$(eval $(call gb_Jar_add_sourcefiles,report,\ + wizards/com/sun/star/wizards/report/CallReportWizard \ + wizards/com/sun/star/wizards/report/Dataimport \ + wizards/com/sun/star/wizards/report/DBColumn \ + wizards/com/sun/star/wizards/report/GroupFieldHandler \ + wizards/com/sun/star/wizards/report/IReportBuilderLayouter \ + wizards/com/sun/star/wizards/report/IReportDefinitionReadAccess \ + wizards/com/sun/star/wizards/report/IReportDocument \ + wizards/com/sun/star/wizards/report/RecordTable \ + wizards/com/sun/star/wizards/report/ReportFinalizer \ + wizards/com/sun/star/wizards/report/ReportImplementationHelper \ + wizards/com/sun/star/wizards/report/ReportLayouter \ + wizards/com/sun/star/wizards/report/ReportTextDocument \ + wizards/com/sun/star/wizards/report/ReportTextImplementation \ + wizards/com/sun/star/wizards/report/ReportWizard \ +)) + +$(eval $(call gb_Jar_set_componentfile,report,wizards/com/sun/star/wizards/report/report,OOO)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Jar_reportbuilder.mk b/wizards/Jar_reportbuilder.mk new file mode 100644 index 000000000..c6662faaf --- /dev/null +++ b/wizards/Jar_reportbuilder.mk @@ -0,0 +1,50 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,reportbuilderwizard)) + +$(eval $(call gb_Jar_use_jars,reportbuilderwizard,\ + libreoffice \ + java_uno \ + commonwizards \ + report \ +)) + +$(eval $(call gb_Jar_set_packageroot,reportbuilderwizard,com)) + +$(eval $(call gb_Jar_set_manifest,reportbuilderwizard,$(SRCDIR)/wizards/com/sun/star/wizards/reportbuilder/MANIFEST.MF)) + +$(eval $(call gb_Jar_add_sourcefiles,reportbuilderwizard,\ + wizards/com/sun/star/wizards/reportbuilder/ReportBuilderImplementation \ + wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn \ + wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns \ + wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns \ + wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate \ + wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove \ + wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft \ + wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants \ + wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter \ + wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject \ + wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel \ + wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject \ + wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField \ + wizards/com/sun/star/wizards/reportbuilder/layout/Tabular \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Jar_table.mk b/wizards/Jar_table.mk new file mode 100644 index 000000000..cd1568ed6 --- /dev/null +++ b/wizards/Jar_table.mk @@ -0,0 +1,46 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Jar_Jar,table)) + +$(eval $(call gb_Jar_use_jars,table,\ + libreoffice \ + java_uno \ + commonwizards \ +)) + +$(eval $(call gb_Jar_set_packageroot,table,com)) + +$(eval $(call gb_Jar_set_manifest,table,$(SRCDIR)/wizards/com/sun/star/wizards/table/MANIFEST.MF)) + +$(eval $(call gb_Jar_add_sourcefiles,table,\ + wizards/com/sun/star/wizards/table/CallTableWizard \ + wizards/com/sun/star/wizards/table/CGCategory \ + wizards/com/sun/star/wizards/table/CGTable \ + wizards/com/sun/star/wizards/table/FieldDescription \ + wizards/com/sun/star/wizards/table/FieldFormatter \ + wizards/com/sun/star/wizards/table/Finalizer \ + wizards/com/sun/star/wizards/table/PrimaryKeyHandler \ + wizards/com/sun/star/wizards/table/ScenarioSelector \ + wizards/com/sun/star/wizards/table/TableWizard \ +)) + +$(eval $(call gb_Jar_set_componentfile,table,wizards/com/sun/star/wizards/table/table,OOO)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Makefile b/wizards/Makefile new file mode 100644 index 000000000..0997e6284 --- /dev/null +++ b/wizards/Makefile @@ -0,0 +1,14 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +module_directory:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) + +include $(module_directory)/../solenv/gbuild/partial_build.mk + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Module_wizards.mk b/wizards/Module_wizards.mk new file mode 100644 index 000000000..ccc8b3c74 --- /dev/null +++ b/wizards/Module_wizards.mk @@ -0,0 +1,60 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Module_Module,wizards)) + +$(eval $(call gb_Module_add_targets,wizards,\ + CustomTarget_share \ + CustomTarget_wizards \ + Package_access2base \ + Package_depot \ + Package_euro \ + Package_form \ + Package_gimmicks \ + Package_import \ + Package_share \ + Package_standard \ + Package_template \ + Package_tools \ + Package_tutorials \ + Package_usr \ + Package_wizards \ + Package_wizards_properties \ + Pyuno_fax \ + Pyuno_letter \ + Pyuno_agenda \ + Pyuno_commonwizards \ +)) + +$(eval $(call gb_Module_add_l10n_targets,wizards,\ + AllLangMoTarget_wiz \ +)) + +ifeq ($(ENABLE_JAVA),TRUE) +$(eval $(call gb_Module_add_targets,wizards,\ + Jar_commonwizards \ + Jar_form \ + Jar_query \ + Jar_report \ + Jar_reportbuilder \ + Jar_table \ +)) +endif + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_access2base.mk b/wizards/Package_access2base.mk new file mode 100644 index 000000000..0689b748a --- /dev/null +++ b/wizards/Package_access2base.mk @@ -0,0 +1,63 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvaccess2base,$(SRCDIR)/wizards/source/access2base)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvaccess2base,$(LIBO_SHARE_FOLDER)/basic/Access2Base,\ + _License.xba \ + acConstants.xba \ + Application.xba \ + Collect.xba \ + CommandBar.xba \ + CommandBarControl.xba \ + Control.xba \ + Database.xba \ + DataDef.xba \ + Dialog.xba \ + dialog.xlb \ + dlgFormat.xdl \ + dlgTrace.xdl \ + DoCmd.xba \ + Event.xba \ + Field.xba \ + Form.xba \ + L10N.xba \ + Methods.xba \ + Module.xba \ + OptionGroup.xba \ + PropertiesGet.xba \ + PropertiesSet.xba \ + Property.xba \ + Python.xba \ + Recordset.xba \ + Root_.xba \ + script.xlb \ + SubForm.xba \ + TempVar.xba \ + Test.xba \ + Trace.xba \ + UtilProperty.xba \ + Utils.xba \ +)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvaccess2base,$(LIBO_LIB_PYUNO_FOLDER),\ + access2base.py \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_depot.mk b/wizards/Package_depot.mk new file mode 100644 index 000000000..bca72325d --- /dev/null +++ b/wizards/Package_depot.mk @@ -0,0 +1,45 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvdepot,$(SRCDIR)/wizards/source/depot)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvdepot,$(LIBO_SHARE_FOLDER)/basic/Depot,\ + CommonLang.xba \ + Currency.xba \ + Depot.xba \ + dialog.xlb \ + Dialog2.xdl \ + Dialog3.xdl \ + Dialog4.xdl \ + Internet.xba \ + Lang_de.xba \ + Lang_en.xba \ + Lang_es.xba \ + Lang_fr.xba \ + Lang_it.xba \ + Lang_ja.xba \ + Lang_ko.xba \ + Lang_sv.xba \ + Lang_tw.xba \ + Lang_zh.xba \ + script.xlb \ + tools.xba \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_euro.mk b/wizards/Package_euro.mk new file mode 100644 index 000000000..415cb4714 --- /dev/null +++ b/wizards/Package_euro.mk @@ -0,0 +1,37 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrveuro,$(SRCDIR)/wizards/source/euro)) + +$(eval $(call gb_Package_add_files,wizards_basicsrveuro,$(LIBO_SHARE_FOLDER)/basic/Euro,\ + AutoPilotRun.xba \ + Common.xba \ + ConvertRun.xba \ + dialog.xlb \ + DlgConvert.xdl \ + DlgPassword.xdl \ + Hard.xba \ + Init.xba \ + Protect.xba \ + script.xlb \ + Soft.xba \ + Writer.xba \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_form.mk b/wizards/Package_form.mk new file mode 100644 index 000000000..dd8325f1b --- /dev/null +++ b/wizards/Package_form.mk @@ -0,0 +1,34 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvform,$(SRCDIR)/wizards/source/formwizard)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvform,$(LIBO_SHARE_FOLDER)/basic/FormWizard,\ + DBMeta.xba \ + develop.xba \ + dialog.xlb \ + DlgFormDB.xdl \ + FormWizard.xba \ + Language.xba \ + Layouter.xba \ + script.xlb \ + tools.xba \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_gimmicks.mk b/wizards/Package_gimmicks.mk new file mode 100644 index 000000000..51aebb1c0 --- /dev/null +++ b/wizards/Package_gimmicks.mk @@ -0,0 +1,34 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvgimmicks,$(SRCDIR)/wizards/source/gimmicks)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvgimmicks,$(LIBO_SHARE_FOLDER)/basic/Gimmicks,\ + AutoText.xba \ + ChangeAllChars.xba \ + dialog.xlb \ + GetTexts.xba \ + ReadDir.xba \ + ReadFolderDlg.xdl \ + script.xlb \ + UserfieldDlg.xdl \ + Userfields.xba \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_import.mk b/wizards/Package_import.mk new file mode 100644 index 000000000..ebe8d8169 --- /dev/null +++ b/wizards/Package_import.mk @@ -0,0 +1,33 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvimport,$(SRCDIR)/wizards/source/importwizard)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvimport,$(LIBO_SHARE_FOLDER)/basic/ImportWizard,\ + API.xba \ + dialog.xlb \ + DialogModul.xba \ + FilesModul.xba \ + ImportDialog.xdl \ + Language.xba\ + Main.xba \ + script.xlb \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_share.mk b/wizards/Package_share.mk new file mode 100644 index 000000000..b986041e0 --- /dev/null +++ b/wizards/Package_share.mk @@ -0,0 +1,27 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicshare,$(call gb_CustomTarget_get_workdir,wizards/share))) + +$(eval $(call gb_Package_add_files,wizards_basicshare,$(LIBO_SHARE_FOLDER)/basic,\ + dialog.xlc \ + script.xlc \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_standard.mk b/wizards/Package_standard.mk new file mode 100644 index 000000000..abe56a232 --- /dev/null +++ b/wizards/Package_standard.mk @@ -0,0 +1,28 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvstandard,$(SRCDIR)/wizards/source/standard)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvstandard,$(LIBO_SHARE_PRESETS_FOLDER)/basic/Standard,\ + dialog.xlb \ + Module1.xba \ + script.xlb \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_template.mk b/wizards/Package_template.mk new file mode 100644 index 000000000..13728c716 --- /dev/null +++ b/wizards/Package_template.mk @@ -0,0 +1,33 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvtemplate,$(SRCDIR)/wizards/source/template)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvtemplate,$(LIBO_SHARE_FOLDER)/basic/Template,\ + Autotext.xba \ + Correspondence.xba \ + dialog.xlb \ + DialogStyles.xdl \ + ModuleAgenda.xba \ + Samples.xba \ + script.xlb \ + TemplateDialog.xdl \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_tools.mk b/wizards/Package_tools.mk new file mode 100644 index 000000000..20bd5e73e --- /dev/null +++ b/wizards/Package_tools.mk @@ -0,0 +1,34 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvtools,$(SRCDIR)/wizards/source/tools)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvtools,$(LIBO_SHARE_FOLDER)/basic/Tools,\ + Debug.xba \ + dialog.xlb \ + DlgOverwriteAll.xdl \ + Listbox.xba \ + Misc.xba \ + ModuleControls.xba\ + script.xlb \ + Strings.xba \ + UCB.xba \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_tutorials.mk b/wizards/Package_tutorials.mk new file mode 100644 index 000000000..7accc8468 --- /dev/null +++ b/wizards/Package_tutorials.mk @@ -0,0 +1,36 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicsrvtutorials,$(SRCDIR)/wizards/source/tutorials)) + +$(eval $(call gb_Package_add_files,wizards_basicsrvtutorials,$(LIBO_SHARE_FOLDER)/basic/Tutorials,\ + dialog.xlb \ + Functions.xba \ + RoadMap.xba \ + script.xlb \ + ShowInfoDialog.xba \ + TutorialClose.xba \ + TutorialCloseDialog.xdl \ + TutorialCreator.xba \ + TutorialOpen.xba\ + TutorialOpenDialog.xdl \ + TutorialsDialog.xdl \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_usr.mk b/wizards/Package_usr.mk new file mode 100644 index 000000000..539de4944 --- /dev/null +++ b/wizards/Package_usr.mk @@ -0,0 +1,27 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +$(eval $(call gb_Package_Package,wizards_basicusr,$(SRCDIR)/wizards/source/config)) + +$(eval $(call gb_Package_add_files,wizards_basicusr,$(LIBO_SHARE_PRESETS_FOLDER)/basic,\ + dialog.xlc \ + script.xlc \ +)) + +# vim: set noet sw=4 ts=4: diff --git a/wizards/Package_wizards.mk b/wizards/Package_wizards.mk new file mode 100644 index 000000000..cb2f25282 --- /dev/null +++ b/wizards/Package_wizards.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Package_Package,wizards_wizardshare,$(SRCDIR)/wizards/source/resources)) + +$(eval $(call gb_Package_add_files,wizards_wizardshare,$(LIBO_SHARE_FOLDER)/wizards,\ + resources_en_US.properties \ +)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/Package_wizards_properties.mk b/wizards/Package_wizards_properties.mk new file mode 100644 index 000000000..7be797877 --- /dev/null +++ b/wizards/Package_wizards_properties.mk @@ -0,0 +1,16 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Package_Package,wizards_properties,$(call gb_CustomTarget_get_workdir,wizards/locproperties))) + +$(eval $(call gb_Package_add_files,wizards_properties,$(LIBO_SHARE_FOLDER)/wizards,\ + $(foreach lang,$(subst -,_,$(gb_TRANS_LANGS)),resources_$(lang).properties) \ +)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/Pyuno_agenda.mk b/wizards/Pyuno_agenda.mk new file mode 100644 index 000000000..2fe25bc37 --- /dev/null +++ b/wizards/Pyuno_agenda.mk @@ -0,0 +1,27 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Pyuno_Pyuno,agenda,$(SRCDIR)/wizards/com/sun/star/wizards/agenda)) + +$(eval $(call gb_Pyuno_add_files,agenda,wizards/agenda,\ + AgendaDocument.py \ + AgendaWizardDialogConst.py \ + AgendaWizardDialogImpl.py \ + AgendaWizardDialog.py \ + AgendaWizardDialogResources.py \ + CallWizard.py \ + CGAgenda.py \ + CGTopic.py \ + __init__.py \ + TemplateConsts.py \ + TopicsControl.py \ +)) +$(eval $(call gb_Pyuno_set_componentfile_full,agenda,wizards/com/sun/star/wizards/agenda/agenda,vnd.openoffice.pymodule:wizards.agenda,.CallWizard)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/Pyuno_commonwizards.mk b/wizards/Pyuno_commonwizards.mk new file mode 100644 index 000000000..1c139950d --- /dev/null +++ b/wizards/Pyuno_commonwizards.mk @@ -0,0 +1,58 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Pyuno_Pyuno,commonwizards,$(SRCDIR)/wizards/com/sun/star/wizards)) + +$(eval $(call gb_Pyuno_add_files,commonwizards,wizards,\ + __init__.py \ + common/strings.hrc \ + common/ConfigGroup.py \ + common/ConfigSet.py \ + common/Configuration.py \ + common/Desktop.py \ + common/FileAccess.py \ + common/HelpIds.py \ + common/NoValidPathException.py \ + common/NumberFormatter.py \ + common/Properties.py \ + common/PropertyNames.py \ + common/SystemDialog.py \ + common/IRenderer.py \ + common/UCB.py \ + common/ListModel.py \ + common/__init__.py \ + document/OfficeDocument.py \ + document/__init__.py \ + text/TextDocument.py \ + text/TextElement.py \ + text/TextFieldHandler.py \ + text/TextSectionHandler.py \ + text/__init__.py \ + ui/ControlScroller.py \ + ui/DocumentPreview.py \ + ui/PathSelection.py \ + ui/PeerConfig.py \ + ui/UIConsts.py \ + ui/UnoDialog.py \ + ui/UnoDialog2.py \ + ui/WizardDialog.py \ + ui/__init__.py \ + ui/event/CommonListener.py \ + ui/event/DataAware.py \ + ui/event/ListModelBinder.py \ + ui/event/RadioDataAware.py \ + ui/event/UnoDataAware.py \ + ui/event/Task.py \ + ui/event/TaskEvent.py \ + ui/event/TaskListener.py \ + ui/event/EventListenerList.py \ + ui/event/__init__.py \ +)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/Pyuno_fax.mk b/wizards/Pyuno_fax.mk new file mode 100644 index 000000000..9b3c193af --- /dev/null +++ b/wizards/Pyuno_fax.mk @@ -0,0 +1,25 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Pyuno_Pyuno,fax,$(SRCDIR)/wizards/com/sun/star/wizards/fax)) + +$(eval $(call gb_Pyuno_add_files,fax,wizards/fax,\ + __init__.py \ + CallWizard.py \ + CGFax.py \ + CGFaxWizard.py \ + FaxDocument.py \ + FaxWizardDialogConst.py \ + FaxWizardDialogImpl.py \ + FaxWizardDialog.py \ + FaxWizardDialogResources.py \ +)) +$(eval $(call gb_Pyuno_set_componentfile_full,fax,wizards/com/sun/star/wizards/fax/fax,vnd.openoffice.pymodule:wizards.fax,.CallWizard)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/Pyuno_letter.mk b/wizards/Pyuno_letter.mk new file mode 100644 index 000000000..efcbe5f7d --- /dev/null +++ b/wizards/Pyuno_letter.mk @@ -0,0 +1,26 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +$(eval $(call gb_Pyuno_Pyuno,letter,$(SRCDIR)/wizards/com/sun/star/wizards/letter)) + +$(eval $(call gb_Pyuno_add_files,letter,wizards/letter,\ + CallWizard.py \ + CGLetter.py \ + CGLetterWizard.py \ + CGPaperElementLocation.py \ + __init__.py \ + LetterDocument.py \ + LetterWizardDialogConst.py \ + LetterWizardDialogImpl.py \ + LetterWizardDialog.py \ + LetterWizardDialogResources.py \ +)) +$(eval $(call gb_Pyuno_set_componentfile_full,letter,wizards/com/sun/star/wizards/letter/letter,vnd.openoffice.pymodule:wizards.letter,.CallWizard)) + +# vim:set noet sw=4 ts=4: diff --git a/wizards/README b/wizards/README new file mode 100644 index 000000000..332c53507 --- /dev/null +++ b/wizards/README @@ -0,0 +1,4 @@ +Java wizards for db setup, importing, tutorials, etc. + +There are also partially converted python copies of each wizard, which +we are hoping to migrate to in order to remove the Java dependency here.
\ No newline at end of file diff --git a/wizards/com/sun/star/wizards/README b/wizards/com/sun/star/wizards/README new file mode 100644 index 000000000..9ee284004 --- /dev/null +++ b/wizards/com/sun/star/wizards/README @@ -0,0 +1,18 @@ +To call a wizard remotely you need to: + +-> For testing on core: + export URE_BOOTSTRAP="file:///home/'USER'/libreoffice-core/instdir/program/fundamentalrc" + export PYTHONPATH=/home/'USER'/libreoffice-core/instdir/program + #and run LibreOffice in listening mode: + ./soffice --"accept=socket,host=localhost,port=2002;urp;" + +-> For testing on installed LibreOffice: + export URE_BOOTSTRAP="file:///usr/lib/libreoffice/program/fundamentalrc" + export PYTHONPATH=/usr/lib/libreoffice/program + #and run LibreOffice in listening mode: + soffice --"accept=socket,host=localhost,port=2002;urp;" + +-> Launch the wizard from wizards parent folder: + python3.3 + from wizards.[Wizard's folder].CallWizard import CallWizard + CallWizard.callRemote() diff --git a/wizards/com/sun/star/wizards/__init__.py b/wizards/com/sun/star/wizards/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/__init__.py diff --git a/wizards/com/sun/star/wizards/agenda/AgendaDocument.py b/wizards/com/sun/star/wizards/agenda/AgendaDocument.py new file mode 100644 index 000000000..b96fe44cf --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/AgendaDocument.py @@ -0,0 +1,924 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback +from ..text.TextElement import TextElement +from ..text.TextDocument import TextDocument +from ..text.TextSectionHandler import TextSectionHandler +from ..common.FileAccess import FileAccess + +from datetime import datetime + +from com.sun.star.text.PlaceholderType import TEXT +from com.sun.star.i18n.NumberFormatIndex import TIME_HHMM, DATE_SYSTEM_LONG + +''' +The classes here implement the whole document-functionality of the agenda wizard: +the live-preview and the final "creation" of the document, +when the user clicks "finish". <br/> +<br/> +<h2>Some terminology:<h2/> +items are names or headings. we don't make any distinction. + +<br/> +The Agenda Template is used as general "controller" +of the whole document, whereas the two child-classes ItemsTable +and TopicsTable control the item tables (note plural!) and the +topics table (note singular).<br/> +<br/> +Other small classes are used to abstract the handling of cells and text and we +try to use them as components. +<br/><br/> +We tried to keep the Agenda Template as flexible as possible, though there +must be many limitations, because it is generated dynamically.<br/><br/> +To keep the template flexible the following decisions were made:<br/> +1. Item tables.<br/> +1.a. there might be arbitrary number of Item tables.<br/> +1.b. Item tables design (bordewr, background) is arbitrary.<br/> +1.c. Items text styles are individual, +and use stylelist styles with predefined names.<br/> +As result the following limitations:<br/> +Pairs of Name->value for each item.<br/> +Tables contain *only* those pairs.<br/> +2. Topics table.<br/> +2.a. arbitrary structure.<br/> +2.b. design is arbitrary.<br/> +As result the following limitations:<br/> +No column merge is allowed.<br/> +One compulsory Heading row.<br/> +<br/><br/> +To let the template be flexible, we use a kind of "detection": we look where +the items are read the design of each table, re-applying it after writing the +table.self.xTextDocument +<br/><br/> +A note about threads:<br/> +Many methods here are synchronized, in order to avoid collision made by +events fired too often. +''' +class AgendaDocument(TextDocument): + + ''' + constructor. The document is *not* loaded here. + only some formal members are set. + ''' + + def __init__(self, xmsf, agenda, resources, templateConsts, listener): + super(AgendaDocument,self).__init__(xmsf,listener, None, + "WIZARD_LIVE_PREVIEW") + self.agenda = agenda + self.templateConsts = templateConsts + self.resources = resources + self.itemsMap = {} + self.allItems = [] + + def load(self, templateURL): + # Each template is duplicated. aw-XXX.ott is the template itself + # and XXX.ott is a section link. + self.template = self.calcTemplateName(templateURL) + self.loadAsPreview(templateURL, False) + self.xFrame.ComponentWindow.Enable = False + self.xTextDocument.lockControllers() + self.initialize() + self.initializeData() + self.xTextDocument.unlockControllers() + + ''' + The agenda templates are in format of aw-XXX.ott + the templates name is then XXX.ott. + This method calculates it. + ''' + + def calcTemplateName(self, url): + return FileAccess.connectURLs( + FileAccess.getParentDir(url), FileAccess.getFilename(url)[3:]) + + '''synchronize the document to the model.<br/> + this method rewrites all titles, item tables , and the topics table- + thus synchronizing the document to the data model (CGAgenda). + information (it is only actualized on save) the given list + supplies this information. + ''' + + def initializeData(self): + for i in self.itemsTables: + try: + i.write() + except Exception: + traceback.print_exc() + + self.redrawTitle("txtTitle") + self.redrawTitle("txtDate") + self.redrawTitle("txtTime") + self.redrawTitle("cbLocation") + + ''' + redraws/rewrites the table which contains the given item + This method is called when the user checks/unchecks an item. + The table is being found, in which the item is, and redrawn. + ''' + + def redraw(self, itemName): + self.xTextDocument.lockControllers() + try: + # get the table in which the item is... + itemsTable = self.itemsMap[itemName] + # rewrite the table. + itemsTable.write() + except Exception: + traceback.print_exc() + self.xTextDocument.unlockControllers() + + ''' + checks the data model if the + item corresponding to the given string should be shown + ''' + + def isShowItem(self, itemName): + if itemName == self.templateConsts.FILLIN_MEETING_TYPE: + return self.agenda.cp_ShowMeetingType + elif itemName == self.templateConsts.FILLIN_READ: + return self.agenda.cp_ShowRead + elif itemName == self.templateConsts.FILLIN_BRING: + return self.agenda.cp_ShowBring + elif itemName == self.templateConsts.FILLIN_NOTES: + return self.agenda.cp_ShowNotes + elif itemName == self.templateConsts.FILLIN_FACILITATOR: + return self.agenda.cp_ShowFacilitator + elif itemName == self.templateConsts.FILLIN_TIMEKEEPER: + return self.agenda.cp_ShowTimekeeper + elif itemName == self.templateConsts.FILLIN_NOTETAKER: + return self.agenda.cp_ShowNotetaker + elif itemName == self.templateConsts.FILLIN_PARTICIPANTS: + return self.agenda.cp_ShowAttendees + elif itemName == self.templateConsts.FILLIN_CALLED_BY: + return self.agenda.cp_ShowCalledBy + elif itemName == self.templateConsts.FILLIN_OBSERVERS: + return self.agenda.cp_ShowObservers + elif itemName == self.templateConsts.FILLIN_RESOURCE_PERSONS: + return self.agenda.cp_ShowResourcePersons + else: + raise ValueError("No such item") + + '''itemsCache is a Map containing all agenda item. These are object which + "write themselves" to the table, given a table cursor. + A cache is used in order to reuse the objects, instead of recreate them. + This method fills the cache will all items objects (names and headings). + ''' + + def initItemsCache(self): + self.itemsCache = {} + # Headings + self.itemsCache[ + self.templateConsts.FILLIN_MEETING_TYPE] = \ + AgendaItem(self.templateConsts.FILLIN_MEETING_TYPE, + self.resources.itemMeetingType, + PlaceholderElement( + self.resources.reschkMeetingTitle_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_BRING] = \ + AgendaItem(self.templateConsts.FILLIN_BRING, + self.resources.itemBring, + PlaceholderElement ( + self.resources.reschkBring_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_READ] = \ + AgendaItem (self.templateConsts.FILLIN_READ, + self.resources.itemRead, + PlaceholderElement ( + self.resources.reschkRead_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_NOTES] = \ + AgendaItem (self.templateConsts.FILLIN_NOTES, + self.resources.itemNote, + PlaceholderElement ( + self.resources.reschkNotes_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + + # Names + self.itemsCache[ + self.templateConsts.FILLIN_CALLED_BY] = \ + AgendaItem(self.templateConsts.FILLIN_CALLED_BY, + self.resources.itemCalledBy, + PlaceholderElement ( + self.resources.reschkConvenedBy_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_FACILITATOR] = \ + AgendaItem(self.templateConsts.FILLIN_FACILITATOR, + self.resources.itemFacilitator, + PlaceholderElement ( + self.resources.reschkPresiding_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_PARTICIPANTS] = \ + AgendaItem(self.templateConsts.FILLIN_PARTICIPANTS, + self.resources.itemAttendees, + PlaceholderElement( + self.resources.reschkAttendees_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_NOTETAKER] = \ + AgendaItem(self.templateConsts.FILLIN_NOTETAKER, + self.resources.itemNotetaker, + PlaceholderElement( + self.resources.reschkNoteTaker_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_TIMEKEEPER] = \ + AgendaItem(self.templateConsts.FILLIN_TIMEKEEPER, + self.resources.itemTimekeeper, + PlaceholderElement( + self.resources.reschkTimekeeper_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_OBSERVERS] = \ + AgendaItem(self.templateConsts.FILLIN_OBSERVERS, + self.resources.itemObservers, + PlaceholderElement( + self.resources.reschkObservers_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + self.itemsCache[ + self.templateConsts.FILLIN_RESOURCE_PERSONS] = \ + AgendaItem(self.templateConsts.FILLIN_RESOURCE_PERSONS, + self.resources.itemResource, + PlaceholderElement( + self.resources.reschkResourcePersons_value, + self.resources.resPlaceHolderHint, self.xTextDocument)) + + '''Initializes a template.<br/> + This method does the following tasks:<br/> + get a Time and Date format for the document, and retrieve the null + date of the document (which is document-specific).<br/> + Initializes the Items Cache map. + Analyses the document:<br/> + -find all "filled-ins" (appear as >xxx< in the document). + -analyze all items sections (and the tables in them). + -locate the titles and actualize them + -analyze the topics table + ''' + + def initialize(self): + ''' + Get the default locale of the document, + and create the date and time formatters. + ''' + self.dateUtils = self.DateUtils(self.xMSF, self.xTextDocument) + self.formatter = self.dateUtils.formatter + self.dateFormat = self.dateUtils.getFormat(DATE_SYSTEM_LONG) + self.timeFormat = self.dateUtils.getFormat(TIME_HHMM) + + self.initItemsCache() + self.allItems = self.searchFillInItems(0) + self.initializeTitles() + self.initializeItemsSections() + self.textSectionHandler = TextSectionHandler( + self.xTextDocument, self.xTextDocument) + self.topics = Topics(self) + + ''' + locates the titles (name, location, date, time) + and saves a reference to their Text ranges. + ''' + + def initializeTitles(self): + auxList = [] + for i in self.allItems: + text = i.String.lstrip().lower() + if text == self.templateConsts.FILLIN_TITLE: + self.teTitle = PlaceholderTextElement( + i, self.resources.resPlaceHolderTitle, + self.resources.resPlaceHolderHint, self.xTextDocument) + self.trTitle = i + elif text == self.templateConsts.FILLIN_DATE: + self.teDate = PlaceholderTextElement( + i, self.resources.resPlaceHolderDate, + self.resources.resPlaceHolderHint, self.xTextDocument) + self.trDate = i + elif text == self.templateConsts.FILLIN_TIME: + self.teTime = PlaceholderTextElement( + i, self.resources.resPlaceHolderTime, + self.resources.resPlaceHolderHint, self.xTextDocument) + self.trTime = i + elif text == self.templateConsts.FILLIN_LOCATION: + self.teLocation = PlaceholderTextElement( + i, self.resources.resPlaceHolderLocation, + self.resources.resPlaceHolderHint, self.xTextDocument) + self.trLocation = i + else: + auxList.append(i) + self.allItems = auxList + + ''' + analyze the item sections in the template. + delegates the analyze of each table to the ItemsTable class. + ''' + + def initializeItemsSections(self): + sections = self.getSections( + self.xTextDocument, self.templateConsts.SECTION_ITEMS) + # for each section - there is a table... + self.itemsTables = [] + for i in sections: + try: + self.itemsTables.append( + ItemsTable(self.getSection(i), self.getTable(i), self)) + except Exception: + traceback.print_exc() + raise AttributeError ( + "Fatal Error while initializing \ + Template: items table in section " + i) + + + def getSections(self, document, s): + allSections = document.TextSections.ElementNames + return self.getNamesWhichStartWith(allSections, s) + + def getSection(self, name): + return self.xTextDocument.TextSections.getByName(name) + + def getTable(self, name): + return self.xTextDocument.TextTables.getByName(name) + + def redrawTitle(self, controlName): + try: + if controlName == "txtTitle": + self.teTitle.placeHolderText = self.agenda.cp_Title + self.teTitle.write(self.trTitle) + elif controlName == "txtDate": + self.teDate.placeHolderText = \ + self.getDateString(self.agenda.cp_Date) + self.teDate.write(self.trDate) + elif controlName == "txtTime": + self.teTime.placeHolderText = self.agenda.cp_Time + self.teTime.write(self.trTime) + elif controlName == "cbLocation": + self.teLocation.placeHolderText = self.agenda.cp_Location + self.teLocation.write(self.trLocation) + else: + raise Exception("No such title control...") + except Exception: + traceback.print_exc() + + def getDateString(self, date): + if not date: + return "" + dateObject = datetime.strptime(date, '%d/%m/%y').date() + return self.dateUtils.format(self.dateFormat, dateObject) + + def finish(self, topics): + self.createMinutes(topics) + self.deleteHiddenSections() + self.textSectionHandler.removeAllTextSections() + + ''' + hidden sections exist when an item's section is hidden because the + user specified not to display any items which it contains. + When finishing the wizard removes this sections + entirely from the document. + ''' + + def deleteHiddenSections(self): + allSections = self.xTextDocument.TextSections.ElementNames + try: + for i in allSections: + self.section = self.getSection(i) + visible = bool(self.section.IsVisible) + if not visible: + self.section.Anchor.String = "" + + except Exception: + traceback.print_exc() + + ''' + create the minutes for the given topics or remove the minutes + section from the document. + If no topics are supplied, or the user specified not to create minutes, + the minutes section will be removed, + @param topicsData supplies PropertyValue arrays containing + the values for the topics. + ''' + + def createMinutes(self, topicsData): + # if the minutes section should be removed (the + # user did not check "create minutes") + if not self.agenda.cp_IncludeMinutes \ + or len(topicsData) <= 1: + try: + minutesAllSection = self.getSection( + self.templateConsts.SECTION_MINUTES_ALL) + minutesAllSection.Anchor.String = "" + except Exception: + traceback.print_exc() + + # the user checked "create minutes" + else: + try: + topicStartTime = int(self.agenda.cp_Time) + # first I replace the minutes titles... + self.items = self.searchFillInItems() + itemIndex = 0 + for item in self.items: + itemText = item.String.lstrip().lower() + if itemText == \ + self.templateConsts.FILLIN_MINUTES_TITLE: + self.fillMinutesItem( + item, self.agenda.cp_Title, + self.resources.resPlaceHolderTitle) + elif itemText == \ + self.templateConsts.FILLIN_MINUTES_LOCATION: + self.fillMinutesItem( + item, self.agenda.cp_Location, + self.resources.resPlaceHolderLocation) + elif itemText == \ + self.templateConsts.FILLIN_MINUTES_DATE: + self.fillMinutesItem( + item, getDateString(self.agenda.cp_Date), + self.resources.resPlaceHolderDate) + elif itemText == \ + self.templateConsts.FILLIN_MINUTES_TIME: + self.fillMinutesItem( item, self.agenda.cp_Time, + self.resources.resPlaceHolderTime) + + self.items.clear() + ''' + now add minutes for each topic. + The template contains *one* minutes section, so + we first use the one available, and then add a one... + topics data has *always* an empty topic at the end... + ''' + + for i in xrange(len(topicsData) - 1): + topic = topicsData[i] + items = self.searchFillInItems() + itemIndex = 0 + for item in items: + itemText = item.String.lstrip().lower() + if itemText == \ + self.templateConsts.FILLIN_MINUTE_NUM: + self.fillMinutesItem(item, topic[0].Value, "") + elif itemText == \ + self.templateConsts.FILLIN_MINUTE_TOPIC: + self.fillMinutesItem(item, topic[1].Value, "") + elif itemText == \ + self.templateConsts.FILLIN_MINUTE_RESPONSIBLE: + self.fillMinutesItem(item, topic[2].Value, "") + elif itemText == \ + self.templateConsts.FILLIN_MINUTE_TIME: + topicTime = 0 + try: + topicTime = topic[3].Value + except Exception: + pass + + ''' + if the topic has no time, we do not + display any time here. + ''' + if topicTime == 0 or topicStartTime == 0: + time = topic[3].Value + else: + time = str(topicStartTime) + " - " + topicStartTime += topicTime * 1000 + time += str(topicStartTime) + + self.fillMinutesItem(item, time, "") + + self.textSectionHandler.removeTextSectionbyName( + self.templateConsts.SECTION_MINUTES) + # after the last section we do not insert a one. + if i < len(topicsData) - 2: + self.textSectionHandler.insertTextSection( + self.templateConsts.SECTION_MINUTES, + self.template, False) + + except Exception: + traceback.print_exc() + + '''given a text range and a text, fills the given + text range with the given text. + If the given text is empty, uses a placeholder with the given + placeholder text. + @param range text range to fill + @param text the text to fill to the text range object. + @param placeholder the placeholder text to use, if the + text argument is empty (null or "") + ''' + + def fillMinutesItem(self, Range, text, placeholder): + paraStyle = Range.ParaStyleName + Range.setString(text) + Range.ParaStyleName = paraStyle + if text is None or text == "": + if placeholder is not None and not placeholder == "": + placeHolder = self.createPlaceHolder( + self.xTextDocument, placeholder, + self.resources.resPlaceHolderHint) + try: + Range.Start.Text.insertTextContent( + Range.Start, placeHolder, True) + except Exception: + traceback.print_exc() + + ''' + creates a placeholder field with the given text and given hint. + ''' + + @classmethod + def createPlaceHolder(self, xmsf, ph, hint): + try: + placeHolder = xmsf.createInstance( + "com.sun.star.text.TextField.JumpEdit") + except Exception: + traceback.print_exc() + return None + + placeHolder.PlaceHolder = ph + placeHolder.Hint = hint + placeHolder.PlaceHolderType = uno.Any("short",TEXT) + return placeHolder + + def getNamesWhichStartWith(self, allNames, prefix): + v = [] + for i in allNames: + if i.startswith(prefix): + v.append(i) + return v + + ''' + Convenience method for inserting some cells into a table. + ''' + + @classmethod + def insertTableRows(self, table, start, count): + rows = table.Rows + rows.insertByIndex(start, count) + + ''' + returns the rows count of this table, assuming + there is no vertical merged cells. + ''' + + @classmethod + def getRowCount(self, table): + cells = table.getCellNames() + return int(cells[len(cells) - 1][1:]) + +class ItemsTable(object): + ''' + the items in the table. + ''' + items = [] + table = None + + def __init__(self, section, table, agenda): + self.agenda = agenda + ItemsTable.table = table + self.section = section + self.items = [] + ''' + go through all <*> items in the document + and each one if it is in this table. + If they are, register them to belong here, notice their order + and remove them from the list of all <*> items, so the next + search will be faster. + ''' + aux = [] + for item in self.agenda.allItems: + t = item.TextTable + if t == ItemsTable.table: + iText = item.String.lower().lstrip() + ai = self.agenda.itemsCache[iText] + if ai is not None: + self.items.append(ai) + self.agenda.itemsMap[iText] = self + else: + aux.append(item) + self.agenda.allItems = aux + + ''' + link the section to the template. this will restore the original table + with all the items.<br/> + then break the link, to make the section editable.<br/> + then, starting at cell one, write all items that should be visible. + then clear the rest and remove obsolete rows. + If no items are visible, hide the section. + ''' + + def write(self): + name = self.section.Name + # link and unlink the section to the template. + self.agenda.textSectionHandler.linkSectiontoTemplate( + self.agenda.template, name, self.section) + self.agenda.textSectionHandler.breakLinkOfTextSection( + self.section) + # we need to get an instance after linking + + ItemsTable.table = self.agenda.getTable(name) + self.section = self.agenda.getSection(name) + cursor = ItemsTable.table.createCursorByCellName("A1") + # should this section be visible? + visible = False + # write items + cellName = "" + ''' + now go through all items that belong to this + table. Check each one against the model. If it should + be displayed, call its write method. + All items are of type AgendaItem which means they write + two cells to the table: a title (text) and a placeholder. + see AgendaItem class below. + ''' + for i in self.items: + if self.agenda.isShowItem(i.name): + visible = True + i.table = ItemsTable.table + i.write(cursor) + # I store the cell name which was last written... + cellName = cursor.RangeName + cursor.goRight(1, False) + + if visible: + boolean = True + else: + boolean = False + self.section.IsVisible = boolean + if not visible: + return + ''' + if the cell that was last written is the current cell, + it means this is the end of the table, so we end here. + (because after getting the cellName above, + I call the goRight method. + If it did not go right, it means it's the last cell. + ''' + + if cellName == cursor.RangeName: + return + ''' + if not, we continue and clear all cells until + we are at the end of the row. + ''' + + while not cellName == cursor.RangeName and \ + not cursor.RangeName.startswith("A"): + cell = ItemsTable.table.getCellByName(cursor.RangeName) + cell.String = "" + cellName = cursor.RangeName + cursor.goRight(1, False) + + ''' + again: if we are at the end of the table, end here. + ''' + if cellName == cursor.RangeName: + return + + ''' + now before deleting i move the cursor up so it + does not disappear, because it will crash office. + ''' + cursor.gotoStart(False) + +''' +This class handles the preview of the topics table. +You can call it the controller of the topics table. +It differs from ItemsTable in that it has no data model - +the update is done programmatically.<br/> +<br/> +The decision to make this class a class by its own +was done out of logic reasons and not design/functionality reasons, +since there is anyway only one instance of this class at runtime +it could have also be implemented in the AgendaDocument class +but for clarity and separation I decided to make a sub class for it. +''' + +class Topics(object): + '''Analyze the structure of the Topics table. + The structure Must be as follows:<br> + -One Header Row. <br> + -arbitrary number of rows per topic <br> + -arbitrary content in the topics row <br> + -only soft formatting will be restored. <br> + -the topic rows must repeat three times. <br> + -in the topics rows, placeholders for number, topic, responsible, + and duration must be placed.<br><br> + A word about table format: to reconstruct the format of the table we hold + to the following formats: first row (header), topic, and last row. + We hold the format of the last row, because one might wish to give it + a special format, other than the one on the bottom of each topic. + The left and right borders of the whole table are, on the other side, + part of the topics rows format, and need not be preserved separately. + ''' + table = None + lastRowFormat = [] + rowsPerTopic = None + + def __init__(self, agenda): + self.firstRowFormat = [] + self.agenda = agenda + self.writtenTopics = -1 + try: + Topics.table = self.agenda.getTable( + self.agenda.templateConsts.SECTION_TOPICS) + except Exception: + traceback.print_exc() + raise AttributeError ( + "Fatal error while loading template: table " + \ + self.agenda.templateConsts.SECTION_TOPICS + " could not load.") + + ''' + first I store all <*> ranges + which are in the topics table. + I store each <*> range in this - the key + is the cell it is in. Later when analyzing the topic, + cell by cell, I check in this map to know + if a cell contains a <*> or not. + ''' + try: + items = {} + for i in self.agenda.allItems: + t = i.TextTable + if t == Topics.table: + cell = i.Cell + iText = cell.CellName + items[iText] = i + + ''' + in the topics table, there are always one + title row and three topics defined. + So no mutter how many rows a topic takes - we + can restore its structure and format. + ''' + rows = self.agenda.getRowCount(Topics.table) + Topics.rowsPerTopic = int((rows - 1) / 3) + + firstCell = "A" + str(1 + Topics.rowsPerTopic + 1) + afterLastCell = "A" + str(1 + (Topics.rowsPerTopic * 2) + 1) + # go to the first row of the 2. topic + + cursor = Topics.table.createCursorByCellName(firstCell) + # analyze the structure of the topic rows. + while not cursor.RangeName == afterLastCell: + cell = Topics.table.getCellByName(cursor.RangeName) + # first I store the content and para style of the cell + ae = TextElement(cell, cell.String) + ae.write() + + # goto next cell. + cursor.goRight(1, False) + except Exception: + traceback.print_exc() + + '''rewrites a single cell containing. + This is used in order to refresh the topic/responsible/duration data + in the preview document, in response to a change in the gui (by the user) + Since the structure of the topics table is flexible, + The Topics object, which analyzed the structure of the topics table upon + initialization, refreshes the appropriate cell. + ''' + def writeCell(self, row, column, data): + # if the whole row should be written... + if self.writtenTopics < row: + self.writtenTopics += 1 + rows = self.agenda.getRowCount(Topics.table) + reqRows = 1 + (row + 1) * Topics.rowsPerTopic + firstRow = reqRows - Topics.rowsPerTopic + 1 + diff = reqRows - rows + if diff > 0: + # set the item's text... + self.agenda.insertTableRows(Topics.table, rows, diff) + column = 0 + cursor = Topics.table.createCursorByCellName("A" + str(firstRow)) + else: + # calculate the table row. + firstRow = 1 + (row * Topics.rowsPerTopic) + 1 + cursor = Topics.table.createCursorByCellName("A" + str(firstRow)) + + # move the cursor to the needed cell... + cursor.goRight(column, False) + + xc = Topics.table.getCellByName(cursor.RangeName) + # and write it ! + te = TextElement(xc, data[column].Value) + te.write() + + '''removes obsolete rows, reducing the + topics table to the given number of topics. + Note this method does only reducing - if + the number of topics given is greater than the + number of actual topics it does *not* add + rows! + Note also that the first topic will never be removed. + If the table contains no topics, the whole section will + be removed upon finishing. + The reason for that is a "table-design" one: the first topic is + maintained in order to be able to add rows with a design of this topic, + and not of the header row. + @param topics the number of topics the table should contain. + @throws Exception + ''' + + def reduceDocumentTo(self, topics): + # we never remove the first topic... + if topics <= 0: + topics = 1 + + tableRows = Topics.table.Rows + targetNumOfRows = topics * Topics.rowsPerTopic + 1 + if tableRows.Count > targetNumOfRows: + tableRows.removeByIndex( + targetNumOfRows, tableRows.Count - targetNumOfRows) + +''' +A Text element which, if the text to write is empty (null or "") +inserts a placeholder instead. +''' + +class PlaceholderTextElement(TextElement): + + def __init__(self, textRange, placeHolderText_, hint_, xmsf_): + super(PlaceholderTextElement,self).__init__(textRange, "") + + self.text = placeHolderText_ + self.hint = hint_ + self.xmsf = xmsf_ + self.xTextContentList = [] + + def write(self, textRange): + textRange.String = self.placeHolderText + if self.placeHolderText is None or self.placeHolderText == "": + try: + xTextContent = AgendaDocument.createPlaceHolder( + self.xmsf, self.text, self.hint) + self.xTextContentList.append(xTextContent) + textRange.Text.insertTextContent( + textRange.Start, xTextContent, True) + except Exception: + traceback.print_exc() + else: + if self.xTextContentList: + for i in self.xTextContentList: + textRange.Text.removeTextContent(i) + self.xTextContentList = [] +''' +An Agenda element which writes no text, but inserts a placeholder, and formats +it using a ParaStyleName. +''' + +class PlaceholderElement(object): + + def __init__(self, placeHolderText_, hint_, textDocument): + self.placeHolderText = placeHolderText_ + self.hint = hint_ + self.textDocument = textDocument + + def write(self, textRange): + try: + xTextContent = AgendaDocument.createPlaceHolder( + self.textDocument, self.placeHolderText, self.hint) + textRange.Text.insertTextContent( + textRange.Start, xTextContent, True) + except Exception: + traceback.print_exc() + +''' +An implementation of AgendaElement which +gets as a parameter a table cursor, and writes +a text to the cell marked by this table cursor, and +a place holder to the next cell. +''' + +class AgendaItem(object): + + def __init__(self, name_, te, f): + self.name = name_ + self.field = f + self.textElement = te + + def write(self, tableCursor): + cellname = tableCursor.RangeName + cell = ItemsTable.table.getCellByName(cellname) + cell.String = self.textElement + tableCursor.goRight(1, False) + # second field is actually always null... + # this is a preparation for adding placeholders. + if self.field is not None: + self.field.write(ItemsTable.table.getCellByName( + tableCursor.RangeName)) diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py new file mode 100644 index 000000000..991b05f04 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialog.py @@ -0,0 +1,320 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..ui.WizardDialog import WizardDialog, uno, UIConsts, PropertyNames +from .AgendaWizardDialogConst import AgendaWizardDialogConst, HID +from .AgendaWizardDialogResources import AgendaWizardDialogResources + +from com.sun.star.awt.FontUnderline import SINGLE + +class AgendaWizardDialog(WizardDialog): + + def __init__(self, xmsf): + super(AgendaWizardDialog,self).__init__(xmsf, HID ) + + #Load Resources + self.resources = AgendaWizardDialogResources() + + #set dialog properties... + self.setDialogProperties(True, 210, True, 200, 52, 1, 1, + self.resources.resAgendaWizardDialog_title, 310) + + self.PROPS_LIST = ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_LABEL_B = ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_CHECK = (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_BUTTON = (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_X = (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_TEXTAREA = (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_TEXT = (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.PROPS_IMAGE = ("Border", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_IMAGEURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "ScaleImage", PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + + self.fontDescriptor4 = \ + uno.createUnoStruct('com.sun.star.awt.FontDescriptor') + self.fontDescriptor4.Weight = 150 + + def buildStep1(self): + self.insertLabel("lblTitle1", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle1_value, + True, 91, 8, 1, 100,212)) + self.insertLabel("lblPageDesign", self.PROPS_TEXT, + (8, self.resources.reslblPageDesign_value, 97, 32, 1, 101, 66)) + self.listPageDesign = self.insertListBox("listPageDesign", + None, AgendaWizardDialogConst.LISTPAGEDESIGN_ACTION_PERFORMED, + self.PROPS_LIST, + (True, 12, AgendaWizardDialogConst.LISTPAGEDESIGN_HID, + 166, 30, 1, 102, 70), self) + self.chkMinutes = self.insertCheckBox("chkMinutes", None, + self.PROPS_CHECK, (9, AgendaWizardDialogConst.CHKMINUTES_HID, + self.resources.reschkMinutes_value, 97, 50, 0, 1, 103, 203), self) + self.insertImage("imgHelp1", self.PROPS_IMAGE, + (0, 10, "", UIConsts.INFOIMAGEURL, 92, 145, False, 1, 104, 10)) + self.insertLabel("lblHelp1", self.PROPS_TEXTAREA, + (39, self.resources.reslblHelp1_value, + True, 104, 145, 1, 105, 199)) + + def buildStep2(self): + self.insertLabel("lblTitle2", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle2_value, + True, 91, 8, 2, 200, 212)) + self.insertLabel("lblDate", self.PROPS_TEXT, + (8, self.resources.reslblDate_value, 97, 32, 2, 201,66)) + self.txtDate = self.insertDateField( + "txtDate", AgendaWizardDialogConst.TXTDATE_TEXT_CHANGED, + self.PROPS_LIST, + (True, 12, AgendaWizardDialogConst.TXTDATE_HID, + 166,30, 2, 202, 70), self) + self.insertLabel("lblTime", self.PROPS_TEXT, + (8, self.resources.reslblTime_value, 97, 50, 2, 203, 66)) + self.txtTime = self.insertTimeField("txtTime", + AgendaWizardDialogConst.TXTTIME_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + "StrictFormat", + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, AgendaWizardDialogConst.TXTTIME_HID, + 166, 48, 2, True, 204, 70), self) + self.insertLabel("lblTitle", self.PROPS_TEXT, + (8, self.resources.reslblTitle_value, 97, 68, 2, 205, 66)) + self.txtTitle = self.insertTextField( + "txtTitle", AgendaWizardDialogConst.TXTTITLE_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (26, AgendaWizardDialogConst.TXTTITLE_HID, + True, 166, 66, 2, 206, 138), self) + self.insertLabel("lblLocation", self.PROPS_TEXT, + (8, self.resources.reslblLocation_value, 97, 100, 2, 207, 66)) + self.cbLocation = self.insertTextField( + "cbLocation", AgendaWizardDialogConst.TXTLOCATION_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (34, AgendaWizardDialogConst.CBLOCATION_HID, + True, 166,98, 2, 208, 138), self) + self.insertImage("imgHelp2", self.PROPS_IMAGE, + (0, 10, "", UIConsts.INFOIMAGEURL, 92, 145, False, 2, 209, 10)) + self.insertLabel("lblHelp2", self.PROPS_TEXTAREA, + (39, self.resources.reslblHelp2_value, + True, 104, 145, 2, 210, 199)) + + def buildStep3(self): + self.insertLabel("lblTitle3", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle3_value, + True, 91, 8, 3, 300,212)) + self.chkMeetingTitle = self.insertCheckBox("chkMeetingTitle", + AgendaWizardDialogConst.CHKUSEMEETINGTYPE_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKMEETINGTITLE_HID, + self.resources.reschkMeetingTitle_value, + 97, 32, 1, 3, 301, 69), self) + self.chkRead = self.insertCheckBox("chkRead", + AgendaWizardDialogConst.CHKUSEREAD_ITEM_CHANGED, self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKREAD_HID, + self.resources.reschkRead_value, 97, 46, 0, 3, 302, 162), self) + self.chkBring = self.insertCheckBox("chkBring", + AgendaWizardDialogConst.CHKUSEBRING_ITEM_CHANGED, self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKBRING_HID, + self.resources.reschkBring_value, + 97, 60, 0, 3, 303, 162), self) + self.chkNotes = self.insertCheckBox("chkNotes", + AgendaWizardDialogConst.CHKUSENOTES_ITEM_CHANGED, self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKNOTES_HID, + self.resources.reschkNotes_value, + 97, 74, 1, 3, 304, 160), self) + self.insertImage("imgHelp3", self.PROPS_IMAGE, (0, 10, + "", UIConsts.INFOIMAGEURL, 92, 145, False, 3, 305, 10)) + self.insertLabel("lblHelp3", self.PROPS_TEXTAREA, + (39, self.resources.reslblHelp3_value, True,104, 145, 3, 306, 199)) + + def buildStep4(self): + self.insertLabel("lblTitle5", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle5_value, + True, 91, 8, 4, 400, 212)) + self.chkConvenedBy = self.insertCheckBox("chkConvenedBy", + AgendaWizardDialogConst.CHKUSECALLEDBYNAME_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKCONVENEDBY_HID, + self.resources.reschkConvenedBy_value, + 97, 32, 1, 4, 401, 150), self) + self.chkPresiding = self.insertCheckBox("chkPresiding", + AgendaWizardDialogConst.CHKUSEFACILITATOR_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKPRESIDING_HID, + self.resources.reschkPresiding_value, + 97, 46, 0, 4, 402, 150), self) + self.chkNoteTaker = self.insertCheckBox("chkNoteTaker", + AgendaWizardDialogConst.CHKUSENOTETAKER_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKNOTETAKER_HID, + self.resources.reschkNoteTaker_value, + 97, 60, 0, 4, 403, 150), self) + self.chkTimekeeper = self.insertCheckBox("chkTimekeeper", + AgendaWizardDialogConst.CHKUSETIMEKEEPER_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKTIMEKEEPER_HID, + self.resources.reschkTimekeeper_value, + 97, 74, 0, 4, 404, 150), self) + self.chkAttendees = self.insertCheckBox("chkAttendees", + AgendaWizardDialogConst.CHKUSEATTENDEES_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKATTENDEES_HID, + self.resources.reschkAttendees_value, + 97, 88, 1, 4, 405, 150), self) + self.chkObservers = self.insertCheckBox("chkObservers", + AgendaWizardDialogConst.CHKUSEOBSERVERS_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKOBSERVERS_HID, + self.resources.reschkObservers_value, + 97, 102, 0, 4, 406, 150), self) + self.chkResourcePersons = self.insertCheckBox("chkResourcePersons", + AgendaWizardDialogConst.CHKUSERESOURCEPERSONS_ITEM_CHANGED, + self.PROPS_CHECK, + (8, AgendaWizardDialogConst.CHKRESOURCEPERSONS_HID, + self.resources.reschkResourcePersons_value, + 97, 116, 0, 4, 407, 150), self) + self.insertImage("imgHelp4", self.PROPS_IMAGE, + (0, 10, "", UIConsts.INFOIMAGEURL, + 92, 145, False, 4, 408, 10)) + self.insertLabel("lblHelp4", self.PROPS_TEXTAREA, + (39, self.resources.reslblHelp4_value, True, 104, 145, 4, 409, 199)) + + def buildStep5(self): + self.insertLabel("lblTitle4", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle4_value, + True, 91, 8, 5, 500, 212)) + self.insertLabel("lblTopic", self.PROPS_TEXT, + (8, self.resources.reslblTopic_value, 107, 28, 5, 71, 501)) + self.insertLabel("lblResponsible", self.PROPS_TEXT, + (8, self.resources.reslblResponsible_value, 195, 28, 5, 72, 502)) + self.insertLabel("lblDuration", self.PROPS_TEXT, + (8, self.resources.reslblDuration_value, 267, 28, 5, 73, 503)) + self.btnInsert = self.insertButton("btnInsert", + AgendaWizardDialogConst.BTNINSERT_ACTION_PERFORMED, + self.PROPS_BUTTON, (14, AgendaWizardDialogConst.BTNINSERT_HID, + self.resources.resButtonInsert, 92, 136, 5, 580, 40), self) + self.btnRemove = self.insertButton("btnRemove", + AgendaWizardDialogConst.BTNREMOVE_ACTION_PERFORMED, + self.PROPS_BUTTON, (14, AgendaWizardDialogConst.BTNREMOVE_HID, + self.resources.resButtonRemove, 134, 136, 5, 581, 40), self) + self.btnUp = self.insertButton("btnUp", + AgendaWizardDialogConst.BTNUP_ACTION_PERFORMED, + self.PROPS_BUTTON, (14, AgendaWizardDialogConst.BTNUP_HID, + self.resources.resButtonUp, 180, 136, 5, 582, 60), self) + self.btnDown = self.insertButton("btnDown", + AgendaWizardDialogConst.BTNDOWN_ACTION_PERFORMED, + self.PROPS_BUTTON, (14, AgendaWizardDialogConst.BTNDOWN_HID, + self.resources.resButtonDown, 244, 136, 5, 583, 60), self) + + def buildStep6(self): + self.insertLabel("lblTitle6", self.PROPS_LABEL_B, + (self.fontDescriptor4, 16, self.resources.reslblTitle6_value, + True, 91, 8, 6, 600, 212)) + self.insertLabel("lblHelpPg6", self.PROPS_TEXTAREA, + (24, self.resources.reslblHelpPg6_value, True, + 97, 32, 6, 601,204)) + self.insertLabel("lblTemplateName", self.PROPS_TEXT, + (8, self.resources.reslblTemplateName_value, + 97, 62, 6, 602, 101)) + self.txtTemplateName = self.insertTextField("txtTemplateName", + None, self.PROPS_X, + (12, AgendaWizardDialogConst.TXTTEMPLATENAME_HID, + 202, 60, 6, 603, 100), self) + self.insertLabel("lblProceed", self.PROPS_TEXT, + (8, self.resources.reslblProceed_value, 97, 101, 6, 607,204)) + self.optCreateAgenda = self.insertRadioButton("optCreateAgenda", None, + self.PROPS_CHECK, (8, AgendaWizardDialogConst.OPTCREATEAGENDA_HID, + self.resources.resoptCreateAgenda_value, + 103, 113, 1, 6, 608, 198), self) + self.optMakeChanges = self.insertRadioButton("optMakeChanges", None, + self.PROPS_BUTTON, (8, AgendaWizardDialogConst.OPTMAKECHANGES_HID, + self.resources.resoptMakeChanges_value, + 103, 125, 6, 609, 198), self) + self.insertImage("imgHelp6", self.PROPS_IMAGE, (0, 10, "", + UIConsts.INFOIMAGEURL, 92, 145, False, 6, 610, 10)) + self.insertLabel("lblHelp6", self.PROPS_TEXTAREA, + (39, self.resources.reslblHelp6_value, True, 104, 145, 6, 611, 199)) diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py new file mode 100644 index 000000000..e4370a416 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogConst.py @@ -0,0 +1,77 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.HelpIds import HelpIds + +HID = 41051 + +class AgendaWizardDialogConst: + + TXTTITLE_TEXT_CHANGED = "txtTitleTextChanged" + TXTDATE_TEXT_CHANGED = "txtDateTextChanged" + TXTTIME_TEXT_CHANGED = "txtTimeTextChanged" + TXTLOCATION_TEXT_CHANGED = "txtLocationTextChanged" + CHKMINUTES_ITEM_CHANGED = "chkMinutesItemChanged" + CHKUSEMEETINGTYPE_ITEM_CHANGED = "chkUseMeetingTypeItemChanged" + CHKUSEREAD_ITEM_CHANGED = "chkUseReadItemChanged" + CHKUSEBRING_ITEM_CHANGED = "chkUseBringItemChanged" + CHKUSENOTES_ITEM_CHANGED = "chkUseNotesItemChanged" + CHKUSECALLEDBYNAME_ITEM_CHANGED = "chkUseCalledByItemChanged" + CHKUSEFACILITATOR_ITEM_CHANGED = "chkUseFacilitatorItemChanged" + CHKUSENOTETAKER_ITEM_CHANGED = "chkUseNoteTakerItemChanged" + CHKUSETIMEKEEPER_ITEM_CHANGED = "chkUseTimeKeeperItemChanged" + CHKUSEATTENDEES_ITEM_CHANGED = "chkUseAttendeesItemChanged" + CHKUSEOBSERVERS_ITEM_CHANGED = "chkUseObserversItemChanged" + CHKUSERESOURCEPERSONS_ITEM_CHANGED = "chkUseResourcePersonsItemChanged" + LISTPAGEDESIGN_ACTION_PERFORMED = "pageDesignChanged" + BTNTEMPLATEPATH_ACTION_PERFORMED = "saveAs" + BTNINSERT_ACTION_PERFORMED = "insertRow" + BTNREMOVE_ACTION_PERFORMED = "removeRow" + BTNUP_ACTION_PERFORMED = "rowUp" + BTNDOWN_ACTION_PERFORMED = "rowDown" + + LISTPAGEDESIGN_HID = HelpIds.getHelpIdString(HID + 6) + CHKMINUTES_HID = HelpIds.getHelpIdString(HID + 7) + TXTTIME_HID = HelpIds.getHelpIdString(HID + 8) + TXTDATE_HID = HelpIds.getHelpIdString(HID + 9) + TXTTITLE_HID = HelpIds.getHelpIdString(HID + 10) + CBLOCATION_HID = HelpIds.getHelpIdString(HID + 11) + + CHKMEETINGTITLE_HID = HelpIds.getHelpIdString(HID + 12) + CHKREAD_HID = HelpIds.getHelpIdString(HID + 13) + CHKBRING_HID = HelpIds.getHelpIdString(HID + 14) + CHKNOTES_HID = HelpIds.getHelpIdString(HID + 15) + + CHKCONVENEDBY_HID = HelpIds.getHelpIdString(HID + 16) + CHKPRESIDING_HID = HelpIds.getHelpIdString(HID + 17) + CHKNOTETAKER_HID = HelpIds.getHelpIdString(HID + 18) + CHKTIMEKEEPER_HID = HelpIds.getHelpIdString(HID + 19) + CHKATTENDEES_HID = HelpIds.getHelpIdString(HID + 20) + CHKOBSERVERS_HID = HelpIds.getHelpIdString(HID + 21) + CHKRESOURCEPERSONS_HID = HelpIds.getHelpIdString(HID + 22) + + TXTTEMPLATENAME_HID = HelpIds.getHelpIdString(HID + 23) + TXTTEMPLATEPATH_HID = HelpIds.getHelpIdString(HID + 24) + BTNTEMPLATEPATH_HID = HelpIds.getHelpIdString(HID + 25) + + OPTCREATEAGENDA_HID = HelpIds.getHelpIdString(HID + 26) + OPTMAKECHANGES_HID = HelpIds.getHelpIdString(HID + 27) + + BTNINSERT_HID = HelpIds.getHelpIdString(HID + 28) + BTNREMOVE_HID = HelpIds.getHelpIdString(HID + 29) + BTNUP_HID = HelpIds.getHelpIdString(HID + 30) + BTNDOWN_HID = HelpIds.getHelpIdString(HID + 31) diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py new file mode 100644 index 000000000..372dad055 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogImpl.py @@ -0,0 +1,384 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +import os.path +from .AgendaWizardDialog import AgendaWizardDialog, uno +from .AgendaWizardDialogConst import HID +from .AgendaDocument import AgendaDocument, TextElement +from .TemplateConsts import TemplateConsts +from .TopicsControl import TopicsControl +from .CGAgenda import CGAgenda +from ..ui.PathSelection import PathSelection +from ..ui.event.UnoDataAware import UnoDataAware +from ..ui.event.RadioDataAware import RadioDataAware +from ..ui.event.CommonListener import TerminateListenerProcAdapter +from ..common.NoValidPathException import NoValidPathException +from ..common.SystemDialog import SystemDialog +from ..common.Desktop import Desktop +from ..common.HelpIds import HelpIds +from ..common.Configuration import Configuration +from ..common.FileAccess import FileAccess +from ..document.OfficeDocument import OfficeDocument + +from com.sun.star.util import CloseVetoException +from com.sun.star.view.DocumentZoomType import OPTIMAL +from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO + +class AgendaWizardDialogImpl(AgendaWizardDialog): + + def __init__(self, xmsf): + super(AgendaWizardDialogImpl, self).__init__(xmsf) + self.filenameChanged = False + self.pageDesign = -1 + + def enterStep(self, OldStep, NewStep): + pass + + def leaveStep(self, OldStep, NewStep): + pass + + def startWizard(self, xMSF): + self.running = True + try: + #Number of steps on WizardDialog + self.nMaxStep = 6 + + self.agenda = CGAgenda() + + # read configuration data before we initialize the topics + root = Configuration.getConfigurationRoot( + self.xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", + False) + self.agenda.readConfiguration(root, "cp_") + + self.templateConsts = TemplateConsts + + self.initializePaths() + # initialize the agenda template + self.terminateListener = TerminateListenerProcAdapter(self.queryTermination) + self.myAgendaDoc = AgendaDocument( + self.xMSF, self.agenda, self.resources, + self.templateConsts, self.terminateListener) + self.initializeTemplates() + + self.myAgendaDoc.load( + self.agendaTemplates[1][self.agenda.cp_AgendaType]) + self.drawConstants() + + # build the dialog. + self.drawNaviBar() + + self.buildStep1() + self.buildStep2() + self.buildStep3() + self.buildStep4() + self.buildStep5() + self.buildStep6() + + self.topicsControl = TopicsControl(self, self.xMSF, self.agenda) + + #special Control for setting the save Path: + self.insertPathSelectionControl() + + # synchronize GUI and CGAgenda object. + self.initConfiguration() + + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + + # create the peer + xContainerWindow = self.myAgendaDoc.xFrame.ContainerWindow + self.createWindowPeer(xContainerWindow) + + # initialize roadmap + self.insertRoadmap() + + self.executeDialogFromComponent(self.myAgendaDoc.xFrame) + self.removeTerminateListener() + self.closeDocument() + self.running = False + except Exception: + self.removeTerminateListener() + traceback.print_exc() + self.running = False + return + + def insertPathSelectionControl(self): + self.myPathSelection = PathSelection( + self.xMSF, self, PathSelection.TransferMode.SAVE, + PathSelection.DialogTypes.FILE) + self.myPathSelection.insert(6, 97, 70, 205, 45, + self.resources.reslblTemplatePath_value, True, + HelpIds.getHelpIdString(HID + 24), + HelpIds.getHelpIdString(HID + 25)) + self.myPathSelection.sDefaultDirectory = self.sUserTemplatePath + self.myPathSelection.sDefaultName = "myAgendaTemplate.ott" + self.myPathSelection.sDefaultFilter = "writer8_template" + self.myPathSelection.addSelectionListener(self) + + ''' + bind controls to the agenda member (DataAware model) + ''' + + def initConfiguration(self): + self.xDialogModel.listPageDesign.StringItemList = \ + tuple(self.agendaTemplates[0]) + UnoDataAware.attachListBox( + self.agenda, "cp_AgendaType", self.listPageDesign, True).updateUI() + self.pageDesign = self.agenda.cp_AgendaType + UnoDataAware.attachCheckBox( + self.agenda, "cp_IncludeMinutes", self.chkMinutes, True).updateUI() + UnoDataAware.attachEditControl( + self.agenda, "cp_Title", self.txtTitle, True).updateUI() + UnoDataAware.attachDateControl( + self.agenda, "cp_Date", self.txtDate, True).updateUI() + UnoDataAware.attachTimeControl( + self.agenda, "cp_Time", self.txtTime, True).updateUI() + UnoDataAware.attachEditControl( + self.agenda, "cp_Location", self.cbLocation, True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowMeetingType", self.chkMeetingTitle, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowRead", self.chkRead, True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowBring", self.chkBring, True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowNotes", self.chkNotes, True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowCalledBy", self.chkConvenedBy, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowFacilitator", self.chkPresiding, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowNotetaker", self.chkNoteTaker, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowTimekeeper", self.chkTimekeeper, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowAttendees", self.chkAttendees, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowObservers", self.chkObservers, + True).updateUI() + UnoDataAware.attachCheckBox( + self.agenda, "cp_ShowResourcePersons",self.chkResourcePersons, + True).updateUI() + UnoDataAware.attachEditControl( + self.agenda, "cp_TemplateName", self.txtTemplateName, + True).updateUI() + RadioDataAware.attachRadioButtons( + self.agenda, "cp_ProceedMethod", + (self.optCreateAgenda, self.optMakeChanges), True).updateUI() + + def insertRoadmap(self): + self.addRoadmap() + self.insertRoadMapItems( + self.resources.RoadmapLabels, [True, True, True, True, True, True]) + self.setRoadmapInteractive(True) + self.setRoadmapComplete(True) + self.setCurrentRoadmapItemID(1) + + ''' + read the available agenda wizard templates. + ''' + + def initializeTemplates(self): + try: + sAgendaPath = self.sTemplatePath + "/wizard/agenda" + self.agendaTemplates = FileAccess.getFolderTitles( + self.xMSF, "aw", sAgendaPath, self.resources.dictPageDesign) + return True + except NoValidPathException: + traceback.print_exc() + return False + + ''' + first page, page design listbox changed. + ''' + + def pageDesignChanged(self): + try: + SelectedItemPos = self.listPageDesign.SelectedItemPos + #avoid to load the same item again + if self.pageDesign is not SelectedItemPos: + self.pageDesign = SelectedItemPos + self.myAgendaDoc.load( + self.agendaTemplates[1][SelectedItemPos]) + self.drawConstants() + except Exception: + traceback.print_exc() + + #textFields listeners + def txtTitleTextChanged(self): + self.myAgendaDoc.redrawTitle("txtTitle") + + def txtDateTextChanged(self): + self.myAgendaDoc.redrawTitle("txtDate") + + def txtTimeTextChanged(self): + self.myAgendaDoc.redrawTitle("txtTime") + + def txtLocationTextChanged(self): + self.myAgendaDoc.redrawTitle("cbLocation") + + #checkbox listeners + def chkUseMeetingTypeItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_MEETING_TYPE) + + def chkUseReadItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_READ) + + def chkUseBringItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_BRING) + + def chkUseNotesItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_NOTES) + + def chkUseCalledByItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_CALLED_BY) + + def chkUseFacilitatorItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_FACILITATOR) + + def chkUseNoteTakerItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_NOTETAKER) + + def chkUseTimeKeeperItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_TIMEKEEPER) + + def chkUseAttendeesItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_PARTICIPANTS) + + def chkUseObserversItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_OBSERVERS) + + def chkUseResourcePersonsItemChanged(self): + self.myAgendaDoc.redraw(self.templateConsts.FILLIN_RESOURCE_PERSONS) + + def insertRow(self): + self.topicsControl.insertRow() + + def removeRow(self): + self.topicsControl.removeRow() + + def rowUp(self): + self.topicsControl.rowUp() + + def rowDown(self): + self.topicsControl.rowDown() + + def cancelWizard(self): + self.xUnoDialog.endExecute() + self.running = False + + def finishWizard(self): + self.switchToStep(self.getCurrentStep(), self.nMaxStep) + bSaveSuccess = False + endWizard = True + try: + self.sPath = self.myPathSelection.getSelectedPath() + if not self.sPath or not os.path.exists(self.sPath): + self.myPathSelection.triggerPathPicker() + self.sPath = self.myPathSelection.getSelectedPath() + + #first, if the filename was not changed, thus + #it is coming from a saved session, check if the + # file exists and warn the user. + if not self.filenameChanged: + answer = SystemDialog.showMessageBox( + self.xMSF, "MessBox", YES_NO + DEF_NO, + self.resources.resOverwriteWarning, + self.xUnoDialog.Peer) + if answer == 3: + # user said: no, do not overwrite + endWizard = False + return False + + xDocProps = self.myAgendaDoc.xTextDocument.DocumentProperties + xDocProps.Title = self.txtTemplateName.Text + self.myAgendaDoc.setWizardTemplateDocInfo( \ + self.resources.resAgendaWizardDialog_title, + self.resources.resTemplateDescription) + bSaveSuccess = OfficeDocument.store( + self.xMSF, self.myAgendaDoc.xTextDocument, self.sPath, + "writer8_template") + + if bSaveSuccess: + self.topicsControl.saveTopics(self.agenda) + root = Configuration.getConfigurationRoot( + self.xMSF, "/org.openoffice.Office.Writer/Wizards/Agenda", + True) + self.agenda.writeConfiguration(root, "cp_") + root.commitChanges() + + self.myAgendaDoc.finish(self.topicsControl.scrollfields) + + loadValues = list(range(2)) + loadValues[0] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[0].Name = "AsTemplate" + if self.agenda.cp_ProceedMethod == 1: + loadValues[0].Value = True + else: + loadValues[0].Value = False + + loadValues[1] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[1].Name = "InteractionHandler" + + xIH = self.xMSF.createInstance( + "com.sun.star.comp.uui.UUIInteractionHandler") + loadValues[1].Value = xIH + + oDoc = OfficeDocument.load( + Desktop.getDesktop(self.xMSF), + self.sPath, "_default", loadValues) + oDoc.CurrentController.ViewSettings.ZoomType = OPTIMAL + else: + pass + + except Exception: + traceback.print_exc() + finally: + if endWizard: + self.xUnoDialog.endExecute() + self.running = False + return True + + def closeDocument(self): + try: + self.myAgendaDoc.xFrame.close(False) + except CloseVetoException: + traceback.print_exc() + + def drawConstants(self): + '''Localise the template''' + constRangeList = self.myAgendaDoc.searchFillInItems(1) + + for i in constRangeList: + text = i.String.lower() + aux = TextElement(i, self.resources.dictConstants[text]) + aux.write() + + def validatePath(self): + if self.myPathSelection.usedPathPicker: + self.filenameChanged = True + self.myPathSelection.usedPathPicker = False diff --git a/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py new file mode 100644 index 000000000..b1d53de6b --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/AgendaWizardDialogResources.py @@ -0,0 +1,137 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +class AgendaWizardDialogResources(object): + + SECTION_ITEMS = "AGENDA_ITEMS" + SECTION_TOPICS = "AGENDA_TOPICS" + SECTION_MINUTES_ALL = "MINUTES_ALL" + SECTION_MINUTES = "MINUTES" + + def __init__(self): + import imp, os + imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')) + import strings + + self.resAgendaWizardDialog_title = strings.RID_AGENDAWIZARDDIALOG_START_1 + self.resoptMakeChanges_value = strings.RID_AGENDAWIZARDDIALOG_START_2 + self.reslblTemplateName_value = strings.RID_AGENDAWIZARDDIALOG_START_3 + self.reslblTemplatePath_value = strings.RID_AGENDAWIZARDDIALOG_START_4 + self.reslblProceed_value = strings.RID_AGENDAWIZARDDIALOG_START_5 + self.reslblTitle1_value = strings.RID_AGENDAWIZARDDIALOG_START_6 + self.reslblTitle3_value = strings.RID_AGENDAWIZARDDIALOG_START_7 + self.reslblTitle2_value = strings.RID_AGENDAWIZARDDIALOG_START_8 + self.reslblTitle4_value = strings.RID_AGENDAWIZARDDIALOG_START_9 + self.reslblTitle5_value = strings.RID_AGENDAWIZARDDIALOG_START_10 + self.reslblTitle6_value = strings.RID_AGENDAWIZARDDIALOG_START_11 + self.reschkMinutes_value = strings.RID_AGENDAWIZARDDIALOG_START_12 + self.reslblHelp1_value = strings.RID_AGENDAWIZARDDIALOG_START_13 + self.reslblTime_value = strings.RID_AGENDAWIZARDDIALOG_START_14 + self.reslblTitle_value = strings.RID_AGENDAWIZARDDIALOG_START_15 + self.reslblLocation_value = strings.RID_AGENDAWIZARDDIALOG_START_16 + self.reslblHelp2_value = strings.RID_AGENDAWIZARDDIALOG_START_17 + self.resbtnTemplatePath_value = strings.RID_AGENDAWIZARDDIALOG_START_18 + self.resoptCreateAgenda_value = strings.RID_AGENDAWIZARDDIALOG_START_19 + self.reslblHelp6_value = strings.RID_AGENDAWIZARDDIALOG_START_20 + self.reslblTopic_value = strings.RID_AGENDAWIZARDDIALOG_START_21 + self.reslblResponsible_value = strings.RID_AGENDAWIZARDDIALOG_START_22 + self.reslblDuration_value = strings.RID_AGENDAWIZARDDIALOG_START_23 + self.reschkConvenedBy_value = strings.RID_AGENDAWIZARDDIALOG_START_24 + self.reschkPresiding_value = strings.RID_AGENDAWIZARDDIALOG_START_25 + self.reschkNoteTaker_value = strings.RID_AGENDAWIZARDDIALOG_START_26 + self.reschkTimekeeper_value = strings.RID_AGENDAWIZARDDIALOG_START_27 + self.reschkAttendees_value = strings.RID_AGENDAWIZARDDIALOG_START_28 + self.reschkObservers_value = strings.RID_AGENDAWIZARDDIALOG_START_29 + self.reschkResourcePersons_value = strings.RID_AGENDAWIZARDDIALOG_START_30 + self.reslblHelp4_value = strings.RID_AGENDAWIZARDDIALOG_START_31 + self.reschkMeetingTitle_value = strings.RID_AGENDAWIZARDDIALOG_START_32 + self.reschkRead_value = strings.RID_AGENDAWIZARDDIALOG_START_33 + self.reschkBring_value = strings.RID_AGENDAWIZARDDIALOG_START_34 + self.reschkNotes_value = strings.RID_AGENDAWIZARDDIALOG_START_35 + self.reslblHelp3_value = strings.RID_AGENDAWIZARDDIALOG_START_36 + self.reslblDate_value = strings.RID_AGENDAWIZARDDIALOG_START_38 + self.reslblHelpPg6_value = strings.RID_AGENDAWIZARDDIALOG_START_39 + self.reslblPageDesign_value = strings.RID_AGENDAWIZARDDIALOG_START_40 + self.resDefaultFilename = strings.RID_AGENDAWIZARDDIALOG_START_41 + self.resDefaultFilename = self.resDefaultFilename[:-4] + ".ott" + self.resDefaultTitle = strings.RID_AGENDAWIZARDDIALOG_START_42 + self.resErrSaveTemplate = strings.RID_AGENDAWIZARDDIALOG_START_43 + self.resPlaceHolderTitle = strings.RID_AGENDAWIZARDDIALOG_START_44 + self.resPlaceHolderDate = strings.RID_AGENDAWIZARDDIALOG_START_45 + self.resPlaceHolderTime = strings.RID_AGENDAWIZARDDIALOG_START_46 + self.resPlaceHolderLocation = strings.RID_AGENDAWIZARDDIALOG_START_47 + self.resPlaceHolderHint = strings.RID_AGENDAWIZARDDIALOG_START_48 + self.resErrOpenTemplate = strings.RID_AGENDAWIZARDDIALOG_START_56 + self.itemMeetingType = strings.RID_AGENDAWIZARDDIALOG_START_57 + self.itemBring = strings.RID_AGENDAWIZARDDIALOG_START_58 + self.itemRead = strings.RID_AGENDAWIZARDDIALOG_START_59 + self.itemNote = strings.RID_AGENDAWIZARDDIALOG_START_60 + self.itemCalledBy = strings.RID_AGENDAWIZARDDIALOG_START_61 + self.itemFacilitator = strings.RID_AGENDAWIZARDDIALOG_START_62 + self.itemAttendees = strings.RID_AGENDAWIZARDDIALOG_START_63 + self.itemNotetaker = strings.RID_AGENDAWIZARDDIALOG_START_64 + self.itemTimekeeper = strings.RID_AGENDAWIZARDDIALOG_START_65 + self.itemObservers = strings.RID_AGENDAWIZARDDIALOG_START_66 + self.itemResource = strings.RID_AGENDAWIZARDDIALOG_START_67 + self.resButtonInsert = strings.RID_AGENDAWIZARDDIALOG_START_68 + self.resButtonRemove = strings.RID_AGENDAWIZARDDIALOG_START_69 + self.resButtonUp = strings.RID_AGENDAWIZARDDIALOG_START_70 + self.resButtonDown = strings.RID_AGENDAWIZARDDIALOG_START_71 + + #Create a dictionary for localised string in the template + self.dictConstants = { + "#datetitle#" : strings.RID_AGENDAWIZARDDIALOG_START_72, + "#timetitle#" : strings.RID_AGENDAWIZARDDIALOG_START_73, + "#locationtitle#" : strings.RID_AGENDAWIZARDDIALOG_START_74, + "#topics#" : strings.RID_AGENDAWIZARDDIALOG_START_75, + "#num.#" : strings.RID_AGENDAWIZARDDIALOG_START_76, + "#topicheader#" : strings.RID_AGENDAWIZARDDIALOG_START_77, + "#responsibleheader#" : strings.RID_AGENDAWIZARDDIALOG_START_78, + "#timeheader#" : strings.RID_AGENDAWIZARDDIALOG_START_79, + "#additional-information#" : strings.RID_AGENDAWIZARDDIALOG_START_80, + "#minutes-for#" : strings.RID_AGENDAWIZARDDIALOG_START_81, + "#discussion#" : strings.RID_AGENDAWIZARDDIALOG_START_82, + "#conclusion#" : strings.RID_AGENDAWIZARDDIALOG_START_83, + "#to-do#" : strings.RID_AGENDAWIZARDDIALOG_START_84, + "#responsible-party#" : strings.RID_AGENDAWIZARDDIALOG_START_85, + "#deadline#" : strings.RID_AGENDAWIZARDDIALOG_START_86} + + #Create a dictionary for localising the page design + self.dictPageDesign = { + "Blue" : strings.RID_AGENDAWIZARDDIALOG_START_87, + "Classic" : strings.RID_AGENDAWIZARDDIALOG_START_88, + "Colorful" : strings.RID_AGENDAWIZARDDIALOG_START_89, + "Elegant" : strings.RID_AGENDAWIZARDDIALOG_START_90, + "Green" : strings.RID_AGENDAWIZARDDIALOG_START_91, + "Grey" : strings.RID_AGENDAWIZARDDIALOG_START_92, + "Modern" : strings.RID_AGENDAWIZARDDIALOG_START_93, + "Orange" : strings.RID_AGENDAWIZARDDIALOG_START_94, + "Red" : strings.RID_AGENDAWIZARDDIALOG_START_95, + "Simple" : strings.RID_AGENDAWIZARDDIALOG_START_96} + + #Common Resources + self.resOverwriteWarning = strings.RID_COMMON_START_19 + self.resTemplateDescription = strings.RID_COMMON_START_20 + + self.RoadmapLabels = [] + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_50) + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_51) + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_52) + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_53) + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_54) + self.RoadmapLabels.append(strings.RID_AGENDAWIZARDDIALOG_START_55) diff --git a/wizards/com/sun/star/wizards/agenda/CGAgenda.py b/wizards/com/sun/star/wizards/agenda/CGAgenda.py new file mode 100644 index 000000000..ee8435ba1 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/CGAgenda.py @@ -0,0 +1,46 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.ConfigGroup import ConfigGroup +from ..common.ConfigSet import ConfigSet +from .CGTopic import CGTopic + +class CGAgenda(ConfigGroup): + + def __init__(self): + self.cp_AgendaType = int() + self.cp_IncludeMinutes = bool() + self.cp_Title = "" + self.cp_Date = str() + self.cp_Time = str() + self.cp_Location = "" + self.cp_ShowMeetingType = bool() + self.cp_ShowRead = bool() + self.cp_ShowBring = bool() + self.cp_ShowNotes = bool() + self.cp_ShowCalledBy = bool() + self.cp_ShowFacilitator = bool() + self.cp_ShowNotetaker = bool() + self.cp_ShowTimekeeper = bool() + self.cp_ShowAttendees = bool() + self.cp_ShowObservers = bool() + self.cp_ShowResourcePersons = bool() + self.cp_TemplateName = str() + self.cp_TemplatePath = str() + self.cp_ProceedMethod = int() + + self.cp_Topics = ConfigSet(CGTopic) diff --git a/wizards/com/sun/star/wizards/agenda/CGTopic.py b/wizards/com/sun/star/wizards/agenda/CGTopic.py new file mode 100644 index 000000000..e99f770b2 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/CGTopic.py @@ -0,0 +1,60 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.ConfigGroup import ConfigGroup + +''' +CGTopic means: Configuration Group Topic. +This object encapsulates a configuration group with topic information. +Since the topic's gui control uses its own data model, there is +also code here to convert from the data model to CGTopic object (the constructor) +and vice versa (setDataToRow method - used when loading the last session...) +''' + +class CGTopic(ConfigGroup): + + ''' + create a new CGTopic object with data from the given row. + the row object is a PropertyValue array, as used + by the TopicsControl's data model. + @param row PropertyValue array as used by the TopicsControl's data model. + ''' + + def __init__(self, row=None): + if row is None: + self.cp_Index = int() + self.cp_Topic = str() + self.cp_Responsible = str() + self.cp_Time = str() + else: + self.cp_Index = int(row[0].Value[:-1]) + self.cp_Topic = row[1].Value + self.cp_Responsible = row[2].Value + self.cp_Time = row[3].Value + + ''' + copies the data in this CGTopic object + to the given row. + @param row the row object (PropertyValue array) to + copy the data to. + ''' + + def setDataToRow(self, row): + row[0].Value = "" + str(self.cp_Index) + "." + row[1].Value = self.cp_Topic + row[2].Value = self.cp_Responsible + row[3].Value = self.cp_Time diff --git a/wizards/com/sun/star/wizards/agenda/CallWizard.py b/wizards/com/sun/star/wizards/agenda/CallWizard.py new file mode 100644 index 000000000..2b784e2fe --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/CallWizard.py @@ -0,0 +1,75 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import unohelper +import traceback + +from .AgendaWizardDialogImpl import AgendaWizardDialogImpl, Desktop + +from com.sun.star.lang import XServiceInfo +from com.sun.star.task import XJobExecutor + +# pythonloader looks for a static g_ImplementationHelper variable +g_ImplementationHelper = unohelper.ImplementationHelper() +g_implName = "com.sun.star.wizards.agenda.CallWizard" + +# implement a UNO component by deriving from the standard unohelper.Base class +# and from the interface(s) you want to implement. +class CallWizard(unohelper.Base, XJobExecutor, XServiceInfo): + def __init__(self, ctx): + # store the component context for later use + self.ctx = ctx + + def trigger(self, args): + try: + fw = AgendaWizardDialogImpl(self.ctx.ServiceManager) + fw.startWizard(self.ctx.ServiceManager) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + @classmethod + def callRemote(self): + #Call the wizard remotely(see README) + try: + ConnectStr = \ + "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" + xLocMSF = Desktop.connect(ConnectStr) + lw = AgendaWizardDialogImpl(xLocMSF) + lw.startWizard(xLocMSF) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + def getImplementationName(self): + return g_implName + + def supportsService(self, ServiceName): + return g_ImplementationHelper.supportsService(g_implName, ServiceName) + + def getSupportedServiceNames(self): + return g_ImplementationHelper.getSupportedServiceNames(g_implName) + +g_ImplementationHelper.addImplementation( \ + CallWizard, # UNO object class + g_implName, # implementation name + ("com.sun.star.task.Job",),) # list of implemented services + # (the only service) + +# vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/wizards/com/sun/star/wizards/agenda/TemplateConsts.py b/wizards/com/sun/star/wizards/agenda/TemplateConsts.py new file mode 100644 index 000000000..2593c2ce3 --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/TemplateConsts.py @@ -0,0 +1,83 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +class TemplateConsts: + FILLIN_TITLE = "<title>" + FILLIN_TITLE = "<title>" + FILLIN_DATE = "<date>" + FILLIN_TIME = "<time>" + FILLIN_LOCATION = "<location>" + ''' + section name <b>prefix</b> for sections that contain items. + this is also used as table name prefix, since each items section + must contain a table whose name is identical name to the section's name. + ''' + SECTION_ITEMS = "AGENDA_ITEMS" + ''' + the name of the section which contains the topics. + ''' + SECTION_TOPICS = "AGENDA_TOPICS" + ''' + the name of the parent minutes section. + ''' + SECTION_MINUTES_ALL = "MINUTES_ALL" + ''' + the name of the child minutes section. + This section will be duplicated for each topic. + ''' + SECTION_MINUTES = "MINUTES" + ''' + tagged headings and names. + These will be searched in item tables (in the template) and will be + replaced with resource strings. + + headings... + ''' + FILLIN_MEETING_TYPE = "<meeting-type>" + FILLIN_BRING = "<bring>" + FILLIN_READ = "<read>" + FILLIN_NOTES = "<notes>" + ''' + names... + ''' + FILLIN_CALLED_BY = "<called-by>" + FILLIN_FACILITATOR = "<facilitator>" + FILLIN_PARTICIPANTS = "<attendees>" + FILLIN_NOTETAKER = "<notetaker>" + FILLIN_TIMEKEEPER = "<timekeeper>" + FILLIN_OBSERVERS = "<observers>" + FILLIN_RESOURCE_PERSONS = "<resource-persons>" + + ''' + fillins for minutes. + These will be searched in the minutes section and will be replaced + with the appropriate data. + ''' + FILLIN_MINUTES_TITLE = "<minutes-title>" + FILLIN_MINUTES_LOCATION = "<minutes-location>" + FILLIN_MINUTES_DATE = "<minutes-date>" + FILLIN_MINUTES_TIME = "<minutes-time>" + ''' + Minutes-topic fillins + These will be searched in the minutes-child-section, and + will be replaced with topic data. + ''' + FILLIN_MINUTE_NUM = "<mnum>" + FILLIN_MINUTE_TOPIC = "<mtopic>" + FILLIN_MINUTE_RESPONSIBLE = "<mresponsible>" + FILLIN_MINUTE_TIME = "<mtime>" diff --git a/wizards/com/sun/star/wizards/agenda/TopicsControl.py b/wizards/com/sun/star/wizards/agenda/TopicsControl.py new file mode 100644 index 000000000..6e269f6bf --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/TopicsControl.py @@ -0,0 +1,857 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +from ..ui.ControlScroller import ControlScroller, PropertyNames, traceback, \ + HelpIds +from .AgendaWizardDialogConst import HID +from ..common.Properties import Properties +from ..ui.event.CommonListener import FocusListenerProcAdapter, \ + KeyListenerProcAdapter + +from com.sun.star.awt.Key import DOWN, UP, TAB +from com.sun.star.awt.KeyModifier import SHIFT, MOD1 + +''' +This class implements the UI functionality of the topics scroller control. +<br/> +During development, there has been a few changes which were not *fully* done +mainly in converting the topics and time boxes +from combobox and time box to normal textboxes, +so in the code they might be referenced as combobox or timebox. This should be +rather understood as topicstextbox and timetextbox.<br/><br/> +Important behaviour of this control is that there is always a +blank row at the end, in which the user can enter data.<br/> +Once the row is not blank (thus, the user entered data...), +a new blank row is added.<br/> +Once the user removes the last *unempty* row, binsertRowy deleting its data, it becomes +the *last empty row* and the one after is being automatically removed.<br/><br/> +The control shows 5 rows at a time.<br/> +If, for example, only 2 rows exist (from which the 2ed one is empty...) +then the other three rows, which do not exist in the data model, are disabled. +<br/> +The following other functionality is implemented: +<br/> +0. synchronizing data between controls, data model and live preview. +1. Tab scrolling.<br/> +2. Keyboard scrolling.<br/> +3. Removing rows and adding new rows.<br/> +4. Moving rows up and down. <br/> +<br/> +This control relays on the ControlScroller control which uses the following +Data model:<br/> +1. It uses a vector, whose members are arrays of PropertyValue.<br/> +2. Each array represents a row.<br/> +(Note: the Name and Value members of the PropertyValue object are being used) +3. Each property Value represents a value +for a single control with the following rules:<br/> +3. a. the Value of the property is used for as value +of the controls (usually text).<br/> +3. b. the Name of the property is used to map values +to UI controls in the following manner:<br/> +3. b. 1. only the Name of the first X Rows is regarded, +where X is the number of visible rows (in the ainsertRowgenda wizard this would be 5, +since 5 topic rows are visible on the dialog).<br/> +3. b. 2. The Names of the first X (or 5...) rows are the names +of the UI Controls to hold values. When the control scroller scrolls, +it looks at the first 5 rows and uses the names specified there to map the +current values to the specified controls. <br/> +This data model makes the following limitations on the implementation: +When moving rows, only the values should be moved. The Rows objects, +which contain also the Names of the controls should not be switched. <br/> +also when deleting or inserting rows, attention should be paid that no rows +should be removed or inserted. Instead, only the Values should rotate. <br/><br/> +To save the topics in the registry a ConfigSet of objects of type CGTopic is +being used. +This one is not synchronized "live", since it is unnecessary... instead, it is +synchronized on call, before the settings should be saved. +''' + +class TopicsControl(ControlScroller): + + LABEL = "lblTopicCnt_" + TOPIC = "txtTopicTopic_" + RESP = "cbTopicResp_" + TIME = "txtTopicTime_" + LABEL_PROPS = (PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + TEXT_PROPS = (PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + + def __init__(self, dialog, xmsf, agenda): + try: + super(TopicsControl, self).__init__( + dialog, xmsf, 5, 92, 38, 212, 5, 18, HID + 32) + self.dialog = dialog + #fill preview's table + self.initializeScrollFields(agenda) + #fill gui's table + self.fillupControls(True) + self.nscrollvalue = 0 + self.lastFocusRow = 0 + self.lastFocusControl = None + # set some focus listeners for TAB scroll down and up... + # prepare scroll down on tab press... + self.lastTime = \ + self.ControlGroupVector[self.nblockincrement - 1].timebox + + self.lastTime.addKeyListener(KeyListenerProcAdapter( + self.lastControlKeyPressed)) + #prepare scroll up on tab press... + self.firstTopic = self.ControlGroupVector[0].textbox + self.firstTopic.addKeyListener(KeyListenerProcAdapter( + self.firstControlKeyPressed)) + self.enableButtons() + except Exception: + traceback.print_exc() + + ''' + initializes the data of the control. + ''' + + def initializeScrollFields(self, agenda): + # create a row for each topic with the given values... + for index,item in enumerate(agenda.cp_Topics.childrenList): + row = self.newRow(index) + item.setDataToRow(row) + # a parent class method + self.registerControlGroup(row, index) + self.updateDocumentRow(index) + # inserts a blank row at the end... + self.insertRowAtEnd() + + ''' + Insert a blank (empty) row + as last row of the control. + The control has always a blank row at the + end, which enables the user to enter data... + ''' + + def insertRowAtEnd(self): + l = len(self.scrollfields) + self.registerControlGroup(self.newRow(l), l) + self.setTotalFieldCount(l + 1) + # if the new row is visible, it must have been disabled + # so it should be now enabled... + if l - self.nscrollvalue < self.nblockincrement: + self.ControlGroupVector[l - self.nscrollvalue].\ + setEnabled(True) + + def saveTopics(self, agenda): + # last row is always empty + agenda.cp_Topics.childrenList = self.scrollfields[:-1] + + ''' + remove the last row + ''' + + def removeLastRow(self): + l = len(self.scrollfields) + # if we should scroll up... + if (l - self.nscrollvalue) >= 1 \ + and (l - self.nscrollvalue) <= self.nblockincrement \ + and self.nscrollvalue > 0: + while (l - self.nscrollvalue >= 1) \ + and l - self.nscrollvalue <= self.nblockincrement \ + and self.nscrollvalue > 0: + self.setScrollValue(self.nscrollvalue - 1) + # if we should disable a row... + elif self.nscrollvalue == 0 and l - 1 < self.nblockincrement: + self.ControlGroupVector[l - 1].setEnabled(False) + + self.unregisterControlGroup(l - 1) + self.setTotalFieldCount(l - 1) + + ''' + in order to use the "move up", "down" "insert" and "remove" buttons, + we track the last control the gained focus, in order to know which + row should be handled. + @param fe + ''' + + def focusGained(self, fe): + xc = fe.Source + self.focusGained2(xc) + + ''' + Sometimes I set the focus programmatically to a control + (for example when moving a row up or down, the focus should move + with it). + In such cases, no VCL event is being triggered so it must + be called programmatically. + This is done by this method. + @param control + ''' + + def focusGained2(self, control): + try: + #calculate in which row we are... + name = control.Model.Name + num = name[name.index("_") + 1:] + self.lastFocusRow = int(num) + self.nscrollvalue + self.lastFocusControl = control + # enable/disable the buttons... + self.enableButtons() + except Exception: + traceback.print_exc() + + ''' + enable or disable the buttons according to the + current row we are in. + ''' + + def enableButtons(self): + self.CurUnoDialog.btnInsert.Model.Enabled = \ + self.lastFocusRow < len(self.scrollfields) + self.CurUnoDialog.btnRemove.Model.Enabled = \ + self.lastFocusRow < len(self.scrollfields) - 1 + if self.lastFocusControl is not None: + self.CurUnoDialog.btnUp.Model.Enabled = self.lastFocusRow > 0 + self.CurUnoDialog.btnDown.Model.Enabled = \ + self.lastFocusRow < len(self.scrollfields) - 1 + else: + self.CurUnoDialog.btnUp.Model.Enabled = False + self.CurUnoDialog.btnDown.Model.Enabled = False + + ''' + Removes the current row. + See general class documentation explanation about the + data model used and the limitations which explain the implementation here. + ''' + + def removeRow(self): + try: + for i in range(self.lastFocusRow, + len(self.scrollfields) - 1): + pv1 = self.scrollfields[i] + pv2 = self.scrollfields[i + 1] + pv1[1].Value = pv2[1].Value + pv1[2].Value = pv2[2].Value + pv1[3].Value = pv2[3].Value + self.updateDocumentRow(i) + if i - self.nscrollvalue < self.nblockincrement: + self.fillupControl(i - self.nscrollvalue) + + self.removeLastRow() + # update the live preview background document + self.reduceDocumentToTopics() + self.enableButtons() + if self.lastFocusControl is not None: + # the focus should return to the edit control + self.focus(self.lastFocusControl) + except Exception: + traceback.print_exc() + + ''' + Inserts a row before the current row. + See general class documentation explanation about the + data model used and the limitations which explain the implementation here. + ''' + + def insertRow(self): + try: + self.insertRowAtEnd() + for i in range(len(self.scrollfields) - 2, + self.lastFocusRow, -1): + pv1 = self.scrollfields[i] + pv2 = self.scrollfields[i - 1] + pv1[1].Value = pv2[1].Value + pv1[2].Value = pv2[2].Value + pv1[3].Value = pv2[3].Value + self.updateDocumentRow(i) + if i - self.nscrollvalue < self.nblockincrement: + self.fillupControl(i - self.nscrollvalue) + + # after rotating all the properties from this row on, + # we clear the row, so it is practically a new one... + pv1 = self.scrollfields[self.lastFocusRow] + pv1[1].Value = "" + pv1[2].Value = "" + pv1[3].Value = "" + # update the preview document. + self.updateDocumentRow(self.lastFocusRow) + self.fillupControl( + self.lastFocusRow - self.nscrollvalue) + self.enableButtons() + + if self.lastFocusControl is not None: + self.focus(self.lastFocusControl) + except Exception: + traceback.print_exc() + + ''' + create a new row with the given index. + The index is important because it is used in the + Name member of the PropertyValue objects. + To know why see general class documentation above (data model explanation) + @param i the index of the new row + @return + ''' + + def newRow(self, i): + pv = list(range(4)) + pv[0] = Properties.createProperty( + TopicsControl.LABEL + str(i), "" + str(i + 1) + ".") + pv[1] = Properties.createProperty(TopicsControl.TOPIC + str(i), "") + pv[2] = Properties.createProperty(TopicsControl.RESP + str(i), "") + pv[3] = Properties.createProperty(TopicsControl.TIME + str(i), "") + return pv + + ''' + Implementation of ControlScroller + This is a UI method which inserts a new row to the control. + It uses the child-class ControlRow. (see below). + ''' + + def insertControlGroup(self, _index, npos): + oControlRow = ControlRow( + self.CurUnoDialog, self.iCompPosX, npos, _index, + ControlRow.tabIndex, self) + self.ControlGroupVector.append(oControlRow) + ControlRow.tabIndex += 4 + + ''' + Checks if a row is empty. + This is used when the last row is changed. + If it is empty, the next row (which is always blank) is removed. + If it is not empty, a next row must exist. + @param row the index number of the row to check. + @return true if empty. false if not. + ''' + + def isRowEmpty(self, row): + data = self.getTopicData(row) + # now - is this row empty? + return not data[1].Value and not data[2].Value and not data[3].Value + + ''' + update the preview document and + remove/insert rows if needed. + @param guiRow + @param column + ''' + + def fieldChanged(self, guiRow, column): + try: + # First, I update the document + data = self.getTopicData(guiRow + self.nscrollvalue) + if data is None: + return + self.updateDocumentCell( + guiRow + self.nscrollvalue, column, data) + if self.isRowEmpty(guiRow + self.nscrollvalue): + ''' + if this is the row before the last one + (the last row is always empty) + delete the last row... + ''' + if (guiRow + self.nscrollvalue) \ + == len(self.scrollfields) - 2: + self.removeLastRow() + '''now consequently check the last two rows, + and remove the last one if they are both empty. + (actually I check always the "before last" row, + because the last one is always empty... + ''' + while len(self.scrollfields) > 1 \ + and self.isRowEmpty( + len(self.scrollfields) - 2): + self.removeLastRow() + cr = self.ControlGroupVector[ + len(self.scrollfields) - \ + self.nscrollvalue - 1] + # if a remove was performed, set focus + #to the last row with some data in it... + self.focus(self.getControlByIndex(cr, column)) + # update the preview document. + self.reduceDocumentToTopics() + else: + # row contains data + # is this the last row? + if (guiRow + self.nscrollvalue + 1) \ + == len(self.scrollfields): + self.insertRowAtEnd() + + except Exception: + traceback.print_exc() + + ''' + return the corresponding row data for the given index. + @param topic index of the topic to get. + @return a PropertyValue array with the data for the given topic. + ''' + + def getTopicData(self, topic): + if topic < len(self.scrollfields): + return self.scrollfields[topic] + else: + return None + + ''' + If the user presses tab on the last control, and + there *are* more rows in the model, scroll down. + @param event + ''' + + def lastControlKeyPressed(self, event): + # if tab without shift was pressed... + try: + if event.KeyCode == TAB and event.Modifiers == 0: + # if there is another row... + if (self.nblockincrement + self.nscrollvalue) \ + < len(self.scrollfields): + self.setScrollValue(self.nscrollvalue + 1) + self.focus(self.getControlByIndex(self.ControlGroupVector[4], 1)) + except Exception: + traceback.print_exc() + + ''' + If the user presses shift-tab on the first control, and + there *are* more rows in the model, scroll up. + @param event + ''' + + def firstControlKeyPressed(self, event): + # if tab with shift was pressed... + if (event.KeyCode == TAB) and \ + (event.Modifiers == SHIFT): + if self.nscrollvalue > 0: + self.setScrollValue(self.nscrollvalue - 1) + self.focus(self.lastTime) + + ''' + sets focus to the given control. + @param textControl + ''' + + def focus(self, textControl): + textControl.setFocus() + text = textControl.Text + textControl.Selection = uno.createUnoStruct( \ + 'com.sun.star.awt.Selection', 0, len(text)) + self.focusGained2(textControl) + + ''' + moves the given row one row down. + @param guiRow the gui index of the row to move. + @param control the control to gain focus after moving. + ''' + + def rowDown(self, guiRow=None, control=None): + try: + if guiRow is None: + guiRow = self.lastFocusRow - self.nscrollvalue + if control is None: + control = self.lastFocusControl + # only perform if this is not the last row. + actuallRow = guiRow + self.nscrollvalue + if actuallRow + 1 < len(self.scrollfields): + # get the current selection + selection = control.Selection + # the last row should scroll... + scroll = (guiRow == self.nblockincrement - 1) + if scroll: + self.setScrollValue(self.nscrollvalue + 1) + + scroll1 = self.nscrollvalue + if scroll: + aux = -1 + else: + aux = 1 + self.switchRows(guiRow, guiRow + aux) + if self.nscrollvalue != scroll1: + guiRow += (self.nscrollvalue - scroll1) + + self.setSelection(guiRow + (not scroll), control, selection) + except Exception: + traceback.print_exc() + + ''' + move the current row up + ''' + + def rowUp(self, guiRow=None, control=None): + try: + if guiRow is None: + guiRow = self.lastFocusRow - self.nscrollvalue + if control is None: + control = self.lastFocusControl + # only perform if this is not the first row + actuallRow = guiRow + self.nscrollvalue + if actuallRow > 0: + # get the current selection + selection = control.Selection + # the last row should scroll... + scroll = (guiRow == 0) + if scroll: + self.setScrollValue(self.nscrollvalue - 1) + if scroll: + aux = 1 + else: + aux = -1 + self.switchRows(guiRow, guiRow + aux) + self.setSelection(guiRow - (not scroll), control, selection) + except Exception: + traceback.print_exc() + + ''' + moves the cursor up. + @param guiRow + @param control + ''' + + def cursorUp(self, guiRow, control): + # is this the last full row ? + actuallRow = guiRow + self.nscrollvalue + #if this is the first row + if actuallRow == 0: + return + # the first row should scroll... + + scroll = (guiRow == 0) + if scroll: + self.setScrollValue(self.nscrollvalue - 1) + upperRow = self.ControlGroupVector[guiRow] + else: + upperRow = self.ControlGroupVector[guiRow - 1] + + self.focus(self.getControl(upperRow, control)) + + ''' + moves the cursor down + @param guiRow + @param control + ''' + + def cursorDown(self, guiRow, control): + # is this the last full row ? + actuallRow = guiRow + self.nscrollvalue + #if this is the last row, exit + if actuallRow == len(self.scrollfields) - 1: + return + # the first row should scroll... + + scroll = (guiRow == self.nblockincrement - 1) + if scroll: + self.setScrollValue(self.nscrollvalue + 1) + lowerRow = self.ControlGroupVector[guiRow] + else: + # if we scrolled we are done... + #otherwise... + lowerRow = self.ControlGroupVector[guiRow + 1] + + self.focus(self.getControl(lowerRow, control)) + + ''' + changes the values of the given rows with each other + @param row1 one can figure out what this parameter is... + @param row2 one can figure out what this parameter is... + ''' + + def switchRows(self, row1, row2): + o1 = self.scrollfields[row1 + self.nscrollvalue] + o2 = self.scrollfields[row2 + self.nscrollvalue] + temp = None + for i in range(1, len(o1)): + temp = o1[i].Value + o1[i].Value = o2[i].Value + o2[i].Value = temp + self.fillupControl(row1) + self.fillupControl(row2) + self.updateDocumentRow(row1 + self.nscrollvalue, o1) + self.updateDocumentRow(row2 + self.nscrollvalue, o2) + + ''' + if we changed the last row, add another one... + ''' + if (row1 + self.nscrollvalue + 1 == \ + len(self.scrollfields)) \ + or (row2 + self.nscrollvalue + 1 == \ + len(self.scrollfields)): + + self.insertRowAtEnd() + ''' + if we did not change the last row but + we did change the one before - check if we + have two empty rows at the end. + If so, delete the last one... + ''' + elif (row1 + self.nscrollvalue) + \ + (row2 + self.nscrollvalue) \ + == (len(self.scrollfields) * 2 - 5): + if self.isRowEmpty(len(self.scrollfields) - 2) \ + and self.isRowEmpty( + len(self.scrollfields) - 1): + self.removeLastRow() + self.reduceDocumentToTopics() + + ''' + sets a text selection to a given control. + This is used when one moves a row up or down. + After moving row X to X+/-1, the selection (or cursor position) of the + last focused control should be restored. + The control's row is the given guiRow. + The control's column is detected according to the given event. + This method is called as subsequent to different events, + thus it is comfortable to use the event here to detect the column, + rather than in the different event methods. + @param guiRow the row of the control to set the selection to. + @param eventSource helps to detect + the control's column to set the selection to. + @param s the selection object to set. + ''' + + def setSelection(self, guiRow, eventSource, s): + cr = self.ControlGroupVector[guiRow] + control = self.getControl(cr, eventSource) + control.setFocus() + control.setSelection(s) + + ''' + returns a control out of the given row, according to a column number. + @param cr control row object. + @param column the column number. + @return the control... + ''' + + def getControlByIndex(self, cr, column): + tmp_switch_var1 = column + if tmp_switch_var1 == 0: + return cr.label + elif tmp_switch_var1 == 1: + return cr.textbox + elif tmp_switch_var1 == 2: + return cr.combobox + elif tmp_switch_var1 == 3: + return cr.timebox + else: + raise Exception("No such column"); + + '''getControl + returns a control out of the given row, which is + in the same column as the given control. + @param cr control row object + @param control a control indicating a column. + @return + ''' + + def getControl(self, cr, control): + column = self.getColumn(control) + return self.getControlByIndex(cr, column) + + ''' + returns the column number of the given control. + @param control + @return + ''' + + def getColumn(self, control): + name = control.Model.Name + if name.startswith(TopicsControl.TOPIC): + return 1 + if name.startswith(TopicsControl.RESP): + return 2 + if name.startswith(TopicsControl.TIME): + return 3 + if name.startswith(TopicsControl.LABEL): + return 0 + return -1 + + ''' + update the given row in the preview document with the given data. + @param row + @param data + ''' + + def updateDocumentRow(self, row, data=None): + if data is None: + data = self.scrollfields[row] + try: + for i in range(len(data)): + self.CurUnoDialog.myAgendaDoc.topics.writeCell( + row, i, data) + except Exception: + traceback.print_exc() + + ''' + updates a single cell in the preview document. + Is called when a single value is changed, since we really + don't have to update the whole row for one small change... + @param row the data row to update (topic number). + @param column the column to update (a gui column, not a document column). + @param data the data of the entire row. + ''' + + def updateDocumentCell(self, row, column, data): + try: + self.CurUnoDialog.myAgendaDoc.topics.writeCell( + row, column, data) + except Exception: + traceback.print_exc() + + ''' + when removing rows, this method updates + the preview document to show the number of rows + according to the data model. + ''' + + def reduceDocumentToTopics(self): + try: + self.CurUnoDialog.myAgendaDoc.topics.reduceDocumentTo( + len(self.scrollfields) - 1) + except Exception: + traceback.print_exc() + +''' +A class represting a single GUI row. +Note that the instance methods of this class +are being called and handle controls of +a single row. +''' + +class ControlRow(object): + + tabIndex = 520 + ''' + constructor. Create the row in the given dialog given coordinates, + with the given offset (row number) and tabindex. + Note that since I use this specifically for the agenda wizard, + the step and all control coordinates inside the + row are constant (5). + ''' + + def __init__(self, dialog, x, y, i, tabindex, topicsControl): + self.offset = i + self.dialog = dialog + self.topicsControl = topicsControl + self.label = self.dialog.insertLabel( + self.topicsControl.LABEL + str(i), + self.topicsControl.LABEL_PROPS, + (8, "" + str(i + 1) + ".", + x + 4, y + 2, self.topicsControl.iStep, tabindex, 10)) + self.textbox = self.dialog.insertTextField( + self.topicsControl.TOPIC + str(i), "topicTextChanged", + self.topicsControl.TEXT_PROPS, + (12, HelpIds.getHelpIdString(self.topicsControl.curHelpIndex + i * 3 + 1), + x + 15, y, self.topicsControl.iStep, tabindex + 1, 84), self) + self.combobox = self.dialog.insertTextField( + self.topicsControl.RESP + str(i), "responsibleTextChanged", + self.topicsControl.TEXT_PROPS, + (12, HelpIds.getHelpIdString(self.topicsControl.curHelpIndex + i * 3 + 2), + x + 103, y, self.topicsControl.iStep, tabindex + 2, 68), self) + self.timebox = self.dialog.insertTextField( + self.topicsControl.TIME + str(i), "timeTextChanged", + self.topicsControl.TEXT_PROPS, + (12, HelpIds.getHelpIdString(self.topicsControl.curHelpIndex + i * 3 + 3), + x + 175, y, self.topicsControl.iStep, tabindex + 3, 20), self) + self.setEnabled(False) + self.textbox.addKeyListener(KeyListenerProcAdapter(self.keyPressed)) + self.combobox.addKeyListener(KeyListenerProcAdapter(self.keyPressed)) + self.timebox.addKeyListener(KeyListenerProcAdapter(self.keyPressed)) + self.textbox.addFocusListener(FocusListenerProcAdapter( + self.topicsControl.focusGained)) + self.combobox.addFocusListener(FocusListenerProcAdapter( + self.topicsControl.focusGained)) + self.timebox.addFocusListener(FocusListenerProcAdapter( + self.topicsControl.focusGained)) + + def topicTextChanged(self): + try: + # update the data model + self.topicsControl.fieldInfo(self.offset, 1) + # update the preview document + self.topicsControl.fieldChanged(self.offset, 1) + except Exception: + traceback.print_exc() + + ''' + called through an event listener when the + responsible text is changed by the user. + updates the data model and the preview document. + ''' + + def responsibleTextChanged(self): + try: + # update the data model + self.topicsControl.fieldInfo(self.offset, 2) + # update the preview document + self.topicsControl.fieldChanged(self.offset, 2) + except Exception: + traceback.print_exc() + + ''' + called through an event listener when the + time text is changed by the user. + updates the data model and the preview document. + ''' + + def timeTextChanged(self): + try: + # update the data model + self.topicsControl.fieldInfo(self.offset, 3) + # update the preview document + self.topicsControl.fieldChanged(self.offset, 3) + except Exception: + traceback.print_exc() + + ''' + enables/disables the row. + @param enabled true for enable, false for disable. + ''' + + def setEnabled(self, enabled): + self.label.Model.Enabled = enabled + self.textbox.Model.Enabled = enabled + self.combobox.Model.Enabled = enabled + self.timebox.Model.Enabled = enabled + + ''' + Implementation of XKeyListener. + Optionally performs the one of the following: + cursor up, or down, row up or down + ''' + + def keyPressed(self, event): + try: + if self.isMoveDown(event): + self.topicsControl.rowDown(self.offset, event.Source) + elif self.isMoveUp(event): + self.topicsControl.rowUp(self.offset, event.Source) + elif self.isDown(event): + self.topicsControl.cursorDown(self.offset, event.Source) + elif self.isUp(event): + self.topicsControl.cursorUp(self.offset, event.Source) + + self.topicsControl.enableButtons() + except Exception: + traceback.print_exc() + + def isMoveDown(self, e): + return (e.KeyCode == DOWN) and (e.Modifiers == MOD1) + + def isMoveUp(self, e): + return (e.KeyCode == UP) and (e.Modifiers == MOD1) + + def isDown(self, e): + return (e.KeyCode == DOWN) and (e.Modifiers == 0) + + def isUp(self, e): + return (e.KeyCode == UP) and (e.Modifiers == 0) diff --git a/wizards/com/sun/star/wizards/agenda/__init__.py b/wizards/com/sun/star/wizards/agenda/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/__init__.py diff --git a/wizards/com/sun/star/wizards/agenda/agenda.component b/wizards/com/sun/star/wizards/agenda/agenda.component new file mode 100644 index 000000000..5778ae32f --- /dev/null +++ b/wizards/com/sun/star/wizards/agenda/agenda.component @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> +<component loader="com.sun.star.loader.Python" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.wizards.agenda.CallWizard"> + <service name="com.sun.star.task.Job"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/common/ConfigGroup.py b/wizards/com/sun/star/wizards/common/ConfigGroup.py new file mode 100644 index 000000000..200d4ef9d --- /dev/null +++ b/wizards/com/sun/star/wizards/common/ConfigGroup.py @@ -0,0 +1,59 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import inspect + +class ConfigGroup(object): + + root = None + + def __init__(self): + self.root = None + + def writeConfiguration(self, configurationView, param): + for name,data in inspect.getmembers(self): + if name.startswith(param): + self.writeField( name, configurationView, param) + + def writeField(self, field, configView, prefix): + propertyName = field[len(prefix):] + child = getattr(self, field) + if isinstance(child, ConfigGroup): + child.writeConfiguration(configView.getByName(propertyName), + prefix) + else: + setattr(configView,propertyName,getattr(self,field)) + + def readConfiguration(self, configurationView, param): + for name,data in inspect.getmembers(self): + if name.startswith(param): + self.readField( name, configurationView, param) + + def readField(self, field, configView, prefix): + propertyName = field[len(prefix):] + child = getattr(self, field) + if isinstance(child, ConfigGroup): + child.setRoot(self.root); + child.readConfiguration(configView.getByName(propertyName), + prefix) + else: + value = configView.getByName(propertyName) + if value is not None: + setattr(self,field, value) + + def setRoot(self, newRoot): + self.root = newRoot diff --git a/wizards/com/sun/star/wizards/common/ConfigSet.py b/wizards/com/sun/star/wizards/common/ConfigSet.py new file mode 100644 index 000000000..d4cc7e488 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/ConfigSet.py @@ -0,0 +1,67 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from .ConfigGroup import ConfigGroup + +class ConfigSet(ConfigGroup): + ''' + After reading the configuration set items, + the ConfigSet checks this field. + If it is true, it will remove any nulls from + the vector. + subclasses can change this field in the constructor + to avoid this "deletion" of nulls. + ''' + + def __init__(self, childType): + self.childType = childType + self.childrenList = [] + self.childrenListLen = 0 + + def writeConfiguration(self, configurationView, param): + for i in range(self.childrenListLen): + #remove previous configuration + configurationView.removeByName(i) + for index,item in enumerate(self.childrenList): + try: + childView = configurationView.createInstance() + configurationView.insertByName(index, childView) + if callable( self.childType ): + topic = self.childType() + topic.cp_Index = item[0].Value + topic.cp_Topic = item[1].Value + topic.cp_Responsible = item[2].Value + topic.cp_Time = item[3].Value + topic.writeConfiguration(childView, param) + except Exception: + traceback.print_exc() + + def readConfiguration(self, configurationView, param): + #each iteration represents a Topic row + names = configurationView.ElementNames + if names: + for i in names: + try: + if callable( self.childType ): + topic = self.childType() + topic.readConfiguration( + configurationView.getByName(i), param) + self.childrenList.append(topic) + except Exception: + traceback.print_exc() + self.childrenListLen = len(self.childrenList) diff --git a/wizards/com/sun/star/wizards/common/Configuration.java b/wizards/com/sun/star/wizards/common/Configuration.java new file mode 100644 index 000000000..c206a4014 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Configuration.java @@ -0,0 +1,201 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.beans.*; +import com.sun.star.container.*; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.Locale; + +/** + * This class gives access to the OO configuration API. + * <p>It contains 4 get and 4 set convenience methods for getting and settings properties + * in the configuration.</p> + * <p>For the get methods, two parameters must be given: name and parent, where name is the + * name of the property, parent is a HierarchyElement (::com::sun::star::configuration::HierarchyElement)</p> + * <p>The get and set methods support hierarchical property names like "options/gridX". </p> + * <p>NOTE: not yet supported, but sometime later, + * If you will omit the "parent" parameter, then the "name" parameter must be in hierarchy form from + * the root of the registry.</p> + */ +public abstract class Configuration +{ + + public static Object getConfigurationRoot(XMultiServiceFactory xmsf, String sPath, boolean updateable) throws com.sun.star.uno.Exception + { + + Object oConfigProvider; + oConfigProvider = xmsf.createInstance("com.sun.star.configuration.ConfigurationProvider"); + XMultiServiceFactory confMsf = UnoRuntime.queryInterface(XMultiServiceFactory.class, oConfigProvider); + + final String sView = updateable ? "com.sun.star.configuration.ConfigurationUpdateAccess" : "com.sun.star.configuration.ConfigurationAccess"; + + Object args[] = new Object[1]; + + PropertyValue aPathArgument = new PropertyValue(); + aPathArgument.Name = "nodepath"; + aPathArgument.Value = sPath; + + args[0] = aPathArgument; + + return confMsf.createInstanceWithArguments(sView, args); + } + + public static String getProductName(XMultiServiceFactory xMSF) + { + try + { + Object oProdNameAccess = getConfigurationRoot(xMSF, "org.openoffice.Setup/Product", false); + return (String) Helper.getUnoObjectbyName(oProdNameAccess, "ooName"); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + private static String getLocaleString(XMultiServiceFactory xMSF, String root, String key) + { + String sLocale = PropertyNames.EMPTY_STRING; + try + { + Object oMasterKey = getConfigurationRoot(xMSF, root, false); + sLocale = (String) Helper.getUnoObjectbyName(oMasterKey, key); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + if (sLocale.length() == 0 && (!key.equals("Locale") || !root.equals("org.openoffice.System/L10N/"))) + { + return getLocaleString(xMSF, "org.openoffice.System/L10N/", "Locale"); + } + return sLocale; + } + + private static Locale getLocale(XMultiServiceFactory xMSF, String root, String key) + { + Locale aLocLocale = new Locale(); + String sLocale = getLocaleString(xMSF, root, key); + String[] sLocaleList = JavaTools.ArrayoutofString(sLocale, "-"); + aLocLocale.Language = sLocaleList[0]; + if (sLocaleList.length > 1) + { + aLocLocale.Country = sLocaleList[1]; + } + return aLocLocale; + } + + public static Locale getLocale(XMultiServiceFactory xMSF) + { + return getLocale(xMSF, "org.openoffice.Setup/L10N/", "ooSetupSystemLocale"); + } + + public static Locale getUILocale(XMultiServiceFactory xMSF) + { + return getLocale(xMSF, "org.openoffice.Setup/L10N/", "ooLocale"); + } + + public static String[] getNodeDisplayNames(XNameAccess _xNameAccessNode) + { + return getNodeChildNames(_xNameAccessNode, PropertyNames.PROPERTY_NAME); + } + + public static String[] getNodeChildNames(XNameAccess xNameAccessNode, String _schildname) + { + String[] snames = null; + try + { + snames = xNameAccessNode.getElementNames(); + String[] sdisplaynames = new String[snames.length]; + for (int i = 0; i < snames.length; i++) + { + Object oContent = Helper.getUnoPropertyValue(xNameAccessNode.getByName(snames[i]), _schildname); + if (!AnyConverter.isVoid(oContent)) + { + sdisplaynames[i] = (String) Helper.getUnoPropertyValue(xNameAccessNode.getByName(snames[i]), _schildname); + } + else + { + sdisplaynames[i] = snames[i]; + } + } + return sdisplaynames; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return snames; + } + } + + public static XNameAccess getChildNodebyIndex(XNameAccess _xNameAccess, int _index) throws com.sun.star.uno.Exception + { + String[] snames = _xNameAccess.getElementNames(); + Object oNode = _xNameAccess.getByName(snames[_index]); + return UnoRuntime.queryInterface(XNameAccess.class, oNode); + } + + public static XNameAccess getChildNodebyName(XNameAccess _xNameAccessNode, String _SubNodeName) + { + try + { + if (_xNameAccessNode.hasByName(_SubNodeName)) + { + return UnoRuntime.queryInterface(XNameAccess.class, _xNameAccessNode.getByName(_SubNodeName)); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } + + public static XNameAccess getChildNodebyDisplayName(XMultiServiceFactory _xMSF, Locale _aLocale, XNameAccess _xNameAccessNode, String _displayname, String _nodename, int _nmaxcharcount) + { + String[] snames = null; + try + { + snames = _xNameAccessNode.getElementNames(); + for (int i = 0; i < snames.length; i++) + { + String curdisplayname = (String) Helper.getUnoPropertyValue(_xNameAccessNode.getByName(snames[i]), _nodename); + if ((_nmaxcharcount > 0) && (_nmaxcharcount < curdisplayname.length())) + { + curdisplayname = curdisplayname.substring(0, _nmaxcharcount); + } + curdisplayname = Desktop.removeSpecialCharacters(_xMSF, _aLocale, curdisplayname); + + if (curdisplayname.equals(_displayname)) + { + return UnoRuntime.queryInterface(XNameAccess.class, _xNameAccessNode.getByName(snames[i])); + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } +} diff --git a/wizards/com/sun/star/wizards/common/Configuration.py b/wizards/com/sun/star/wizards/common/Configuration.py new file mode 100644 index 000000000..91274e0b2 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Configuration.py @@ -0,0 +1,70 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback + +class Configuration(object): + '''This class gives access to the OO configuration api.''' + + @classmethod + def getConfigurationRoot(self, xmsf, sPath, updateable): + oConfigProvider = xmsf.createInstance( + "com.sun.star.configuration.ConfigurationProvider") + args = [] + + aPathArgument = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + aPathArgument.Name = "nodepath" + aPathArgument.Value = sPath + + args.append(aPathArgument) + + if updateable: + sView = "com.sun.star.configuration.ConfigurationUpdateAccess" + else: + sView = "com.sun.star.configuration.ConfigurationAccess" + + return oConfigProvider.createInstanceWithArguments(sView, tuple(args)) + + @classmethod + def getProductName(self, xMSF): + try: + oProdNameAccess = self.getConfigurationRoot(xMSF, "org.openoffice.Setup/Product", False); + return oProdNameAccess.getByName("ooName") + except Exception: + traceback.print_exc() + return "Unknown" + + @classmethod + def getNode(self, name, parent): + return parent.getByName(name) + + @classmethod + def commit(self, configView): + configView.commitChanges() + + @classmethod + def getInt(self, name, parent): + o = getNode(name, parent) + if (com.sun.star.uno.AnyConverter.isVoid(o)): + return 0 + return com.sun.star.uno.AnyConverter.toInt(o) + + @classmethod + def set(self, value, name, parent): + parent.setHierarchicalPropertyValue(name, value) diff --git a/wizards/com/sun/star/wizards/common/DebugHelper.java b/wizards/com/sun/star/wizards/common/DebugHelper.java new file mode 100644 index 000000000..6f172a2dc --- /dev/null +++ b/wizards/com/sun/star/wizards/common/DebugHelper.java @@ -0,0 +1,35 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.uno.Exception; + +public class DebugHelper +{ + + + public static void exception(Exception ex) throws java.lang.Exception + { +// throw new UnsupportedOperationException("Not supported yet."); + } + + public static void writeInfo(String msg) + { +// throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/wizards/com/sun/star/wizards/common/Desktop.java b/wizards/com/sun/star/wizards/common/Desktop.java new file mode 100644 index 000000000..b19d1f375 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Desktop.java @@ -0,0 +1,286 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiComponentFactory; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XURLTransformer; +import com.sun.star.lang.Locale; +import com.sun.star.bridge.XUnoUrlResolver; +import com.sun.star.comp.helper.Bootstrap; +import com.sun.star.container.XHierarchicalNameAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.frame.*; +import com.sun.star.i18n.KParseType; +import com.sun.star.i18n.ParseResult; +import com.sun.star.i18n.XCharacterClassification; + +public class Desktop +{ + + public static XDesktop getDesktop(XMultiServiceFactory xMSF) + { + com.sun.star.uno.XInterface xInterface = null; + XDesktop xDesktop = null; + if (xMSF != null) + { + try + { + xInterface = (com.sun.star.uno.XInterface) xMSF.createInstance("com.sun.star.frame.Desktop"); + xDesktop = UnoRuntime.queryInterface(XDesktop.class, xInterface); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + else + { + System.out.println("Can't create a desktop. null pointer !"); + } + return xDesktop; + } + + public static XFrame getActiveFrame(XMultiServiceFactory xMSF) + { + XDesktop xDesktop = getDesktop(xMSF); + XFramesSupplier xFrameSuppl = UnoRuntime.queryInterface(XFramesSupplier.class, xDesktop); + return xFrameSuppl.getActiveFrame(); + } + + private static XDispatch getDispatcher(XFrame xFrame, String _stargetframe, com.sun.star.util.URL oURL) + { + try + { + com.sun.star.util.URL[] oURLArray = new com.sun.star.util.URL[1]; + oURLArray[0] = oURL; + XDispatchProvider xDispatchProvider = UnoRuntime.queryInterface(XDispatchProvider.class, xFrame); + return xDispatchProvider.queryDispatch(oURLArray[0], _stargetframe, FrameSearchFlag.ALL); // "_self" + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } + + private static com.sun.star.util.URL getDispatchURL(XMultiServiceFactory xMSF, String _sURL) throws com.sun.star.uno.Exception + { + Object oTransformer = xMSF.createInstance("com.sun.star.util.URLTransformer"); + XURLTransformer xTransformer = UnoRuntime.queryInterface(XURLTransformer.class, oTransformer); + com.sun.star.util.URL[] oURL = new com.sun.star.util.URL[1]; + oURL[0] = new com.sun.star.util.URL(); + oURL[0].Complete = _sURL; + xTransformer.parseStrict(oURL); + return oURL[0]; + } + + private static void dispatchURL(XMultiServiceFactory xMSF, String sURL, XFrame xFrame, String _stargetframe) throws com.sun.star.uno.Exception + { + com.sun.star.util.URL oURL = getDispatchURL(xMSF, sURL); + XDispatch xDispatch = getDispatcher(xFrame, _stargetframe, oURL); + dispatchURL(xDispatch, oURL); + } + + public static void dispatchURL(XMultiServiceFactory xMSF, String sURL, XFrame xFrame) throws com.sun.star.uno.Exception + { + dispatchURL(xMSF, sURL, xFrame, PropertyNames.EMPTY_STRING); + } + + private static void dispatchURL(XDispatch _xDispatch, com.sun.star.util.URL oURL) + { + PropertyValue[] oArg = new PropertyValue[0]; + _xDispatch.dispatch(oURL, oArg); + } + + private static XMultiComponentFactory getMultiComponentFactory() throws com.sun.star.uno.Exception, RuntimeException, java.lang.Exception + { + XComponentContext xcomponentcontext = Bootstrap.createInitialComponentContext(null); + // initial serviceManager + return xcomponentcontext.getServiceManager(); + } + + public static XMultiServiceFactory connect(String connectStr) throws com.sun.star.uno.Exception, com.sun.star.uno.RuntimeException, Exception + { + XMultiComponentFactory componentFactory = getMultiComponentFactory(); + Object xUrlResolver = componentFactory.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", null ); + XUnoUrlResolver urlResolver = UnoRuntime.queryInterface(XUnoUrlResolver.class, xUrlResolver); + return UnoRuntime.queryInterface(XMultiServiceFactory.class, urlResolver.resolve( connectStr ) ); + } + + public static String getIncrementSuffix(XNameAccess xElementContainer, String ElementName) + { + boolean bElementexists = true; + int i = 1; + String sIncSuffix = PropertyNames.EMPTY_STRING; + String BaseName = ElementName; + while (bElementexists) + { + bElementexists = xElementContainer.hasByName(ElementName); + if (bElementexists) + { + i += 1; + ElementName = BaseName + Integer.toString(i); + } + } + if (i > 1) + { + sIncSuffix = Integer.toString(i); + } + return sIncSuffix; + } + + private static String getIncrementSuffix(XHierarchicalNameAccess xElementContainer, String ElementName) + { + boolean bElementexists = true; + int i = 1; + String sIncSuffix = PropertyNames.EMPTY_STRING; + String BaseName = ElementName; + while (bElementexists) + { + bElementexists = xElementContainer.hasByHierarchicalName(ElementName); + if (bElementexists) + { + i += 1; + ElementName = BaseName + Integer.toString(i); + } + } + if (i > 1) + { + sIncSuffix = Integer.toString(i); + } + return sIncSuffix; + } + + private static int checkforfirstSpecialCharacter(XMultiServiceFactory _xMSF, String _sString, Locale _aLocale) + { + try + { + int nStartFlags = com.sun.star.i18n.KParseTokens.ANY_LETTER_OR_NUMBER + com.sun.star.i18n.KParseTokens.ASC_UNDERSCORE; + Object ocharservice = _xMSF.createInstance("com.sun.star.i18n.CharacterClassification"); + XCharacterClassification xCharacterClassification = UnoRuntime.queryInterface(XCharacterClassification.class, ocharservice); + ParseResult aResult = xCharacterClassification.parsePredefinedToken(KParseType.IDENTNAME, _sString, 0, _aLocale, nStartFlags, PropertyNames.EMPTY_STRING, nStartFlags, PropertyNames.SPACE); + return aResult.EndPos; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return -1; + } + } + + public static String removeSpecialCharacters(XMultiServiceFactory _xMSF, Locale _aLocale, String _sname) + { + String snewname = _sname; + int i = 0; + while (i < snewname.length()) + { + i = Desktop.checkforfirstSpecialCharacter(_xMSF, snewname, _aLocale); + if (i < snewname.length()) + { + String sspecialchar = snewname.substring(i, i + 1); + snewname = JavaTools.replaceSubString(snewname, PropertyNames.EMPTY_STRING, sspecialchar); + } + } + return snewname; + } + + /** + * Checks if the passed Element Name already exists in the ElementContainer. If yes it appends a + * suffix to make it unique + * @return a unique Name ready to be added to the container. + */ + public static String getUniqueName(XNameAccess xElementContainer, String sElementName) + { + String sIncSuffix = getIncrementSuffix(xElementContainer, sElementName); + return sElementName + sIncSuffix; + } + + /** + * Checks if the passed Element Name already exists in the ElementContainer. If yes it appends a + * suffix to make it unique + * @return a unique Name ready to be added to the container. + */ + public static String getUniqueName(XHierarchicalNameAccess xElementContainer, String sElementName) + { + String sIncSuffix = getIncrementSuffix(xElementContainer, sElementName); + return sElementName + sIncSuffix; + } + + /** + * Checks if the passed Element Name already exists in the list. If yes it appends a + * suffix to make it unique. + * @return a unique Name not being in the passed list. + */ + public static String getUniqueName(String[] _slist, String _sElementName, String _sSuffixSeparator) + { + if (_slist == null || _slist.length == 0) + { + return _sElementName; + } + String scompname = _sElementName; + int a = 2; + while (true) + { + for (int i = 0; i < _slist.length; i++) + { + if (JavaTools.FieldInList(_slist, scompname) == -1) + { + return scompname; + } + } + scompname = _sElementName + _sSuffixSeparator + a++; + } + } + + + + private static String getTemplatePath(XMultiServiceFactory _xMSF) + { + try + { + return FileAccess.getOfficePath(_xMSF, "Template", "share", "/wizard"); + } + catch (NoValidPathException nopathexception) + { + } + return PropertyNames.EMPTY_STRING; + } + + + + public static String getBitmapPath(XMultiServiceFactory _xMSF) + { + try + { + return FileAccess.combinePaths(_xMSF, getTemplatePath(_xMSF), "/../wizard/bitmap"); + } + catch (NoValidPathException nopathexception) + { + } + return PropertyNames.EMPTY_STRING; + } + + + + + +} diff --git a/wizards/com/sun/star/wizards/common/Desktop.py b/wizards/com/sun/star/wizards/common/Desktop.py new file mode 100644 index 000000000..99c9d60d8 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Desktop.py @@ -0,0 +1,96 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback + +from com.sun.star.frame.FrameSearchFlag import ALL +from com.sun.star.util import URL +from com.sun.star.i18n.KParseTokens import ANY_LETTER_OR_NUMBER, ASC_UNDERSCORE + +class Desktop(object): + + @classmethod + def getDesktop(self, xMSF): + xDesktop = None + if xMSF is not None: + try: + xDesktop = xMSF.createInstance( "com.sun.star.frame.Desktop") + except Exception: + traceback.print_exc() + else: + print ("Can't create a desktop. null pointer !") + return xDesktop + + @classmethod + def getActiveFrame(self, xMSF): + xDesktop = self.getDesktop(xMSF) + return xDesktop.getActiveFrame() + + @classmethod + def getDispatcher(self, xMSF, xFrame, _stargetframe, oURL): + try: + xDispatch = xFrame.queryDispatch(oURL, _stargetframe, ALL) + return xDispatch + except Exception: + traceback.print_exc() + + return None + + @classmethod + def connect(self, connectStr): + localContext = uno.getComponentContext() + resolver = localContext.ServiceManager.createInstanceWithContext( + "com.sun.star.bridge.UnoUrlResolver", localContext) + ctx = resolver.resolve( connectStr ) + orb = ctx.ServiceManager + return orb + + @classmethod + def getIncrementSuffix(self, xElementContainer, sElementName): + bElementexists = True + i = 1 + sIncSuffix = "" + BaseName = sElementName + while bElementexists: + try: + bElementexists = xElementContainer.hasByName(sElementName) + except: + bElementexists = xElementContainer.hasByHierarchicalName( + sElementName) + if bElementexists: + i += 1 + sElementName = BaseName + str(i) + + if i > 1: + sIncSuffix = str(i) + + return sIncSuffix + + ''' + Checks if the passed Element Name already exists in the ElementContainer. + If yes it appends a suffix to make it unique + @param xElementContainer + @param sElementName + @return a unique Name ready to be added to the container. + ''' + + @classmethod + def getUniqueName(self, xElementContainer, sElementName): + sIncSuffix = self.getIncrementSuffix(xElementContainer, sElementName) + return sElementName + sIncSuffix + diff --git a/wizards/com/sun/star/wizards/common/FileAccess.java b/wizards/com/sun/star/wizards/common/FileAccess.java new file mode 100644 index 000000000..1dfb3c90d --- /dev/null +++ b/wizards/com/sun/star/wizards/common/FileAccess.java @@ -0,0 +1,590 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.Locale; +import com.sun.star.uno.Exception; +import com.sun.star.util.XMacroExpander; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Vector; + +import com.sun.star.io.XActiveDataSink; +import com.sun.star.io.XInputStream; +import com.sun.star.io.XTextInputStream; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.ucb.CommandAbortedException; +import com.sun.star.ucb.XFileIdentifierConverter; +import com.sun.star.ucb.XSimpleFileAccess; +import com.sun.star.ucb.XSimpleFileAccess2; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.beans.PropertyValue; +import com.sun.star.document.XDocumentProperties; + +/** + * This class delivers static convenience methods + * to use with ucb SimpleFileAccess service. + * You can also instantiate the class, to encapsulate + * some functionality of SimpleFileAccess. The instance + * keeps a reference to an XSimpleFileAccess and an + * XFileIdentifierConverter, saves the permanent + * overhead of querying for those interfaces, and delivers + * convenience methods for using them. + * These Convenience methods include mainly Exception-handling. + */ +public class FileAccess +{ + + private static String deleteLastSlashfromUrl(String _sPath) + { + if (_sPath.endsWith("/")) + { + return _sPath.substring(0, _sPath.length() - 1); + } + else + { + return _sPath; + } + } + + /** + * Further information on arguments value see in OO Developer Guide, + * chapter 6.2.7 + * @return the respective path of the office application. A probable following "/" at the end is trimmed. + */ + public static String getOfficePath(XMultiServiceFactory xMSF, String sPath) + { + try + { + String ResultPath = PropertyNames.EMPTY_STRING; + XInterface xInterface = (XInterface) xMSF.createInstance("com.sun.star.util.PathSettings"); + ResultPath = com.sun.star.uno.AnyConverter.toString(Helper.getUnoPropertyValue(xInterface, sPath)); + ResultPath = deleteLastSlashfromUrl(ResultPath); + return ResultPath; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return PropertyNames.EMPTY_STRING; + } + } + + /** + * Further information on arguments value see in OO Developer Guide, + * chapter 6.2.7 + * @param sType use "share" or "user". Set to PropertyNames.EMPTY_STRING if not needed eg for the WorkPath; + * In the return Officepath a possible slash at the end is cut off + */ + public static String getOfficePath(XMultiServiceFactory xMSF, String sPath, String sType, String sSearchDir) throws NoValidPathException + { + //This method currently only works with sPath="Template" + + String ResultPath = PropertyNames.EMPTY_STRING; + + String Template_writable = PropertyNames.EMPTY_STRING; + String[] Template_internal; + String[] Template_user; + + boolean bexists = false; + try + { + XInterface xPathInterface = (XInterface) xMSF.createInstance("com.sun.star.util.PathSettings"); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xPathInterface); + String WritePath = PropertyNames.EMPTY_STRING; + String[] ReadPaths = null; + XInterface xUcbInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xUcbInterface); + + Template_writable = (String) xPropertySet.getPropertyValue(sPath + "_writable"); + Template_internal = (String[]) xPropertySet.getPropertyValue(sPath + "_internal"); + Template_user = (String[]) xPropertySet.getPropertyValue(sPath + "_user"); + int iNumEntries = Template_user.length + Template_internal.length + 1; + ReadPaths = new String[iNumEntries]; + int t = 0; + for (int i = 0; i < Template_internal.length; i++) + { + ReadPaths[t] = Template_internal[i]; + t++; + } + for (int i = 0; i < Template_user.length; i++) + { + ReadPaths[t] = Template_user[i]; + t++; + } + ReadPaths[t] = Template_writable; + WritePath = Template_writable; + + if (sType.equalsIgnoreCase("user")) + { + ResultPath = WritePath; + bexists = true; + } + else + { + //find right path using the search sub path + for (int i = 0; i < ReadPaths.length; i++) + { + String tmpPath = ReadPaths[i] + sSearchDir; + if (xSimpleFileAccess.exists(tmpPath)) + { + ResultPath = ReadPaths[i]; + bexists = true; + break; + } + } + } + ResultPath = deleteLastSlashfromUrl(ResultPath); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + ResultPath = PropertyNames.EMPTY_STRING; + } + if (!bexists) + { + throw new NoValidPathException(xMSF, PropertyNames.EMPTY_STRING); + } + return ResultPath; + } + + public static ArrayList<String> getOfficePaths(XMultiServiceFactory xMSF, String _sPath) + { + //This method currently only works with sPath="Template" + + ArrayList<String> aPathList = new ArrayList<String>(); + String Template_writable = PropertyNames.EMPTY_STRING; + String[] Template_internal; + String[] Template_user; + + try + { + XInterface xPathInterface = (XInterface) xMSF.createInstance("com.sun.star.util.PathSettings"); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xPathInterface); + Template_writable = (String) xPropertySet.getPropertyValue(_sPath + "_writable"); + Template_internal = (String[]) xPropertySet.getPropertyValue(_sPath + "_internal"); + Template_user = (String[]) xPropertySet.getPropertyValue(_sPath + "_user"); + + for (int i = 0; i < Template_internal.length; i++) + { + String sPath = Template_internal[i]; + if (sPath.startsWith("vnd.")) + { + String sPathToExpand = sPath.substring("vnd.sun.star.Expand:".length()); + + XMacroExpander xExpander = Helper.getMacroExpander(xMSF); + sPath = xExpander.expandMacros(sPathToExpand); + } + + // if there exists a language in the directory, we try to add the right language + sPath = checkIfLanguagePathExists(xMSF, sPath); + + aPathList.add(sPath); + } + aPathList.addAll(Arrays.asList(Template_user)); + aPathList.add(Template_writable); + // There was a bug here, because we have to search through the whole list of paths + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return aPathList; + } + + private static String checkIfLanguagePathExists(XMultiServiceFactory _xMSF, String _sPath) + { + try + { + Object defaults = _xMSF.createInstance("com.sun.star.text.Defaults"); + Locale aLocale = (Locale) Helper.getUnoStructValue(defaults, "CharLocale"); + if (aLocale == null) + { + aLocale = new com.sun.star.lang.Locale(); + aLocale.Country = java.util.Locale.getDefault().getCountry(); + aLocale.Language = java.util.Locale.getDefault().getLanguage(); + aLocale.Variant = java.util.Locale.getDefault().getVariant(); + } + + String sLanguage = aLocale.Language; + String sCountry = aLocale.Country; + String sVariant = aLocale.Variant; + + // de-DE-Bayrisch + StringBuffer aLocaleAll = new StringBuffer(); + aLocaleAll.append(sLanguage).append('-').append(sCountry).append('-').append(sVariant); + String sPath = _sPath + "/" + aLocaleAll.toString(); + + XInterface xInterface = (XInterface) _xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xInterface); + if (xSimpleFileAccess.exists(sPath)) + { + return sPath; + } + + // de-DE + StringBuffer aLocaleLang_Country = new StringBuffer(); + aLocaleLang_Country.append(sLanguage).append('-').append(sCountry); + sPath = _sPath + "/" + aLocaleLang_Country.toString(); + + if (xSimpleFileAccess.exists(sPath)) + { + return sPath; + } + + // de + StringBuffer aLocaleLang = new StringBuffer(); + aLocaleLang.append(sLanguage); + sPath = _sPath + "/" + aLocaleLang.toString(); + + if (xSimpleFileAccess.exists(sPath)) + { + return sPath; + } + + // the absolute default is en-US or en + sPath = _sPath + "/en-US"; + if (xSimpleFileAccess.exists(sPath)) + { + return sPath; + } + + sPath = _sPath + "/en"; + if (xSimpleFileAccess.exists(sPath)) + { + return sPath; + } + + } + catch (com.sun.star.uno.Exception e) + { + } + + return _sPath; + } + + public static void combinePaths(XMultiServiceFactory xMSF, ArrayList<String> _aFirstPath, String _sSecondPath) + { + for (int i = 0; i < _aFirstPath.size(); ++i) + { + String sOnePath = _aFirstPath.get(i); + sOnePath = addPath(sOnePath, _sSecondPath); + if (isPathValid(xMSF, sOnePath)) + { + _aFirstPath.add(i, sOnePath); + _aFirstPath.remove(i + 1); + } + else + { + _aFirstPath.remove(i); + --i; + } + } + } + + public static boolean isPathValid(XMultiServiceFactory xMSF, String _sPath) + { + boolean bExists = false; + try + { + XInterface xUcbInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xUcbInterface); + bExists = xSimpleFileAccess.exists(_sPath); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return bExists; + } + + public static String combinePaths(XMultiServiceFactory xMSF, String _sFirstPath, String _sSecondPath) throws NoValidPathException + { + boolean bexists = false; + String ReturnPath = PropertyNames.EMPTY_STRING; + try + { + XInterface xUcbInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xUcbInterface); + ReturnPath = _sFirstPath + _sSecondPath; + bexists = xSimpleFileAccess.exists(ReturnPath); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return PropertyNames.EMPTY_STRING; + } + if (!bexists) + { + throw new NoValidPathException(xMSF, PropertyNames.EMPTY_STRING); + } + return ReturnPath; + } + + /** + * We search in all given path for a given file + */ + private static String addPath(String _sPath, String _sPath2) + { + String sNewPath; + if (!_sPath.endsWith("/")) + { + _sPath += "/"; + } + if (_sPath2.startsWith("/")) + { + _sPath2 = _sPath2.substring(1); + } + sNewPath = _sPath + _sPath2; + return sNewPath; + } + + public static String getPathFromList(XMultiServiceFactory xMSF, ArrayList<String> _aList, String _sFile) + { + String sFoundFile = PropertyNames.EMPTY_STRING; + try + { + XInterface xInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + com.sun.star.ucb.XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xInterface); + + for (int i = 0; i < _aList.size(); i++) + { + String sPath = _aList.get(i); + sPath = addPath(sPath, _sFile); + if (xSimpleFileAccess.exists(sPath)) + { + sFoundFile = sPath; + } + } + } + catch (com.sun.star.uno.Exception e) + { + } + return sFoundFile; + } + + public static String[][] getFolderTitles(com.sun.star.lang.XMultiServiceFactory xMSF, String _sStartFilterName, ArrayList<String> FolderNames) + throws NoValidPathException + { + return getFolderTitles(xMSF, _sStartFilterName, FolderNames, PropertyNames.EMPTY_STRING); + } + + private static String getTitle(XMultiServiceFactory xMSF, String _sFile) + { + String sTitle = PropertyNames.EMPTY_STRING; + try + { + XInterface xDocInterface = (XInterface) xMSF.createInstance("com.sun.star.document.DocumentProperties"); + XDocumentProperties xDocProps = UnoRuntime.queryInterface(XDocumentProperties.class, xDocInterface); + PropertyValue[] noArgs = { }; + xDocProps.loadFromMedium(_sFile, noArgs); + sTitle = xDocProps.getTitle(); + } + catch (Exception e) + { + } + return sTitle; + } + + public static String[][] getFolderTitles(com.sun.star.lang.XMultiServiceFactory xMSF, String _sStartFilterName, ArrayList<String> FolderName, String _sEndFilterName) + throws NoValidPathException + { + String[][] LocLayoutFiles = new String[2][]; + if (FolderName.isEmpty()) + { + throw new NoValidPathException(null, "Path not given."); + } + ArrayList<String> TitleVector = new ArrayList<String>(); + ArrayList<String> URLVector = new ArrayList<String>(); + + com.sun.star.ucb.XSimpleFileAccess xSimpleFileAccess = null; + try + { + XInterface xInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, xInterface); + } + catch (com.sun.star.uno.Exception e) + { + throw new NoValidPathException(null, "Internal error.", e); + } + + for (int j = 0; j < FolderName.size(); j++) + { + String sFolderName = FolderName.get(j); + + try + { + String[] nameList = xSimpleFileAccess.getFolderContents(sFolderName, false); + _sStartFilterName = _sStartFilterName == null || _sStartFilterName.equals(PropertyNames.EMPTY_STRING) ? null : _sStartFilterName + "-"; + + String fileName = PropertyNames.EMPTY_STRING; + for (int i = 0; i < nameList.length; i++) + { + fileName = getFilename(nameList[i]); + String sTitle; + + if (_sStartFilterName == null || fileName.startsWith(_sStartFilterName)) + { + if (_sEndFilterName.equals(PropertyNames.EMPTY_STRING)) + { + sTitle = getTitle(xMSF, nameList[i]); + } + else if (fileName.endsWith(_sEndFilterName)) + { + fileName = fileName.replaceAll(_sEndFilterName + "$", PropertyNames.EMPTY_STRING); + sTitle = fileName; + } + else + { + // no or wrong (start|end) filter + continue; + } + URLVector.add(nameList[i]); + TitleVector.add(sTitle); + } + } + } + catch (com.sun.star.ucb.CommandAbortedException exception) + { + exception.printStackTrace(System.err); + } + catch (com.sun.star.uno.Exception e) + { + } + } + + String[] LocNameList = new String[URLVector.size()]; + String[] LocTitleList = new String[TitleVector.size()]; + + // LLA: we have to check if this works + URLVector.toArray(LocNameList); + TitleVector.toArray(LocTitleList); + + LocLayoutFiles[1] = LocNameList; + LocLayoutFiles[0] = LocTitleList; + + JavaTools.bubblesortList(LocLayoutFiles); + + return LocLayoutFiles; + } + private XSimpleFileAccess2 fileAccess; + + public FileAccess(XMultiServiceFactory xmsf) throws com.sun.star.uno.Exception + { + //get a simple file access... + Object fa = xmsf.createInstance("com.sun.star.ucb.SimpleFileAccess"); + fileAccess = UnoRuntime.queryInterface(XSimpleFileAccess2.class, fa); + //get the file identifier converter + Object fcv = xmsf.createInstance("com.sun.star.ucb.FileContentProvider"); + UnoRuntime.queryInterface(XFileIdentifierConverter.class, fcv); + } + + /** + * @return the extension of the given filename. + */ + private static String getExtension(String filename) + { + int p = filename.indexOf('.'); + if (p == -1) + { + return PropertyNames.EMPTY_STRING; + } + else + { + do + { + filename = filename.substring(p + 1); + } + while ((p = filename.indexOf('.')) > -1); + } + return filename; + } + + /** + * @param def what to return in case of an exception + * @return true if the given file exists or not. + * if an exception occurs, returns the default value. + */ + public boolean exists(String filename, boolean def) + { + try + { + return fileAccess.exists(filename); + } + catch (CommandAbortedException e) + { + } + catch (Exception e) + { + } + + return def; + } + + public static String getFilename(String path) + { + return getFilename(path, "/"); + } + + private static String getFilename(String path, String pathSeparator) + { + String[] s = JavaTools.ArrayoutofString(path, pathSeparator); + return s[s.length - 1]; + } + + public static String getBasename(String path, String pathSeparator) + { + String filename = getFilename(path, pathSeparator); + String sExtension = getExtension(filename); + return filename.substring(0, filename.length() - (sExtension.length() + 1)); + } + + public static String[] getDataFromTextFile(XMultiServiceFactory _xMSF, String _filepath) + { + String[] sFileData = null; + try + { + Vector<String> oDataVector = new Vector<String>(); + Object oSimpleFileAccess = _xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface(XSimpleFileAccess.class, oSimpleFileAccess); + if (xSimpleFileAccess.exists(_filepath)) + { + XInputStream xInputStream = xSimpleFileAccess.openFileRead(_filepath); + Object oTextInputStream = _xMSF.createInstance("com.sun.star.io.TextInputStream"); + XTextInputStream xTextInputStream = UnoRuntime.queryInterface(XTextInputStream.class, oTextInputStream); + XActiveDataSink xActiveDataSink = UnoRuntime.queryInterface(XActiveDataSink.class, oTextInputStream); + xActiveDataSink.setInputStream(xInputStream); + while (!xTextInputStream.isEOF()) + { + oDataVector.addElement( xTextInputStream.readLine()); + } + xTextInputStream.closeInput(); + sFileData = new String[oDataVector.size()]; + oDataVector.toArray(sFileData); + + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return sFileData; + } + +} diff --git a/wizards/com/sun/star/wizards/common/FileAccess.py b/wizards/com/sun/star/wizards/common/FileAccess.py new file mode 100644 index 000000000..c58f6d4b4 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/FileAccess.py @@ -0,0 +1,226 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback + +from os import sep as FileSeparator + +''' +This class delivers static convenience methods +to use with ucb SimpleFileAccess service. +You can also instantiate the class, to encapsulate +some functionality of SimpleFileAccess. The instance +keeps a reference to an XSimpleFileAccess and an +XFileIdentifierConverter, saves the permanent +overhead of querying for those interfaces, and delivers +convenience methods for using them. +These Convenience methods include mainly Exception-handling. +''' + +class FileAccess(object): + + def __init__(self, xmsf): + #get the file identifier converter + self.filenameConverter = xmsf.createInstance( + "com.sun.star.ucb.FileContentProvider") + self.xInterface = xmsf.createInstance( + "com.sun.star.ucb.SimpleFileAccess") + + @classmethod + def deleteLastSlashfromUrl(self, _sPath): + if _sPath.endswith("/"): + return _sPath[:-1] + else: + return _sPath + + ''' + Further information on arguments value see in OO Developer Guide, + chapter 6.2.7 + @param xMSF + @param sPath + @param xSimpleFileAccess + @return the respective path of the office application. + A probable following "/" at the end is trimmed. + ''' + + @classmethod + def getOfficePath(self, xMSF, sPath, xSimpleFileAccess): + try: + ResultPath = "" + xInterface = xMSF.createInstance("com.sun.star.util.PathSettings") + ResultPath = str(getattr(xInterface, sPath)) + ResultPath = self.deleteLastSlashfromUrl(ResultPath) + return ResultPath + except Exception: + traceback.print_exc() + return "" + + @classmethod + def getFolderTitles(self, xMSF, FilterName, FolderName, resDict=None): + #Returns and ordered dict containing the template's name and path + + locLayoutFiles = [] + try: + xDocInterface = xMSF.createInstance( + "com.sun.star.document.DocumentProperties") + xInterface = xMSF.createInstance( + "com.sun.star.ucb.SimpleFileAccess") + nameList = xInterface.getFolderContents(FolderName, False) + if FilterName is None or FilterName == "": + FilterName = None + else: + FilterName += "-" + + locLayoutDict = {} + for i in nameList: + fileName = self.getFilename(i) + if FilterName is None or fileName.startswith(FilterName): + xDocInterface.loadFromMedium(i, tuple()) + if resDict is None: + title = xDocInterface.Title + else: + if xDocInterface.Title in resDict: + # localise string at runtime + title = resDict[xDocInterface.Title] + else: + title = xDocInterface.Title + locLayoutDict[title] = i + + #sort the dictionary and create a list containing the + #keys list and the values list + keysList = sorted(locLayoutDict.keys()) + valuesList= [] + for i in keysList: + valuesList.append(locLayoutDict[i]) + locLayoutFiles.append(keysList) + locLayoutFiles.append(valuesList) + except Exception: + traceback.print_exc() + + return locLayoutFiles + + @classmethod + def getTitle(self, xMSF, _sFile): + sTitle = "" + try: + xDocInterface = xMSF.createInstance( + "com.sun.star.document.DocumentProperties") + noArgs = [] + xDocInterface.loadFromMedium(_sFile, noArgs) + sTitle = xDocInterface.getTitle() + except Exception: + traceback.print_exc() + + return sTitle + + def getPath(self, parentURL, childURL): + string = "" + if childURL is not None and childURL != "": + string = "/" + childURL + return self.filenameConverter.getSystemPathFromFileURL( + parentURL + string) + + def copy(self, source, target): + try: + self.xInterface.copy(source, target) + return True + except Exception: + traceback.print_exc() + return False + + def exists(self, filename, default): + try: + return self.xInterface.exists(filename) + except Exception: + traceback.print_exc() + return default + + def delete(self, filename): + try: + self.xInterface.kill(filename) + return True + except Exception: + traceback.print_exc() + return False + + # lists the files in a given directory + # @param dir + # @param includeFolders + # @return + def listFiles(self, folder, includeFolders): + try: + return self.xInterface.getFolderContents(folder, includeFolders) + except Exception: + traceback.print_exc() + return [""] + + def getSize(self, url): + try: + return self.xInterface.getSize(url) + except Exception: + traceback.print_exc() + return -1 + + def getURL(self, parentURL, childPath): + if len(childPath) > 0 and childPath[0] == "/": + path = parentURL + childPath + else: + path = parentURL + "/" + childPath + return path + + @classmethod + def getFilename(self, path, pathSeparator = "/"): + return path.split(pathSeparator)[-1] + + ''' + if the path points to file, gives the directory in which the file is. + ''' + + @classmethod + def getParentDir(self, url): + while url[-1] == "/": + url = url[:-1] + return url[:url.rfind("/")] + + @classmethod + def connectURLs(self, urlFolder, urlFilename): + stringFolder = "" + stringFileName = urlFilename + if not urlFolder.endswith("/"): + stringFolder = "/" + if urlFilename.startswith("/"): + stringFileName = urlFilename[1:] + return urlFolder + stringFolder + stringFileName + + # @param filename + # @return the extension of the given filename. + @classmethod + def getExtension(self, filename): + p = filename.find(".") + if (p == -1): + return "" + else: + while (True): + filename = filename[(p+1):] + p = filename.find(".") + if (p == -1): + break + return filename + + @classmethod + def filename(self, name, ext, i): + return name + ("" if (i == 0) else str(i)) + ("" if (ext == "") else ("." + ext)) diff --git a/wizards/com/sun/star/wizards/common/HelpIds.java b/wizards/com/sun/star/wizards/common/HelpIds.java new file mode 100644 index 000000000..2c1ae4fc7 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/HelpIds.java @@ -0,0 +1,1040 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +public class HelpIds +{ + private static String array1[] = new String[] + { + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID0_HELP", // HID:34201 + "HID:WIZARDS_HID0_NEXT", // HID:34202 + "HID:WIZARDS_HID0_PREV", // HID:34203 + "HID:WIZARDS_HID0_CREATE", // HID:34204 + "HID:WIZARDS_HID0_CANCEL", // HID:34205 + "HID:WIZARDS_HID0_STATUS_DIALOG", // HID:34206 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID2_BTN_DOC_UP", // HID:34213 + "HID:WIZARDS_HID2_BTN_DOC_DOWN", // HID:34214 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID2_STATUS_ADD_DOCS", // HID:34219 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG10", // HID:34229 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG11", // HID:34230 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG12", // HID:34231 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG13", // HID:34232 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG14", // HID:34233 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG15", // HID:34234 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_BG_BTN_OK", // HID:34293 + "HID:WIZARDS_HID_BG_BTN_CANCEL", // HID:34294 + "HID:WIZARDS_HID_BG_BTN_BACK", // HID:34295 + "HID:WIZARDS_HID_BG_BTN_FW", // HID:34296 + "HID:WIZARDS_HID_BG_BTN_IMG1", // HID:34297 + "HID:WIZARDS_HID_BG_BTN_IMG2", // HID:34298 + "HID:WIZARDS_HID_BG_BTN_IMG3", // HID:34299 + "HID:WIZARDS_HID_BG_BTN_IMG4", // HID:34300 + "HID:WIZARDS_HID_BG_BTN_IMG5", // HID:34301 + "HID:WIZARDS_HID_BG_BTN_IMG6", // HID:34302 + "HID:WIZARDS_HID_BG_BTN_IMG7", // HID:34303 + "HID:WIZARDS_HID_BG_BTN_IMG8", // HID:34304 + "HID:WIZARDS_HID_BG_BTN_IMG9", // HID:34305 + "HID:WIZARDS_HID_BG_BTN_IMG10", // HID:34306 + "HID:WIZARDS_HID_BG_BTN_IMG11", // HID:34307 + "HID:WIZARDS_HID_BG_BTN_IMG12", // HID:34308 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_DIALOG", // HID:34320 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_0_CMDPREV", // HID:34322 + "HID:WIZARDS_HID_DLGREPORT_0_CMDNEXT", // HID:34323 + "HID:WIZARDS_HID_DLGREPORT_0_CMDFINISH", // HID:34324 + "HID:WIZARDS_HID_DLGREPORT_0_CMDCANCEL", // HID:34325 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_1_LBTABLES", // HID:34330 + "HID:WIZARDS_HID_DLGREPORT_1_FIELDSAVAILABLE", // HID:34331 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVESELECTED", // HID:34332 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEALL", // HID:34333 + "HID:WIZARDS_HID_DLGREPORT_1_CMDREMOVESELECTED", // HID:34334 + "HID:WIZARDS_HID_DLGREPORT_1_CMDREMOVEALL", // HID:34335 + "HID:WIZARDS_HID_DLGREPORT_1_FIELDSSELECTED", // HID:34336 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEUP", // HID:34337 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEDOWN", // HID:34338 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_2_GROUPING", // HID:34340 + "HID:WIZARDS_HID_DLGREPORT_2_CMDGROUP", // HID:34341 + PropertyNames.EMPTY_STRING, // HID:34342 empty, no moveall button + "HID:WIZARDS_HID_DLGREPORT_2_CMDUNGROUP", // HID:34343 + PropertyNames.EMPTY_STRING, // HID:34344 empty, no removeall button + "HID:WIZARDS_HID_DLGREPORT_2_PREGROUPINGDEST", // HID:34345 + "HID:WIZARDS_HID_DLGREPORT_2_CMDMOVEUPGROUP", // HID:34346 + "HID:WIZARDS_HID_DLGREPORT_2_CMDMOVEDOWNGROUP", // HID:34347 + "HID:WIZARDS_HID_DLGREPORT_3_SORT1", // HID:34348 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND1", // HID:34349 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND1", // HID:34350 + "HID:WIZARDS_HID_DLGREPORT_3_SORT2", // HID:34351 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND2", // HID:34352 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND2", // HID:34353 + "HID:WIZARDS_HID_DLGREPORT_3_SORT3", // HID:34354 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND3", // HID:34355 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND3", // HID:34356 + "HID:WIZARDS_HID_DLGREPORT_3_SORT4", // HID:34357 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND4", // HID:34358 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND4", // HID:34359 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_4_TITLE", // HID:34362 + "HID:WIZARDS_HID_DLGREPORT_4_DATALAYOUT", // HID:34363 + "HID:WIZARDS_HID_DLGREPORT_4_PAGELAYOUT", // HID:34364 + "HID:WIZARDS_HID_DLGREPORT_4_LANDSCAPE", // HID:34365 + "HID:WIZARDS_HID_DLGREPORT_4_PORTRAIT", // HID:34366 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_5_OPTDYNTEMPLATE", // HID:34370 + "HID:WIZARDS_HID_DLGREPORT_5_OPTSTATDOCUMENT", // HID:34371 + "HID:WIZARDS_HID_DLGREPORT_5_TXTTEMPLATEPATH", // HID:34372 + "HID:WIZARDS_HID_DLGREPORT_5_CMDTEMPLATEPATH", // HID:34373 + "HID:WIZARDS_HID_DLGREPORT_5_OPTEDITTEMPLATE", // HID:34374 + "HID:WIZARDS_HID_DLGREPORT_5_OPTUSETEMPLATE", // HID:34375 + "HID:WIZARDS_HID_DLGREPORT_5_TXTDOCUMENTPATH", // HID:34376 + "HID:WIZARDS_HID_DLGREPORT_5_CMDDOCUMENTPATH", // HID:34377 + "HID:WIZARDS_HID_DLGREPORT_5_CHKLINKTODB", // HID:34378 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_1", // HID:34381 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_2", // HID:34382 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_3", // HID:34383 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_4", // HID:34384 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_5", // HID:34385 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_6", // HID:34386 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_7", // HID:34387 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_DIALOG", // HID:34400 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_CMDPREV", // HID:34402 + "HID:WIZARDS_HID_DLGFORM_CMDNEXT", // HID:34403 + "HID:WIZARDS_HID_DLGFORM_CMDFINISH", // HID:34404 + "HID:WIZARDS_HID_DLGFORM_CMDCANCEL", // HID:34405 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_MASTER_LBTABLES", // HID:34411 + "HID:WIZARDS_HID_DLGFORM_MASTER_FIELDSAVAILABLE", // HID:34412 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVESELECTED", // HID:34413 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEALL", // HID:34414 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDREMOVESELECTED", // HID:34415 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDREMOVEALL", // HID:34416 + "HID:WIZARDS_HID_DLGFORM_MASTER_FIELDSSELECTED", // HID:34417 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEUP", // HID:34418 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEDOWN", // HID:34419 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_CHKCREATESUBFORM", // HID:34421 + "HID:WIZARDS_HID_DLGFORM_OPTONEXISTINGRELATION", // HID:34422 + "HID:WIZARDS_HID_DLGFORM_OPTSELECTMANUALLY", // HID:34423 + "HID:WIZARDS_HID_DLGFORM_lstRELATIONS", // HID:34424 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_SUB_LBTABLES", // HID:34431 + "HID:WIZARDS_HID_DLGFORM_SUB_FIELDSAVAILABLE", // HID:34432 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVESELECTED", // HID:34433 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEALL", // HID:34434 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDREMOVESELECTED", // HID:34435 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDREMOVEALL", // HID:34436 + "HID:WIZARDS_HID_DLGFORM_SUB_FIELDSSELECTED", // HID:34437 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEUP", // HID:34438 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEDOWN", // HID:34439 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK1", // HID:34441 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK1", // HID:34442 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK2", // HID:34443 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK2", // HID:34444 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK3", // HID:34445 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK3", // HID:34446 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK4", // HID:34447 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK4", // HID:34448 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_CMDALIGNLEFT", // HID:34451 + "HID:WIZARDS_HID_DLGFORM_CMDALIGNRIGHT", // HID:34452 + "HID:WIZARDS_HID_DLGFORM_CMDLEFTLABELED", // HID:34453 + "HID:WIZARDS_HID_DLGFORM_CMDTOPLABELED", // HID:34454 + "HID:WIZARDS_HID_DLGFORM_CMDTABLESTYLE", // HID:34455 + "HID:WIZARDS_HID_DLGFORM_CMDTOPJUSTIFIED", // HID:34456 + "HID:WIZARDS_HID_DLGFORM_CMDLEFTLABELED2", // HID:34457 + "HID:WIZARDS_HID_DLGFORM_CMDTOPLABELED2", // HID:34458 + "HID:WIZARDS_HID_DLGFORM_CMDTABLESTYLE2", // HID:34459 + "HID:WIZARDS_HID_DLGFORM_CMDTOPJUSTIFIED2", // HID:34460 + "HID:WIZARDS_HID_DLGFORM_OPTNEWDATAONLY", // HID:34461 + "HID:WIZARDS_HID_DLGFORM_OPTDISPLAYALLDATA", // HID:34462 + "HID:WIZARDS_HID_DLGFORM_CHKNOMODIFICATION", // HID:34463 + "HID:WIZARDS_HID_DLGFORM_CHKNODELETION", // HID:34464 + "HID:WIZARDS_HID_DLGFORM_CHKNOADDITION", // HID:34465 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_LSTSTYLES", // HID:34471 + "HID:WIZARDS_HID_DLGFORM_CMDNOBORDER", // HID:34472 + "HID:WIZARDS_HID_DLGFORM_CMD3DBORDER", // HID:34473 + "HID:WIZARDS_HID_DLGFORM_CMDSIMPLEBORDER", // HID:34474 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGFORM_TXTPATH", // HID:34481 + "HID:WIZARDS_HID_DLGFORM_OPTWORKWITHFORM", // HID:34482 + "HID:WIZARDS_HID_DLGFORM_OPTMODIFYFORM", // HID:34483 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGNEWSLTR_DIALOG", // HID:34500 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTSTANDARDLAYOUT", // HID:34501 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTPARTYLAYOUT", // HID:34502 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTBROCHURELAYOUT", // HID:34503 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTSINGLESIDED", // HID:34504 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTDOUBLESIDED", // HID:34505 + "HID:WIZARDS_HID_DLGNEWSLTR_CMDGOON", // HID:34506 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_SELLBUY", // HID:34520 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SELLBUY", // HID:34521 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTQUANTITY", // HID:34522 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTRATE", // HID:34523 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTDATE", // HID:34524 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTCOMMISSION", // HID:34525 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTFIX", // HID:34526 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTMINIMUM", // HID:34527 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SELLBUY", // HID:34528 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SELLBUY", // HID:34529 + "HID:WIZARDS_HID_DLGDEPOT_1_LSTSELLSTOCKS", // HID:34530 + "HID:WIZARDS_HID_DLGDEPOT_2_LSTBUYSTOCKS", // HID:34531 + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_SPLIT", // HID:34532 + "HID:WIZARDS_HID_DLGDEPOT_0_LSTSTOCKNAMES", // HID:34533 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SPLIT", // HID:34534 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SPLIT", // HID:34535 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SPLIT", // HID:34536 + "HID:WIZARDS_HID_DLGDEPOT_1_OPTPERSHARE", // HID:34537 + "HID:WIZARDS_HID_DLGDEPOT_1_OPTTOTAL", // HID:34538 + "HID:WIZARDS_HID_DLGDEPOT_1_TXTDIVIDEND", // HID:34539 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTOLDRATE", // HID:34540 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTNEWRATE", // HID:34541 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTDATE", // HID:34542 + "HID:WIZARDS_HID_DLGDEPOT_3_TXTSTARTDATE", // HID:34543 + "HID:WIZARDS_HID_DLGDEPOT_3_TXTENDDATE", // HID:34544 + "HID:WIZARDS_HID_DLGDEPOT_3_OPTDAILY", // HID:34545 + "HID:WIZARDS_HID_DLGDEPOT_3_OPTWEEKLY", // HID:34546 + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_HISTORY", // HID:34547 + "HID:WIZARDS_HID_DLGDEPOT_LSTMARKETS", // HID:34548 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_HISTORY", // HID:34549 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_HISTORY", // HID:34550 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGIMPORT_DIALOG", // HID:34570 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDHELP", // HID:34571 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDCANCEL", // HID:34572 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDPREV", // HID:34573 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDNEXT", // HID:34574 + "HID:WIZARDS_HID_DLGIMPORT_0_OPTSODOCUMENTS", // HID:34575 + "HID:WIZARDS_HID_DLGIMPORT_0_OPTMSDOCUMENTS", // HID:34576 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKLOGFILE", // HID:34577 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKWORD", // HID:34578 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKEXCEL", // HID:34579 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKPOWERPOINT", // HID:34580 + "HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATE", // HID:34581 + "HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATERECURSE", // HID:34582 + "HID:WIZARDS_HID_DLGIMPORT_2_LBTEMPLATEPATH", // HID:34583 + "HID:WIZARDS_HID_DLGIMPORT_2_EDTEMPLATEPATH", // HID:34584 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT", // HID:34585 + "HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENT", // HID:34586 + "HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENTRECURSE", // HID:34587 + "HID:WIZARDS_HID_DLGIMPORT_2_LBDOCUMENTPATH", // HID:34588 + "HID:WIZARDS_HID_DLGIMPORT_2_EDDOCUMENTPATH", // HID:34589 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT", // HID:34590 + "HID:WIZARDS_HID_DLGIMPORT_2_LBEXPORTDOCUMENTPATH", // HID:34591 + "HID:WIZARDS_HID_DLGIMPORT_2_EDEXPORTDOCUMENTPATH", // HID:34592 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDEXPORTPATHSELECT", // HID:34593 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGIMPORT_3_TBSUMMARY", // HID:34595 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKWRITER", // HID:34596 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKCALC", // HID:34597 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKIMPRESS", // HID:34598 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKMATHGLOBAL", // HID:34599 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT2", // HID:34600 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT2", // HID:34601 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGCORRESPONDENCE_DIALOG", // HID:34630 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_CANCEL", // HID:34631 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA1", // HID:34632 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA2", // HID:34633 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_AGENDAOKAY", // HID:34634 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER1", // HID:34635 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER2", // HID:34636 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_LETTEROKAY", // HID:34637 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGSTYLES_DIALOG", // HID:34650 + "HID:WIZARDS_HID_DLGSTYLES_LISTBOX", // HID:34651 + "HID:WIZARDS_HID_DLGSTYLES_CANCEL", // HID:34652 + "HID:WIZARDS_HID_DLGSTYLES_OKAY", // HID:34653 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGCONVERT_DIALOG", // HID:34660 + "HID:WIZARDS_HID_DLGCONVERT_CHECKBOX1", // HID:34661 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON1", // HID:34662 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON2", // HID:34663 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON3", // HID:34664 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON4", // HID:34665 + "HID:WIZARDS_HID_DLGCONVERT_LISTBOX1", // HID:34666 + "HID:WIZARDS_HID_DLGCONVERT_OBFILE", // HID:34667 + "HID:WIZARDS_HID_DLGCONVERT_OBDIR", // HID:34668 + "HID:WIZARDS_HID_DLGCONVERT_COMBOBOX1", // HID:34669 + "HID:WIZARDS_HID_DLGCONVERT_TBSOURCE", // HID:34670 + "HID:WIZARDS_HID_DLGCONVERT_CHECKRECURSIVE", // HID:34671 + "HID:WIZARDS_HID_DLGCONVERT_TBTARGET", // HID:34672 + "HID:WIZARDS_HID_DLGCONVERT_CBCANCEL", // HID:34673 + "HID:WIZARDS_HID_DLGCONVERT_CBHELP", // HID:34674 + "HID:WIZARDS_HID_DLGCONVERT_CBBACK", // HID:34675 + "HID:WIZARDS_HID_DLGCONVERT_CBGOON", // HID:34676 + "HID:WIZARDS_HID_DLGCONVERT_CBSOURCEOPEN", // HID:34677 + "HID:WIZARDS_HID_DLGCONVERT_CBTARGETOPEN", // HID:34678 + "HID:WIZARDS_HID_DLGCONVERT_CHKPROTECT", // HID:34679 + "HID:WIZARDS_HID_DLGCONVERT_CHKTEXTDOCUMENTS", // HID:34680 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGPASSWORD_CMDGOON", // HID:34690 + "HID:WIZARDS_HID_DLGPASSWORD_CMDCANCEL", // HID:34691 + "HID:WIZARDS_HID_DLGPASSWORD_CMDHELP", // HID:34692 + "HID:WIZARDS_HID_DLGPASSWORD_TXTPASSWORD", // HID:34693 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGHOLIDAYCAL_DIALOG", // HID:34700 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_PREVIEW", // HID:34701 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_OPYEAR", // HID:34702 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_OPMONTH", // HID:34703 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_EDYEAR", // HID:34704 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_EDMONTH", // HID:34705 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_SPINYEAR", // HID:34706 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_SPINMONTH", // HID:34707 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_CMBSTATE", // HID:34708 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_LBOWNDATA", // HID:34709 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CMDINSERT", // HID:34710 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CMDDELETE", // HID:34711 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENT", // HID:34712 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CHKEVENT", // HID:34713 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTDAY", // HID:34714 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTDAY", // HID:34715 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTMONTH", // HID:34716 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTMONTH", // HID:34717 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTYEAR", // HID:34718 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTYEAR", // HID:34719 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDOWNDATA", // HID:34720 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDCANCEL", // HID:34721 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDOK" // HID:34722 + }; + private static String array2[] = new String[] + { + "HID:WIZARDS_HID_LTRWIZ_OPTBUSINESSLETTER", // HID:40769 + "HID:WIZARDS_HID_LTRWIZ_OPTPRIVOFFICIALLETTER", // HID:40770 + "HID:WIZARDS_HID_LTRWIZ_OPTPRIVATELETTER", // HID:40771 + "HID:WIZARDS_HID_LTRWIZ_LSTBUSINESSSTYLE", // HID:40772 + "HID:WIZARDS_HID_LTRWIZ_CHKBUSINESSPAPER", // HID:40773 + "HID:WIZARDS_HID_LTRWIZ_LSTPRIVOFFICIALSTYLE", // HID:40774 + "HID:WIZARDS_HID_LTRWIZ_LSTPRIVATESTYLE", // HID:40775 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERCOMPANYLOGO", // HID:40776 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOHEIGHT", // HID:40777 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOX", // HID:40778 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOWIDTH", // HID:40779 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOY", // HID:40780 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERCOMPANYADDRESS", // HID:40781 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSHEIGHT", // HID:40782 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSX", // HID:40783 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSWIDTH", // HID:40784 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSY", // HID:40785 + "HID:WIZARDS_HID_LTRWIZ_CHKCOMPANYRECEIVER", // HID:40786 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERFOOTER", // HID:40787 + "HID:WIZARDS_HID_LTRWIZ_NUMFOOTERHEIGHT", // HID:40788 + "HID:WIZARDS_HID_LTRWIZ_LSTLETTERNORM", // HID:40789 + "HID:WIZARDS_HID_LTRWIZ_CHKUSELOGO", // HID:40790 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEADDRESSRECEIVER", // HID:40791 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESIGNS", // HID:40792 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESUBJECT", // HID:40793 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESALUTATION", // HID:40794 + "HID:WIZARDS_HID_LTRWIZ_LSTSALUTATION", // HID:40795 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEBENDMARKS", // HID:40796 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEGREETING", // HID:40797 + "HID:WIZARDS_HID_LTRWIZ_LSTGREETING", // HID:40798 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEFOOTER", // HID:40799 + "HID:WIZARDS_HID_LTRWIZ_OPTSENDERPLACEHOLDER", // HID:40800 + "HID:WIZARDS_HID_LTRWIZ_OPTSENDERDEFINE", // HID:40801 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERNAME", // HID:40802 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERSTREET", // HID:40803 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERPOSTCODE", // HID:40804 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERSTATE_TEXT", // HID:40805 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERCITY", // HID:40806 + "HID:WIZARDS_HID_LTRWIZ_OPTRECEIVERPLACEHOLDER", // HID:40807 + "HID:WIZARDS_HID_LTRWIZ_OPTRECEIVERDATABASE", // HID:40808 + "HID:WIZARDS_HID_LTRWIZ_TXTFOOTER", // HID:40809 + "HID:WIZARDS_HID_LTRWIZ_CHKFOOTERNEXTPAGES", // HID:40810 + "HID:WIZARDS_HID_LTRWIZ_CHKFOOTERPAGENUMBERS", // HID:40811 + "HID:WIZARDS_HID_LTRWIZ_TXTTEMPLATENAME", // HID:40812 + "HID:WIZARDS_HID_LTRWIZ_OPTCREATELETTER", // HID:40813 + "HID:WIZARDS_HID_LTRWIZ_OPTMAKECHANGES", // HID:40814 + "HID:WIZARDS_HID_LTRWIZ_TXTPATH", // HID:40815 + "HID:WIZARDS_HID_LTRWIZ_CMDPATH", // HID:40816 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_LTRWIZARD", // HID:40820 + "HID:WIZARDS_HID_LTRWIZARD_HELP", // HID:40821 + "HID:WIZARDS_HID_LTRWIZARD_BACK", // HID:40822 + "HID:WIZARDS_HID_LTRWIZARD_NEXT", // HID:40823 + "HID:WIZARDS_HID_LTRWIZARD_CREATE", // HID:40824 + "HID:WIZARDS_HID_LTRWIZARD_CANCEL", // HID:40825 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_LSTTABLES", // HID:40850 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDS", // HID:40851 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVESELECTED", // HID:40852 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEALL", // HID:40853 + "HID:WIZARDS_HID_QUERYWIZARD_CMDREMOVESELECTED", // HID:40854 + "HID:WIZARDS_HID_QUERYWIZARD_CMDREMOVEALL", // HID:40855 + "HID:WIZARDS_HID_QUERYWIZARD_LSTSELFIELDS", // HID:40856 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEUP", // HID:40857 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEDOWN", // HID:40858 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_SORT1", // HID:40865 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND1", // HID:40866 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND1", // HID:40867 + "HID:WIZARDS_HID_QUERYWIZARD_SORT2", // HID:40868 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND2", // HID:40869 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND2", // HID:40870 + "HID:WIZARDS_HID_QUERYWIZARD_SORT3", // HID:40871 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND3", // HID:40872 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND3", // HID:40873 + "HID:WIZARDS_HID_QUERYWIZARD_SORT4", // HID:40874 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND4", // HID:40875 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND4", // HID:40876 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_OPTMATCHALL", // HID:40878 + "HID:WIZARDS_HID_QUERYWIZARD_OPTMATCHANY", // HID:40879 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_1", // HID:40880 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_1", // HID:40881 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_1", // HID:40882 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_2", // HID:40883 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_2", // HID:40884 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_2", // HID:40885 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_3", // HID:40886 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_3", // HID:40887 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_3", // HID:40888 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_OPTAGGREGATEDETAILQUERY", // HID:40895 + "HID:WIZARDS_HID_QUERYWIZARD_OPTAGGREGATESUMMARYQUERY", // HID:40896 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_1", // HID:40897 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_1", // HID:40898 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_2", // HID:40899 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_2", // HID:40900 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_3", // HID:40901 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_3", // HID:40902 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_4", // HID:40903 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_4", // HID:40904 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_5", // HID:40905 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_5", // HID:40906 + "HID:WIZARDS_HID_QUERYWIZARD_BTNAGGREGATEPLUS", // HID:40907 + "HID:WIZARDS_HID_QUERYWIZARD_BTNAGGREGATEMINUS", // HID:40908 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDS", // HID:40915 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVESELECTED", // HID:40916 + PropertyNames.EMPTY_STRING, // HID:40917 empty, no moveall button + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERREMOVESELECTED", // HID:40918 + PropertyNames.EMPTY_STRING, // HID:40919 empty no removeall button + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERSELFIELDS", // HID:40920 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVEUP", // HID:409121 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVEDOWN", // HID:40922 + "HID:WIZARDS_HID_QUERYWIZARD_OPTGROUPMATCHALL", // HID:40923 + "HID:WIZARDS_HID_QUERYWIZARD_OPTGROUPMATCHANY", // HID:40924 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_1", // HID:40925 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_1", // HID:40926 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_1", // HID:40927 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_2", // HID:40928 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_2", // HID:40929 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_2", // HID:40930 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_3", // HID:40931 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_3", // HID:40932 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_3", // HID:40933 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_1", // HID:40940 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_2", // HID:40941 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_3", // HID:40942 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_4", // HID:40943 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_5", // HID:40944 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_6", // HID:40945 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_7", // HID:40946 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_TXTQUERYTITLE", // HID:40955 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDISPLAYQUERY", // HID:40956 + "HID:WIZARDS_HID_QUERYWIZARD_OPTMODIFYQUERY", // HID:40957 + "HID:WIZARDS_HID_QUERYWIZARD_TXTSUMMARY", // HID:40958 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD", // HID:40970 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_QUERYWIZARD_BACK", // HID:40972 + "HID:WIZARDS_HID_QUERYWIZARD_NEXT", // HID:40973 + "HID:WIZARDS_HID_QUERYWIZARD_CREATE", // HID:40974 + "HID:WIZARDS_HID_QUERYWIZARD_CANCEL", // HID:40975 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_IS_BTN_OK", // HID:41003 + "HID:WIZARDS_HID_IS_BTN_CANCEL", // HID:41004 + "HID:WIZARDS_HID_IS_BTN_IMG1", // HID:41005 + "HID:WIZARDS_HID_IS_BTN_IMG2", // HID:41006 + "HID:WIZARDS_HID_IS_BTN_IMG3", // HID:41007 + "HID:WIZARDS_HID_IS_BTN_IMG4", // HID:41008 + "HID:WIZARDS_HID_IS_BTN_IMG5", // HID:41009 + "HID:WIZARDS_HID_IS_BTN_IMG6", // HID:41010 + "HID:WIZARDS_HID_IS_BTN_IMG7", // HID:41011 + "HID:WIZARDS_HID_IS_BTN_IMG8", // HID:41012 + "HID:WIZARDS_HID_IS_BTN_IMG9", // HID:41013 + "HID:WIZARDS_HID_IS_BTN_IMG10", // HID:41014 + "HID:WIZARDS_HID_IS_BTN_IMG11", // HID:41015 + "HID:WIZARDS_HID_IS_BTN_IMG12", // HID:41016 + "HID:WIZARDS_HID_IS_BTN_IMG13", // HID:41017 + "HID:WIZARDS_HID_IS_BTN_IMG14", // HID:41018 + "HID:WIZARDS_HID_IS_BTN_IMG15", // HID:41019 + "HID:WIZARDS_HID_IS_BTN_IMG16", // HID:41020 + "HID:WIZARDS_HID_IS_BTN_IMG17", // HID:41021 + "HID:WIZARDS_HID_IS_BTN_IMG18", // HID:41022 + "HID:WIZARDS_HID_IS_BTN_IMG19", // HID:41023 + "HID:WIZARDS_HID_IS_BTN_IMG20", // HID:41024 + "HID:WIZARDS_HID_IS_BTN_IMG21", // HID:41025 + "HID:WIZARDS_HID_IS_BTN_IMG22", // HID:41026 + "HID:WIZARDS_HID_IS_BTN_IMG23", // HID:41027 + "HID:WIZARDS_HID_IS_BTN_IMG24", // HID:41028 + "HID:WIZARDS_HID_IS_BTN_IMG25", // HID:41029 + "HID:WIZARDS_HID_IS_BTN_IMG26", // HID:41030 + "HID:WIZARDS_HID_IS_BTN_IMG27", // HID:41031 + "HID:WIZARDS_HID_IS_BTN_IMG28", // HID:41032 + "HID:WIZARDS_HID_IS_BTN_IMG29", // HID:41033 + "HID:WIZARDS_HID_IS_BTN_IMG30", // HID:41034 + "HID:WIZARDS_HID_IS_BTN_IMG31", // HID:41035 + "HID:WIZARDS_HID_IS_BTN_IMG32", // HID:41036 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_FTP_OK", // HID:41047 + "HID:WIZARDS_HID_FTP_CANCEL", // HID:41048 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_AGWIZ", // HID:41051 + "HID:WIZARDS_HID_AGWIZ_HELP", // HID:41052 + "HID:WIZARDS_HID_AGWIZ_NEXT", // HID:41053 + "HID:WIZARDS_HID_AGWIZ_PREV", // HID:41054 + "HID:WIZARDS_HID_AGWIZ_CREATE", // HID:41055 + "HID:WIZARDS_HID_AGWIZ_CANCEL", // HID:41056 + "HID:WIZARDS_HID_AGWIZ_1_LIST_PAGEDESIGN", // HID:41057 + "HID:WIZARDS_HID_AGWIZ_1_CHK_MINUTES", // HID:41058 + "HID:WIZARDS_HID_AGWIZ_2_TXT_TIME", // HID:41059 + "HID:WIZARDS_HID_AGWIZ_2_TXT_DATE", // HID:41060 + "HID:WIZARDS_HID_AGWIZ_2_TXT_TITLE", // HID:41061 + "HID:WIZARDS_HID_AGWIZ_2_TXT_LOCATION", // HID:41062 + "HID:WIZARDS_HID_AGWIZ_3_CHK_MEETING_TYPE", // HID:41063 + "HID:WIZARDS_HID_AGWIZ_3_CHK_READ", // HID:41064 + "HID:WIZARDS_HID_AGWIZ_3_CHK_BRING", // HID:41065 + "HID:WIZARDS_HID_AGWIZ_3_CHK_NOTES", // HID:41066 + "HID:WIZARDS_HID_AGWIZ_4_CHK_CALLED_BY", // HID:41067 + "HID:WIZARDS_HID_AGWIZ_4_CHK_FACILITATOR", // HID:41068 + "HID:WIZARDS_HID_AGWIZ_4_CHK_NOTETAKER", // HID:41069 + "HID:WIZARDS_HID_AGWIZ_4_CHK_TIMEKEEPER", // HID:41070 + "HID:WIZARDS_HID_AGWIZ_4_CHK_ATTENDEES", // HID:41071 + "HID:WIZARDS_HID_AGWIZ_4_CHK_OBSERVERS", // HID:41072 + "HID:WIZARDS_HID_AGWIZ_4_CHK_RESOURCEPERSONS", // HID:41073 + "HID:WIZARDS_HID_AGWIZ_6_TXT_TEMPLATENAME", // HID:41074 + "HID:WIZARDS_HID_AGWIZ_6_TXT_TEMPLATEPATH", // HID:41075 + "HID:WIZARDS_HID_AGWIZ_6_BTN_TEMPLATEPATH", // HID:41076 + "HID:WIZARDS_HID_AGWIZ_6_OPT_CREATEAGENDA", // HID:41077 + "HID:WIZARDS_HID_AGWIZ_6_OPT_MAKECHANGES", // HID:41078 + "HID:WIZARDS_HID_AGWIZ_5_BTN_INSERT", // HID:41079 + "HID:WIZARDS_HID_AGWIZ_5_BTN_REMOVE", // HID:41080 + "HID:WIZARDS_HID_AGWIZ_5_BTN_UP", // HID:41081 + "HID:WIZARDS_HID_AGWIZ_5_BTN_DOWN", // HID:41082 + "HID:WIZARDS_HID_AGWIZ_5_SCROLL_BAR", // HID:41083 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_1", // HID:41084 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_1", // HID:41085 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_1", // HID:41086 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_2", // HID:41087 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_2", // HID:41088 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_2", // HID:41089 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_3", // HID:41090 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_3", // HID:41091 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_3", // HID:41092 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_4", // HID:41093 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_4", // HID:41094 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_4", // HID:41095 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_5", // HID:41096 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_5", // HID:41097 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_5", // HID:41098 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_FAXWIZ_OPTBUSINESSFAX", // HID:41120 + "HID:WIZARDS_HID_FAXWIZ_LSTBUSINESSSTYLE", // HID:41121 + "HID:WIZARDS_HID_FAXWIZ_OPTPRIVATEFAX", // HID:41122 + "HID:WIZARDS_HID_LSTPRIVATESTYLE", // HID:41123 + "HID:WIZARDS_HID_IMAGECONTROL3", // HID:41124 + "HID:WIZARDS_HID_CHKUSELOGO", // HID:41125 + "HID:WIZARDS_HID_CHKUSEDATE", // HID:41126 + "HID:WIZARDS_HID_CHKUSECOMMUNICATIONTYPE", // HID:41127 + "HID:WIZARDS_HID_LSTCOMMUNICATIONTYPE", // HID:41128 + "HID:WIZARDS_HID_CHKUSESUBJECT", // HID:41129 + "HID:WIZARDS_HID_CHKUSESALUTATION", // HID:41130 + "HID:WIZARDS_HID_LSTSALUTATION", // HID:41131 + "HID:WIZARDS_HID_CHKUSEGREETING", // HID:41132 + "HID:WIZARDS_HID_LSTGREETING", // HID:41133 + "HID:WIZARDS_HID_CHKUSEFOOTER", // HID:41134 + "HID:WIZARDS_HID_OPTSENDERPLACEHOLDER", // HID:41135 + "HID:WIZARDS_HID_OPTSENDERDEFINE", // HID:41136 + "HID:WIZARDS_HID_TXTSENDERNAME", // HID:41137 + "HID:WIZARDS_HID_TXTSENDERSTREET", // HID:41138 + "HID:WIZARDS_HID_TXTSENDERPOSTCODE", // HID:41139 + "HID:WIZARDS_HID_TXTSENDERSTATE", // HID:41140 + "HID:WIZARDS_HID_TXTSENDERCITY", // HID:41141 + "HID:WIZARDS_HID_TXTSENDERFAX", // HID:41142 + "HID:WIZARDS_HID_OPTRECEIVERPLACEHOLDER", // HID:41143 + "HID:WIZARDS_HID_OPTRECEIVERDATABASE", // HID:41144 + "HID:WIZARDS_HID_TXTFOOTER", // HID:41145 + "HID:WIZARDS_HID_CHKFOOTERNEXTPAGES", // HID:41146 + "HID:WIZARDS_HID_CHKFOOTERPAGENUMBERS", // HID:41147 + "HID:WIZARDS_HID_TXTTEMPLATENAME", // HID:41148 + "HID:WIZARDS_HID_FILETEMPLATEPATH", // HID:41149 + "HID:WIZARDS_HID_OPTCREATEFAX", // HID:41150 + "HID:WIZARDS_HID_OPTMAKECHANGES", // HID:41151 + "HID:WIZARDS_HID_IMAGECONTROL2", // HID:41152 + "HID:WIZARDS_HID_FAXWIZ_TXTPATH", // HID:41153 + "HID:WIZARDS_HID_FAXWIZ_CMDPATH", // HID:41154 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_FAXWIZARD", // HID:41180 + "HID:WIZARDS_HID_FAXWIZARD_HELP", // HID:41181 + "HID:WIZARDS_HID_FAXWIZARD_BACK", // HID:41182 + "HID:WIZARDS_HID_FAXWIZARD_NEXT", // HID:41183 + "HID:WIZARDS_HID_FAXWIZARD_CREATE", // HID:41184 + "HID:WIZARDS_HID_FAXWIZARD_CANCEL", // HID:41185 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGTABLE_DIALOG", // HID:41200 + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGTABLE_CMDPREV", // HID:41202 + "HID:WIZARDS_HID_DLGTABLE_CMDNEXT", // HID:41203 + "HID:WIZARDS_HID_DLGTABLE_CMDFINISH", // HID:41204 + "HID:WIZARDS_HID_DLGTABLE_CMDCANCEL", // HID:41205 + "HID:WIZARDS_HID_DLGTABLE_OPTBUSINESS", // HID:41206 + "HID:WIZARDS_HID_DLGTABLE_OPTPRIVATE", // HID:41207 + "HID:WIZARDS_HID_DLGTABLE_LBTABLES", // HID:41208 + "HID:WIZARDS_HID_DLGTABLE_FIELDSAVAILABLE", // HID:41209 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVESELECTED", // HID:41210 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEALL", // HID:41211 + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVESELECTED", // HID:41212 + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVEALL", // HID:41213 + "HID:WIZARDS_HID_DLGTABLE_FIELDSSELECTED", // HID:41214 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEUP", // HID:41215 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEDOWN", // HID:41216 + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + PropertyNames.EMPTY_STRING, + "HID:WIZARDS_HID_DLGTABLE_LB_SELFIELDNAMES", // HID:41220 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDUP", // HID:41221 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDDOWN", // HID:41222 + "HID:WIZARDS_HID_DLGTABLE_CMDMINUS", // HID:41223 + "HID:WIZARDS_HID_DLGTABLE_CMDPLUS", // HID:41224 + "HID:WIZARDS_HID_DLGTABLE_COLNAME", // HID:41225 + "HID:WIZARDS_HID_DLGTABLE_COLMODIFIER", // HID:41226 + "HID:WIZARDS_HID_DLGTABLE_CHK_USEPRIMEKEY", // HID:41227 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_AUTOMATIC", // HID:41228 + "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE_AUTOMATIC", // HID:41229 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SINGLE", // HID:41230 + "HID:WIZARDS_HID_DLGTABLE_LB_PK_FIELDNAME", // HID:41231 + "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE", // HID:41232 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SEVERAL", // HID:41233 + "HID:WIZARDS_HID_DLGTABLE_FIELDS_PK_AVAILABLE", // HID:41234 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVE_PK_SELECTED", // HID:41235 + PropertyNames.EMPTY_STRING, // HID:41236 empty, no moveall button + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVE_PK_SELECTED", // HID:41237 + PropertyNames.EMPTY_STRING, // HID:41238 empty, no removeall button + "HID:WIZARDS_HID_DLGTABLE_FIELDS_PK_SELECTED", // HID:41239 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEUP_PK_SELECTED", // HID:41240 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEDOWN_PK_SELECTED", // HID:41241 + "HID:WIZARDS_HID_DLGTABLE_TXT_NAME", // HID:41242 + "HID:WIZARDS_HID_DLGTABLE_OPT_MODIFYTABLE", // HID:41243 + "HID:WIZARDS_HID_DLGTABLE_OPT_WORKWITHTABLE", // HID:41244 + "HID:WIZARDS_HID_DLGTABLE_OPT_STARTFORMWIZARD", // HID:41245 + "HID:WIZARDS_HID_DLGTABLE_LST_CATALOG", // HID:41246 + "HID:WIZARDS_HID_DLGTABLE_LST_SCHEMA" // HID:41247 + }; + + public static String getHelpIdString( int nHelpId ) + { + if ( nHelpId >= 34200 && nHelpId <= 34722 ) + return array1[ nHelpId - 34200 ]; + else if ( nHelpId >= 40769 && nHelpId <= 41245 ) + return array2[ nHelpId - 40769 ]; + else + return ""; + } +} diff --git a/wizards/com/sun/star/wizards/common/HelpIds.py b/wizards/com/sun/star/wizards/common/HelpIds.py new file mode 100644 index 000000000..971fc149c --- /dev/null +++ b/wizards/com/sun/star/wizards/common/HelpIds.py @@ -0,0 +1,1028 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +class HelpIds: + array1 = [ + "HID:WIZARDS_HID0_HELP", # HID:34201 + "HID:WIZARDS_HID0_NEXT", # HID:34202 + "HID:WIZARDS_HID0_PREV", # HID:34203 + "HID:WIZARDS_HID0_CREATE", # HID:34204 + "HID:WIZARDS_HID0_CANCEL", # HID:34205 + "HID:WIZARDS_HID0_STATUS_DIALOG", # HID:34206 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID2_BTN_DOC_UP", # HID:34213 + "HID:WIZARDS_HID2_BTN_DOC_DOWN", # HID:34214 + "", + "", + "", + "", + "HID:WIZARDS_HID2_STATUS_ADD_DOCS", # HID:34219 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG10", # HID:34229 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG11", # HID:34230 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG12", # HID:34231 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG13", # HID:34232 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG14", # HID:34233 + "HID:WIZARDS_HID3_IL_LAYOUTS_IMG15", # HID:34234 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_BG_BTN_OK", # HID:34293 + "HID:WIZARDS_HID_BG_BTN_CANCEL", # HID:34294 + "HID:WIZARDS_HID_BG_BTN_BACK", # HID:34295 + "HID:WIZARDS_HID_BG_BTN_FW", # HID:34296 + "HID:WIZARDS_HID_BG_BTN_IMG1", # HID:34297 + "HID:WIZARDS_HID_BG_BTN_IMG2", # HID:34298 + "HID:WIZARDS_HID_BG_BTN_IMG3", # HID:34299 + "HID:WIZARDS_HID_BG_BTN_IMG4", # HID:34300 + "HID:WIZARDS_HID_BG_BTN_IMG5", # HID:34301 + "HID:WIZARDS_HID_BG_BTN_IMG6", # HID:34302 + "HID:WIZARDS_HID_BG_BTN_IMG7", # HID:34303 + "HID:WIZARDS_HID_BG_BTN_IMG8", # HID:34304 + "HID:WIZARDS_HID_BG_BTN_IMG9", # HID:34305 + "HID:WIZARDS_HID_BG_BTN_IMG10", # HID:34306 + "HID:WIZARDS_HID_BG_BTN_IMG11", # HID:34307 + "HID:WIZARDS_HID_BG_BTN_IMG12", # HID:34308 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGREPORT_DIALOG", # HID:34320 + "", + "HID:WIZARDS_HID_DLGREPORT_0_CMDPREV", # HID:34322 + "HID:WIZARDS_HID_DLGREPORT_0_CMDNEXT", # HID:34323 + "HID:WIZARDS_HID_DLGREPORT_0_CMDFINISH", # HID:34324 + "HID:WIZARDS_HID_DLGREPORT_0_CMDCANCEL", # HID:34325 + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGREPORT_1_LBTABLES", # HID:34330 + "HID:WIZARDS_HID_DLGREPORT_1_FIELDSAVAILABLE", # HID:34331 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVESELECTED", # HID:34332 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEALL", # HID:34333 + "HID:WIZARDS_HID_DLGREPORT_1_CMDREMOVESELECTED", # HID:34334 + "HID:WIZARDS_HID_DLGREPORT_1_CMDREMOVEALL", # HID:34335 + "HID:WIZARDS_HID_DLGREPORT_1_FIELDSSELECTED", # HID:34336 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEUP", # HID:34337 + "HID:WIZARDS_HID_DLGREPORT_1_CMDMOVEDOWN", # HID:34338 + "", + "HID:WIZARDS_HID_DLGREPORT_2_GROUPING", # HID:34340 + "HID:WIZARDS_HID_DLGREPORT_2_CMDGROUP", # HID:34341 + "HID:WIZARDS_HID_DLGREPORT_2_CMDUNGROUP", # HID:34342 + "HID:WIZARDS_HID_DLGREPORT_2_PREGROUPINGDEST", # HID:34343 + "HID:WIZARDS_HID_DLGREPORT_2_CMDMOVEUPGROUP", # HID:34344 + "HID:WIZARDS_HID_DLGREPORT_2_CMDMOVEDOWNGROUP", # HID:34345 + "HID:WIZARDS_HID_DLGREPORT_3_SORT1", # HID:34346 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND1", # HID:34347 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND1", # HID:34348 + "HID:WIZARDS_HID_DLGREPORT_3_SORT2", # HID:34349 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND2", # HID:34350 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND2", # HID:34351 + "HID:WIZARDS_HID_DLGREPORT_3_SORT3", # HID:34352 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND3", # HID:34353 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND3", # HID:34354 + "HID:WIZARDS_HID_DLGREPORT_3_SORT4", # HID:34355 + "HID:WIZARDS_HID_DLGREPORT_3_OPTASCEND4", # HID:34356 + "HID:WIZARDS_HID_DLGREPORT_3_OPTDESCEND4", # HID:34357 + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGREPORT_4_TITLE", # HID:34362 + "HID:WIZARDS_HID_DLGREPORT_4_DATALAYOUT", # HID:34363 + "HID:WIZARDS_HID_DLGREPORT_4_PAGELAYOUT", # HID:34364 + "HID:WIZARDS_HID_DLGREPORT_4_LANDSCAPE", # HID:34365 + "HID:WIZARDS_HID_DLGREPORT_4_PORTRAIT", # HID:34366 + "", + "", + "", + "HID:WIZARDS_HID_DLGREPORT_5_OPTDYNTEMPLATE", # HID:34370 + "HID:WIZARDS_HID_DLGREPORT_5_OPTSTATDOCUMENT", # HID:34371 + "HID:WIZARDS_HID_DLGREPORT_5_TXTTEMPLATEPATH", # HID:34372 + "HID:WIZARDS_HID_DLGREPORT_5_CMDTEMPLATEPATH", # HID:34373 + "HID:WIZARDS_HID_DLGREPORT_5_OPTEDITTEMPLATE", # HID:34374 + "HID:WIZARDS_HID_DLGREPORT_5_OPTUSETEMPLATE", # HID:34375 + "HID:WIZARDS_HID_DLGREPORT_5_TXTDOCUMENTPATH", # HID:34376 + "HID:WIZARDS_HID_DLGREPORT_5_CMDDOCUMENTPATH", # HID:34377 + "HID:WIZARDS_HID_DLGREPORT_5_CHKLINKTODB", # HID:34378 + "", + "", + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_1", # HID:34381 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_2", # HID:34382 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_3", # HID:34383 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_4", # HID:34384 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_5", # HID:34385 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_6", # HID:34386 + "HID:WIZARDS_HID_DLGREPORT_6_TXTTITLE_7", # HID:34387 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGFORM_DIALOG", # HID:34400 + "", + "HID:WIZARDS_HID_DLGFORM_CMDPREV", # HID:34402 + "HID:WIZARDS_HID_DLGFORM_CMDNEXT", # HID:34403 + "HID:WIZARDS_HID_DLGFORM_CMDFINISH", # HID:34404 + "HID:WIZARDS_HID_DLGFORM_CMDCANCEL", # HID:34405 + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGFORM_MASTER_LBTABLES", # HID:34411 + "HID:WIZARDS_HID_DLGFORM_MASTER_FIELDSAVAILABLE", # HID:34412 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVESELECTED", # HID:34413 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEALL", # HID:34414 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDREMOVESELECTED", # HID:34415 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDREMOVEALL", # HID:34416 + "HID:WIZARDS_HID_DLGFORM_MASTER_FIELDSSELECTED", # HID:34417 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEUP", # HID:34418 + "HID:WIZARDS_HID_DLGFORM_MASTER_CMDMOVEDOWN", # HID:34419 + "", + "HID:WIZARDS_HID_DLGFORM_CHKCREATESUBFORM", # HID:34421 + "HID:WIZARDS_HID_DLGFORM_OPTONEXISTINGRELATION", # HID:34422 + "HID:WIZARDS_HID_DLGFORM_OPTSELECTMANUALLY", # HID:34423 + "HID:WIZARDS_HID_DLGFORM_lstRELATIONS", # HID:34424 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGFORM_SUB_LBTABLES", # HID:34431 + "HID:WIZARDS_HID_DLGFORM_SUB_FIELDSAVAILABLE", # HID:34432 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVESELECTED", # HID:34433 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEALL", # HID:34434 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDREMOVESELECTED", # HID:34435 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDREMOVEALL", # HID:34436 + "HID:WIZARDS_HID_DLGFORM_SUB_FIELDSSELECTED", # HID:34437 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEUP", # HID:34438 + "HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEDOWN", # HID:34439 + "", + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK1", # HID:34441 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK1", # HID:34442 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK2", # HID:34443 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK2", # HID:34444 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK3", # HID:34446 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK4", # HID:34447 + "HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK4", # HID:34448 + "", + "", + "HID:WIZARDS_HID_DLGFORM_CMDALIGNLEFT", # HID:34451 + "HID:WIZARDS_HID_DLGFORM_CMDALIGNRIGHT", # HID:34452 + "HID:WIZARDS_HID_DLGFORM_CMDLEFTLABELED", # HID:34453 + "HID:WIZARDS_HID_DLGFORM_CMDTOPLABELED", # HID:34454 + "HID:WIZARDS_HID_DLGFORM_CMDTABLESTYLE", # HID:34455 + "HID:WIZARDS_HID_DLGFORM_CMDTOPJUSTIFIED", # HID:34456 + "HID:WIZARDS_HID_DLGFORM_CMDLEFTLABELED2", # HID:34457 + "HID:WIZARDS_HID_DLGFORM_CMDTOPLABELED2", # HID:34458 + "HID:WIZARDS_HID_DLGFORM_CMDTABLESTYLE2", # HID:34459 + "HID:WIZARDS_HID_DLGFORM_CMDTOPJUSTIFIED2", # HID:34460 + "HID:WIZARDS_HID_DLGFORM_OPTNEWDATAONLY", # HID:34461 + "HID:WIZARDS_HID_DLGFORM_OPTDISPLAYALLDATA", # HID:34462 + "HID:WIZARDS_HID_DLGFORM_CHKNOMODIFICATION", # HID:34463 + "HID:WIZARDS_HID_DLGFORM_CHKNODELETION", # HID:34464 + "HID:WIZARDS_HID_DLGFORM_CHKNOADDITION", # HID:34465 + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGFORM_LSTSTYLES", # HID:34471 + "HID:WIZARDS_HID_DLGFORM_CMDNOBORDER", # HID:34472 + "HID:WIZARDS_HID_DLGFORM_CMD3DBORDER", # HID:34473 + "HID:WIZARDS_HID_DLGFORM_CMDSIMPLEBORDER", # HID:34474 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGFORM_TXTPATH", # HID:34481 + "HID:WIZARDS_HID_DLGFORM_OPTWORKWITHFORM", # HID:34482 + "HID:WIZARDS_HID_DLGFORM_OPTMODIFYFORM", # HID:34483 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGNEWSLTR_DIALOG", # HID:34500 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTSTANDARDLAYOUT", # HID:34501 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTPARTYLAYOUT", # HID:34502 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTBROCHURELAYOUT", # HID:34503 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTSINGLESIDED", # HID:34504 + "HID:WIZARDS_HID_DLGNEWSLTR_OPTDOUBLESIDED", # HID:34505 + "HID:WIZARDS_HID_DLGNEWSLTR_CMDGOON", # HID:34506 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_SELLBUY", # HID:34520 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SELLBUY", # HID:34521 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTQUANTITY", # HID:34522 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTRATE", # HID:34523 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTDATE", # HID:34524 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTCOMMISSION", # HID:34525 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTFIX", # HID:34526 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTMINIMUM", # HID:34527 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SELLBUY", # HID:34528 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SELLBUY", # HID:34529 + "HID:WIZARDS_HID_DLGDEPOT_1_LSTSELLSTOCKS", # HID:34530 + "HID:WIZARDS_HID_DLGDEPOT_2_LSTBUYSTOCKS", # HID:34531 + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_SPLIT", # HID:34532 + "HID:WIZARDS_HID_DLGDEPOT_0_LSTSTOCKNAMES", # HID:34533 + "HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SPLIT", # HID:34534 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SPLIT", # HID:34535 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SPLIT", # HID:34536 + "HID:WIZARDS_HID_DLGDEPOT_1_OPTPERSHARE", # HID:34537 + "HID:WIZARDS_HID_DLGDEPOT_1_OPTTOTAL", # HID:34538 + "HID:WIZARDS_HID_DLGDEPOT_1_TXTDIVIDEND", # HID:34539 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTOLDRATE", # HID:34540 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTNEWRATE", # HID:34541 + "HID:WIZARDS_HID_DLGDEPOT_2_TXTDATE", # HID:34542 + "HID:WIZARDS_HID_DLGDEPOT_3_TXTSTARTDATE", # HID:34543 + "HID:WIZARDS_HID_DLGDEPOT_3_TXTENDDATE", # HID:34544 + "HID:WIZARDS_HID_DLGDEPOT_3_OPTDAILY", # HID:34545 + "HID:WIZARDS_HID_DLGDEPOT_3_OPTWEEKLY", # HID:34546 + "HID:WIZARDS_HID_DLGDEPOT_DIALOG_HISTORY", # HID:34547 + "HID:WIZARDS_HID_DLGDEPOT_LSTMARKETS", # HID:34548 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_HISTORY", # HID:34549 + "HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_HISTORY", # HID:34550 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGIMPORT_DIALOG", # HID:34570 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDHELP", # HID:34571 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDCANCEL", # HID:34572 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDPREV", # HID:34573 + "HID:WIZARDS_HID_DLGIMPORT_0_CMDNEXT", # HID:34574 + "HID:WIZARDS_HID_DLGIMPORT_0_OPTSODOCUMENTS", # HID:34575 + "HID:WIZARDS_HID_DLGIMPORT_0_OPTMSDOCUMENTS", # HID:34576 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKLOGFILE", # HID:34577 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKWORD", # HID:34578 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKEXCEL", # HID:34579 + "HID:WIZARDS_HID_DLGIMPORT_2_CHKPOWERPOINT", # HID:34580 + "HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATE", # HID:34581 + "HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATERECURSE", # HID:34582 + "HID:WIZARDS_HID_DLGIMPORT_2_LBTEMPLATEPATH", # HID:34583 + "HID:WIZARDS_HID_DLGIMPORT_2_EDTEMPLATEPATH", # HID:34584 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT", # HID:34585 + "HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENT", # HID:34586 + "HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENTRECURSE", # HID:34587 + "HID:WIZARDS_HID_DLGIMPORT_2_LBDOCUMENTPATH", # HID:34588 + "HID:WIZARDS_HID_DLGIMPORT_2_EDDOCUMENTPATH", # HID:34589 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT", # HID:34590 + "HID:WIZARDS_HID_DLGIMPORT_2_LBEXPORTDOCUMENTPATH", # HID:34591 + "HID:WIZARDS_HID_DLGIMPORT_2_EDEXPORTDOCUMENTPATH", # HID:34592 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDEXPORTPATHSELECT", # HID:34593 + "", + "HID:WIZARDS_HID_DLGIMPORT_3_TBSUMMARY", # HID:34595 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKWRITER", # HID:34596 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKCALC", # HID:34597 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKIMPRESS", # HID:34598 + "HID:WIZARDS_HID_DLGIMPORT_0_CHKMATHGLOBAL", # HID:34599 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT2", # HID:34600 + "HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT2", # HID:34601 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGCORRESPONDENCE_DIALOG", # HID:34630 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_CANCEL", # HID:34631 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA1", # HID:34632 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA2", # HID:34633 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_AGENDAOKAY", # HID:34634 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER1", # HID:34635 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER2", # HID:34636 + "HID:WIZARDS_HID_DLGCORRESPONDENCE_LETTEROKAY", # HID:34637 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGSTYLES_DIALOG", # HID:34650 + "HID:WIZARDS_HID_DLGSTYLES_LISTBOX", # HID:34651 + "HID:WIZARDS_HID_DLGSTYLES_CANCEL", # HID:34652 + "HID:WIZARDS_HID_DLGSTYLES_OKAY", # HID:34653 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGCONVERT_DIALOG", # HID:34660 + "HID:WIZARDS_HID_DLGCONVERT_CHECKBOX1", # HID:34661 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON1", # HID:34662 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON2", # HID:34663 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON3", # HID:34664 + "HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON4", # HID:34665 + "HID:WIZARDS_HID_DLGCONVERT_LISTBOX1", # HID:34666 + "HID:WIZARDS_HID_DLGCONVERT_OBFILE", # HID:34667 + "HID:WIZARDS_HID_DLGCONVERT_OBDIR", # HID:34668 + "HID:WIZARDS_HID_DLGCONVERT_COMBOBOX1", # HID:34669 + "HID:WIZARDS_HID_DLGCONVERT_TBSOURCE", # HID:34670 + "HID:WIZARDS_HID_DLGCONVERT_CHECKRECURSIVE", # HID:34671 + "HID:WIZARDS_HID_DLGCONVERT_TBTARGET", # HID:34672 + "HID:WIZARDS_HID_DLGCONVERT_CBCANCEL", # HID:34673 + "HID:WIZARDS_HID_DLGCONVERT_CBHELP", # HID:34674 + "HID:WIZARDS_HID_DLGCONVERT_CBBACK", # HID:34675 + "HID:WIZARDS_HID_DLGCONVERT_CBGOON", # HID:34676 + "HID:WIZARDS_HID_DLGCONVERT_CBSOURCEOPEN", # HID:34677 + "HID:WIZARDS_HID_DLGCONVERT_CBTARGETOPEN", # HID:34678 + "HID:WIZARDS_HID_DLGCONVERT_CHKPROTECT", # HID:34679 + "HID:WIZARDS_HID_DLGCONVERT_CHKTEXTDOCUMENTS", # HID:34680 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGPASSWORD_CMDGOON", # HID:34690 + "HID:WIZARDS_HID_DLGPASSWORD_CMDCANCEL", # HID:34691 + "HID:WIZARDS_HID_DLGPASSWORD_CMDHELP", # HID:34692 + "HID:WIZARDS_HID_DLGPASSWORD_TXTPASSWORD", # HID:34693 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGHOLIDAYCAL_DIALOG", # HID:34700 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_PREVIEW", # HID:34701 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_OPYEAR", # HID:34702 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_OPMONTH", # HID:34703 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_EDYEAR", # HID:34704 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_EDMONTH", # HID:34705 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_SPINYEAR", # HID:34706 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_SPINMONTH", # HID:34707 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_1_CMBSTATE", # HID:34708 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_LBOWNDATA", # HID:34709 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CMDINSERT", # HID:34710 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CMDDELETE", # HID:34711 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENT", # HID:34712 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_CHKEVENT", # HID:34713 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTDAY", # HID:34714 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTDAY", # HID:34715 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTMONTH", # HID:34716 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTMONTH", # HID:34717 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_EDEVENTYEAR", # HID:34718 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_2_SPINEVENTYEAR", # HID:34719 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDOWNDATA", # HID:34720 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDCANCEL", # HID:34721 + "HID:WIZARDS_HID_DLGHOLIDAYCAL_0_CMDOK" # HID:34722 + ] + array2 = ["HID:WIZARDS_HID_LTRWIZ_OPTBUSINESSLETTER", # HID:40769 + "HID:WIZARDS_HID_LTRWIZ_OPTPRIVOFFICIALLETTER", # HID:40770 + "HID:WIZARDS_HID_LTRWIZ_OPTPRIVATELETTER", # HID:40771 + "HID:WIZARDS_HID_LTRWIZ_LSTBUSINESSSTYLE", # HID:40772 + "HID:WIZARDS_HID_LTRWIZ_CHKBUSINESSPAPER", # HID:40773 + "HID:WIZARDS_HID_LTRWIZ_LSTPRIVOFFICIALSTYLE", # HID:40774 + "HID:WIZARDS_HID_LTRWIZ_LSTPRIVATESTYLE", # HID:40775 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERCOMPANYLOGO", # HID:40776 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOHEIGHT", # HID:40777 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOX", # HID:40778 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOWIDTH", # HID:40779 + "HID:WIZARDS_HID_LTRWIZ_NUMLOGOY", # HID:40780 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERCOMPANYADDRESS", # HID:40781 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSHEIGHT", # HID:40782 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSX", # HID:40783 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSWIDTH", # HID:40784 + "HID:WIZARDS_HID_LTRWIZ_NUMADDRESSY", # HID:40785 + "HID:WIZARDS_HID_LTRWIZ_CHKCOMPANYRECEIVER", # HID:40786 + "HID:WIZARDS_HID_LTRWIZ_CHKPAPERFOOTER", # HID:40787 + "HID:WIZARDS_HID_LTRWIZ_NUMFOOTERHEIGHT", # HID:40788 + "HID:WIZARDS_HID_LTRWIZ_LSTLETTERNORM", # HID:40789 + "HID:WIZARDS_HID_LTRWIZ_CHKUSELOGO", # HID:40790 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEADDRESSRECEIVER", # HID:40791 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESIGNS", # HID:40792 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESUBJECT", # HID:40793 + "HID:WIZARDS_HID_LTRWIZ_CHKUSESALUTATION", # HID:40794 + "HID:WIZARDS_HID_LTRWIZ_LSTSALUTATION", # HID:40795 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEBENDMARKS", # HID:40796 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEGREETING", # HID:40797 + "HID:WIZARDS_HID_LTRWIZ_LSTGREETING", # HID:40798 + "HID:WIZARDS_HID_LTRWIZ_CHKUSEFOOTER", # HID:40799 + "HID:WIZARDS_HID_LTRWIZ_OPTSENDERPLACEHOLDER", # HID:40800 + "HID:WIZARDS_HID_LTRWIZ_OPTSENDERDEFINE", # HID:40801 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERNAME", # HID:40802 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERSTREET", # HID:40803 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERPOSTCODE", # HID:40804 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERSTATE_TEXT", # HID:40805 + "HID:WIZARDS_HID_LTRWIZ_TXTSENDERCITY", # HID:40806 + "HID:WIZARDS_HID_LTRWIZ_OPTRECEIVERPLACEHOLDER", # HID:40807 + "HID:WIZARDS_HID_LTRWIZ_OPTRECEIVERDATABASE", # HID:40808 + "HID:WIZARDS_HID_LTRWIZ_TXTFOOTER", # HID:40809 + "HID:WIZARDS_HID_LTRWIZ_CHKFOOTERNEXTPAGES", # HID:40810 + "HID:WIZARDS_HID_LTRWIZ_CHKFOOTERPAGENUMBERS", # HID:40811 + "HID:WIZARDS_HID_LTRWIZ_TXTTEMPLATENAME", # HID:40812 + "HID:WIZARDS_HID_LTRWIZ_OPTCREATELETTER", # HID:40813 + "HID:WIZARDS_HID_LTRWIZ_OPTMAKECHANGES", # HID:40814 + "HID:WIZARDS_HID_LTRWIZ_TXTPATH", # HID:40815 + "HID:WIZARDS_HID_LTRWIZ_CMDPATH", # HID:40816 + "", + "", + "", + "HID:WIZARDS_HID_LTRWIZARD", # HID:40820 + "HID:WIZARDS_HID_LTRWIZARD_HELP", # HID:40821 + "HID:WIZARDS_HID_LTRWIZARD_BACK", # HID:40822 + "HID:WIZARDS_HID_LTRWIZARD_NEXT", # HID:40823 + "HID:WIZARDS_HID_LTRWIZARD_CREATE", # HID:40824 + "HID:WIZARDS_HID_LTRWIZARD_CANCEL", # HID:40825 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_LSTTABLES", # HID:40850 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDS", # HID:40851 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVESELECTED", # HID:40852 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEALL", # HID:40853 + "HID:WIZARDS_HID_QUERYWIZARD_CMDREMOVESELECTED", # HID:40854 + "HID:WIZARDS_HID_QUERYWIZARD_CMDREMOVEALL", # HID:40855 + "HID:WIZARDS_HID_QUERYWIZARD_LSTSELFIELDS", # HID:40856 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEUP", # HID:40857 + "HID:WIZARDS_HID_QUERYWIZARD_CMDMOVEDOWN", # HID:40858 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_SORT1", # HID:40865 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND1", # HID:40866 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND1", # HID:40867 + "HID:WIZARDS_HID_QUERYWIZARD_SORT2", # HID:40868 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND2", # HID:40869 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND2", # HID:40870 + "HID:WIZARDS_HID_QUERYWIZARD_SORT3", # HID:40871 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND3", # HID:40872 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND3", # HID:40873 + "HID:WIZARDS_HID_QUERYWIZARD_SORT4", # HID:40874 + "HID:WIZARDS_HID_QUERYWIZARD_OPTASCEND4", # HID:40875 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDESCEND4", # HID:40876 + "", + "HID:WIZARDS_HID_QUERYWIZARD_OPTMATCHALL", # HID:40878 + "HID:WIZARDS_HID_QUERYWIZARD_OPTMATCHANY", # HID:40879 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_1", # HID:40880 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_1", # HID:40881 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_1", # HID:40882 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_2", # HID:40883 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_2", # HID:40884 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_2", # HID:40885 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFIELDNAME_3", # HID:40886 + "HID:WIZARDS_HID_QUERYWIZARD_LSTOPERATOR_3", # HID:40887 + "HID:WIZARDS_HID_QUERYWIZARD_TXTVALUE_3", # HID:40888 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_OPTAGGREGATEDETAILQUERY", # HID:40895 + "HID:WIZARDS_HID_QUERYWIZARD_OPTAGGREGATESUMMARYQUERY", # HID:40896 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_1", # HID:40897 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_1", # HID:40898 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_2", # HID:40899 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_2", # HID:40900 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_3", # HID:40901 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_3", # HID:40902 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_4", # HID:40903 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_4", # HID:40904 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFUNCTION_5", # HID:40905 + "HID:WIZARDS_HID_QUERYWIZARD_LSTAGGREGATEFIELDS_5", # HID:40906 + "HID:WIZARDS_HID_QUERYWIZARD_BTNAGGREGATEPLUS", # HID:40907 + "HID:WIZARDS_HID_QUERYWIZARD_BTNAGGREGATEMINUS", # HID:40908 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDS", # HID:40915 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVESELECTED", # HID:40916 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERREMOVESELECTED", # HID:40917 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERSELFIELDS", # HID:40918 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVEUP", # HID:40919 + "HID:WIZARDS_HID_QUERYWIZARD_CMDFILTERMOVEDOWN", # HID:40920 + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_OPTGROUPMATCHALL", # HID:40923 + "HID:WIZARDS_HID_QUERYWIZARD_OPTGROUPMATCHANY", # HID:40924 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_1", # HID:40925 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_1", # HID:40926 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_1", # HID:40927 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_2", # HID:40928 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_2", # HID:40929 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_2", # HID:40930 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTERFIELDNAME_3", # HID:40931 + "HID:WIZARDS_HID_QUERYWIZARD_LSTFILTEROPERATOR_3", # HID:40932 + "HID:WIZARDS_HID_QUERYWIZARD_TXTFILTERVALUE_3", # HID:40933 + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_1", # HID:40940 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_2", # HID:40941 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_3", # HID:40942 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_4", # HID:40943 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_5", # HID:40944 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_6", # HID:40945 + "HID:WIZARDS_HID_QUERYWIZARD_TXTTITLE_7", # HID:40946 + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD_TXTQUERYTITLE", # HID:40955 + "HID:WIZARDS_HID_QUERYWIZARD_OPTDISPLAYQUERY", # HID:40956 + "HID:WIZARDS_HID_QUERYWIZARD_OPTMODIFYQUERY", # HID:40957 + "HID:WIZARDS_HID_QUERYWIZARD_TXTSUMMARY", # HID:40958 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_QUERYWIZARD", # HID:40970 + "", + "HID:WIZARDS_HID_QUERYWIZARD_BACK", # HID:40972 + "HID:WIZARDS_HID_QUERYWIZARD_NEXT", # HID:40973 + "HID:WIZARDS_HID_QUERYWIZARD_CREATE", # HID:40974 + "HID:WIZARDS_HID_QUERYWIZARD_CANCEL", # HID:40975 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_IS_BTN_OK", # HID:41003 + "HID:WIZARDS_HID_IS_BTN_CANCEL", # HID:41004 + "HID:WIZARDS_HID_IS_BTN_IMG1", # HID:41005 + "HID:WIZARDS_HID_IS_BTN_IMG2", # HID:41006 + "HID:WIZARDS_HID_IS_BTN_IMG3", # HID:41007 + "HID:WIZARDS_HID_IS_BTN_IMG4", # HID:41008 + "HID:WIZARDS_HID_IS_BTN_IMG5", # HID:41009 + "HID:WIZARDS_HID_IS_BTN_IMG6", # HID:41010 + "HID:WIZARDS_HID_IS_BTN_IMG7", # HID:41011 + "HID:WIZARDS_HID_IS_BTN_IMG8", # HID:41012 + "HID:WIZARDS_HID_IS_BTN_IMG9", # HID:41013 + "HID:WIZARDS_HID_IS_BTN_IMG10", # HID:41014 + "HID:WIZARDS_HID_IS_BTN_IMG11", # HID:41015 + "HID:WIZARDS_HID_IS_BTN_IMG12", # HID:41016 + "HID:WIZARDS_HID_IS_BTN_IMG13", # HID:41017 + "HID:WIZARDS_HID_IS_BTN_IMG14", # HID:41018 + "HID:WIZARDS_HID_IS_BTN_IMG15", # HID:41019 + "HID:WIZARDS_HID_IS_BTN_IMG16", # HID:41020 + "HID:WIZARDS_HID_IS_BTN_IMG17", # HID:41021 + "HID:WIZARDS_HID_IS_BTN_IMG18", # HID:41022 + "HID:WIZARDS_HID_IS_BTN_IMG19", # HID:41023 + "HID:WIZARDS_HID_IS_BTN_IMG20", # HID:41024 + "HID:WIZARDS_HID_IS_BTN_IMG21", # HID:41025 + "HID:WIZARDS_HID_IS_BTN_IMG22", # HID:41026 + "HID:WIZARDS_HID_IS_BTN_IMG23", # HID:41027 + "HID:WIZARDS_HID_IS_BTN_IMG24", # HID:41028 + "HID:WIZARDS_HID_IS_BTN_IMG25", # HID:41029 + "HID:WIZARDS_HID_IS_BTN_IMG26", # HID:41030 + "HID:WIZARDS_HID_IS_BTN_IMG27", # HID:41031 + "HID:WIZARDS_HID_IS_BTN_IMG28", # HID:41032 + "HID:WIZARDS_HID_IS_BTN_IMG29", # HID:41033 + "HID:WIZARDS_HID_IS_BTN_IMG30", # HID:41034 + "HID:WIZARDS_HID_IS_BTN_IMG31", # HID:41035 + "HID:WIZARDS_HID_IS_BTN_IMG32", # HID:41036 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_FTP_OK", # HID:41047 + "HID:WIZARDS_HID_FTP_CANCEL", # HID:41048 + "", + "", + "HID:WIZARDS_HID_AGWIZ", # HID:41051 + "HID:WIZARDS_HID_AGWIZ_HELP", # HID:41052 + "HID:WIZARDS_HID_AGWIZ_NEXT", # HID:41053 + "HID:WIZARDS_HID_AGWIZ_PREV", # HID:41054 + "HID:WIZARDS_HID_AGWIZ_CREATE", # HID:41055 + "HID:WIZARDS_HID_AGWIZ_CANCEL", # HID:41056 + "HID:WIZARDS_HID_AGWIZ_1_LIST_PAGEDESIGN", # HID:41057 + "HID:WIZARDS_HID_AGWIZ_1_CHK_MINUTES", # HID:41058 + "HID:WIZARDS_HID_AGWIZ_2_TXT_TIME", # HID:41059 + "HID:WIZARDS_HID_AGWIZ_2_TXT_DATE", # HID:41060 + "HID:WIZARDS_HID_AGWIZ_2_TXT_TITLE", # HID:41061 + "HID:WIZARDS_HID_AGWIZ_2_TXT_LOCATION", # HID:41062 + "HID:WIZARDS_HID_AGWIZ_3_CHK_MEETING_TYPE", # HID:41063 + "HID:WIZARDS_HID_AGWIZ_3_CHK_READ", # HID:41064 + "HID:WIZARDS_HID_AGWIZ_3_CHK_BRING", # HID:41065 + "HID:WIZARDS_HID_AGWIZ_3_CHK_NOTES", # HID:41066 + "HID:WIZARDS_HID_AGWIZ_4_CHK_CALLED_BY", # HID:41067 + "HID:WIZARDS_HID_AGWIZ_4_CHK_FACILITATOR", # HID:41068 + "HID:WIZARDS_HID_AGWIZ_4_CHK_NOTETAKER", # HID:41069 + "HID:WIZARDS_HID_AGWIZ_4_CHK_TIMEKEEPER", # HID:41070 + "HID:WIZARDS_HID_AGWIZ_4_CHK_ATTENDEES", # HID:41071 + "HID:WIZARDS_HID_AGWIZ_4_CHK_OBSERVERS", # HID:41072 + "HID:WIZARDS_HID_AGWIZ_4_CHK_RESOURCEPERSONS", # HID:41073 + "HID:WIZARDS_HID_AGWIZ_6_TXT_TEMPLATENAME", # HID:41074 + "HID:WIZARDS_HID_AGWIZ_6_TXT_TEMPLATEPATH", # HID:41075 + "HID:WIZARDS_HID_AGWIZ_6_BTN_TEMPLATEPATH", # HID:41076 + "HID:WIZARDS_HID_AGWIZ_6_OPT_CREATEAGENDA", # HID:41077 + "HID:WIZARDS_HID_AGWIZ_6_OPT_MAKECHANGES", # HID:41078 + "HID:WIZARDS_HID_AGWIZ_5_BTN_INSERT", # HID:41079 + "HID:WIZARDS_HID_AGWIZ_5_BTN_REMOVE", # HID:41080 + "HID:WIZARDS_HID_AGWIZ_5_BTN_UP", # HID:41081 + "HID:WIZARDS_HID_AGWIZ_5_BTN_DOWN", # HID:41082 + "HID:WIZARDS_HID_AGWIZ_5_SCROLL_BAR", # HID:41083 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_1", # HID:41084 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_1", # HID:41085 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_1", # HID:41086 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_2", # HID:41087 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_2", # HID:41088 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_2", # HID:41089 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_3", # HID:41090 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_3", # HID:41091 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_3", # HID:41092 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_4", # HID:41093 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_4", # HID:41094 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_4", # HID:41095 + "HID:WIZARDS_HID_AGWIZ_5_TXT_TOPIC_5", # HID:41096 + "HID:WIZARDS_HID_AGWIZ_5_TXT_RESPONSIBLE_5", # HID:41097 + "HID:WIZARDS_HID_AGWIZ_5_TXT_MINUTES_5", # HID:41098 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_FAXWIZ_OPTBUSINESSFAX", # HID:41120 + "HID:WIZARDS_HID_FAXWIZ_LSTBUSINESSSTYLE", # HID:41121 + "HID:WIZARDS_HID_FAXWIZ_OPTPRIVATEFAX", # HID:41122 + "HID:WIZARDS_HID_LSTPRIVATESTYLE", # HID:41123 + "HID:WIZARDS_HID_IMAGECONTROL3", # HID:41124 + "HID:WIZARDS_HID_CHKUSELOGO", # HID:41125 + "HID:WIZARDS_HID_CHKUSEDATE", # HID:41126 + "HID:WIZARDS_HID_CHKUSECOMMUNICATIONTYPE", # HID:41127 + "HID:WIZARDS_HID_LSTCOMMUNICATIONTYPE", # HID:41128 + "HID:WIZARDS_HID_CHKUSESUBJECT", # HID:41129 + "HID:WIZARDS_HID_CHKUSESALUTATION", # HID:41130 + "HID:WIZARDS_HID_LSTSALUTATION", # HID:41131 + "HID:WIZARDS_HID_CHKUSEGREETING", # HID:41132 + "HID:WIZARDS_HID_LSTGREETING", # HID:41133 + "HID:WIZARDS_HID_CHKUSEFOOTER", # HID:41134 + "HID:WIZARDS_HID_OPTSENDERPLACEHOLDER", # HID:41135 + "HID:WIZARDS_HID_OPTSENDERDEFINE", # HID:41136 + "HID:WIZARDS_HID_TXTSENDERNAME", # HID:41137 + "HID:WIZARDS_HID_TXTSENDERSTREET", # HID:41138 + "HID:WIZARDS_HID_TXTSENDERPOSTCODE", # HID:41139 + "HID:WIZARDS_HID_TXTSENDERSTATE", # HID:41140 + "HID:WIZARDS_HID_TXTSENDERCITY", # HID:41141 + "HID:WIZARDS_HID_TXTSENDERFAX", # HID:41142 + "HID:WIZARDS_HID_OPTRECEIVERPLACEHOLDER", # HID:41143 + "HID:WIZARDS_HID_OPTRECEIVERDATABASE", # HID:41144 + "HID:WIZARDS_HID_TXTFOOTER", # HID:41145 + "HID:WIZARDS_HID_CHKFOOTERNEXTPAGES", # HID:41146 + "HID:WIZARDS_HID_CHKFOOTERPAGENUMBERS", # HID:41147 + "HID:WIZARDS_HID_TXTTEMPLATENAME", # HID:41148 + "HID:WIZARDS_HID_FILETEMPLATEPATH", # HID:41149 + "HID:WIZARDS_HID_OPTCREATEFAX", # HID:41150 + "HID:WIZARDS_HID_OPTMAKECHANGES", # HID:41151 + "HID:WIZARDS_HID_IMAGECONTROL2", # HID:41152 + "HID:WIZARDS_HID_FAXWIZ_TXTPATH", # HID:41153 + "HID:WIZARDS_HID_FAXWIZ_CMDPATH", # HID:41154 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_FAXWIZARD", # HID:41180 + "HID:WIZARDS_HID_FAXWIZARD_HELP", # HID:41181 + "HID:WIZARDS_HID_FAXWIZARD_BACK", # HID:41182 + "HID:WIZARDS_HID_FAXWIZARD_NEXT", # HID:41183 + "HID:WIZARDS_HID_FAXWIZARD_CREATE", # HID:41184 + "HID:WIZARDS_HID_FAXWIZARD_CANCEL", # HID:41185 + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "HID:WIZARDS_HID_DLGTABLE_DIALOG", # HID:41200 + "", + "HID:WIZARDS_HID_DLGTABLE_CMDPREV", # HID:41202 + "HID:WIZARDS_HID_DLGTABLE_CMDNEXT", # HID:41203 + "HID:WIZARDS_HID_DLGTABLE_CMDFINISH", # HID:41204 + "HID:WIZARDS_HID_DLGTABLE_CMDCANCEL", # HID:41205 + "HID:WIZARDS_HID_DLGTABLE_OPTBUSINESS", # HID:41206 + "HID:WIZARDS_HID_DLGTABLE_OPTPRIVATE", # HID:41207 + "HID:WIZARDS_HID_DLGTABLE_LBTABLES", # HID:41208 + "HID:WIZARDS_HID_DLGTABLE_FIELDSAVAILABLE", # HID:41209 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVESELECTED", # HID:41210 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEALL", # HID:41211 + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVESELECTED", # HID:41212 + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVEALL", # HID:41213 + "HID:WIZARDS_HID_DLGTABLE_FIELDSSELECTED", # HID:41214 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEUP", # HID:41215 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEDOWN", # HID:41216 + "", + "", + "", + "HID:WIZARDS_HID_DLGTABLE_LB_SELFIELDNAMES", # HID:41220 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDUP", # HID:41221 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDDOWN", # HID:41222 + "HID:WIZARDS_HID_DLGTABLE_CMDMINUS", # HID:41223 + "HID:WIZARDS_HID_DLGTABLE_CMDPLUS", # HID:41224 + "HID:WIZARDS_HID_DLGTABLE_COLNAME", # HID:41225 + "HID:WIZARDS_HID_DLGTABLE_COLMODIFIER", # HID:41226 + "HID:WIZARDS_HID_DLGTABLE_CHK_USEPRIMEKEY", # HID:41227 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_AUTOMATIC", # HID:41228 + "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE_AUTOMATIC", # HID:41229 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SINGLE", # HID:41230 + "HID:WIZARDS_HID_DLGTABLE_LB_PK_FIELDNAME", # HID:41231 + "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE", # HID:41232 + "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SEVERAL", # HID:41233 + "HID:WIZARDS_HID_DLGTABLE_FIELDS_PK_AVAILABLE", # HID:41234 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVE_PK_SELECTED", # HID:41235 + "HID:WIZARDS_HID_DLGTABLE_CMDREMOVE_PK_SELECTED", # HID:41236 + "HID:WIZARDS_HID_DLGTABLE_FIELDS_PK_SELECTED", # HID:41237 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEUP_PK_SELECTED", # HID:41238 + "HID:WIZARDS_HID_DLGTABLE_CMDMOVEDOWN_PK_SELECTED", # HID:41239 + "HID:WIZARDS_HID_DLGTABLE_TXT_NAME", # HID:41240 + "HID:WIZARDS_HID_DLGTABLE_OPT_MODIFYTABLE", # HID:41241 + "HID:WIZARDS_HID_DLGTABLE_OPT_WORKWITHTABLE", # HID:41242 + "HID:WIZARDS_HID_DLGTABLE_OPT_STARTFORMWIZARD", # HID:41243 + "HID:WIZARDS_HID_DLGTABLE_LST_CATALOG", # HID:41244 + "HID:WIZARDS_HID_DLGTABLE_LST_SCHEMA" # HID:41245 + ] + + @classmethod + def getHelpIdString(self, nHelpId): + if nHelpId >= 34200 and nHelpId <= 34722: + return HelpIds.array1[nHelpId - 34200] + elif nHelpId >= 40769 and nHelpId <= 41245: + return HelpIds.array2[nHelpId - 40769] + else: + return None diff --git a/wizards/com/sun/star/wizards/common/Helper.java b/wizards/com/sun/star/wizards/common/Helper.java new file mode 100644 index 000000000..efb0a970a --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Helper.java @@ -0,0 +1,239 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.uno.XComponentContext; +import com.sun.star.util.XMacroExpander; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.RuntimeException; +import com.sun.star.uno.UnoRuntime; + +public class Helper +{ + + public static long convertUnoDatetoInteger(com.sun.star.util.Date DateValue) + { + java.util.Calendar oCal = java.util.Calendar.getInstance(); + oCal.set(DateValue.Year, DateValue.Month, DateValue.Day); + java.util.Date dTime = oCal.getTime(); + long lTime = dTime.getTime(); + return lTime / (3600 * 24000); + } + + public static void setUnoPropertyValue(Object oUnoObject, String PropertyName, Object PropertyValue) + { + try + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oUnoObject); + if (xPSet.getPropertySetInfo().hasPropertyByName(PropertyName)) + { + xPSet.setPropertyValue(PropertyName, PropertyValue); + } + else + { + throw new java.lang.IllegalArgumentException("No Such Property: '" + PropertyName + "'"); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public static Object getUnoObjectbyName(Object oUnoObject, String ElementName) + { + try + { + com.sun.star.container.XNameAccess xName = UnoRuntime.queryInterface(com.sun.star.container.XNameAccess.class, oUnoObject); + if (xName.hasByName(ElementName)) + { + return xName.getByName(ElementName); + } + else + { + throw new RuntimeException(); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + + + public static Object getUnoPropertyValue(Object oUnoObject, String PropertyName, java.lang.Class<?> xClass) + { + try + { + if (oUnoObject != null) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oUnoObject); + Object oObject = xPSet.getPropertyValue(PropertyName); + if (AnyConverter.isVoid(oObject)) + { + return null; + } + else + { + return com.sun.star.uno.AnyConverter.toObject(new com.sun.star.uno.Type(xClass), oObject); + } + } + return null; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + + + + + public static Object getUnoPropertyValue(Object oUnoObject, String PropertyName) + { + try + { + if (oUnoObject != null) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oUnoObject); + return xPSet.getPropertyValue(PropertyName); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return null; + } + + public static Object getUnoArrayPropertyValue(Object oUnoObject, String PropertyName) + { + try + { + if (oUnoObject != null) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oUnoObject); + Object oObject = xPSet.getPropertyValue(PropertyName); + if (AnyConverter.isArray(oObject)) + { + return getArrayValue(oObject); + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return null; + } + + public static Object getUnoStructValue(Object oUnoObject, String PropertyName) + { + try + { + if (oUnoObject != null) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oUnoObject); + if (xPSet.getPropertySetInfo().hasPropertyByName(PropertyName)) + { + return xPSet.getPropertyValue(PropertyName); + } + } + return null; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public static void setUnoPropertyValues(Object oUnoObject, String[] PropertyNames, Object[] PropertyValues) + { + try + { + com.sun.star.beans.XMultiPropertySet xMultiPSetLst = UnoRuntime.queryInterface(com.sun.star.beans.XMultiPropertySet.class, oUnoObject); + if (xMultiPSetLst != null) + { + xMultiPSetLst.setPropertyValues(PropertyNames, PropertyValues); + } + else + { + for (int i = 0; i < PropertyNames.length; i++) + { + setUnoPropertyValue(oUnoObject, PropertyNames[i], PropertyValues[i]); + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + /** + * checks if the value of an object that represents an array is null. + * check beforehand if the Object is really an array with "AnyConverter.IsArray(oObject) + * @param oValue the parameter that has to represent an object + * @return a null reference if the array is empty + */ + private static Object getArrayValue(Object oValue) + { + try + { + Object oPropList = com.sun.star.uno.AnyConverter.toArray(oValue); + int nlen = java.lang.reflect.Array.getLength(oPropList); + if (nlen == 0) + { + return null; + } + else + { + return oPropList; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public static XComponentContext getComponentContext(XMultiServiceFactory _xMSF) + { + // Get the path to the extension and try to add the path to the class loader + final XPropertySet xProps = UnoRuntime.queryInterface(XPropertySet.class, _xMSF); + final PropertySetHelper aHelper = new PropertySetHelper(xProps); + final Object aDefaultContext = aHelper.getPropertyValueAsObject("DefaultContext"); + return UnoRuntime.queryInterface(XComponentContext.class, aDefaultContext); + } + + public static XMacroExpander getMacroExpander(XMultiServiceFactory _xMSF) + { + final XComponentContext xComponentContext = getComponentContext(_xMSF); + final Object aSingleton = xComponentContext.getValueByName("/singletons/com.sun.star.util.theMacroExpander"); + return UnoRuntime.queryInterface(XMacroExpander.class, aSingleton); + } +} diff --git a/wizards/com/sun/star/wizards/common/IRenderer.java b/wizards/com/sun/star/wizards/common/IRenderer.java new file mode 100644 index 000000000..c704ed6f4 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/IRenderer.java @@ -0,0 +1,30 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +/** + * A General interface which gives a string + * that represents the rendered argument object. + * Can be used to reference resources, internationalizartion + * a.s.o + */ +public interface IRenderer +{ + + String render(Object object); +} diff --git a/wizards/com/sun/star/wizards/common/IRenderer.py b/wizards/com/sun/star/wizards/common/IRenderer.py new file mode 100644 index 000000000..6086665f4 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/IRenderer.py @@ -0,0 +1,28 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . + +from abc import abstractmethod + +# A General interface which gives a string +# that represents the rendered argument object. +# Can be used to reference resources, internationalizartion +# a.s.o +class IRenderer: + + @abstractmethod + def render(object): + pass diff --git a/wizards/com/sun/star/wizards/common/InvalidQueryException.java b/wizards/com/sun/star/wizards/common/InvalidQueryException.java new file mode 100644 index 000000000..a4ac8f90a --- /dev/null +++ b/wizards/com/sun/star/wizards/common/InvalidQueryException.java @@ -0,0 +1,35 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.lang.XMultiServiceFactory; + +public class InvalidQueryException extends java.lang.Throwable +{ + // TODO don't show messages in Exceptions + public InvalidQueryException(XMultiServiceFactory xMSF, String sCommand) + { + SystemDialog.showErrorBox(xMSF, "RID_REPORT_65", "<STATEMENT>", sCommand); // Querycreationnotpossible + } + // TODO don't show messages in Exceptions + public InvalidQueryException(XMultiServiceFactory xMSF, String sCommand, Throwable cause) + { + super(cause); + SystemDialog.showErrorBox(xMSF, "RID_REPORT_65", "<STATEMENT>", sCommand); // Querycreationnotpossible + } +} diff --git a/wizards/com/sun/star/wizards/common/JavaTools.java b/wizards/com/sun/star/wizards/common/JavaTools.java new file mode 100644 index 000000000..65bb3f644 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/JavaTools.java @@ -0,0 +1,538 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.beans.PropertyValue; +import java.util.*; +import java.io.File; + +import com.sun.star.lib.util.UrlToFileMapper; +import java.net.MalformedURLException; +import java.net.URL; + +public class JavaTools +{ + + public static String[] ArrayOutOfMultiDimArray(String _sMultiDimArray[][], int _index) + { + String[] sRetArray = null; + if (_sMultiDimArray != null) + { + sRetArray = new String[_sMultiDimArray.length]; + for (int i = 0; i < _sMultiDimArray.length; i++) + { + sRetArray[i] = _sMultiDimArray[i][_index]; + } + } + return sRetArray; + } + + /**converts a list of Integer values included in an Integer vector to a list of int values + */ + public static int[] IntegerTointList(java.util.List<Integer> _aIntegerVector) + { + int[] nintValues = null; + if (_aIntegerVector.size() > 0) { + int i = 0; + nintValues = new int[_aIntegerVector.size()]; + for (Integer nIntegerValue : _aIntegerVector) { + nintValues[i++] = nIntegerValue.intValue(); + } + } + return nintValues; + } + + /**converts a list of Boolean values included in a Boolean vector to a list of boolean values + */ + public static boolean[] BooleanTobooleanList(java.util.List<Boolean> _aBooleanVector) + { + boolean[] bbooleanValues = null; + if (_aBooleanVector.size() > 0) { + int i = 0; + bbooleanValues = new boolean[_aBooleanVector.size()]; + for (Boolean bBooleanValue : _aBooleanVector) { + bbooleanValues[i++] = bBooleanValue.booleanValue(); + } + } + return bbooleanValues; + } + + public static String getlongestArrayItem(String[] StringArray) + { + String sLongestItem = PropertyNames.EMPTY_STRING; + int iCurLength; + int iOldLength = 0; + for (String str : StringArray) + { + iCurLength = str.length(); + if (iCurLength > iOldLength) + { + iOldLength = iCurLength; + sLongestItem = str; + } + } + return sLongestItem; + } + + public static String ArraytoString(String[] LocArray) + { + StringBuilder ResultString = new StringBuilder(PropertyNames.EMPTY_STRING); + boolean bActive = false; + for (String str : LocArray) { + if (bActive) { + ResultString.append(PropertyNames.SEMI_COLON); + } else { + bActive = true; + } + ResultString.append(str); + } + return ResultString.toString(); + } + + /** + * @return the index of the field that contains the string 'SearchString' or '-1' if not it is + * not contained within the array + */ + public static int FieldInList(String[] SearchList, String SearchString) { + int retvalue = -1; + for (int i = 0; i < SearchList.length; i++) { + if (SearchList[i].equals(SearchString)) { + retvalue = i; + break; + } + } + return retvalue; + } + + public static int FieldInTable(String[][] SearchList, String SearchString) + { + int retvalue = -1; + if (SearchList != null) { + int FieldLen = SearchList.length; + if (FieldLen > 0) { + for (int i = 0; i < FieldLen; i++) { + if (SearchList[i][0] != null && SearchList[i][0].equals(SearchString)) { + retvalue = i; + break; + } + } + } + } + return retvalue; + } + + public static int FieldInIntTable(int[][] SearchList, int SearchValue) + { + int retvalue = -1; + for (int i = 0; i < SearchList.length; i++) + { + if (SearchList[i][0] == SearchValue) + { + retvalue = i; + break; + } + } + return retvalue; + } + + public static int FieldInIntTable(int[] SearchList, int SearchValue, int _startindex) + { + int retvalue = -1; + for (int i = _startindex; i < SearchList.length; i++) + { + if (SearchList[i] == SearchValue) + { + retvalue = i; + break; + } + } + return retvalue; + } + + public static int FieldInIntTable(int[] SearchList, int SearchValue) + { + return FieldInIntTable(SearchList, SearchValue, 0); + } + + public static int getArraylength(Object[] MyArray) + { + int FieldCount = 0; + if (MyArray != null) + { + FieldCount = MyArray.length; + } + return FieldCount; + } + + /** + * This function bubble sorts an array of with 2 dimensions. + * The default sorting order is the first dimension + * Only if sort2ndValue is True the second dimension is the relevant for the sorting order + */ + public static String[][] bubblesortList(String[][] SortList) + { + String DisplayDummy; + int SortCount = SortList[0].length; + int DimCount = SortList.length; + for (int s = 0; s < SortCount; s++) + { + for (int t = 0; t < SortCount - s - 1; t++) + { + if (SortList[0][t].compareTo(SortList[0][t + 1]) > 0) + { + for (int k = 0; k < DimCount; k++) + { + DisplayDummy = SortList[k][t]; + SortList[k][t] = SortList[k][t + 1]; + SortList[k][t + 1] = DisplayDummy; + } + } + } + } + return SortList; + } + + public static String[] ArrayoutofString(String MainString, String Token) + { + String[] StringArray; + if (!MainString.equals(PropertyNames.EMPTY_STRING)) + { + ArrayList<String> StringVector = new ArrayList<String>(); + int iIndex; + do + { + iIndex = MainString.indexOf(Token); + if (iIndex < 0) + { + StringVector.add(MainString); + } + else + { + StringVector.add(MainString.substring(0, iIndex)); + MainString = MainString.substring(iIndex + 1, MainString.length()); + } + } + while (iIndex >= 0); + int FieldCount = StringVector.size(); + StringArray = new String[FieldCount]; + StringVector.toArray(StringArray); + } + else + { + StringArray = new String[0]; + } + return StringArray; + } + + public static String replaceSubString(String MainString, String NewSubString, String OldSubString) + { + try + { + int NewIndex = 0; + int OldIndex = 0; + int NewSubLen = NewSubString.length(); + int OldSubLen = OldSubString.length(); + while (NewIndex != -1) + { + NewIndex = MainString.indexOf(OldSubString, OldIndex); + if (NewIndex != -1) + { + MainString = MainString.substring(0, NewIndex) + NewSubString + MainString.substring(NewIndex + OldSubLen); + OldIndex = NewIndex + NewSubLen; + } + } + return MainString; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public static String convertfromURLNotation(String _sURLPath) + { + String sPath = PropertyNames.EMPTY_STRING; + try + { + URL oJavaURL = new URL(_sURLPath); + File oFile = UrlToFileMapper.mapUrlToFile(oJavaURL); + sPath = oFile.getAbsolutePath(); + } + catch (MalformedURLException e) + { + e.printStackTrace(System.err); + } + return sPath; + } + + public static String[] removeOutdatedFields(String[] baselist, String[] _complist) + { + String[] retarray = new String[] + { + }; + if ((baselist != null) && (_complist != null)) + { + ArrayList<String> retvector = new ArrayList<String>(); + for (int i = 0; i < baselist.length; i++) + { + if (FieldInList(_complist, baselist[i]) > -1) + { + retvector.add(baselist[i]); + // here you could call the method of a defined interface to notify the calling method + } + } + retarray = new String[retvector.size()]; + retvector.toArray(retarray); + } + return retarray; + } + + public static String[][] removeOutdatedFields(String[][] baselist, String[] _complist, int _compindex) + { + String[][] retarray = new String[][] {}; + if ((baselist != null) && (_complist != null)) + { + if (baselist.length > 0) + { + ArrayList<String[]> retvector = new ArrayList<String[]>(); + for (int i = 0; i < baselist.length; i++) + { + String sValue = baselist[i][_compindex]; + if (FieldInList(_complist, sValue) != -1) + { + retvector.add(baselist[i]); + // here you could call the method of a defined interface to notify the calling method + } + } + retarray = new String[retvector.size()][2]; + retvector.toArray(retarray); + } + } + return retarray; + } + + public static String[][] removeOutdatedFields(String[][] baselist, String[] _complist) + { + return removeOutdatedFields(baselist, _complist, 0); + } + + public static PropertyValue[][] removeOutdatedFields(PropertyValue[][] baselist, String[] _complist) + { + if ((baselist != null) && (_complist != null)) + { + ArrayList<PropertyValue[]> firstdimvector = new ArrayList<PropertyValue[]>(); + for (int n = 0; n < baselist.length; n++) + { + ArrayList<PropertyValue> secdimvector = new ArrayList<PropertyValue>(); + for (int m = 0; m < baselist[n].length; m++) + { + if (FieldInList(_complist, baselist[n][m].Name) > -1) + { + secdimvector.add(baselist[n][m]); + } + } + if (!secdimvector.isEmpty()) + { + PropertyValue[] internalArray = new PropertyValue[secdimvector.size()]; + secdimvector.toArray(internalArray); + firstdimvector.add(internalArray); + } + } + PropertyValue[][] retarray = new PropertyValue[firstdimvector.size()][]; + return firstdimvector.toArray(retarray); + } + return new PropertyValue[][] + { + }; + } + + /** + * searches a multidimensional array for duplicate fields. According to the following example + * SlaveFieldName1 ;SlaveFieldName2; SlaveFieldName3 + * MasterFieldName1;MasterFieldName2;MasterFieldName3 + * The entries SlaveFieldNameX and MasterFieldNameX are grouped together and then the created groups are compared + * If a group is duplicate the entry of the second group is returned. + */ + public static int getDuplicateFieldIndex(String[][] _scomplist) + { + int retvalue = -1; + if (_scomplist.length > 0) + { + int fieldcount = _scomplist[0].length; + String[] sDescList = new String[fieldcount]; + for (int m = 0; m < fieldcount; m++) + { + for (int n = 0; n < _scomplist.length; n++) + { + if (n == 0) + { + sDescList[m] = ""; + } + sDescList[m] += _scomplist[n][m]; + } + } + return getDuplicateFieldIndex(sDescList); + } + return retvalue; + } + + /** + * not tested!!!!! + */ + public static int getDuplicateFieldIndex(String[] scomplist) + { + for (int n = 0; n < scomplist.length; n++) + { + String scurvalue = scomplist[n]; + for (int m = n; m < scomplist.length; m++) + { + if (m != n) + { + if (scurvalue.equals(scomplist[m])) + { + return m; + } + } + } + } + return -1; + } + + public static int getDuplicateFieldIndex(String[] _scomplist, String _fieldname) + { + int iduplicate = 0; + for (int n = 0; n < _scomplist.length; n++) + { + if (_scomplist[n].equals(_fieldname)) + { + iduplicate++; + if (iduplicate == 2) + { + return n; + } + } + } + return -1; + } + + private static boolean isEqual(PropertyValue firstPropValue, PropertyValue secPropValue) + { + if (!firstPropValue.Name.equals(secPropValue.Name)) + { + return false; + //TODO replace 'equals' with AnyConverter.getType(firstpropValue).equals(secPropValue) to check content and Type + } + if (!firstPropValue.Value.equals(secPropValue.Value)) + { + return false; + } + return (firstPropValue.Handle == secPropValue.Handle); + } + + public static int[] getDuplicateFieldIndex(PropertyValue[][] ocomplist) + { + for (int n = 0; n < ocomplist.length; n++) + { + PropertyValue[] ocurValue = ocomplist[n]; + for (int m = n; m < ocurValue.length; m++) + { + PropertyValue odetValue = ocurValue[m]; + for (int s = 0; s < ocurValue.length; s++) + { + if (s != m) + { + if (isEqual(odetValue, ocurValue[s])) + { + return new int[] + { + n, s + }; + } + } + } + } + } + return new int[] + { + -1, -1 + }; + } + + public static String getSuffixNumber(String _sbasestring) + { + int suffixcharcount = 0; + for (int i = _sbasestring.length() - 1; i >= 0; i--) + { + char b = _sbasestring.charAt(i); + if ((b >= '0') && (b <= '9')) + { + suffixcharcount++; + } + else + { + break; + } + } + int istart = _sbasestring.length() - suffixcharcount; + return _sbasestring.substring(istart, _sbasestring.length()); + } + + public static String[] removefromList(String[] _sbaselist, String[] _sdellist) { + ArrayList<String> tempbaselist = new ArrayList<String>(); + for (String _sbase : _sbaselist) { + if (FieldInList(_sdellist, _sbase) == -1) { + tempbaselist.add(_sbase); + } + } + String[] sretlist = new String[tempbaselist.size()]; + tempbaselist.toArray(sretlist); + return sretlist; + } + + /** + * compares two strings. If one of them is empty and the other one is null it also returns true + */ + public static boolean isSame(String sFirstString, String sSecondString) + { + boolean bissame = false; + if (sFirstString == null) + { + if (sSecondString != null) + { + bissame = sSecondString.equals(PropertyNames.EMPTY_STRING); + } + else + { + bissame = true; + } + } + else + { + if (sFirstString.equals(PropertyNames.EMPTY_STRING)) + { + bissame = (sSecondString == null); + } + else if (sSecondString != null) + { + bissame = sFirstString.equals(sSecondString); + } + } + return bissame; + } +} diff --git a/wizards/com/sun/star/wizards/common/ListModel.py b/wizards/com/sun/star/wizards/common/ListModel.py new file mode 100644 index 000000000..e0eaf5de3 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/ListModel.py @@ -0,0 +1,35 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +from abc import abstractmethod + +class ListModel(object): + + @abstractmethod + def getSize(self): + pass + + @abstractmethod + def getElementAt(self, arg0): + pass + + def addListDataListener(self, listener): + pass + + def removeListDataListener(self, listener): + pass diff --git a/wizards/com/sun/star/wizards/common/MANIFEST.MF b/wizards/com/sun/star/wizards/common/MANIFEST.MF new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/common/MANIFEST.MF diff --git a/wizards/com/sun/star/wizards/common/NamedValueCollection.java b/wizards/com/sun/star/wizards/common/NamedValueCollection.java new file mode 100644 index 000000000..32cc0cd80 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NamedValueCollection.java @@ -0,0 +1,79 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.beans.PropertyState; +import com.sun.star.beans.PropertyValue; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; + +public class NamedValueCollection +{ + final private HashMap< String, Object > m_values = new HashMap< String, Object >(); + + public NamedValueCollection() + { + } + + public NamedValueCollection( final PropertyValue[] i_values ) + { + for ( int i = 0; i < i_values.length; ++i ) + m_values.put( i_values[i].Name, i_values[i].Value ); + } + + public final void put( final String i_name, final Object i_value ) + { + m_values.put( i_name, i_value ); + } + + + + public final < T extends XInterface > T queryOrDefault( final String i_key, final T i_default, Class<T> i_interfaceClass ) + { + if ( m_values.containsKey( i_key ) ) + { + final Object value = m_values.get( i_key ); + return UnoRuntime.queryInterface( i_interfaceClass, value ); + } + return i_default; + } + + public final PropertyValue[] getPropertyValues() + { + PropertyValue[] values = new PropertyValue[ m_values.size() ]; + + Iterator< Entry< String, Object > > iter = m_values.entrySet().iterator(); + int i = 0; + while ( iter.hasNext() ) + { + Entry< String, Object > entry = iter.next(); + values[i++] = new PropertyValue( + entry.getKey(), + 0, + entry.getValue(), + PropertyState.DIRECT_VALUE + ); + } + + return values; + } +} diff --git a/wizards/com/sun/star/wizards/common/NoValidPathException.java b/wizards/com/sun/star/wizards/common/NoValidPathException.java new file mode 100644 index 000000000..3dd465953 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NoValidPathException.java @@ -0,0 +1,44 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.lang.XMultiServiceFactory; + +public class NoValidPathException extends Exception +{ + public NoValidPathException(XMultiServiceFactory xMSF, String _sText) + { + super(_sText); + // TODO: NEVER open a dialog in an exception + if (xMSF != null) + { + SystemDialog.showErrorBox(xMSF, "RID_COMMON_21"); // OfficePathnotavailable + } + } + + public NoValidPathException(XMultiServiceFactory xMSF, String _sText, Throwable cause) + { + super(_sText, cause); + // TODO: NEVER open a dialog in an exception + if (xMSF != null) + { + SystemDialog.showErrorBox(xMSF, "RID_COMMON_21"); // OfficePathnotavailable + } + } +} diff --git a/wizards/com/sun/star/wizards/common/NoValidPathException.py b/wizards/com/sun/star/wizards/common/NoValidPathException.py new file mode 100644 index 000000000..077948527 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NoValidPathException.py @@ -0,0 +1,29 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +class NoValidPathException(Exception): + + def __init__(self, xMSF, _sText): + super(NoValidPathException,self).__init__(_sText) + # TODO: NEVER open a dialog in an exception + from .SystemDialog import SystemDialog + if xMSF: + import imp, os + imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')) + import strings + SystemDialog.showErrorBox(xMSF, strings.RID_COMMON_START_21) #OfficePathnotavailable + diff --git a/wizards/com/sun/star/wizards/common/NumberFormatter.java b/wizards/com/sun/star/wizards/common/NumberFormatter.java new file mode 100644 index 000000000..b2220e1cc --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NumberFormatter.java @@ -0,0 +1,266 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import java.util.Date; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.Locale; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.util.NumberFormat; +import com.sun.star.util.XNumberFormatTypes; +import com.sun.star.util.XNumberFormats; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.util.XNumberFormatter; + + +public class NumberFormatter +{ + + private int iDateFormatKey = -1; + private int iDateTimeFormatKey = -1; + private int iNumberFormatKey = -1; + private int iTextFormatKey = -1; + private int iTimeFormatKey = -1; + private int iLogicalFormatKey = -1; + private long lDateCorrection; + private XNumberFormatter xNumberFormatter; + private XNumberFormats xNumberFormats; + private XNumberFormatTypes xNumberFormatTypes; + private XPropertySet xNumberFormatSettings; + private final Locale aLocale; + static private final Locale enLocale = new Locale( "en", "US", "" ); + + + public NumberFormatter(XMultiServiceFactory _xMSF, XNumberFormatsSupplier _xNumberFormatsSupplier, Locale _aLocale) throws Exception + { + aLocale = _aLocale; + Object oNumberFormatter = _xMSF.createInstance("com.sun.star.util.NumberFormatter"); + xNumberFormats = _xNumberFormatsSupplier.getNumberFormats(); + xNumberFormatSettings = _xNumberFormatsSupplier.getNumberFormatSettings(); + xNumberFormatter = UnoRuntime.queryInterface(XNumberFormatter.class, oNumberFormatter); + xNumberFormatter.attachNumberFormatsSupplier(_xNumberFormatsSupplier); + xNumberFormatTypes = UnoRuntime.queryInterface(XNumberFormatTypes.class, xNumberFormats); + + } + + public NumberFormatter(XNumberFormatsSupplier _xNumberFormatsSupplier, Locale _aLocale) throws Exception + { + aLocale = _aLocale; + xNumberFormats = _xNumberFormatsSupplier.getNumberFormats(); + xNumberFormatSettings = _xNumberFormatsSupplier.getNumberFormatSettings(); + xNumberFormatTypes = UnoRuntime.queryInterface(XNumberFormatTypes.class, xNumberFormats); + } + + + public double convertStringToNumber(int _nkey, String _sString)throws Exception + { + return xNumberFormatter.convertStringToNumber(_nkey, _sString); + } + + + /** + * @param dateCorrection The lDateCorrection to set. + */ + public void setNullDateCorrection(long dateCorrection) + { + lDateCorrection = dateCorrection; + } + + + public int defineNumberFormat(String _FormatString) + { + try + { + int NewFormatKey = xNumberFormats.queryKey(_FormatString, aLocale, true); + if (NewFormatKey == -1) + { + NewFormatKey = xNumberFormats.addNewConverted(_FormatString, enLocale, aLocale); + } + return NewFormatKey; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return -1; + } + } + + + /** + * returns a numberformat for a FormatString. + */ + private int defineNumberFormat(String _FormatString, Locale _aLocale) + { + try + { + int NewFormatKey = xNumberFormats.queryKey(_FormatString, _aLocale, true); + if (NewFormatKey == -1) + { + NewFormatKey = xNumberFormats.addNew(_FormatString, _aLocale); + } + return NewFormatKey; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return -1; + } + } + + + + public void setNumberFormat(XInterface _xFormatObject, int _FormatKey, NumberFormatter _oNumberFormatter) + { + try + { + XPropertySet xNumberFormat = _oNumberFormatter.xNumberFormats.getByKey(_FormatKey); + String FormatString = AnyConverter.toString(Helper.getUnoPropertyValue(xNumberFormat, "FormatString")); + Locale oLocale = (Locale) Helper.getUnoPropertyValue(xNumberFormat, "Locale"); + int NewFormatKey = defineNumberFormat(FormatString, oLocale); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, _xFormatObject); + if (xPSet.getPropertySetInfo().hasPropertyByName("FormatsSupplier")) + { + xPSet.setPropertyValue("FormatsSupplier", _oNumberFormatter.xNumberFormatter.getNumberFormatsSupplier()); + } + if (xPSet.getPropertySetInfo().hasPropertyByName("NumberFormat")) + { + xPSet.setPropertyValue("NumberFormat", Integer.valueOf(NewFormatKey)); + } + else if (xPSet.getPropertySetInfo().hasPropertyByName("FormatKey")) + { + xPSet.setPropertyValue("FormatKey", Integer.valueOf(NewFormatKey)); + } + else + { + // TODO: throws an exception in a try catch environment, very helpful? + throw new Exception(); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + + public long getNullDateCorrection() + { + com.sun.star.util.Date dNullDate = (com.sun.star.util.Date) Helper.getUnoStructValue(this.xNumberFormatSettings, "NullDate"); + long lNullDate = Helper.convertUnoDatetoInteger(dNullDate); + java.util.Calendar oCal = java.util.Calendar.getInstance(); + oCal.set(1900, 1, 1); + Date dTime = oCal.getTime(); + long lTime = dTime.getTime(); + long lDBNullDate = lTime / (3600 * 24000); + lDateCorrection = lDBNullDate - lNullDate; + return lDateCorrection; + } + + + public int setBooleanReportDisplayNumberFormat() + { + String FormatString = "[=1]" + '"' + (char)9745 + '"' + ";[=0]" + '"' + (char)58480 + '"' + ";0"; + iLogicalFormatKey = xNumberFormats.queryKey(FormatString, aLocale, true); + try + { + if (iLogicalFormatKey == -1) + { + iLogicalFormatKey = xNumberFormats.addNew(FormatString, aLocale); + } + } + catch (Exception e) + { //MalformedNumberFormat + e.printStackTrace(); + iLogicalFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.LOGICAL, aLocale); + } + return iLogicalFormatKey; + } + + + /** + * @return Returns the iDateFormatKey. + */ + public int getDateFormatKey() + { + if (iDateFormatKey == -1) + { + iDateFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.DATE, aLocale); + } + return iDateFormatKey; + } + /** + * @return Returns the iDateTimeFormatKey. + */ + public int getDateTimeFormatKey() + { + if (iDateTimeFormatKey == -1) + { + iDateTimeFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.DATETIME, aLocale); + } + return iDateTimeFormatKey; + } + /** + * @return Returns the iLogicalFormatKey. + */ + public int getLogicalFormatKey() + { + if (iLogicalFormatKey == -1) + { + iLogicalFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.LOGICAL, aLocale); + } + return iLogicalFormatKey; + } + /** + * @return Returns the iNumberFormatKey. + */ + public int getNumberFormatKey() + { + if (iNumberFormatKey == -1) + { + iNumberFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.NUMBER, aLocale); + } + return iNumberFormatKey; + } + /** + * @return Returns the iTextFormatKey. + */ + public int getTextFormatKey() + { + if (iTextFormatKey == -1) + { + iTextFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.TEXT, aLocale); + } + return iTextFormatKey; + } + /** + * @return Returns the iTimeFormatKey. + */ + public int getTimeFormatKey() + { + if (iTimeFormatKey == -1) + { + iTimeFormatKey = xNumberFormatTypes.getStandardFormat(NumberFormat.TIME, aLocale); + } + return iTimeFormatKey; + } +} diff --git a/wizards/com/sun/star/wizards/common/NumberFormatter.py b/wizards/com/sun/star/wizards/common/NumberFormatter.py new file mode 100644 index 000000000..54d84c9fc --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NumberFormatter.py @@ -0,0 +1,86 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from com.sun.star.lang import Locale + +class NumberFormatter(object): + + def __init__(self, _xNumberFormatsSupplier, _aLocale, _xMSF=None): + self.iDateFormatKey = -1 + self.iDateTimeFormatKey = -1 + self.iNumberFormatKey = -1 + self.iTextFormatKey = -1 + self.iTimeFormatKey = -1 + self.iLogicalFormatKey = -1 + self.bNullDateCorrectionIsDefined = False + self.aLocale = _aLocale + if _xMSF is not None: + self.xNumberFormatter = _xMSF.createInstance( + "com.sun.star.util.NumberFormatter") + self.xNumberFormats = _xNumberFormatsSupplier.NumberFormats + self.xNumberFormatSettings = \ + _xNumberFormatsSupplier.NumberFormatSettings + self.xNumberFormatter.attachNumberFormatsSupplier( + _xNumberFormatsSupplier) + + ''' + @param _xMSF + @param _xNumberFormatsSupplier + @return + @throws Exception + @deprecated + ''' + + @classmethod + def createNumberFormatter(self, _xMSF, _xNumberFormatsSupplier): + oNumberFormatter = _xMSF.createInstance( + "com.sun.star.util.NumberFormatter") + oNumberFormatter.attachNumberFormatsSupplier(_xNumberFormatsSupplier) + return oNumberFormatter + + ''' + gives a key to pass to a NumberFormat object. <br/> + example: <br/> + <pre> + XNumberFormatsSupplier nsf = + (XNumberFormatsSupplier)UnoRuntime.queryInterface(...,document) + int key = Desktop.getNumberFormatterKey( + nsf, ...star.i18n.NumberFormatIndex.DATE...) + XNumberFormatter nf = Desktop.createNumberFormatter(xmsf, nsf); + nf.convertNumberToString( key, 1972 ); + </pre> + @param numberFormatsSupplier + @param type - a constant out of i18n.NumberFormatIndex enumeration. + @return a key to use with a util.NumberFormat instance. + ''' + + @classmethod + def getNumberFormatterKey(self, numberFormatsSupplier, Type): + return numberFormatsSupplier.NumberFormats.getFormatIndex( + Type, Locale()) + + def convertNumberToString(self, _nkey, _dblValue, _xNumberFormatter=None): + if _xNumberFormatter is None: + return self.xNumberFormatter.convertNumberToString( + _nkey, _dblValue) + else: + return _xNumberFormatter.convertNumberToString(_nkey, _dblValue) + + def convertStringToNumber(self, _nkey, _sString): + return self.xNumberFormatter.convertStringToNumber(_nkey, _sString) + diff --git a/wizards/com/sun/star/wizards/common/NumericalHelper.java b/wizards/com/sun/star/wizards/common/NumericalHelper.java new file mode 100644 index 000000000..af74704df --- /dev/null +++ b/wizards/com/sun/star/wizards/common/NumericalHelper.java @@ -0,0 +1,353 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.TypeClass; + +/** + * A class for helping with all kinds of numerical conversions. + * Optional or named parameters in SO are of the Object type in Java. + * These objects must be converted to the right simple value type. + * Unfortunately, StarBasic does not know the original desired type, + * and a value that should be a "Float" is delivered as "Byte". This class + * handles the conversions of these types.<br> + * This class does not log warnings (or throws Exceptions) when the precision + * of a value is lost. + */ +public class NumericalHelper +{ + + private static final int BYTE_TYPE = 0; + private static final int SHORT_TYPE = 1; + private static final int INT_TYPE = 2; + private static final int LONG_TYPE = 3; + private static final int FLOAT_TYPE = 4; + private static final int DOUBLE_TYPE = 5; + private static final int CHAR_TYPE = 6; + private static final int STRING_TYPE = -1; + private static final int BOOLEAN_TYPE = -2; + private static final int SEQUENCE_TYPE = -3; + + /** + * private c'tor to prevent instantiation + */ + private NumericalHelper() + { + // private c'tor, so no one can instantiate + } + + + + /** + * get an int value from the object + * @throws com.sun.star.lang.IllegalArgumentException if the object cannot be converted + */ + public static int toInt(Object aValue) + throws com.sun.star.lang.IllegalArgumentException + { + int retValue = 0; + TypeObject aTypeObject = getTypeObject(aValue); + switch (aTypeObject.iType) + { + case BYTE_TYPE: + retValue = getByte(aTypeObject); + break; + case CHAR_TYPE: + retValue = getChar(aTypeObject); + break; + case SHORT_TYPE: + retValue = getShort(aTypeObject); + break; + case INT_TYPE: + retValue = getInt(aTypeObject); + break; + case LONG_TYPE: + retValue = (int) getLong(aTypeObject); + break; + case FLOAT_TYPE: + retValue = (int) getFloat(aTypeObject); + break; + case DOUBLE_TYPE: + retValue = (int) getDouble(aTypeObject); + break; + case STRING_TYPE: + try + { + retValue = Integer.parseInt((String) aTypeObject.aValue); + } + catch (java.lang.NumberFormatException e) + { + throw new com.sun.star.lang.IllegalArgumentException(e, + "Cannot convert to int: " + aTypeObject.aValue); + } + break; + case BOOLEAN_TYPE: + retValue = getBool(aTypeObject) ? -1 : 0; + break; + default: + throw new com.sun.star.lang.IllegalArgumentException( + "Cannot convert this type: " + aValue.getClass().getName()); + } + return retValue; + } + + /** + * get a double value from the object + * @throws com.sun.star.lang.IllegalArgumentException if the object cannot be converted + */ + public static double toDouble(Object aValue) + throws com.sun.star.lang.IllegalArgumentException + { + double retValue = 0.0; + TypeObject aTypeObject = getTypeObject(aValue); + switch (aTypeObject.iType) + { + case BYTE_TYPE: + retValue = getByte(aTypeObject); + break; + case CHAR_TYPE: + retValue = getChar(aTypeObject); + break; + case SHORT_TYPE: + retValue = getShort(aTypeObject); + break; + case INT_TYPE: + retValue = getInt(aTypeObject); + break; + case LONG_TYPE: + retValue = getLong(aTypeObject); + break; + case FLOAT_TYPE: + retValue = getFloat(aTypeObject); + break; + case DOUBLE_TYPE: + retValue = getDouble(aTypeObject); + break; + case STRING_TYPE: + try + { + retValue = Float.parseFloat((String) aTypeObject.aValue); + } + catch (java.lang.NumberFormatException e) + { + throw new com.sun.star.lang.IllegalArgumentException(e, + "Cannot convert to short: " + aTypeObject.aValue); + } + break; + case BOOLEAN_TYPE: + retValue = getBool(aTypeObject) ? (double) -1 : (double) 0; + break; + default: + throw new com.sun.star.lang.IllegalArgumentException( + "Cannot convert this type: " + aValue.getClass().getName()); + } + return retValue; + } + + /** + * get the type object from the given object + * @param aValue an object representing a (numerical) value; can also be an 'any' + * @return a type object: the object together with the its type information + * @throws com.sun.star.lang.IllegalArgumentException if the object is unknown + */ + private static TypeObject getTypeObject(Object aValue) + throws com.sun.star.lang.IllegalArgumentException + { + TypeObject aTypeObject = new TypeObject(); + if (aValue == null || AnyConverter.isVoid(aValue)) + { + throw new com.sun.star.lang.IllegalArgumentException("Cannot convert a null object."); + } + int type = AnyConverter.getType(aValue).getTypeClass().getValue(); + switch (type) + { + case TypeClass.CHAR_value: + aTypeObject.iType = CHAR_TYPE; + aTypeObject.aValue = new Character(AnyConverter.toChar(aValue)); + break; + case TypeClass.BYTE_value: + aTypeObject.iType = BYTE_TYPE; + aTypeObject.aValue = Byte.valueOf(AnyConverter.toByte(aValue)); + break; + case TypeClass.SHORT_value: + aTypeObject.iType = SHORT_TYPE; + aTypeObject.aValue = Short.valueOf(AnyConverter.toShort(aValue)); + break; + case TypeClass.LONG_value: + aTypeObject.iType = INT_TYPE; + aTypeObject.aValue = Integer.valueOf(AnyConverter.toInt(aValue)); + break; + case TypeClass.HYPER_value: + aTypeObject.iType = LONG_TYPE; + aTypeObject.aValue = Long.valueOf(AnyConverter.toLong(aValue)); + break; + case TypeClass.FLOAT_value: + aTypeObject.iType = FLOAT_TYPE; + aTypeObject.aValue = new Float(AnyConverter.toFloat(aValue)); + break; + case TypeClass.DOUBLE_value: + aTypeObject.iType = DOUBLE_TYPE; + aTypeObject.aValue = new Double(AnyConverter.toDouble(aValue)); + break; + case TypeClass.STRING_value: + aTypeObject.iType = STRING_TYPE; + aTypeObject.aValue = AnyConverter.toString(aValue); + break; + case TypeClass.BOOLEAN_value: + aTypeObject.iType = BOOLEAN_TYPE; + aTypeObject.aValue = Boolean.valueOf(AnyConverter.toBoolean(aValue)); + break; + case TypeClass.SEQUENCE_value: + aTypeObject.iType = SEQUENCE_TYPE; + aTypeObject.aValue = aValue; + break; + default: + throw new com.sun.star.lang.IllegalArgumentException( + "Cannot convert this type: " + aValue.getClass().getName()); + } + return aTypeObject; + } + + /** + * get the simple byte type + */ + private static byte getByte(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != BYTE_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a byte type."); + } + return ((Byte) typeObject.aValue).byteValue(); + } + + /** + * get the simple char type + */ + private static char getChar(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != CHAR_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a char type."); + } + return ((Character) typeObject.aValue).charValue(); + } + + /** + * get the simple short type + */ + private static short getShort(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != SHORT_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a short type."); + } + return ((Short) typeObject.aValue).shortValue(); + } + + /** + * get the simple int type + * @param typeObject + * @return + * @throws com.sun.star.lang.IllegalArgumentException + */ + private static int getInt(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != INT_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not an int type."); + } + return ((Integer) typeObject.aValue).intValue(); + } + + /** + * get the simple float type + * @throws com.sun.star.lang.IllegalArgumentException + */ + private static float getFloat(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != FLOAT_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a float type."); + } + return ((Float) typeObject.aValue).floatValue(); + } + + /** + * get the simple double type + */ + private static double getDouble(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != DOUBLE_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a double type."); + } + return ((Double) typeObject.aValue).doubleValue(); + } + + /** + * get the simple long type + */ + private static long getLong(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != LONG_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a long type."); + } + return ((Long) typeObject.aValue).longValue(); + } + + /** + * get the simple boolean type + */ + private static boolean getBool(TypeObject typeObject) + throws com.sun.star.lang.IllegalArgumentException + { + if (typeObject.iType != BOOLEAN_TYPE) + { + throw new com.sun.star.lang.IllegalArgumentException( + "Given argument is not a boolean type."); + } + return ((Boolean) typeObject.aValue).booleanValue(); + } + + /** + * a class to contain a type and a value for easier conversions + */ + private static class TypeObject + { + + public int iType; + public Object aValue; + } + +} diff --git a/wizards/com/sun/star/wizards/common/ParaStyled.java b/wizards/com/sun/star/wizards/common/ParaStyled.java new file mode 100644 index 000000000..6046571b7 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/ParaStyled.java @@ -0,0 +1,53 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.text.*; + +class ParaStyled +{ + + private String paraStyle; + + ParaStyled(String paraStyle_) + { + paraStyle = paraStyle_; + } + + private void format(Object textRange) + { + XText o; + o = UnoRuntime.queryInterface(XText.class, textRange); + if (o == null) + { + o = UnoRuntime.queryInterface(XTextRange.class, textRange).getText(); + } + XTextRange xtr = UnoRuntime.queryInterface(XTextRange.class, textRange); + XTextCursor cursor = o.createTextCursorByRange(xtr); + + Helper.setUnoPropertyValue(cursor, "ParaStyleName", paraStyle); + } + + public void write(Object textRange) + { + format(textRange); + } +} + diff --git a/wizards/com/sun/star/wizards/common/PlaceholderTextElement.java b/wizards/com/sun/star/wizards/common/PlaceholderTextElement.java new file mode 100644 index 000000000..72778d5ed --- /dev/null +++ b/wizards/com/sun/star/wizards/common/PlaceholderTextElement.java @@ -0,0 +1,81 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.text.*; + +public class PlaceholderTextElement extends TextElement +{ + + private String hint; + private String placeHolderText; + private XMultiServiceFactory xmsf; + + public PlaceholderTextElement(XTextRange textRange, String placeHolderText_, String hint_, XMultiServiceFactory xmsf_) + { + super(textRange); + placeHolderText = placeHolderText_; + hint = hint_; + xmsf = xmsf_; + } + + @Override + public void write(Object textRange) + { + super.write(textRange); + if (text.equals(PropertyNames.EMPTY_STRING)) + { + XTextRange xTextRange = UnoRuntime.queryInterface(XTextRange.class, textRange); + try + { + XTextContent xTextContent = createPlaceHolder(xmsf, placeHolderText, hint); + xTextRange.getText().insertTextContent(xTextRange.getStart(), xTextContent, true); + } + catch (com.sun.star.lang.IllegalArgumentException ex) + { + ex.printStackTrace(); + } + } + } + + private static XTextContent createPlaceHolder(XMultiServiceFactory xmsf, String ph, String hint) + { + Object placeHolder; + try + { + placeHolder = xmsf.createInstance("com.sun.star.text.TextField.JumpEdit"); + } + catch (Exception ex) + { + ex.printStackTrace(); + return null; + } + Helper.setUnoPropertyValue(placeHolder, "PlaceHolder", ph); + Helper.setUnoPropertyValue(placeHolder, "Hint", hint); + Helper.setUnoPropertyValue(placeHolder, "PlaceHolderType", Short.valueOf(PlaceholderType.TEXT)); + return UnoRuntime.queryInterface(XTextContent.class, placeHolder); + + } + +} + + diff --git a/wizards/com/sun/star/wizards/common/Properties.java b/wizards/com/sun/star/wizards/common/Properties.java new file mode 100644 index 000000000..2056921d3 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Properties.java @@ -0,0 +1,85 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.beans.PropertyValue; +import java.util.*; + +/** + * Simplifies handling Arrays of PropertyValue. + * To make a use of this class, instantiate it, and call + * the put(propName,propValue) method. + * caution: propName should always be a String. + * When finished, call the getProperties() method to get an array of the set properties. + */ +public class Properties extends HashMap<String,Object> +{ + + public static Object getPropertyValue(PropertyValue[] props, String propName) + { + for (int i = 0; i < props.length; i++) + { + if (propName.equals(props[i].Name)) + { + return props[i].Value; + } + } + throw new IllegalArgumentException("Property '" + propName + "' not found."); + } + + public static boolean hasPropertyValue(PropertyValue[] props, String propName) + { + for (int i = 0; i < props.length; i++) + { + if (propName.equals(props[i].Name)) + { + return true; + } + } + return false; + } + + public static PropertyValue createProperty(String name, Object value) + { + PropertyValue pv = new PropertyValue(); + pv.Name = name; + pv.Value = value; + return pv; + } + + public static PropertyValue createProperty(String name, Object value, int handle) + { + PropertyValue pv = createProperty(name, value); + pv.Handle = handle; + return pv; + } + + public static PropertyValue[] convertToPropertyValueArray(Object[] _oObjectArray) + { + PropertyValue[] retproperties = null; + if (_oObjectArray != null && _oObjectArray.length > 0) + { + retproperties = new PropertyValue[_oObjectArray.length]; + for (int i = 0; i < _oObjectArray.length; i++) + { + retproperties[i] = (PropertyValue) _oObjectArray[i]; + } + } + return retproperties; + } +} diff --git a/wizards/com/sun/star/wizards/common/Properties.py b/wizards/com/sun/star/wizards/common/Properties.py new file mode 100644 index 000000000..974856af6 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Properties.py @@ -0,0 +1,62 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from com.sun.star.beans import PropertyValue + +''' +Simplifies handling Arrays of PropertyValue. +To make a use of this class, instantiate it, and call +the put(propName,propValue) method. +caution: propName should always be a String. +When finished, call the getProperties() method to get an array of the set properties. +''' + +class Properties(dict): + + @classmethod + def getPropertyValue(self, props, propName): + for i in props: + if propName == i.Name: + return i.Value + + raise AttributeError ("Property '" + propName + "' not found.") + + @classmethod + def hasPropertyValue(self, props, propName): + for i in props: + if propName == i.Name: + return True + return False + + @classmethod + def getProperties(self, _map): + pv = [] + for k,v in _map.items(): + pv.append(self.createProperty(k, v)) + return pv + + @classmethod + def createProperty(self, name, value, handle=None): + pv = PropertyValue() + pv.Name = name + pv.Value = value + if handle is not None: + pv.Handle = handle + return pv + + def getProperties1(self): + return self.getProperties(self) diff --git a/wizards/com/sun/star/wizards/common/PropertyNames.java b/wizards/com/sun/star/wizards/common/PropertyNames.java new file mode 100644 index 000000000..5e5df5c87 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/PropertyNames.java @@ -0,0 +1,57 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +public class PropertyNames +{ + + public static String PROPERTY_DEFAULT_VALUE = "DefaultValue"; + public static String PROPERTY_IS_NULLABLE = "IsNullable"; + public static String PROPERTY_INPUT_REQUIRED = "InputRequired"; + public static String PROPERTY_ENABLED = "Enabled"; + public static String PROPERTY_HEIGHT = "Height"; + public static String PROPERTY_HELPURL = "HelpURL"; + public static String PROPERTY_POSITION_X = "PositionX"; + public static String PROPERTY_POSITION_Y = "PositionY"; + public static String PROPERTY_LABEL = "Label"; + public static String PROPERTY_MULTILINE = "MultiLine"; + public static String PROPERTY_NAME = "Name"; + public static String PROPERTY_STEP = "Step"; + public static String PROPERTY_WIDTH = "Width"; + public static String PROPERTY_TABINDEX = "TabIndex"; + public static String PROPERTY_STATE = "State"; + public static String PROPERTY_IMAGEURL = "ImageURL"; + public static String PROPERTY_TITLE = "Title"; + public static String PROPERTY_BORDER = "Border"; + public static String PROPERTY_MOVEABLE = "Moveable"; + public static String PROPERTY_ALIGN = "Align"; + public static String COMMAND = "Command"; + public static String COMMAND_TYPE = "CommandType"; + public static String SELECTED_ITEMS = "SelectedItems"; + public static String URL = "URL"; + public static String ACTIVE_CONNECTION = "ActiveConnection"; + public static String ASC = "ASC"; + public static String SEMI_COLON = ";"; + public static String EMPTY_STRING = ""; + public static String START = "start"; + public static String ORIENTATION = "Orientation"; + public static String READ_ONLY = "ReadOnly"; + public static String SPACE = " "; + public static String STRING_ITEM_LIST = "StringItemList"; + public static String FONT_DESCRIPTOR = "FontDescriptor"; +} diff --git a/wizards/com/sun/star/wizards/common/PropertyNames.py b/wizards/com/sun/star/wizards/common/PropertyNames.py new file mode 100644 index 000000000..a78c08d29 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/PropertyNames.py @@ -0,0 +1,34 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +class PropertyNames: + PROPERTY_ENABLED = "Enabled" + PROPERTY_HEIGHT = "Height" + PROPERTY_HELPURL = "HelpURL" + PROPERTY_POSITION_X = "PositionX" + PROPERTY_POSITION_Y = "PositionY" + PROPERTY_LABEL = "Label" + PROPERTY_MULTILINE = "MultiLine" + PROPERTY_NAME = "Name" + PROPERTY_STEP = "Step" + PROPERTY_WIDTH = "Width" + PROPERTY_TABINDEX = "TabIndex" + PROPERTY_STATE = "State" + PROPERTY_IMAGEURL = "ImageURL" + PROPERTY_TITLE = "Title" + PROPERTY_MOVEABLE = "Moveable" + PROPERTY_CLOSEABLE = "Closeable" diff --git a/wizards/com/sun/star/wizards/common/PropertySetHelper.java b/wizards/com/sun/star/wizards/common/PropertySetHelper.java new file mode 100644 index 000000000..7de45668e --- /dev/null +++ b/wizards/com/sun/star/wizards/common/PropertySetHelper.java @@ -0,0 +1,257 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.beans.XPropertySet; +import com.sun.star.uno.AnyConverter; +import java.util.HashMap; + +public class PropertySetHelper +{ + + private XPropertySet m_xPropertySet; + private HashMap<String, Object> m_aHashMap; + + public PropertySetHelper(Object _aObj) + { + if (_aObj == null) + { + return; + } + m_xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, _aObj); + } + + private HashMap<String, Object> getHashMap() + { + if (m_aHashMap == null) + { + m_aHashMap = new HashMap<String, Object>(); + } + return m_aHashMap; + } + + /** + set a property, don't throw any exceptions, they will only write down as a hint in the helper debug output + @param _sName name of the property to set + @param _aValue property value as object + */ + public void setPropertyValueDontThrow(String _sName, Object _aValue) + { + try + { + setPropertyValue(_sName, _aValue); + } + catch (Exception e) + { + DebugHelper.writeInfo("Don't throw the exception with property name(" + _sName + " ) : " + e.getMessage()); + } + } + + /** + set a property, + @param _sName name of the property to set + @param _aValue property value as object + */ + private void setPropertyValue(String _sName, Object _aValue) throws java.lang.Exception + { + if (m_xPropertySet != null) + { + try + { + m_xPropertySet.setPropertyValue(_sName, _aValue); + } + // Exceptions are not from interest + catch (com.sun.star.beans.UnknownPropertyException e) + { + DebugHelper.writeInfo(e.getMessage()); + DebugHelper.exception(e); + } + catch (com.sun.star.beans.PropertyVetoException e) + { + DebugHelper.writeInfo(e.getMessage()); + DebugHelper.exception(e); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + DebugHelper.writeInfo(e.getMessage()); + DebugHelper.exception(e); + } + } + else + { + getHashMap().put(_sName, _aValue); + } + } + + /** + get a property and convert it to a int value + @param _sName the string name of the property + @param _nDefault if an error occur, return this value + @return the int value of the property + */ + public int getPropertyValueAsInteger(String _sName, int _nDefault) + { + Object aObject = null; + int nValue = _nDefault; + + if (m_xPropertySet != null) + { + try + { + aObject = m_xPropertySet.getPropertyValue(_sName); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + } + if (aObject != null) + { + try + { + nValue = NumericalHelper.toInt(aObject); + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + DebugHelper.writeInfo("can't convert an object to integer."); + } + } + return nValue; + } + + + + /** + get a property and convert it to a double value + @param _sName the string name of the property + @param _nDefault if an error occur, return this value + @return the int value of the property + */ + public double getPropertyValueAsDouble(String _sName, double _nDefault) + { + Object aObject = null; + double nValue = _nDefault; + + if (m_xPropertySet != null) + { + try + { + aObject = m_xPropertySet.getPropertyValue(_sName); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + } + if (aObject == null && getHashMap().containsKey(_sName)) + { + aObject = getHashMap().get(_sName); + } + if (aObject != null) + { + try + { + nValue = NumericalHelper.toDouble(aObject); + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + DebugHelper.writeInfo("can't convert an object to integer."); + } + } + return nValue; + } + + + + /** + get a property and convert it to a string value + @param _sName the string name of the property + @param _sDefault if an error occur, return this value + @return the string value of the property + */ + public String getPropertyValueAsString(String _sName, String _sDefault) + { + Object aObject = null; + String sValue = _sDefault; + + if (m_xPropertySet != null) + { + try + { + aObject = m_xPropertySet.getPropertyValue(_sName); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + } + if (aObject != null) + { + try + { + sValue = AnyConverter.toString(aObject); + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + DebugHelper.writeInfo("can't convert an object to string."); + } + } + return sValue; + } + + /** + get a property and don't convert it + @param _sName the string name of the property + @return the object value of the property without any conversion + */ + public Object getPropertyValueAsObject(String _sName) + { + Object aObject = null; + + if (m_xPropertySet != null) + { + try + { + aObject = m_xPropertySet.getPropertyValue(_sName); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + catch (com.sun.star.lang.WrappedTargetException e) + { + DebugHelper.writeInfo(e.getMessage()); + } + } + return aObject; + } + +} diff --git a/wizards/com/sun/star/wizards/common/Resource.java b/wizards/com/sun/star/wizards/common/Resource.java new file mode 100644 index 000000000..0da8f9756 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/Resource.java @@ -0,0 +1,68 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.beans.PropertyState; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.configuration.theDefaultProvider; +import com.sun.star.lang.Locale; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.resource.StringResourceWithLocation; +import com.sun.star.resource.XStringResourceWithLocation; +import com.sun.star.util.XMacroExpander; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.XComponentContext; +import com.sun.star.uno.XInterface; +import com.sun.star.uno.UnoRuntime; + +public final class Resource +{ + private XStringResourceWithLocation m_xStrResource; + + /** + * <p>Load the resource bundle that contains the resource {@code String} + * values.</p> + */ + public Resource(XMultiServiceFactory xMSF) { + XComponentContext xContext = Helper.getComponentContext(xMSF); + XMacroExpander xExpander = Helper.getMacroExpander(xMSF); + String sPath = xExpander.expandMacros("$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/wizards/"); + Locale locale = Configuration.getUILocale(xMSF); + m_xStrResource = StringResourceWithLocation.create(xContext, sPath, true, locale, "resources", "", null); + } + + /** + * This method returns the corresponding {@code String} given the key. + * + * @param key Key string for getting the message {@code String}. + * @return Message {@code String} corresponding to the key. + */ + public String getResText(String key) { + return m_xStrResource.resolveString(key); + } + + public static void showCommonResourceError(XMultiServiceFactory xMSF) + { + String ProductName = Configuration.getProductName(xMSF); + String sError = "The files required could not be found.\nPlease start the %PRODUCTNAME Setup and choose 'Repair'."; + sError = JavaTools.replaceSubString(sError, ProductName, "%PRODUCTNAME"); + SystemDialog.showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sError); + } +} diff --git a/wizards/com/sun/star/wizards/common/SystemDialog.java b/wizards/com/sun/star/wizards/common/SystemDialog.java new file mode 100644 index 000000000..73be87b5a --- /dev/null +++ b/wizards/com/sun/star/wizards/common/SystemDialog.java @@ -0,0 +1,125 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.common; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.XInterface; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.lang.XComponent; +import com.sun.star.frame.XFrame; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.awt.XToolkit; +import com.sun.star.awt.XMessageBox; + +public class SystemDialog +{ + + public static int showErrorBox(XMultiServiceFactory xMSF, String ResID, String AddTag, String AddString) + { + Resource oResource; + String ProductName = Configuration.getProductName(xMSF); + oResource = new Resource(xMSF); + String sErrorMessage = oResource.getResText(ResID); + sErrorMessage = JavaTools.replaceSubString(sErrorMessage, ProductName, "%PRODUCTNAME"); + sErrorMessage = JavaTools.replaceSubString(sErrorMessage, String.valueOf((char) 13), "<BR>"); + sErrorMessage = JavaTools.replaceSubString(sErrorMessage, AddString, AddTag); + return SystemDialog.showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sErrorMessage); + } + + public static int showErrorBox(XMultiServiceFactory xMSF, String ResID) + { + Resource oResource; + String ProductName = Configuration.getProductName(xMSF); + oResource = new Resource(xMSF); + String sErrorMessage = oResource.getResText(ResID); + sErrorMessage = JavaTools.replaceSubString(sErrorMessage, ProductName, "%PRODUCTNAME"); + sErrorMessage = JavaTools.replaceSubString(sErrorMessage, String.valueOf((char) 13), "<BR>"); + return showMessageBox(xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, sErrorMessage); + } + + /* + * example: + * (xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, "message") + */ + /** + * @param windowServiceName one of the following strings: + * "ErrorBox", "WarningBox", "MessBox", "InfoBox", "QueryBox". + * There are other values possible, look + * under src/toolkit/source/awt/vcltoolkit.cxx + * @param windowAttribute see com.sun.star.awt.VclWindowPeerAttribute + * @return 0 = cancel, 1 = ok, 2 = yes, 3 = no(I'm not sure here) + * other values check for yourself ;-) + */ + public static int showMessageBox(XMultiServiceFactory xMSF, String windowServiceName, int windowAttribute, String MessageText) + { + + short iMessage = 0; + try + { + if (MessageText == null) + { + return 0; + } + XFrame xFrame = Desktop.getActiveFrame(xMSF); + XWindowPeer xWindowPeer = UnoRuntime.queryInterface(XWindowPeer.class, xFrame.getComponentWindow()); + return showMessageBox(xMSF, xWindowPeer, windowServiceName, windowAttribute, MessageText); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return iMessage; + } + + /** + * just like the other showMessageBox(...) method, but receives a + * peer argument to use to create the message box. + */ + public static int showMessageBox(XMultiServiceFactory xMSF, XWindowPeer peer, String windowServiceName, int windowAttribute, String MessageText) + { + // If the peer is null we try to get one from the desktop... + if (peer == null) + { + return showMessageBox(xMSF, windowServiceName, windowAttribute, MessageText); + } + short iMessage = 0; + try + { + XInterface xAWTToolkit = (XInterface) xMSF.createInstance("com.sun.star.awt.Toolkit"); + XToolkit xToolkit = UnoRuntime.queryInterface(XToolkit.class, xAWTToolkit); + com.sun.star.awt.WindowDescriptor oDescriptor = new com.sun.star.awt.WindowDescriptor(); + oDescriptor.WindowServiceName = windowServiceName; + oDescriptor.Parent = peer; + oDescriptor.Type = com.sun.star.awt.WindowClass.MODALTOP; + oDescriptor.WindowAttributes = windowAttribute; + XWindowPeer xMsgPeer = xToolkit.createWindow(oDescriptor); + XMessageBox xMsgbox = UnoRuntime.queryInterface(XMessageBox.class, xMsgPeer); + XComponent xComponent = UnoRuntime.queryInterface(XComponent.class, xMsgbox); + xMsgbox.setMessageText(MessageText); + iMessage = xMsgbox.execute(); + xComponent.dispose(); + } + catch (Exception e) + { + // TODO Auto-generated catch block + e.printStackTrace(System.err); + } + return iMessage; + } + +} diff --git a/wizards/com/sun/star/wizards/common/SystemDialog.py b/wizards/com/sun/star/wizards/common/SystemDialog.py new file mode 100644 index 000000000..412029213 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/SystemDialog.py @@ -0,0 +1,180 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from .Desktop import Desktop + +from com.sun.star.ui.dialogs.TemplateDescription import \ + FILESAVE_AUTOEXTENSION, FILEOPEN_SIMPLE +from com.sun.star.ui.dialogs.ExtendedFilePickerElementIds import \ + CHECKBOX_AUTOEXTENSION +from com.sun.star.awt import WindowDescriptor +from com.sun.star.awt.WindowClass import MODALTOP +from com.sun.star.lang import IllegalArgumentException +from com.sun.star.awt.VclWindowPeerAttribute import OK + +class SystemDialog(object): + + def __init__(self, xMSF, ServiceName, Type): + try: + self.xMSF = xMSF + self.systemDialog = xMSF.createInstance(ServiceName) + self.xStringSubstitution = self.createStringSubstitution(xMSF) + + # Add a name textbox to the filepicker + if self.systemDialog is not None: + if (hasattr(self.systemDialog, "initialize")): + self.systemDialog.initialize((Type,)) + + except Exception: + traceback.print_exc() + + @classmethod + def createStoreDialog(self, xmsf): + return SystemDialog( + xmsf, "com.sun.star.ui.dialogs.FilePicker", + FILESAVE_AUTOEXTENSION) + + def subst(self, path): + try: + s = self.xStringSubstitution.substituteVariables(path, False) + return s + except Exception: + traceback.print_exc() + return path + + def callStoreDialog(self, displayDir, defaultName, sDocuType=None): + if sDocuType is not None: + self.addFilterToDialog(defaultName[-3:], sDocuType, True) + + self.sStorePath = None + try: + self.systemDialog.setValue(CHECKBOX_AUTOEXTENSION, 0, True) + self.systemDialog.setDefaultName(defaultName) + self.systemDialog.setDisplayDirectory(self.subst(displayDir)) + if self.execute(self.systemDialog): + sPathList = self.systemDialog.getFiles() + self.sStorePath = sPathList[0] + + except Exception: + traceback.print_exc() + + return self.sStorePath + + def execute(self, execDialog): + return execDialog.execute() == 1 + + def addFilterToDialog(self, sExtension, filterName, setToDefault): + try: + #get the localized filtername + uiName = self.getFilterUIName(filterName) + pattern = "*." + sExtension + #add the filter + self.addFilter(uiName, pattern, setToDefault) + except Exception: + traceback.print_exc() + + def addFilter(self, uiName, pattern, setToDefault): + try: + self.systemDialog.appendFilter(uiName, pattern) + if setToDefault: + self.systemDialog.setCurrentFilter(uiName) + + except Exception: + traceback.print_exc() + + ''' + note the result should go through conversion of the product name. + @param filterName + @return the UI localized name of the given filter name. + ''' + + def getFilterUIName(self, filterName): + try: + oFactory = self.xMSF.createInstance( + "com.sun.star.document.FilterFactory") + oObject = oFactory.getByName(filterName) + xPropertyValue = list(oObject) + for i in xPropertyValue: + if i is not None and i.Name == "UIName": + return str(i.Value).replace("%productname%", "LibreOffice") + + raise Exception( + "UIName property not found for Filter " + filterName); + except Exception: + traceback.print_exc() + return None + + @classmethod + def showErrorBox(self, xMSF, sErrorMessage, AddTag=None, AddString=None): + sErrorMessage = sErrorMessage.replace("%PRODUCTNAME", "LibreOffice" ) + sErrorMessage = sErrorMessage.replace(str(13), "<BR>") + if AddTag and AddString: + sErrorMessage = sErrorMessage.replace( AddString, AddTag) + return self.showMessageBox(xMSF, "ErrorBox", OK, sErrorMessage) + + ''' + example: + (xMSF, "ErrorBox", com.sun.star.awt.VclWindowPeerAttribute.OK, "message") + + @param windowServiceName one of the following strings: + "ErrorBox", "WarningBox", "MessBox", "InfoBox", "QueryBox". + There are other values possible, look + under src/toolkit/source/awt/vcltoolkit.cxx + @param windowAttribute see com.sun.star.awt.VclWindowPeerAttribute + @return 0 = cancel, 1 = ok, 2 = yes, 3 = no(I'm not sure here) + other values check for yourself ;-) + ''' + @classmethod + def showMessageBox(self, xMSF, windowServiceName, windowAttribute, + MessageText, peer=None): + + if MessageText is None: + return 0 + + iMessage = 0 + try: + # If the peer is null we try to get one from the desktop... + if peer is None: + xFrame = Desktop.getActiveFrame(xMSF) + peer = xFrame.getComponentWindow() + + xToolkit = xMSF.createInstance("com.sun.star.awt.Toolkit") + oDescriptor = WindowDescriptor() + oDescriptor.WindowServiceName = windowServiceName + oDescriptor.Parent = peer + oDescriptor.Type = MODALTOP + oDescriptor.WindowAttributes = windowAttribute + xMsgPeer = xToolkit.createWindow(oDescriptor) + xMsgPeer.MessageText = MessageText + iMessage = xMsgPeer.execute() + xMsgPeer.dispose() + except Exception: + traceback.print_exc() + + return iMessage + + @classmethod + def createStringSubstitution(self, xMSF): + xPathSubst = None + try: + xPathSubst = xMSF.createInstance( + "com.sun.star.util.PathSubstitution") + return xPathSubst + except Exception: + traceback.print_exc() + return None diff --git a/wizards/com/sun/star/wizards/common/TextElement.java b/wizards/com/sun/star/wizards/common/TextElement.java new file mode 100644 index 000000000..a8ee641e1 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/TextElement.java @@ -0,0 +1,54 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.common; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.text.*; + +public class TextElement extends ParaStyled +{ + + String text; + + TextElement(XTextRange range) + { + this(range.getString(), (String) Helper.getUnoPropertyValue(range.getStart(), "ParaStyleName")); + } + + private TextElement(String text_, String paraStyle_) + { + super(paraStyle_); + text = text_; + } + + @Override + public void write(Object textRange) + { + UnoRuntime.queryInterface(XTextRange.class, textRange).setString(text); + if (!text.equals(PropertyNames.EMPTY_STRING)) + { + super.write(textRange); + } + } + + public void setText(String inputText) + { + text = inputText; + } +} diff --git a/wizards/com/sun/star/wizards/common/UCB.py b/wizards/com/sun/star/wizards/common/UCB.py new file mode 100644 index 000000000..1e52e4861 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/UCB.py @@ -0,0 +1,148 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . + +import uno +import traceback + +from abc import abstractmethod + +from ..common.FileAccess import FileAccess + +from com.sun.star.beans import Property + +from com.sun.star.ucb import Command +from com.sun.star.ucb import GlobalTransferCommandArgument +from com.sun.star.ucb.NameClash import OVERWRITE +from com.sun.star.ucb import OpenCommandArgument2 +from com.sun.star.ucb.OpenMode import ALL +from com.sun.star.ucb.TransferCommandOperation import COPY + + +# This class is used to copy the content of a folder to +# another folder. +# There is an inconsistency with argument order. +# It should be always: dir,filename. +class UCB(object): + + ucb = None + fa = None + xmsf = None + + def __init__(self, xmsf): + self.ucb = xmsf.createInstanceWithArguments("com.sun.star.ucb.UniversalContentBroker", ()) + self.fa = FileAccess(xmsf) + self.xmsf = xmsf + + def delete(self, filename): + # System.out.println("UCB.delete(" + filename) + self.executeCommand(self.getContent(filename),"delete", True) + + def copy(self, sourceDir, targetDir): + self.copy1(sourceDir,targetDir, None) + + def copy1(self, sourceDir, targetDir, verifier): + files = self.listFiles(sourceDir, verifier) + for i in range(len(files)): + self.copy2(sourceDir, files[i], targetDir, "") + + def copy2(self, sourceDir, filename, targetDir, targetName): + if (not self.fa.exists(targetDir, True)): + self.fa.xInterface.createFolder(targetDir) + self.executeCommand(self.ucb, "globalTransfer", self.copyArg(sourceDir, filename, targetDir, targetName)) + + # target name can be PropertyNames.EMPTY_STRING, in which case the name stays lige the source name + # @param sourceDir + # @param sourceFilename + # @param targetDir + # @param targetFilename + # @return + def copyArg(self, sourceDir, sourceFilename, targetDir, targetFilename): + aArg = GlobalTransferCommandArgument() + aArg.Operation = COPY + aArg.SourceURL = self.fa.getURL(sourceDir, sourceFilename) + aArg.TargetURL = targetDir + aArg.NewTitle = targetFilename + # fail, if object with same name exists in target folder + aArg.NameClash = OVERWRITE + return aArg + + def executeCommand(self, xContent, aCommandName, aArgument): + aCommand = Command() + aCommand.Name = aCommandName + aCommand.Handle = -1 # not available + aCommand.Argument = aArgument + return xContent.execute(aCommand, 0, None) + + def listFiles(self, path, verifier): + xContent = self.getContent(path) + + aArg = OpenCommandArgument2() + aArg.Mode = ALL + aArg.Priority = 32768 + + # Fill info for the properties wanted. + aArg.Properties = (Property(),) + + aArg.Properties[0].Name = "Title" + aArg.Properties[0].Handle = -1 + + xSet = self.executeCommand(xContent, "open", aArg) + + xResultSet = xSet.getStaticResultSet() + + files = [] + + if (xResultSet.first()): + # obtain XContentAccess interface for child content access and XRow for properties + while (True): + # Obtain URL of child. + if (hasattr(xResultSet, "queryContentIdentifierString")): + aId = xResultSet.queryContentIdentifierString() + aTitle = FileAccess.getFilename(aId) + elif (hasattr(xResultSet, "getString")): + # First column: Title (column numbers are 1-based!) + aTitle = xResultSet.getString(1) + else: + aTitle = "" + #if (len(aTitle) == 0 and xResultSet.wasNull()): + if (len(aTitle) == 0): + # ignore + pass + else: + files.append(aTitle) + if (not xResultSet.next()): + break + # next child + if (verifier is not None): + for i in range(len(files)): + if (not verifier.verify(files[i])): + files.pop(i) # FIXME !!! dangerous + return files + + def getContent(self, path): + try: + ident = self.ucb.createContentIdentifier(path) + return self.ucb.queryContent(ident) + except Exception: + traceback.print_exc() + return None + + class Verifier: + @abstractmethod + def verify(object): + pass + diff --git a/wizards/com/sun/star/wizards/common/__init__.py b/wizards/com/sun/star/wizards/common/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/common/__init__.py diff --git a/wizards/com/sun/star/wizards/common/strings.hrc b/wizards/com/sun/star/wizards/common/strings.hrc new file mode 100644 index 000000000..bb3f07237 --- /dev/null +++ b/wizards/com/sun/star/wizards/common/strings.hrc @@ -0,0 +1,318 @@ +# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# + +import gettext +import uno +import unohelper + +localeDir = "$BRAND_BASE_DIR/$BRAND_SHARE_RESOURCE_SUBDIR" + +gettext.bindtextdomain('wiz', unohelper.fileUrlToSystemPath( + uno.getComponentContext().getByName( + "/singletons/com.sun.star.util.theMacroExpander").expandMacros(localeDir))) + +gettext.textdomain('wiz') + +def NC_(context, string): + # Contextual strings are stored with the concatenation of + # the context, an EOT byte, and the original string, instead of the original string + # see https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html + ret = gettext.gettext(context + chr(4) + string) + if ret.find(chr(4)) == -1: + return ret + return string + +# common section +RID_COMMON_START_0 = NC_("RID_COMMON_START_0", "The directory '%1' could not be created.<BR>There may not be enough space left on your hard disk.") +RID_COMMON_START_1 = NC_("RID_COMMON_START_1", "The text document could not be created.<BR>Please check if the module 'PRODUCTNAME Writer' is installed.") +RID_COMMON_START_2 = NC_("RID_COMMON_START_2", "The spreadsheet could not be created.<BR>Please check if the module 'PRODUCTNAME Calc' is installed.") +RID_COMMON_START_3 = NC_("RID_COMMON_START_3", "The presentation could not be created.<BR>Please check if the module 'PRODUCTNAME Impress' is installed.") +RID_COMMON_START_4 = NC_("RID_COMMON_START_4", "The drawing could not be created.<BR>Please check if the module 'PRODUCTNAME Draw' is installed.") +RID_COMMON_START_5 = NC_("RID_COMMON_START_5", "The formula could not be created.<BR>Please check if the module 'PRODUCTNAME Math' is installed.") +RID_COMMON_START_6 = NC_("RID_COMMON_START_6", "The files required could not be found.<BR>Please start the %PRODUCTNAME Setup and choose 'Repair'.") +RID_COMMON_START_7 = NC_("RID_COMMON_START_7", "The file '<PATH>' already exists.<BR><BR>Would you like to overwrite the existing file?") +RID_COMMON_START_8 = NC_("RID_COMMON_START_8", "Yes") +RID_COMMON_START_9 = NC_("RID_COMMON_START_9", "Yes to All") +RID_COMMON_START_10 = NC_("RID_COMMON_START_10", "No") +RID_COMMON_START_11 = NC_("RID_COMMON_START_11", "Cancel") +RID_COMMON_START_12 = NC_("RID_COMMON_START_12", "~Finish") +RID_COMMON_START_13 = NC_("RID_COMMON_START_13", "< ~Back") +RID_COMMON_START_14 = NC_("RID_COMMON_START_14", "~Next >") +RID_COMMON_START_15 = NC_("RID_COMMON_START_15", "~Help") +RID_COMMON_START_16 = NC_("RID_COMMON_START_16", "Steps") +RID_COMMON_START_17 = NC_("RID_COMMON_START_17", "Close") +RID_COMMON_START_18 = NC_("RID_COMMON_START_18", "OK") +RID_COMMON_START_19 = NC_("RID_COMMON_START_19", "The file already exists. Do you want to overwrite it?") +RID_COMMON_START_20 = NC_("RID_COMMON_START_20", "Template created via <wizard_name> on <current_date>.") +RID_COMMON_START_21 = NC_("RID_COMMON_START_21", "The wizard could not be run, because important files were not found.\nUnder 'Tools - Options - %PRODUCTNAME - Paths' click the 'Default' button to reset the paths to the original default settings.\nThen run the wizard again.") + +# LETTER WIZARD RESOURCES +RID_LETTERWIZARDDIALOG_START_1 = NC_("RID_LETTERWIZARDDIALOG_START_1", "Letter Wizard") +RID_LETTERWIZARDDIALOG_START_2 = NC_("RID_LETTERWIZARDDIALOG_START_2", "Label9") +RID_LETTERWIZARDDIALOG_START_3 = NC_("RID_LETTERWIZARDDIALOG_START_3", "~Business Letter") +RID_LETTERWIZARDDIALOG_START_4 = NC_("RID_LETTERWIZARDDIALOG_START_4", "~Formal Personal Letter") +RID_LETTERWIZARDDIALOG_START_5 = NC_("RID_LETTERWIZARDDIALOG_START_5", "~Personal Letter") +RID_LETTERWIZARDDIALOG_START_6 = NC_("RID_LETTERWIZARDDIALOG_START_6", "~Use letterhead paper with pre-printed elements") +RID_LETTERWIZARDDIALOG_START_7 = NC_("RID_LETTERWIZARDDIALOG_START_7", "~Logo") +RID_LETTERWIZARDDIALOG_START_8 = NC_("RID_LETTERWIZARDDIALOG_START_8", "Return address") +RID_LETTERWIZARDDIALOG_START_9 = NC_("RID_LETTERWIZARDDIALOG_START_9", "~Include footer") +RID_LETTERWIZARDDIALOG_START_10 = NC_("RID_LETTERWIZARDDIALOG_START_10", "~Return address in envelope window") +RID_LETTERWIZARDDIALOG_START_11 = NC_("RID_LETTERWIZARDDIALOG_START_11", "~Logo") +RID_LETTERWIZARDDIALOG_START_12 = NC_("RID_LETTERWIZARDDIALOG_START_12", "~Return address in envelope window") +RID_LETTERWIZARDDIALOG_START_13 = NC_("RID_LETTERWIZARDDIALOG_START_13", "Letter signs") +RID_LETTERWIZARDDIALOG_START_14 = NC_("RID_LETTERWIZARDDIALOG_START_14", "S~ubject line") +RID_LETTERWIZARDDIALOG_START_15 = NC_("RID_LETTERWIZARDDIALOG_START_15", "Salu~tation") +RID_LETTERWIZARDDIALOG_START_16 = NC_("RID_LETTERWIZARDDIALOG_START_16", "Fold ~marks") +RID_LETTERWIZARDDIALOG_START_17 = NC_("RID_LETTERWIZARDDIALOG_START_17", "~Complimentary close") +RID_LETTERWIZARDDIALOG_START_18 = NC_("RID_LETTERWIZARDDIALOG_START_18", "~Footer") +RID_LETTERWIZARDDIALOG_START_19 = NC_("RID_LETTERWIZARDDIALOG_START_19", "~Use user data for return address") +RID_LETTERWIZARDDIALOG_START_20 = NC_("RID_LETTERWIZARDDIALOG_START_20", "~New sender address:") +RID_LETTERWIZARDDIALOG_START_21 = NC_("RID_LETTERWIZARDDIALOG_START_21", "Use placeholders for ~recipient's address") +RID_LETTERWIZARDDIALOG_START_22 = NC_("RID_LETTERWIZARDDIALOG_START_22", "Use address database for ~mail merge") +RID_LETTERWIZARDDIALOG_START_23 = NC_("RID_LETTERWIZARDDIALOG_START_23", "Include ~only on second and following pages") +RID_LETTERWIZARDDIALOG_START_24 = NC_("RID_LETTERWIZARDDIALOG_START_24", "~Include page number") +RID_LETTERWIZARDDIALOG_START_25 = NC_("RID_LETTERWIZARDDIALOG_START_25", "Letter Template") +RID_LETTERWIZARDDIALOG_START_26 = NC_("RID_LETTERWIZARDDIALOG_START_26", "Create a ~letter from this template") +RID_LETTERWIZARDDIALOG_START_27 = NC_("RID_LETTERWIZARDDIALOG_START_27", "Make ~manual changes to this letter template") +RID_LETTERWIZARDDIALOG_START_28 = NC_("RID_LETTERWIZARDDIALOG_START_28", "Page design") +RID_LETTERWIZARDDIALOG_START_29 = NC_("RID_LETTERWIZARDDIALOG_START_29", "Page design") +RID_LETTERWIZARDDIALOG_START_30 = NC_("RID_LETTERWIZARDDIALOG_START_30", "Page design") +RID_LETTERWIZARDDIALOG_START_31 = NC_("RID_LETTERWIZARDDIALOG_START_31", "This wizard helps you to create a letter template. You can then use the template as the basis for writing letters as often as desired.") +RID_LETTERWIZARDDIALOG_START_32 = NC_("RID_LETTERWIZARDDIALOG_START_32", "~Height:") +RID_LETTERWIZARDDIALOG_START_33 = NC_("RID_LETTERWIZARDDIALOG_START_33", "~Width:") +RID_LETTERWIZARDDIALOG_START_34 = NC_("RID_LETTERWIZARDDIALOG_START_34", "S~pacing to left margin:") +RID_LETTERWIZARDDIALOG_START_35 = NC_("RID_LETTERWIZARDDIALOG_START_35", "Spacing ~to top margin:") +RID_LETTERWIZARDDIALOG_START_36 = NC_("RID_LETTERWIZARDDIALOG_START_36", "Height:") +RID_LETTERWIZARDDIALOG_START_37 = NC_("RID_LETTERWIZARDDIALOG_START_37", "Width:") +RID_LETTERWIZARDDIALOG_START_38 = NC_("RID_LETTERWIZARDDIALOG_START_38", "S~pacing to left margin:") +RID_LETTERWIZARDDIALOG_START_39 = NC_("RID_LETTERWIZARDDIALOG_START_39", "Spacing ~to top margin:") +RID_LETTERWIZARDDIALOG_START_40 = NC_("RID_LETTERWIZARDDIALOG_START_40", "Height:") +RID_LETTERWIZARDDIALOG_START_42 = NC_("RID_LETTERWIZARDDIALOG_START_42", "Sender's address") +RID_LETTERWIZARDDIALOG_START_43 = NC_("RID_LETTERWIZARDDIALOG_START_43", "Name:") +RID_LETTERWIZARDDIALOG_START_44 = NC_("RID_LETTERWIZARDDIALOG_START_44", "Street:") +RID_LETTERWIZARDDIALOG_START_45 = NC_("RID_LETTERWIZARDDIALOG_START_45", "ZIP code/State/City:") +RID_LETTERWIZARDDIALOG_START_46 = NC_("RID_LETTERWIZARDDIALOG_START_46", "Recipient's address") +RID_LETTERWIZARDDIALOG_START_47 = NC_("RID_LETTERWIZARDDIALOG_START_47", "Footer") +RID_LETTERWIZARDDIALOG_START_48 = NC_("RID_LETTERWIZARDDIALOG_START_48", "This wizard creates a letter template which enables you to create multiple letters with the same layout and settings.") +RID_LETTERWIZARDDIALOG_START_49 = NC_("RID_LETTERWIZARDDIALOG_START_49", "To create another new letter out of the template just navigate to the template location and double-click it.") +RID_LETTERWIZARDDIALOG_START_50 = NC_("RID_LETTERWIZARDDIALOG_START_50", "Template name:") +RID_LETTERWIZARDDIALOG_START_51 = NC_("RID_LETTERWIZARDDIALOG_START_51", "Location and file name:") +RID_LETTERWIZARDDIALOG_START_52 = NC_("RID_LETTERWIZARDDIALOG_START_52", "How do you want to proceed?") +RID_LETTERWIZARDDIALOG_START_53 = NC_("RID_LETTERWIZARDDIALOG_START_53", "Please choose the type of letter and page design") +RID_LETTERWIZARDDIALOG_START_54 = NC_("RID_LETTERWIZARDDIALOG_START_54", "Select the items to be printed") +RID_LETTERWIZARDDIALOG_START_55 = NC_("RID_LETTERWIZARDDIALOG_START_55", "Specify items already on your letterhead paper") +RID_LETTERWIZARDDIALOG_START_56 = NC_("RID_LETTERWIZARDDIALOG_START_56", "Specify the sender and recipient information") +RID_LETTERWIZARDDIALOG_START_57 = NC_("RID_LETTERWIZARDDIALOG_START_57", "Fill in the information you would like in the footer") +RID_LETTERWIZARDDIALOG_START_58 = NC_("RID_LETTERWIZARDDIALOG_START_58", "Please specify last settings") +RID_LETTERWIZARDDIALOG_START_59 = NC_("RID_LETTERWIZARDDIALOG_START_59", "Subject:") +RID_LETTERWIZARDDIALOG_START_60 = NC_("RID_LETTERWIZARDDIALOG_START_60", "Elegant") +RID_LETTERWIZARDDIALOG_START_61 = NC_("RID_LETTERWIZARDDIALOG_START_61", "Modern") +RID_LETTERWIZARDDIALOG_START_62 = NC_("RID_LETTERWIZARDDIALOG_START_62", "Office") +RID_LETTERWIZARDDIALOG_START_63 = NC_("RID_LETTERWIZARDDIALOG_START_63", "Bottle") +RID_LETTERWIZARDDIALOG_START_64 = NC_("RID_LETTERWIZARDDIALOG_START_64", "Mail") +RID_LETTERWIZARDDIALOG_START_65 = NC_("RID_LETTERWIZARDDIALOG_START_65", "Marine") +RID_LETTERWIZARDDIALOG_START_66 = NC_("RID_LETTERWIZARDDIALOG_START_66", "Red Line") + +# Letter Wizard Greeting Start +RID_LETTERWIZARDSALUTATION_START_1 = NC_("RID_LETTERWIZARDSALUTATION_START_1", "To Whom it May Concern") +RID_LETTERWIZARDSALUTATION_START_2 = NC_("RID_LETTERWIZARDSALUTATION_START_2", "Dear Sir or Madam") +RID_LETTERWIZARDSALUTATION_START_3 = NC_("RID_LETTERWIZARDSALUTATION_START_3", "Hello") + +# Letter Wizard Greeting Start +RID_LETTERWIZARDGREETING_START_1 = NC_("RID_LETTERWIZARDGREETING_START_1", "Sincerely") +RID_LETTERWIZARDGREETING_START_2 = NC_("RID_LETTERWIZARDGREETING_START_2", "Best regards") +RID_LETTERWIZARDGREETING_START_3 = NC_("RID_LETTERWIZARDGREETING_START_3", "Cheers") + +# Letter Wizard Roadmap Start +RID_LETTERWIZARDROADMAP_START_1 = NC_("RID_LETTERWIZARDROADMAP_START_1", "Page Design") +RID_LETTERWIZARDROADMAP_START_2 = NC_("RID_LETTERWIZARDROADMAP_START_2", "Letterhead Layout") +RID_LETTERWIZARDROADMAP_START_3 = NC_("RID_LETTERWIZARDROADMAP_START_3", "Printed Items") +RID_LETTERWIZARDROADMAP_START_4 = NC_("RID_LETTERWIZARDROADMAP_START_4", "Recipient and Sender") +RID_LETTERWIZARDROADMAP_START_5 = NC_("RID_LETTERWIZARDROADMAP_START_5", "Footer") +RID_LETTERWIZARDROADMAP_START_6 = NC_("RID_LETTERWIZARDROADMAP_START_6", "Name and Location") + +# FAX WIZARD RESOURCES +RID_FAXWIZARDDIALOG_START_1 = NC_("RID_FAXWIZARDDIALOG_START_1", "Fax Wizard") +RID_FAXWIZARDDIALOG_START_2 = NC_("RID_FAXWIZARDDIALOG_START_2", "Label9") +RID_FAXWIZARDDIALOG_START_3 = NC_("RID_FAXWIZARDDIALOG_START_3", "~Business Fax") +RID_FAXWIZARDDIALOG_START_4 = NC_("RID_FAXWIZARDDIALOG_START_4", "~Personal Fax") +RID_FAXWIZARDDIALOG_START_5 = NC_("RID_FAXWIZARDDIALOG_START_5", "~Logo") +RID_FAXWIZARDDIALOG_START_6 = NC_("RID_FAXWIZARDDIALOG_START_6", "S~ubject line") +RID_FAXWIZARDDIALOG_START_7 = NC_("RID_FAXWIZARDDIALOG_START_7", "S~alutation") +RID_FAXWIZARDDIALOG_START_8 = NC_("RID_FAXWIZARDDIALOG_START_8", "~Complimentary close") +RID_FAXWIZARDDIALOG_START_9 = NC_("RID_FAXWIZARDDIALOG_START_9", "~Footer") +RID_FAXWIZARDDIALOG_START_10 = NC_("RID_FAXWIZARDDIALOG_START_10", "~Use user data for return address") +RID_FAXWIZARDDIALOG_START_11 = NC_("RID_FAXWIZARDDIALOG_START_11", "~New return address") +RID_FAXWIZARDDIALOG_START_12 = NC_("RID_FAXWIZARDDIALOG_START_12", "My Fax Template") +RID_FAXWIZARDDIALOG_START_13 = NC_("RID_FAXWIZARDDIALOG_START_13", "Create a ~fax from this template") +RID_FAXWIZARDDIALOG_START_14 = NC_("RID_FAXWIZARDDIALOG_START_14", "Make ~manual changes to this fax template") +RID_FAXWIZARDDIALOG_START_15 = NC_("RID_FAXWIZARDDIALOG_START_15", "Page design") +RID_FAXWIZARDDIALOG_START_16 = NC_("RID_FAXWIZARDDIALOG_START_16", "Page design") +RID_FAXWIZARDDIALOG_START_17 = NC_("RID_FAXWIZARDDIALOG_START_17", "This wizard helps you to create a fax template. The template can then be used to create a fax whenever needed.") +RID_FAXWIZARDDIALOG_START_18 = NC_("RID_FAXWIZARDDIALOG_START_18", "Return address") +RID_FAXWIZARDDIALOG_START_19 = NC_("RID_FAXWIZARDDIALOG_START_19", "Name:") +RID_FAXWIZARDDIALOG_START_20 = NC_("RID_FAXWIZARDDIALOG_START_20", "Street:") +RID_FAXWIZARDDIALOG_START_21 = NC_("RID_FAXWIZARDDIALOG_START_21", "ZIP code/State/City:") +RID_FAXWIZARDDIALOG_START_22 = NC_("RID_FAXWIZARDDIALOG_START_22", "Footer") +RID_FAXWIZARDDIALOG_START_23 = NC_("RID_FAXWIZARDDIALOG_START_23", "This wizard creates a fax template which enables you to create multiple faxes with the same layout and settings.") +RID_FAXWIZARDDIALOG_START_24 = NC_("RID_FAXWIZARDDIALOG_START_24", "To create another new fax out of the template, go to the location where you saved the template and double-click the file.") +RID_FAXWIZARDDIALOG_START_25 = NC_("RID_FAXWIZARDDIALOG_START_25", "Template name:") +RID_FAXWIZARDDIALOG_START_26 = NC_("RID_FAXWIZARDDIALOG_START_26", "Location and file name:") +RID_FAXWIZARDDIALOG_START_27 = NC_("RID_FAXWIZARDDIALOG_START_27", "What do you want to do next?") +RID_FAXWIZARDDIALOG_START_28 = NC_("RID_FAXWIZARDDIALOG_START_28", "Choose the type of fax and a page design") +RID_FAXWIZARDDIALOG_START_29 = NC_("RID_FAXWIZARDDIALOG_START_29", "Select items to include in the fax template") +RID_FAXWIZARDDIALOG_START_30 = NC_("RID_FAXWIZARDDIALOG_START_30", "Specify sender and recipient information") +RID_FAXWIZARDDIALOG_START_31 = NC_("RID_FAXWIZARDDIALOG_START_31", "Enter text for the footer") +RID_FAXWIZARDDIALOG_START_32 = NC_("RID_FAXWIZARDDIALOG_START_32", "Choose a name and save the template") +RID_FAXWIZARDDIALOG_START_33 = NC_("RID_FAXWIZARDDIALOG_START_33", "Include ~only on second and following pages") +RID_FAXWIZARDDIALOG_START_34 = NC_("RID_FAXWIZARDDIALOG_START_34", "~Include page number") +RID_FAXWIZARDDIALOG_START_35 = NC_("RID_FAXWIZARDDIALOG_START_35", "~Date") +RID_FAXWIZARDDIALOG_START_36 = NC_("RID_FAXWIZARDDIALOG_START_36", "~Type of message") +RID_FAXWIZARDDIALOG_START_37 = NC_("RID_FAXWIZARDDIALOG_START_37", "Fax Number:") +RID_FAXWIZARDDIALOG_START_38 = NC_("RID_FAXWIZARDDIALOG_START_38", "Use placeholders for ~recipient's address") +RID_FAXWIZARDDIALOG_START_39 = NC_("RID_FAXWIZARDDIALOG_START_39", "Use address database for ~mail merge") +RID_FAXWIZARDDIALOG_START_40 = NC_("RID_FAXWIZARDDIALOG_START_40", "~New return address") +RID_FAXWIZARDDIALOG_START_41 = NC_("RID_FAXWIZARDDIALOG_START_41", "To:") +RID_FAXWIZARDDIALOG_START_42 = NC_("RID_FAXWIZARDDIALOG_START_42", "From:") +RID_FAXWIZARDDIALOG_START_43 = NC_("RID_FAXWIZARDDIALOG_START_43", "Fax:") +RID_FAXWIZARDDIALOG_START_44 = NC_("RID_FAXWIZARDDIALOG_START_44", "Tel:") +RID_FAXWIZARDDIALOG_START_45 = NC_("RID_FAXWIZARDDIALOG_START_45", "Email:") +RID_FAXWIZARDDIALOG_START_46 = NC_("RID_FAXWIZARDDIALOG_START_46", "This template consists of") +RID_FAXWIZARDDIALOG_START_47 = NC_("RID_FAXWIZARDDIALOG_START_47", "page") +RID_FAXWIZARDDIALOG_START_48 = NC_("RID_FAXWIZARDDIALOG_START_48", "Please inform us if transmission errors occur.") +RID_FAXWIZARDDIALOG_START_49 = NC_("RID_FAXWIZARDDIALOG_START_49", "Bottle") +RID_FAXWIZARDDIALOG_START_50 = NC_("RID_FAXWIZARDDIALOG_START_50", "Lines") +RID_FAXWIZARDDIALOG_START_51 = NC_("RID_FAXWIZARDDIALOG_START_51", "Marine") +RID_FAXWIZARDDIALOG_START_52 = NC_("RID_FAXWIZARDDIALOG_START_52", "Classic Fax") +RID_FAXWIZARDDIALOG_START_53 = NC_("RID_FAXWIZARDDIALOG_START_53", "Classic Fax from Private") +RID_FAXWIZARDDIALOG_START_54 = NC_("RID_FAXWIZARDDIALOG_START_54", "Modern Fax") +RID_FAXWIZARDDIALOG_START_55 = NC_("RID_FAXWIZARDDIALOG_START_55", "Modern Fax from Private") +RID_FAXWIZARDDIALOG_START_56 = NC_("RID_FAXWIZARDDIALOG_START_56", "Fax") + +# Fax Wizard Communication Start +RID_FAXWIZARDCOMMUNICATION_START_1 = NC_("RID_FAXWIZARDCOMMUNICATION_START_1", "Important Information!") +RID_FAXWIZARDCOMMUNICATION_START_2 = NC_("RID_FAXWIZARDCOMMUNICATION_START_2", "For your information") +RID_FAXWIZARDCOMMUNICATION_START_3 = NC_("RID_FAXWIZARDCOMMUNICATION_START_3", "News!") + +# Fax Wizard Salutation Start +RID_FAXWIZARDSALUTATION_START_1 = NC_("RID_FAXWIZARDSALUTATION_START_1", "To whom it may concern,") +RID_FAXWIZARDSALUTATION_START_2 = NC_("RID_FAXWIZARDSALUTATION_START_2", "Dear Sir or Madam,") +RID_FAXWIZARDSALUTATION_START_3 = NC_("RID_FAXWIZARDSALUTATION_START_3", "Hello,") +RID_FAXWIZARDSALUTATION_START_4 = NC_("RID_FAXWIZARDSALUTATION_START_4", "Hi,") + +# Fax Wizard Greeting Start +RID_FAXWIZARDGREETING_START_1 = NC_("RID_FAXWIZARDGREETING_START_1", "Sincerely") +RID_FAXWIZARDGREETING_START_2 = NC_("RID_FAXWIZARDGREETING_START_2", "Yours faithfully") +RID_FAXWIZARDGREETING_START_3 = NC_("RID_FAXWIZARDGREETING_START_3", "Regards") +RID_FAXWIZARDGREETING_START_4 = NC_("RID_FAXWIZARDGREETING_START_4", "Love") + +# Fax Wizard Roadmap Start +RID_FAXWIZARDROADMAP_START_1 = NC_("RID_FAXWIZARDROADMAP_START_1", "Page Design") +RID_FAXWIZARDROADMAP_START_2 = NC_("RID_FAXWIZARDROADMAP_START_2", "Items to Include") +RID_FAXWIZARDROADMAP_START_3 = NC_("RID_FAXWIZARDROADMAP_START_3", "Sender and Recipient") +RID_FAXWIZARDROADMAP_START_4 = NC_("RID_FAXWIZARDROADMAP_START_4", "Footer") +RID_FAXWIZARDROADMAP_START_5 = NC_("RID_FAXWIZARDROADMAP_START_5", "Name and Location") + +# AGENDA WIZARD RESOURCES +RID_AGENDAWIZARDDIALOG_START_1 = NC_("RID_AGENDAWIZARDDIALOG_START_1", "Agenda Wizard") +RID_AGENDAWIZARDDIALOG_START_2 = NC_("RID_AGENDAWIZARDDIALOG_START_2", "Make ~manual changes to this agenda template") +RID_AGENDAWIZARDDIALOG_START_3 = NC_("RID_AGENDAWIZARDDIALOG_START_3", "Template name:") +RID_AGENDAWIZARDDIALOG_START_4 = NC_("RID_AGENDAWIZARDDIALOG_START_4", "Location and file name:") +RID_AGENDAWIZARDDIALOG_START_5 = NC_("RID_AGENDAWIZARDDIALOG_START_5", "What do you want to do next?") +RID_AGENDAWIZARDDIALOG_START_6 = NC_("RID_AGENDAWIZARDDIALOG_START_6", "Please choose the page design for the agenda") +RID_AGENDAWIZARDDIALOG_START_7 = NC_("RID_AGENDAWIZARDDIALOG_START_7", "Please select the headings you wish to include in your agenda template") +RID_AGENDAWIZARDDIALOG_START_8 = NC_("RID_AGENDAWIZARDDIALOG_START_8", "Please enter general information for the event") +RID_AGENDAWIZARDDIALOG_START_9 = NC_("RID_AGENDAWIZARDDIALOG_START_9", "Please specify items for the agenda") +RID_AGENDAWIZARDDIALOG_START_10 = NC_("RID_AGENDAWIZARDDIALOG_START_10", "Please select the names you wish to include in your agenda template") +RID_AGENDAWIZARDDIALOG_START_11 = NC_("RID_AGENDAWIZARDDIALOG_START_11", "Choose a name and save the template") +RID_AGENDAWIZARDDIALOG_START_12 = NC_("RID_AGENDAWIZARDDIALOG_START_12", "Include form for recording minutes") +RID_AGENDAWIZARDDIALOG_START_13 = NC_("RID_AGENDAWIZARDDIALOG_START_13", "This wizard helps you to create an agenda template. The template can then be used to create an agenda whenever needed.") +RID_AGENDAWIZARDDIALOG_START_14 = NC_("RID_AGENDAWIZARDDIALOG_START_14", "Time:") +RID_AGENDAWIZARDDIALOG_START_15 = NC_("RID_AGENDAWIZARDDIALOG_START_15", "Name:") +RID_AGENDAWIZARDDIALOG_START_16 = NC_("RID_AGENDAWIZARDDIALOG_START_16", "Location:") +RID_AGENDAWIZARDDIALOG_START_17 = NC_("RID_AGENDAWIZARDDIALOG_START_17", "Placeholders will be used in empty fields. You can replace placeholders with text later.") +RID_AGENDAWIZARDDIALOG_START_18 = NC_("RID_AGENDAWIZARDDIALOG_START_18", "...") +RID_AGENDAWIZARDDIALOG_START_19 = NC_("RID_AGENDAWIZARDDIALOG_START_19", "Create an ~agenda from this template") +RID_AGENDAWIZARDDIALOG_START_20 = NC_("RID_AGENDAWIZARDDIALOG_START_20", "To create a new agenda out of the template, go to the location where you saved the template and double-click the file.") +RID_AGENDAWIZARDDIALOG_START_21 = NC_("RID_AGENDAWIZARDDIALOG_START_21", "Agenda item") +RID_AGENDAWIZARDDIALOG_START_22 = NC_("RID_AGENDAWIZARDDIALOG_START_22", "Responsible") +RID_AGENDAWIZARDDIALOG_START_23 = NC_("RID_AGENDAWIZARDDIALOG_START_23", "Duration") +RID_AGENDAWIZARDDIALOG_START_24 = NC_("RID_AGENDAWIZARDDIALOG_START_24", "Meeting called by") +RID_AGENDAWIZARDDIALOG_START_25 = NC_("RID_AGENDAWIZARDDIALOG_START_25", "Chairperson") +RID_AGENDAWIZARDDIALOG_START_26 = NC_("RID_AGENDAWIZARDDIALOG_START_26", "Minute keeper") +RID_AGENDAWIZARDDIALOG_START_27 = NC_("RID_AGENDAWIZARDDIALOG_START_27", "Moderator") +RID_AGENDAWIZARDDIALOG_START_28 = NC_("RID_AGENDAWIZARDDIALOG_START_28", "Attendees") +RID_AGENDAWIZARDDIALOG_START_29 = NC_("RID_AGENDAWIZARDDIALOG_START_29", "Observers") +RID_AGENDAWIZARDDIALOG_START_30 = NC_("RID_AGENDAWIZARDDIALOG_START_30", "Facility personnel") +RID_AGENDAWIZARDDIALOG_START_31 = NC_("RID_AGENDAWIZARDDIALOG_START_31", "The agenda template will include placeholders for the names of the selected people. When creating an agenda from the template, you can replace these placeholder with the appropriate names.") +RID_AGENDAWIZARDDIALOG_START_32 = NC_("RID_AGENDAWIZARDDIALOG_START_32", "Type of meeting") +RID_AGENDAWIZARDDIALOG_START_33 = NC_("RID_AGENDAWIZARDDIALOG_START_33", "Please read") +RID_AGENDAWIZARDDIALOG_START_34 = NC_("RID_AGENDAWIZARDDIALOG_START_34", "Please bring") +RID_AGENDAWIZARDDIALOG_START_35 = NC_("RID_AGENDAWIZARDDIALOG_START_35", "Notes") +RID_AGENDAWIZARDDIALOG_START_36 = NC_("RID_AGENDAWIZARDDIALOG_START_36", "The agenda template will include placeholders for the selected items.") +RID_AGENDAWIZARDDIALOG_START_38 = NC_("RID_AGENDAWIZARDDIALOG_START_38", "Date:") +RID_AGENDAWIZARDDIALOG_START_39 = NC_("RID_AGENDAWIZARDDIALOG_START_39", "This wizard creates an agenda template which enables you to create multiple agendas with the same layout and settings.") +RID_AGENDAWIZARDDIALOG_START_40 = NC_("RID_AGENDAWIZARDDIALOG_START_40", "Page design:") +RID_AGENDAWIZARDDIALOG_START_41 = NC_("RID_AGENDAWIZARDDIALOG_START_41", "myAgendaTemplate.stw") +RID_AGENDAWIZARDDIALOG_START_42 = NC_("RID_AGENDAWIZARDDIALOG_START_42", "My Agenda Template") +RID_AGENDAWIZARDDIALOG_START_43 = NC_("RID_AGENDAWIZARDDIALOG_START_43", "An error occurred while saving the agenda template.") +RID_AGENDAWIZARDDIALOG_START_44 = NC_("RID_AGENDAWIZARDDIALOG_START_44", "Name") +RID_AGENDAWIZARDDIALOG_START_45 = NC_("RID_AGENDAWIZARDDIALOG_START_45", "Date") +RID_AGENDAWIZARDDIALOG_START_46 = NC_("RID_AGENDAWIZARDDIALOG_START_46", "Time") +RID_AGENDAWIZARDDIALOG_START_47 = NC_("RID_AGENDAWIZARDDIALOG_START_47", "Location") +RID_AGENDAWIZARDDIALOG_START_48 = NC_("RID_AGENDAWIZARDDIALOG_START_48", "Click to replace this text") +RID_AGENDAWIZARDDIALOG_START_50 = NC_("RID_AGENDAWIZARDDIALOG_START_50", "Page Design") +RID_AGENDAWIZARDDIALOG_START_51 = NC_("RID_AGENDAWIZARDDIALOG_START_51", "General Information") +RID_AGENDAWIZARDDIALOG_START_52 = NC_("RID_AGENDAWIZARDDIALOG_START_52", "Headings to Include") +RID_AGENDAWIZARDDIALOG_START_53 = NC_("RID_AGENDAWIZARDDIALOG_START_53", "Names") +RID_AGENDAWIZARDDIALOG_START_54 = NC_("RID_AGENDAWIZARDDIALOG_START_54", "Agenda Items") +RID_AGENDAWIZARDDIALOG_START_55 = NC_("RID_AGENDAWIZARDDIALOG_START_55", "Name and Location") +RID_AGENDAWIZARDDIALOG_START_56 = NC_("RID_AGENDAWIZARDDIALOG_START_56", "An error occurred while opening the agenda template.") +RID_AGENDAWIZARDDIALOG_START_57 = NC_("RID_AGENDAWIZARDDIALOG_START_57", "Type of meeting") +RID_AGENDAWIZARDDIALOG_START_58 = NC_("RID_AGENDAWIZARDDIALOG_START_58", "Please bring") +RID_AGENDAWIZARDDIALOG_START_59 = NC_("RID_AGENDAWIZARDDIALOG_START_59", "Please read") +RID_AGENDAWIZARDDIALOG_START_60 = NC_("RID_AGENDAWIZARDDIALOG_START_60", "Notes") +RID_AGENDAWIZARDDIALOG_START_61 = NC_("RID_AGENDAWIZARDDIALOG_START_61", "Meeting called by") +RID_AGENDAWIZARDDIALOG_START_62 = NC_("RID_AGENDAWIZARDDIALOG_START_62", "Chairperson") +RID_AGENDAWIZARDDIALOG_START_63 = NC_("RID_AGENDAWIZARDDIALOG_START_63", "Attendees") +RID_AGENDAWIZARDDIALOG_START_64 = NC_("RID_AGENDAWIZARDDIALOG_START_64", "Minute keeper") +RID_AGENDAWIZARDDIALOG_START_65 = NC_("RID_AGENDAWIZARDDIALOG_START_65", "Moderator") +RID_AGENDAWIZARDDIALOG_START_66 = NC_("RID_AGENDAWIZARDDIALOG_START_66", "Observers") +RID_AGENDAWIZARDDIALOG_START_67 = NC_("RID_AGENDAWIZARDDIALOG_START_67", "Facility personnel") +RID_AGENDAWIZARDDIALOG_START_68 = NC_("RID_AGENDAWIZARDDIALOG_START_68", "Insert") +RID_AGENDAWIZARDDIALOG_START_69 = NC_("RID_AGENDAWIZARDDIALOG_START_69", "Remove") +RID_AGENDAWIZARDDIALOG_START_70 = NC_("RID_AGENDAWIZARDDIALOG_START_70", "Move up") +RID_AGENDAWIZARDDIALOG_START_71 = NC_("RID_AGENDAWIZARDDIALOG_START_71", "Move down") +RID_AGENDAWIZARDDIALOG_START_72 = NC_("RID_AGENDAWIZARDDIALOG_START_72", "Date:") +RID_AGENDAWIZARDDIALOG_START_73 = NC_("RID_AGENDAWIZARDDIALOG_START_73", "Time:") +RID_AGENDAWIZARDDIALOG_START_74 = NC_("RID_AGENDAWIZARDDIALOG_START_74", "Location:") +RID_AGENDAWIZARDDIALOG_START_75 = NC_("RID_AGENDAWIZARDDIALOG_START_75", "Topics") +RID_AGENDAWIZARDDIALOG_START_76 = NC_("RID_AGENDAWIZARDDIALOG_START_76", "Num.") +RID_AGENDAWIZARDDIALOG_START_77 = NC_("RID_AGENDAWIZARDDIALOG_START_77", "Topic") +RID_AGENDAWIZARDDIALOG_START_78 = NC_("RID_AGENDAWIZARDDIALOG_START_78", "Responsible") +RID_AGENDAWIZARDDIALOG_START_79 = NC_("RID_AGENDAWIZARDDIALOG_START_79", "Time") +RID_AGENDAWIZARDDIALOG_START_80 = NC_("RID_AGENDAWIZARDDIALOG_START_80", "Additional information") +RID_AGENDAWIZARDDIALOG_START_81 = NC_("RID_AGENDAWIZARDDIALOG_START_81", "Minutes for") +RID_AGENDAWIZARDDIALOG_START_82 = NC_("RID_AGENDAWIZARDDIALOG_START_82", "Discussion:") +RID_AGENDAWIZARDDIALOG_START_83 = NC_("RID_AGENDAWIZARDDIALOG_START_83", "Conclusion:") +RID_AGENDAWIZARDDIALOG_START_84 = NC_("RID_AGENDAWIZARDDIALOG_START_84", "To do:") +RID_AGENDAWIZARDDIALOG_START_85 = NC_("RID_AGENDAWIZARDDIALOG_START_85", "Responsible party:") +RID_AGENDAWIZARDDIALOG_START_86 = NC_("RID_AGENDAWIZARDDIALOG_START_86", "Deadline:") +RID_AGENDAWIZARDDIALOG_START_87 = NC_("RID_AGENDAWIZARDDIALOG_START_87", "Blue") +RID_AGENDAWIZARDDIALOG_START_88 = NC_("RID_AGENDAWIZARDDIALOG_START_88", "Classic") +RID_AGENDAWIZARDDIALOG_START_89 = NC_("RID_AGENDAWIZARDDIALOG_START_89", "Colorful") +RID_AGENDAWIZARDDIALOG_START_90 = NC_("RID_AGENDAWIZARDDIALOG_START_90", "Elegant") +RID_AGENDAWIZARDDIALOG_START_91 = NC_("RID_AGENDAWIZARDDIALOG_START_91", "Green") +RID_AGENDAWIZARDDIALOG_START_92 = NC_("RID_AGENDAWIZARDDIALOG_START_92", "Grey") +RID_AGENDAWIZARDDIALOG_START_93 = NC_("RID_AGENDAWIZARDDIALOG_START_93", "Modern") +RID_AGENDAWIZARDDIALOG_START_94 = NC_("RID_AGENDAWIZARDDIALOG_START_94", "Orange") +RID_AGENDAWIZARDDIALOG_START_95 = NC_("RID_AGENDAWIZARDDIALOG_START_95", "Red") +RID_AGENDAWIZARDDIALOG_START_96 = NC_("RID_AGENDAWIZARDDIALOG_START_96", "Simple") + +# vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/wizards/com/sun/star/wizards/db/BlindtextCreator.java b/wizards/com/sun/star/wizards/db/BlindtextCreator.java new file mode 100644 index 000000000..0d79f457d --- /dev/null +++ b/wizards/com/sun/star/wizards/db/BlindtextCreator.java @@ -0,0 +1,100 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; + +public class BlindtextCreator +{ + + private static final String BlindText = + "Ut wisi enim ad minim veniam, quis nostrud exerci tation " + "ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor " + "in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at " + "vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore " + "te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy " + "nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, " + "quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. " + "Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum " + "dolore eu feugiat nulla facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent " + "luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis " + "eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum."; + + public static String adjustBlindTextlength(String FieldTitle, int FieldWidth, boolean bIsCurLandscape, boolean bIsGroupTable, String[] _RecordFieldNames) + { + String BlindTextString = PropertyNames.EMPTY_STRING; + if (bIsGroupTable) + { + return getBlindTextString(FieldTitle, FieldWidth); + } + int MaxFieldCount = getMaxFieldCount(bIsCurLandscape); + if (_RecordFieldNames.length <= 2 * MaxFieldCount) + { + if (_RecordFieldNames.length <= MaxFieldCount) + { + BlindTextString = getBlindTextString(FieldTitle, FieldWidth); + } + else + { + BlindTextString = getBlindTextString(FieldTitle, (int) (0.5 * FieldWidth)); + } + } + else + { + BlindTextString = getBlindTextString(FieldTitle, (int) 1.1 * FieldTitle.length()); + } + return BlindTextString; + } + + public static String getBlindTextString(String FieldTitle, int MaxWidth) + { + String[] BlindTextArray = JavaTools.ArrayoutofString(BlindText, PropertyNames.SPACE); + String PartBlindText = BlindTextArray[0]; + String NewPartBlindText; + int MaxHeaderWidth; + int Titlelength = (int) 1.1 * FieldTitle.length(); // We assume that the TableHeading is bold + + if (Titlelength > PartBlindText.length()) + { + MaxHeaderWidth = Titlelength; + } + else + { + MaxHeaderWidth = PartBlindText.length(); + } + if (MaxHeaderWidth > MaxWidth) + { + MaxWidth = MaxHeaderWidth; + } + int i = 1; + do + { + NewPartBlindText = PartBlindText + PropertyNames.SPACE + BlindTextArray[i]; + if (NewPartBlindText.length() < MaxWidth) + { + PartBlindText = NewPartBlindText; + i += 1; + } + } + while (NewPartBlindText.length() < MaxWidth); + return PartBlindText; + } + + private static int getMaxFieldCount(boolean bIsCurLandscape) + { + if (bIsCurLandscape) + { + return 5; + } + else + { + return 3; + } + } +} diff --git a/wizards/com/sun/star/wizards/db/ColumnPropertySet.java b/wizards/com/sun/star/wizards/db/ColumnPropertySet.java new file mode 100644 index 000000000..484dbf62f --- /dev/null +++ b/wizards/com/sun/star/wizards/db/ColumnPropertySet.java @@ -0,0 +1,159 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.sdbc.DataType; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +public class ColumnPropertySet +{ + + private TypeInspector oTypeInspector; + public XPropertySet xPropertySet; + private int nType; + private String sTypeName = PropertyNames.EMPTY_STRING; + + public ColumnPropertySet(TypeInspector _oTypeInspector, XPropertySet _xPropertySet) + { + xPropertySet = _xPropertySet; + oTypeInspector = _oTypeInspector; + } + + private void assignPropertyValues(String _sNewName, PropertyValue[] _aNewColPropertyValues, boolean _bsetDefaultProperties) + { + try + { + nType = ((Integer) Properties.getPropertyValue(_aNewColPropertyValues, "Type")).intValue(); + nType = oTypeInspector.convertDataType(nType); + if (Properties.hasPropertyValue(_aNewColPropertyValues, "TypeName")) + { + sTypeName = (String) Properties.getPropertyValue(_aNewColPropertyValues, "TypeName"); + } + Integer precision = null; + if (Properties.hasPropertyValue(_aNewColPropertyValues, "Precision")) + { + precision = (Integer) Properties.getPropertyValue(_aNewColPropertyValues, "Precision"); + + } + if ((nType == DataType.VARCHAR) && (precision == null || precision.intValue() == 0)) + { + precision = 50; + } + if (precision != null) + { + xPropertySet.setPropertyValue("Precision", precision); + } + setType(sTypeName, precision); + for (int i = 0; i < _aNewColPropertyValues.length; i++) + { + String sPropName = _aNewColPropertyValues[i].Name; + if (_sNewName != null && sPropName.equals(PropertyNames.PROPERTY_NAME)) + { + xPropertySet.setPropertyValue(PropertyNames.PROPERTY_NAME, _sNewName); + } + else if (sPropName.equals("Precision")) + { + // do nothing, see above + } + else if ((!sPropName.equals("Type")) && (!sPropName.equals("TypeName"))) + { + Object oColValue = _aNewColPropertyValues[i].Value; + assignPropertyValue(sPropName, oColValue); + } + } + if (_bsetDefaultProperties) + { + assignPropertyValue("IsNullable", Integer.valueOf(oTypeInspector.isNullable(xPropertySet))); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + + } + + public void assignPropertyValues(PropertyValue[] _aNewColPropertyValues, boolean _bsetDefaultProperties) + { + assignPropertyValues(null /* don't change the name */, _aNewColPropertyValues, _bsetDefaultProperties); + } + + private void setType(String _sTypeName, Integer precision) + { + if (_sTypeName.equals(PropertyNames.EMPTY_STRING)) + { + sTypeName = oTypeInspector.getDefaultTypeName(nType, precision); + } + else + { + sTypeName = _sTypeName; + } + nType = oTypeInspector.getDataType(sTypeName); + assignPropertyValue("Type", Integer.valueOf(nType)); + assignPropertyValue("TypeName", sTypeName); + } + + private void assignPropertyValue(String _spropname, Object _oValue) + { + try + { + if (_spropname.equals("Type")) + { + nType = ((Integer) _oValue).intValue(); + xPropertySet.setPropertyValue("Type", Integer.valueOf(nType)); + } + else if (_spropname.equals(PropertyNames.PROPERTY_NAME)) + { + String sName = (String) _oValue; + if (!sName.equals(PropertyNames.EMPTY_STRING)) + { + xPropertySet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + } + } + else if (_spropname.equals("Scale")) + { + int nScale = ((Integer) _oValue).intValue(); + nScale = oTypeInspector.getScale(xPropertySet); + xPropertySet.setPropertyValue("Scale", Integer.valueOf(nScale)); + } + else if (_spropname.equals("IsNullable")) + { + int nNullability = ((Integer) _oValue).intValue(); + nNullability = oTypeInspector.getNullability(xPropertySet, nNullability); + xPropertySet.setPropertyValue("IsNullable", Integer.valueOf(nNullability)); + } + else if (_spropname.equals("TypeName")) + { + String sTypeName = (String) _oValue; + xPropertySet.setPropertyValue("TypeName", sTypeName); + } + else + { + xPropertySet.setPropertyValue(_spropname, _oValue); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + +} diff --git a/wizards/com/sun/star/wizards/db/CommandMetaData.java b/wizards/com/sun/star/wizards/db/CommandMetaData.java new file mode 100644 index 000000000..28180382f --- /dev/null +++ b/wizards/com/sun/star/wizards/db/CommandMetaData.java @@ -0,0 +1,539 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.AnyConverter; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class CommandMetaData extends DBMetaData +{ + + public Map<String, String> FieldTitleSet = new HashMap<String, String>(); + public String[] m_aAllFieldNames = new String[] + { + }; + public FieldColumn[] FieldColumns = new FieldColumn[] + { + }; + public String[] GroupFieldNames = new String[] + { + }; + private String[][] SortFieldNames = new String[][] + { + }; + private String[] RecordFieldNames = new String[] + { + }; + public String[][] AggregateFieldNames = new String[][] + { + }; + public String[] NumericFieldNames = new String[] + { + }; + public String[] NonAggregateFieldNames; + private int CommandType; + private String Command; + private String sIdentifierQuote = PropertyNames.EMPTY_STRING; + private boolean bCommandComposerAttributesalreadyRetrieved = false; + + public CommandMetaData(XMultiServiceFactory xMSF) + { + super(xMSF); + } + + public void initializeFieldColumns(String _CommandName, String[] _FieldNames) + { + this.setCommandName(_CommandName); + FieldColumns = new FieldColumn[_FieldNames.length]; + for (int i = 0; i < _FieldNames.length; i++) + { + FieldColumns[i] = new FieldColumn(this, _FieldNames[i], this.getCommandName(), false); + } + } + + public void initializeFieldColumns(String[] _FieldNames, XNameAccess _xColumns) + { + FieldColumns = new FieldColumn[_FieldNames.length]; + for (int i = 0; i < _FieldNames.length; i++) + { + FieldColumns[i] = new FieldColumn(this, _xColumns, _FieldNames[i]); + } + } + + public void initializeFieldColumns(String[] _FieldNames, String _CommandName) + { + this.setCommandName(_CommandName); + FieldColumns = new FieldColumn[_FieldNames.length]; + for (int i = 0; i < _FieldNames.length; i++) + { + FieldColumns[i] = new FieldColumn(this, _FieldNames[i], _CommandName, false); + if (FieldTitleSet != null && FieldTitleSet.containsKey(_FieldNames[i])) + { + FieldColumns[i].setFieldTitle(FieldTitleSet.get(_FieldNames[i])); + if (FieldColumns[i].getFieldTitle() == null) + { + FieldColumns[i].setFieldTitle(_FieldNames[i]); + FieldTitleSet.put(_FieldNames[i], _FieldNames[i]); + } + } + } + } + + public Map<String, String> getFieldTitleSet() + { + return FieldTitleSet; + } + + public XPropertySet getColumnObjectByFieldName(String _FieldName, boolean _bgetByDisplayName) + { + try + { + FieldColumn CurFieldColumn = null; + if (_bgetByDisplayName) + { + CurFieldColumn = this.getFieldColumnByDisplayName(_FieldName); + } + else + { + CurFieldColumn = this.getFieldColumnByFieldName(_FieldName); + } + String CurCommandName = CurFieldColumn.getCommandName(); + CommandObject oCommand = getTableByName(CurCommandName); + Object oColumn = oCommand.getColumns().getByName(CurFieldColumn.getFieldName()); + return UnoRuntime.queryInterface(XPropertySet.class, oColumn); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + // @SuppressWarnings("unchecked") + public void prependSortFieldNames(String[] _fieldnames) + { + ArrayList<String[]> aSortFields = new ArrayList<String[]>(); + for (int i = 0; i < _fieldnames.length; i++) + { + String[] sSortFieldName = new String[2]; + sSortFieldName[0] = _fieldnames[i]; + int index = JavaTools.FieldInTable(SortFieldNames, _fieldnames[i]); + if (index > -1) + { + sSortFieldName[1] = SortFieldNames[index][1]; + } + else + { + sSortFieldName[1] = PropertyNames.ASC; + } + aSortFields.add(sSortFieldName); + } + for (int i = 0; i < SortFieldNames.length; i++) + { + if (JavaTools.FieldInList(_fieldnames, SortFieldNames[i][0]) == -1) + { + aSortFields.add(SortFieldNames[i]); + } + } + SortFieldNames = new String[aSortFields.size()][2]; + aSortFields.toArray(SortFieldNames); + } + + public String[][] getSortFieldNames() + { + return SortFieldNames; + } + + public void setSortFieldNames(String[][] aNewListList) + { + SortFieldNames = aNewListList; + } + + public FieldColumn getFieldColumn(String _FieldName, String _CommandName) + { + for (int i = 0; i < FieldColumns.length; i++) + { + if (FieldColumns[i].getFieldName().equals(_FieldName) && FieldColumns[i].getCommandName().equals(_CommandName)) + { + return FieldColumns[i]; + } + } + return null; + } + + public FieldColumn getFieldColumnByFieldName(String _FieldName) + { + for (int i = 0; i < FieldColumns.length; i++) + { + String sFieldName = FieldColumns[i].getFieldName(); + if (sFieldName.equals(_FieldName)) + { + return FieldColumns[i]; + } + if (_FieldName.indexOf('.') == -1) + { + String sCompound = Command + "." + _FieldName; + if (sFieldName.equals(sCompound)) + { + return FieldColumns[i]; + } + } + } + throw new com.sun.star.uno.RuntimeException(); + } + + public FieldColumn getFieldColumnByDisplayName(String _DisplayName) + { + String identifierQuote = getIdentifierQuote(); + for (int i = 0; i < FieldColumns.length; i++) + { + String sDisplayName = FieldColumns[i].getDisplayFieldName(); + if (sDisplayName.equals(_DisplayName)) + { + return FieldColumns[i]; + } + if (_DisplayName.indexOf('.') == -1) + { + String sCompound = Command + "." + _DisplayName; + if (sDisplayName.equals(sCompound)) + { + return FieldColumns[i]; + } + } + String quotedName = new StringBuilder(CommandName.quoteName(FieldColumns[i].getCommandName(), identifierQuote)).append('.').append(CommandName.quoteName(FieldColumns[i].getFieldName(), identifierQuote)).toString(); + if (quotedName.equals(_DisplayName)) + { + return FieldColumns[i]; + } + } + throw new com.sun.star.uno.RuntimeException(); + } + + public FieldColumn getFieldColumnByTitle(String _FieldTitle) + { + for (int i = 0; i < FieldColumns.length; i++) + { + if (FieldColumns[i].getFieldTitle().equals(_FieldTitle)) + { + return FieldColumns[i]; + } + } + // throw new com.sun.star.uno.RuntimeException(); + // LLA: Group works with fields direct + for (int i = 0; i < FieldColumns.length; i++) + { + if (FieldColumns[i].getFieldName().equals(_FieldTitle)) + { + return FieldColumns[i]; + } + } + throw new com.sun.star.uno.RuntimeException(); + } + + public boolean getFieldNamesOfCommand(String _commandname, int _commandtype) + { + try + { + java.util.ArrayList<String> ResultFieldNames = new java.util.ArrayList<String>(10); + String[] FieldNames; + CommandObject oCommand = this.getCommandByName(_commandname, _commandtype); + FieldNames = oCommand.getColumns().getElementNames(); + if (FieldNames.length > 0) + { + for (int n = 0; n < FieldNames.length; n++) + { + final String sFieldName = FieldNames[n]; + Object oField = oCommand.getColumns().getByName(sFieldName); + int iType = AnyConverter.toInt(Helper.getUnoPropertyValue(oField, "Type")); + // BinaryFieldTypes are not included in the WidthList + if (JavaTools.FieldInIntTable(WidthList, iType) >= 0) + { + ResultFieldNames.add(sFieldName); + } + else if (JavaTools.FieldInIntTable(BinaryTypes, iType) >= 0) + { + ResultFieldNames.add(sFieldName); + } + } + m_aAllFieldNames = new String[ResultFieldNames.size()]; + m_aAllFieldNames = ResultFieldNames.toArray(m_aAllFieldNames); + return true; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + Resource oResource = new Resource(xMSF); + String sMsgNoFieldsFromCommand = oResource.getResText("RID_DB_COMMON_45"); + sMsgNoFieldsFromCommand = JavaTools.replaceSubString(sMsgNoFieldsFromCommand, _commandname, "%NAME"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sMsgNoFieldsFromCommand); + return false; + } + + /** + * @return Returns the command. + */ + public String getCommandName() + { + return Command; + } + + /** + * @param _command The command to set. + */ + public void setCommandName(String _command) + { + Command = _command; + } + + /** + * @return Returns the commandType. + */ + public int getCommandType() + { + return CommandType; + } + + /** + * @param _commandType The commandType to set. + */ + public void setCommandType(int _commandType) + { + CommandType = _commandType; + } + + private boolean isnumeric(FieldColumn _oFieldColumn) + { + try + { + CommandObject oTable = super.getTableByName(_oFieldColumn.getCommandName()); + Object oField = oTable.getColumns().getByName(_oFieldColumn.getFieldName()); + int iType = AnyConverter.toInt(Helper.getUnoPropertyValue(oField, "Type")); + int ifound = java.util.Arrays.binarySearch(NumericTypes, iType); + if ((ifound < NumericTypes.length) && (ifound > 0)) + { + return (NumericTypes[ifound] == iType); + } + else + { + return false; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return false; + } + } + + public String[] setNumericFields() + { + try + { + ArrayList<String> numericfieldsvector = new java.util.ArrayList<String>(); + for (int i = 0; i < FieldColumns.length; i++) + { + if (isnumeric(FieldColumns[i])) + { + numericfieldsvector.add(FieldColumns[i].getDisplayFieldName()); + } + } + NumericFieldNames = new String[numericfieldsvector.size()]; + numericfieldsvector.toArray(NumericFieldNames); + return NumericFieldNames; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return new String[] + { + }; + } + } + + public String[] getFieldNames(String[] _sDisplayFieldNames, String _sCommandName) + { + ArrayList<String> sFieldNamesVector = new java.util.ArrayList<String>(); + for (int i = 0; i < FieldColumns.length; i++) + { + if (_sCommandName.equals(FieldColumns[i].getCommandName()) && JavaTools.FieldInList(_sDisplayFieldNames, FieldColumns[i].getDisplayFieldName()) > -1) + { + sFieldNamesVector.add(FieldColumns[i].getFieldName()); + } + } + String[] sFieldNames = new String[sFieldNamesVector.size()]; + sFieldNamesVector.toArray(sFieldNames); + return sFieldNames; + } + + public String[] getFieldNames() + { + String[] sFieldNames = new String[FieldColumns.length]; + for (int i = 0; i < FieldColumns.length; i++) + { + sFieldNames[i] = FieldColumns[i].getFieldName(); + } + return sFieldNames; + } + + public String[] getDisplayFieldNames() + { + String[] sDisplayFieldNames = new String[FieldColumns.length]; + for (int i = 0; i < FieldColumns.length; i++) + { + sDisplayFieldNames[i] = FieldColumns[i].getDisplayFieldName(); + } + return sDisplayFieldNames; + } + + public String[] setNonAggregateFieldNames() + { + try + { + ArrayList<String> nonaggregatefieldsvector = new java.util.ArrayList<String>(); + for (int i = 0; i < FieldColumns.length; i++) + { + if (JavaTools.FieldInTable(AggregateFieldNames, FieldColumns[i].getDisplayFieldName()) == -1) + { + nonaggregatefieldsvector.add(FieldColumns[i].getDisplayFieldName()); + } + } + NonAggregateFieldNames = new String[nonaggregatefieldsvector.size()]; + nonaggregatefieldsvector.toArray(NonAggregateFieldNames); + return NonAggregateFieldNames; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return new String[] + { + }; + } + } + + public String getFieldTitle(String FieldName) + { + String FieldTitle = FieldName; + if (this.FieldTitleSet != null) + { + FieldTitle = this.FieldTitleSet.get(FieldName); //FieldTitles[TitleIndex]; + if (FieldTitle == null) + { + return FieldName; + } + } + return FieldTitle; + } + + public void setFieldTitles(String[] sFieldTitles) + { + int nFieldColLength = FieldColumns.length; + for (int i = 0; i < sFieldTitles.length; i++) + { + if (i < nFieldColLength) + { + FieldColumns[i].setFieldTitle(sFieldTitles[i]); + } + + } + } + + public void setGroupFieldNames(String[] GroupFieldNames) + { + this.GroupFieldNames = GroupFieldNames; + } + + public String[] getGroupFieldNames() + { + return GroupFieldNames; + } + + public void createRecordFieldNames() + { + String CurFieldName; + int GroupFieldCount; + int TotFieldCount = FieldColumns.length; + GroupFieldCount = JavaTools.getArraylength(GroupFieldNames); + RecordFieldNames = new String[TotFieldCount - GroupFieldCount]; + + int a = 0; + for (int i = 0; i < TotFieldCount; i++) + { + CurFieldName = FieldColumns[i].getFieldName(); + if (JavaTools.FieldInList(GroupFieldNames, CurFieldName) < 0) + { + RecordFieldNames[a] = CurFieldName; + ++a; + } + } + } + + public void setRecordFieldNames(String[] _aNewList) + { + RecordFieldNames = _aNewList; + } + + public String[] getRecordFieldNames() + { + return RecordFieldNames; + } + + public String getRecordFieldName(int i) + { + return RecordFieldNames[i]; + } + + private void setCommandComposingAttributes() + { + try + { + xDBMetaData.getCatalogSeparator(); + sIdentifierQuote = xDBMetaData.getIdentifierQuoteString(); + bCommandComposerAttributesalreadyRetrieved = true; + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + } + + /** + * @return Returns the sIdentifierQuote. + */ + public String getIdentifierQuote() + { + if (!bCommandComposerAttributesalreadyRetrieved) + { + setCommandComposingAttributes(); + } + return sIdentifierQuote; + } +} diff --git a/wizards/com/sun/star/wizards/db/CommandName.java b/wizards/com/sun/star/wizards/db/CommandName.java new file mode 100644 index 000000000..4768018ef --- /dev/null +++ b/wizards/com/sun/star/wizards/db/CommandName.java @@ -0,0 +1,261 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.Exception; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; + +public class CommandName +{ + + private CommandMetaData oCommandMetaData; + private String CatalogName = PropertyNames.EMPTY_STRING; + private String SchemaName = PropertyNames.EMPTY_STRING; + private String TableName = PropertyNames.EMPTY_STRING; + private String DisplayName = PropertyNames.EMPTY_STRING; + private String ComposedName = PropertyNames.EMPTY_STRING; + private String AliasName = PropertyNames.EMPTY_STRING; + private boolean bCatalogAtStart; + private String sCatalogSep; + private boolean baddQuotation = true; + + public CommandName(CommandMetaData _CommandMetaData, String _DisplayName) + { + oCommandMetaData = _CommandMetaData; + setComposedCommandName(_DisplayName); + } + + public CommandName(CommandMetaData _CommandMetaData, String _CatalogName, String _SchemaName, String _TableName, boolean _baddQuotation) + { + try + { + baddQuotation = _baddQuotation; + oCommandMetaData = _CommandMetaData; + if ((_CatalogName != null) && (oCommandMetaData.xDBMetaData.supportsCatalogsInTableDefinitions())) + { + if (!_CatalogName.equals(PropertyNames.EMPTY_STRING)) + { + CatalogName = _CatalogName; + } + } + if ((_SchemaName != null) && (oCommandMetaData.xDBMetaData.supportsSchemasInTableDefinitions())) + { + if (!_SchemaName.equals(PropertyNames.EMPTY_STRING)) + { + SchemaName = _SchemaName; + } + } + if (_TableName != null) + { + if (!_TableName.equals(PropertyNames.EMPTY_STRING)) + { + TableName = _TableName; + } + } + setComposedCommandName(); + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + } + + private void setComposedCommandName(String _DisplayName) + { + try + { + if (!setMetaDataAttributes()) + return; + + this.DisplayName = _DisplayName; + int iIndex; + if (oCommandMetaData.xDBMetaData.supportsCatalogsInDataManipulation()) + { // ...then Catalog also in TableName + iIndex = _DisplayName.indexOf(sCatalogSep); + if (iIndex >= 0) + { + if (bCatalogAtStart) + { + CatalogName = _DisplayName.substring(0, iIndex); + _DisplayName = _DisplayName.substring(iIndex + 1, _DisplayName.length()); + } + else + { + CatalogName = _DisplayName.substring(iIndex + 1, _DisplayName.length()); + _DisplayName = _DisplayName.substring(0, iIndex); + } + } + } + if (oCommandMetaData.xDBMetaData.supportsSchemasInDataManipulation()) + { + String[] NameList = JavaTools.ArrayoutofString(_DisplayName, "."); + if (NameList.length > 1) + { + SchemaName = NameList[0]; + TableName = NameList[1]; + } + else + { + TableName = _DisplayName; + } + } + else + { + TableName = _DisplayName; + } + setComposedCommandName(); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void setComposedCommandName() + { + if (this.setMetaDataAttributes()) + { + if (CatalogName != null) + { + if (!CatalogName.equals(PropertyNames.EMPTY_STRING)) + { + if (bCatalogAtStart) + { + ComposedName = quoteName(CatalogName) + sCatalogSep; + } + } + } + if (SchemaName != null) + { + if (!SchemaName.equals(PropertyNames.EMPTY_STRING)) + { + ComposedName += quoteName(SchemaName) + "."; + } + } + if (ComposedName.equals(PropertyNames.EMPTY_STRING)) + { + ComposedName = quoteName(TableName); + } + else + { + ComposedName += quoteName(TableName); + } + if ((!bCatalogAtStart) && (CatalogName != null)) + { + if (!CatalogName.equals(PropertyNames.EMPTY_STRING)) + { + ComposedName += sCatalogSep + quoteName(CatalogName); + } + } + } + } + + private boolean setMetaDataAttributes() + { + try + { + bCatalogAtStart = oCommandMetaData.xDBMetaData.isCatalogAtStart(); + sCatalogSep = oCommandMetaData.xDBMetaData.getCatalogSeparator(); + oCommandMetaData.xDBMetaData.getIdentifierQuoteString(); + return true; + } + catch (SQLException e) + { + e.printStackTrace(System.err); + return false; + } + } + + private String quoteName(String _sName) + { + if (baddQuotation) + { + return quoteName(_sName, this.oCommandMetaData.getIdentifierQuote()); + } + else + { + return _sName; + } + } + + public static String quoteName(String sName, String _sIdentifierQuote) + { + if (sName == null) + { + sName = PropertyNames.EMPTY_STRING; + } + return new StringBuilder(_sIdentifierQuote).append(sName).append(_sIdentifierQuote).toString(); + } + + public void setAliasName(String _AliasName) + { + AliasName = _AliasName; + } + + public String getAliasName() + { + return AliasName; + } + + /** + * @return Returns the catalogName. + */ + public String getCatalogName() + { + return CatalogName; + } + + /** + * @return Returns the composedName. + */ + public String getComposedName() + { + return ComposedName; + } + + /** + * @return Returns the displayName. + */ + public String getDisplayName() + { + return DisplayName; + } + + /** + * @return Returns the schemaName. + */ + public String getSchemaName() + { + return SchemaName; + } + + /** + * @return Returns the tableName. + */ + public String getTableName() + { + return TableName; + } + + public CommandMetaData getCommandMetaData() + { + return oCommandMetaData; + } +} diff --git a/wizards/com/sun/star/wizards/db/DBMetaData.java b/wizards/com/sun/star/wizards/db/DBMetaData.java new file mode 100644 index 000000000..1a720b0ac --- /dev/null +++ b/wizards/com/sun/star/wizards/db/DBMetaData.java @@ -0,0 +1,1010 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XWindow; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XHierarchicalNameAccess; +import com.sun.star.container.XHierarchicalNameContainer; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XStorable; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.Locale; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XInitialization; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.sdb.XCompletedConnection; +import com.sun.star.sdb.XDocumentDataSource; +import com.sun.star.sdb.XFormDocumentsSupplier; +import com.sun.star.sdb.XOfficeDatabaseDocument; +import com.sun.star.sdb.XQueriesSupplier; +import com.sun.star.sdb.XQueryDefinitionsSupplier; +import com.sun.star.sdb.XReportDocumentsSupplier; +import com.sun.star.sdb.tools.XConnectionTools; +import com.sun.star.sdbc.DataType; +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbc.XConnection; +import com.sun.star.sdbc.XDataSource; +import com.sun.star.sdbc.XDatabaseMetaData; +import com.sun.star.sdbc.XResultSet; +import com.sun.star.sdbc.XRow; +import com.sun.star.sdbcx.XColumnsSupplier; +import com.sun.star.sdbcx.XTablesSupplier; +import com.sun.star.task.XInteractionHandler; +import com.sun.star.ucb.XSimpleFileAccess; +import com.sun.star.ui.dialogs.XExecutableDialog; +import com.sun.star.uno.Any; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.util.XCloseable; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.NamedValueCollection; +import com.sun.star.wizards.common.NumberFormatter; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.common.SystemDialog; + +public class DBMetaData +{ + private XNameAccess xQueryNames; + public XDatabaseMetaData xDBMetaData; + private XDataSource m_dataSource; + private XPropertySet m_dataSourceSettings; + private XOfficeDatabaseDocument xModel; + private XPropertySet xDataSourcePropertySet; + private java.util.ArrayList<CommandObject> CommandObjects = new ArrayList<CommandObject>(1); + private Locale aLocale; + public String DataSourceName; + public com.sun.star.sdbc.XConnection DBConnection; + private com.sun.star.sdb.tools.XConnectionTools m_connectionTools; + public com.sun.star.lang.XMultiServiceFactory xMSF; + private XComponent xConnectionComponent; + + private XNameAccess xNameAccess; + private XInterface xDatabaseContext; + private XWindowPeer xWindowPeer; + private String[] TableNames = new String[] {}; + private String[] QueryNames = new String[] {}; + + protected int[][] WidthList; + protected static final int[] NumericTypes = { + DataType.TINYINT, // == -6; + DataType.BIGINT, // == -5 + DataType.NUMERIC, // == - 2 + DataType.DECIMAL, // == 3; + DataType.INTEGER, // == 4; + DataType.SMALLINT, // == 5; + DataType.FLOAT, // == 6; + DataType.REAL, // == 7; + DataType.DOUBLE, // == 8; + }; + protected static final int[] BinaryTypes = { //new int[12]; + DataType.BINARY, + DataType.VARBINARY, + DataType.LONGVARBINARY, + DataType.BLOB, + DataType.SQLNULL, + DataType.OBJECT, + DataType.DISTINCT, + DataType.STRUCT, + DataType.ARRAY, + DataType.CLOB, + DataType.REF + /* DataType.OTHER, */ + }; + + private int iMaxColumnsInSelect; + private int iMaxColumnNameLength = -1; + private int iMaxTableNameLength = -1; + private boolean bPasswordIsRequired; + private static final int NOLIMIT = 9999999; + private static final int INVALID = 9999999; + public TypeInspector oTypeInspector; + private NumberFormatter oNumberFormatter = null; + private long lDateCorrection = INVALID; + private boolean bdisposeConnection = false; + + public XPropertySet getDataSourcePropertySet() + { + return xDataSourcePropertySet; + } + + public DBMetaData(XMultiServiceFactory xMSF) + { + getInterfaces(xMSF); + InitializeWidthList(); + } + + public NumberFormatter getNumberFormatter() + { + if (oNumberFormatter == null) + { + try + { + XNumberFormatsSupplier xNumberFormatsSupplier = (XNumberFormatsSupplier) AnyConverter.toObject(XNumberFormatsSupplier.class, xDataSourcePropertySet.getPropertyValue("NumberFormatsSupplier")); + //TODO get the locale from the datasource + aLocale = Configuration.getLocale(xMSF); + oNumberFormatter = new NumberFormatter(xMSF, xNumberFormatsSupplier, aLocale); + lDateCorrection = oNumberFormatter.getNullDateCorrection(); + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + return oNumberFormatter; + } + + public long getNullDateCorrection() + { + if (lDateCorrection == INVALID) + { + if (oNumberFormatter == null) + { + oNumberFormatter = getNumberFormatter(); + } + lDateCorrection = oNumberFormatter.getNullDateCorrection(); + } + return lDateCorrection; + } + + private void getInterfaces(XMultiServiceFactory xMSF) + { + try + { + this.xMSF = xMSF; + xDatabaseContext = (XInterface) xMSF.createInstance("com.sun.star.sdb.DatabaseContext"); + xNameAccess = UnoRuntime.queryInterface( XNameAccess.class, xDatabaseContext ); + xNameAccess.getElementNames(); + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + + + + public boolean hasTableByName(String _stablename) + { + return getTableNamesAsNameAccess().hasByName(_stablename); + } + + public void setTableByName(String _tableName) + { + CommandObject oTableObject = new CommandObject(_tableName, com.sun.star.sdb.CommandType.TABLE); + this.CommandObjects.add(oTableObject); + } + + public CommandObject getTableByName(String _tablename) + { + return getCommandByName(_tablename, com.sun.star.sdb.CommandType.TABLE); + } + + public CommandObject getQueryByName(String _queryname) + { + return getCommandByName(_queryname, com.sun.star.sdb.CommandType.QUERY); + } + + public CommandObject getCommandByName(String _commandname, int _commandtype) + { + CommandObject oCommand = null; + for (int i = 0; i < CommandObjects.size(); i++) + { + oCommand = CommandObjects.get(i); + if ((oCommand.Name.equals(_commandname)) && (oCommand.CommandType == _commandtype)) + { + return oCommand; + } + } + if (oCommand == null) + { + oCommand = new CommandObject(_commandname, _commandtype); + CommandObjects.add(oCommand); + } + return oCommand; + } + + public void setQueryByName(String _QueryName) + { + CommandObject oQueryObject = new CommandObject(_QueryName, com.sun.star.sdb.CommandType.QUERY); + this.CommandObjects.add(oQueryObject); + } + + public class CommandObject + { + + private XNameAccess xColumns; + private XPropertySet xPropertySet; + private String Name; + private int CommandType; + + private CommandObject(String _CommandName, int _CommandType) + { + try + { + Object oCommand; + this.Name = _CommandName; + this.CommandType = _CommandType; + if (CommandType == com.sun.star.sdb.CommandType.TABLE) + { + oCommand = getTableNamesAsNameAccess().getByName(Name); + } + else + { + oCommand = getQueryNamesAsNameAccess().getByName(Name); + } + XColumnsSupplier xCommandCols = UnoRuntime.queryInterface( XColumnsSupplier.class, oCommand ); + xPropertySet = UnoRuntime.queryInterface( XPropertySet.class, oCommand ); +// TODO: Performance leak getColumns() take very long. + xColumns = UnoRuntime.queryInterface( XNameAccess.class, xCommandCols.getColumns() ); + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + public XNameAccess getColumns() + { + return xColumns; + } + public String getName() + { + return Name; + } + public XPropertySet getPropertySet() + { + return xPropertySet; + } + } + + public boolean hasEscapeProcessing(XPropertySet _xQueryPropertySet) + { + boolean bHasEscapeProcessing = false; + try + { + if (_xQueryPropertySet.getPropertySetInfo().hasPropertyByName("EscapeProcessing")) + { + bHasEscapeProcessing = AnyConverter.toBoolean(_xQueryPropertySet.getPropertyValue("EscapeProcessing")); + } + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + return bHasEscapeProcessing; + } + + private XNameAccess getQueryNamesAsNameAccess() + { + XQueriesSupplier xDBQueries = UnoRuntime.queryInterface( XQueriesSupplier.class, DBConnection ); + xQueryNames = xDBQueries.getQueries(); + return xQueryNames; + } + + public XNameAccess getTableNamesAsNameAccess() + { + XTablesSupplier xDBTables = UnoRuntime.queryInterface( XTablesSupplier.class, DBConnection ); + return xDBTables.getTables(); + } + + public String[] getQueryNames() + { + if (QueryNames != null && QueryNames.length > 0) + { + return QueryNames; + } + QueryNames = getQueryNamesAsNameAccess().getElementNames(); + return QueryNames; + } + + public String[] getTableNames() + { + if (TableNames != null && TableNames.length > 0) + { + return TableNames; + } + TableNames = getTableNamesAsNameAccess().getElementNames(); + return TableNames; + } + + private void InitializeWidthList() + { + WidthList = new int[17][2]; + WidthList[0][0] = DataType.BIT; // == -7; + WidthList[1][0] = DataType.BOOLEAN; // = 16 + WidthList[2][0] = DataType.TINYINT; // == -6; + WidthList[3][0] = DataType.BIGINT; // == -5; + WidthList[4][0] = DataType.LONGVARCHAR; // == -1; + WidthList[5][0] = DataType.CHAR; // == 1; + WidthList[6][0] = DataType.NUMERIC; // == 2; + WidthList[7][0] = DataType.DECIMAL; // == 3; [with fractional part] + WidthList[8][0] = DataType.INTEGER; // == 4; + WidthList[9][0] = DataType.SMALLINT; // == 5; + WidthList[10][0] = DataType.FLOAT; // == 6; + WidthList[11][0] = DataType.REAL; // == 7; + WidthList[12][0] = DataType.DOUBLE; // == 8; + WidthList[13][0] = DataType.VARCHAR; // == 12; + WidthList[14][0] = DataType.DATE; // == 91; + WidthList[15][0] = DataType.TIME; // == 92; + WidthList[16][0] = DataType.TIMESTAMP; // == 93; + // NumericTypes are all types where aggregate functions can be performed on. + // Similarly to a major competitor date/time/timestamp fields are not included + + + } + + public boolean isBinaryDataType(int _itype) + { + if (NumericTypes == null) + { + InitializeWidthList(); + } + return (JavaTools.FieldInIntTable(BinaryTypes, _itype) > -1); + } + + public int getMaxTablesInSelect() + { + try + { + int itablecount = xDBMetaData.getMaxTablesInSelect(); + if (itablecount == 0) + { + return DBMetaData.NOLIMIT; + } + else + { + return itablecount; + } + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return - 1; + } + } + + public int getMaxColumnsInSelect() + { + return iMaxColumnsInSelect; + } + + private void setMaxColumnsInSelect() throws SQLException + { + iMaxColumnsInSelect = xDBMetaData.getMaxColumnsInSelect(); + if (iMaxColumnsInSelect == 0) + { + iMaxColumnsInSelect = DBMetaData.NOLIMIT; + } + } + + public int getMaxColumnsInTable() throws SQLException + { + int iMaxColumnsInTable = xDBMetaData.getMaxColumnsInTable(); + if (iMaxColumnsInTable == 0) + { + iMaxColumnsInTable = DBMetaData.NOLIMIT; + } + return iMaxColumnsInTable; + } + + private void getDataSourceObjects() throws Exception + { + try + { + xDBMetaData = DBConnection.getMetaData(); + getDataSourceInterfaces(); + setMaxColumnsInSelect(); + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + + private void ensureDataSourceSettings() throws UnknownPropertyException, WrappedTargetException + { + if ( m_dataSourceSettings != null ) + return; + + XPropertySet dataSourceProperties = UnoRuntime.queryInterface( XPropertySet.class, getDataSource() ); + m_dataSourceSettings = UnoRuntime.queryInterface( XPropertySet.class, dataSourceProperties.getPropertyValue( "Settings" ) ); + } + + public boolean isSQL92CheckEnabled() + { + boolean isSQL92CheckEnabled = false; + try + { + ensureDataSourceSettings(); + isSQL92CheckEnabled = AnyConverter.toBoolean( m_dataSourceSettings.getPropertyValue( "EnableSQL92Check" ) ); + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + return isSQL92CheckEnabled; + } + + public XDataSource getDataSource() + { + if (m_dataSource == null) + { + try + { + Object oDataSource = xNameAccess.getByName(DataSourceName); + m_dataSource = UnoRuntime.queryInterface( XDataSource.class, oDataSource ); + } + catch (com.sun.star.container.NoSuchElementException e) + { + } + catch (com.sun.star.lang.WrappedTargetException e) + { + } + } + return m_dataSource; + } + + private void setDataSourceByName(String _DataSourceName) + { + try + { + this.DataSourceName = _DataSourceName; + getDataSourceInterfaces(); + XDocumentDataSource xDocu = UnoRuntime.queryInterface( XDocumentDataSource.class, getDataSource() ); + if (xDocu != null) + { + xModel = xDocu.getDatabaseDocument(); + } + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + + private void getDataSourceInterfaces() throws Exception + { + xDataSourcePropertySet = UnoRuntime.queryInterface( XPropertySet.class, getDataSource() ); + bPasswordIsRequired = ((Boolean) xDataSourcePropertySet.getPropertyValue("IsPasswordRequired")).booleanValue(); + } + + public boolean getConnection(PropertyValue[] curproperties) + { + try + { + XConnection xConnection = null; + if (Properties.hasPropertyValue(curproperties, PropertyNames.ACTIVE_CONNECTION)) + { + xConnection = UnoRuntime.queryInterface( XConnection.class, Properties.getPropertyValue( curproperties, PropertyNames.ACTIVE_CONNECTION ) ); + if (xConnection != null) + { + com.sun.star.container.XChild child = UnoRuntime.queryInterface( com.sun.star.container.XChild.class, xConnection ); + + m_dataSource = UnoRuntime.queryInterface( XDataSource.class, child.getParent() ); + XDocumentDataSource xDocu = UnoRuntime.queryInterface( XDocumentDataSource.class, m_dataSource ); + if (xDocu != null) + { + xModel = xDocu.getDatabaseDocument(); + } + XPropertySet xPSet = UnoRuntime.queryInterface( XPropertySet.class, m_dataSource ); + if (xPSet != null) + { + DataSourceName = AnyConverter.toString(xPSet.getPropertyValue(PropertyNames.PROPERTY_NAME)); + } + return getConnection(xConnection); + } + else + { + bdisposeConnection = true; + } + } + else + { + bdisposeConnection = true; + } + if (Properties.hasPropertyValue(curproperties, "DataSourceName")) + { + String sDataSourceName = AnyConverter.toString(Properties.getPropertyValue(curproperties, "DataSourceName")); + return getConnection(sDataSourceName); + } + else if (Properties.hasPropertyValue(curproperties, "DataSource")) + { + m_dataSource = UnoRuntime.queryInterface( XDataSource.class, Properties.getPropertyValue( curproperties, "DataSource" ) ); + XDocumentDataSource xDocu = UnoRuntime.queryInterface( XDocumentDataSource.class, this.m_dataSource ); + if (xDocu != null) + { + xModel = xDocu.getDatabaseDocument(); + } + return getConnection(m_dataSource); + } + if (Properties.hasPropertyValue(curproperties, "DatabaseLocation")) + { + String sDataSourceName = AnyConverter.toString(Properties.getPropertyValue(curproperties, "DatabaseLocation")); + return getConnection(sDataSourceName); + } + } + catch (IllegalArgumentException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + catch (UnknownPropertyException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + catch (WrappedTargetException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + + return false; + } + + private boolean getConnection(String _DataSourceName) + { + setDataSourceByName(_DataSourceName); + return getConnection( getDataSource() ); + } + + private boolean getConnection(com.sun.star.sdbc.XConnection _DBConnection) + { + try + { + this.DBConnection = _DBConnection; + this.m_connectionTools = UnoRuntime.queryInterface( XConnectionTools.class, this.DBConnection ); + getDataSourceObjects(); + return true; + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return false; + } + } + + private boolean getConnection(XDataSource _dataSource) + { + Resource oResource = new Resource(xMSF); + try + { + int iMsg = 0; + boolean bgetConnection = false; + if (DBConnection != null) + { + xConnectionComponent.dispose(); + } + getDataSourceInterfaces(); + if (!bPasswordIsRequired) + { + DBConnection = _dataSource.getConnection(PropertyNames.EMPTY_STRING, PropertyNames.EMPTY_STRING); + bgetConnection = true; + } + else + { + XInteractionHandler xInteractionHandler = UnoRuntime.queryInterface( XInteractionHandler.class, xMSF.createInstance("com.sun.star.task.InteractionHandler") ); + boolean bExitLoop = true; + do + { + XCompletedConnection xCompleted2 = UnoRuntime.queryInterface( XCompletedConnection.class, _dataSource ); + try + { + DBConnection = xCompleted2.connectWithCompletion( xInteractionHandler ); + bgetConnection = DBConnection != null; + if (!bgetConnection) + { + bExitLoop = true; + } + } + catch (Exception exception) + { + // Note: WindowAttributes from toolkit/source/awt/vclxtoolkit.cxx + String sMsgNoConnection = oResource.getResText("RID_DB_COMMON_14"); + iMsg = showMessageBox("QueryBox", VclWindowPeerAttribute.RETRY_CANCEL, sMsgNoConnection); + bExitLoop = iMsg == 0; + bgetConnection = false; + } + } + while (!bExitLoop); + } + if (!bgetConnection) + { + String sMsgConnectionImpossible = oResource.getResText("RID_DB_COMMON_35"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sMsgConnectionImpossible); + } + else + { + xConnectionComponent = UnoRuntime.queryInterface( XComponent.class, DBConnection ); + m_connectionTools = UnoRuntime.queryInterface( XConnectionTools.class, DBConnection ); + getDataSourceObjects(); + } + return bgetConnection; + } + catch (Exception e) + { + String sMsgConnectionImpossible = oResource.getResText("RID_DB_COMMON_35"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sMsgConnectionImpossible); + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return false; + } + } + + public int getMaxColumnNameLength() + { + try + { + if (iMaxColumnNameLength <= 0) + { + iMaxColumnNameLength = xDBMetaData.getMaxColumnNameLength(); + } + return iMaxColumnNameLength; + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return 0; + } + } + + public int getMaxTableNameLength() + { + try + { + if (iMaxTableNameLength <= 0) + { + iMaxTableNameLength = xDBMetaData.getMaxTableNameLength(); + } + return iMaxTableNameLength; + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return 0; + } + } + + public boolean supportsPrimaryKeys() + { + boolean supportsPrimaryKeys = false; + try + { + ensureDataSourceSettings(); + Any primaryKeySupport = (Any)m_dataSourceSettings.getPropertyValue( "PrimaryKeySupport" ); + if ( AnyConverter.isVoid( primaryKeySupport ) ) + supportsPrimaryKeys = supportsCoreSQLGrammar(); + else + supportsPrimaryKeys = AnyConverter.toBoolean( primaryKeySupport ); + } + catch ( Exception ex ) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, ex ); + } + return supportsPrimaryKeys; + } + + private boolean supportsCoreSQLGrammar() + { + try + { + return xDBMetaData.supportsCoreSQLGrammar(); + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return false; + } + } + + public boolean supportsQueriesInFrom() throws SQLException + { + return m_connectionTools.getDataSourceMetaData().supportsQueriesInFrom(); + } + + public String suggestName( final int i_objectType, final String i_baseName ) throws IllegalArgumentException, SQLException + { + return m_connectionTools.getObjectNames().suggestName( i_objectType, i_baseName ); + } + + /** + * inserts a Query to a datasource; There is no validation if the queryname is already existing in the datasource + */ + public boolean createQuery(SQLQueryComposer _oSQLQueryComposer, String _QueryName) + { + try + { + XQueryDefinitionsSupplier xQueryDefinitionsSuppl = UnoRuntime.queryInterface( XQueryDefinitionsSupplier.class, m_dataSource ); + XNameAccess xQueryDefs = xQueryDefinitionsSuppl.getQueryDefinitions(); + XSingleServiceFactory xSSFQueryDefs = UnoRuntime.queryInterface( XSingleServiceFactory.class, xQueryDefs ); + Object oQuery = xSSFQueryDefs.createInstance(); //"com.sun.star.sdb.QueryDefinition" + XPropertySet xPSet = UnoRuntime.queryInterface( XPropertySet.class, oQuery ); + + String s = _oSQLQueryComposer.m_xQueryAnalyzer.getQuery(); + xPSet.setPropertyValue(PropertyNames.COMMAND, s); + + XNameContainer xNameCont = UnoRuntime.queryInterface( XNameContainer.class, xQueryDefs ); + m_connectionTools.getObjectNames().checkNameForCreate(com.sun.star.sdb.CommandType.QUERY, _QueryName); + xNameCont.insertByName(_QueryName, oQuery); + return true; + } + catch (WrappedTargetException exception) + { + SQLException sqlError = null; + try + { + sqlError = (SQLException) exception.TargetException; + } + catch (ClassCastException castError) + { + } + + if (sqlError != null) + { + callSQLErrorMessageDialog(sqlError, null); + return false; + } + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, exception ); + } + catch (SQLException e) + { + callSQLErrorMessageDialog(e, null); + return false; + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + return false; + } + + public void dispose() + { + if ((DBConnection != null) && (this.bdisposeConnection)) + { + xConnectionComponent.dispose(); + } + } + + public XHierarchicalNameAccess getReportDocuments() + { + XReportDocumentsSupplier xReportDocumentSuppl = UnoRuntime.queryInterface( XReportDocumentsSupplier.class, this.xModel ); + xReportDocumentSuppl.getReportDocuments(); + return UnoRuntime.queryInterface( XHierarchicalNameAccess.class, xReportDocumentSuppl.getReportDocuments() ); + } + + public XHierarchicalNameAccess getFormDocuments() + { + XFormDocumentsSupplier xFormDocumentSuppl = UnoRuntime.queryInterface( XFormDocumentsSupplier.class, xModel ); + return UnoRuntime.queryInterface( XHierarchicalNameAccess.class, xFormDocumentSuppl.getFormDocuments() ); + } + + public boolean hasFormDocumentByName(String _sFormName) + { + XFormDocumentsSupplier xFormDocumentSuppl = UnoRuntime.queryInterface( XFormDocumentsSupplier.class, xModel ); + XNameAccess xFormNameAccess = UnoRuntime.queryInterface( XNameAccess.class, xFormDocumentSuppl.getFormDocuments() ); + return xFormNameAccess.hasByName(_sFormName); + } + + public void addFormDocument(XComponent _xComponent) + { + XHierarchicalNameAccess _xFormDocNameAccess = getFormDocuments(); + addDatabaseDocument(_xComponent, _xFormDocNameAccess, false); + } + + public void addReportDocument(XComponent _xComponent, boolean _bcreatedynamicreport) + { + XHierarchicalNameAccess xReportDocNameAccess = getReportDocuments(); + addDatabaseDocument(_xComponent, xReportDocNameAccess, _bcreatedynamicreport); + } + + /** + * adds the passed document as a report or a form to the database. Afterwards the document is deleted. + * the document may not be open + * @param i_createTemplate describes the type of the document: "form" or "report" + */ + private void addDatabaseDocument(XComponent _xComponent, XHierarchicalNameAccess _xDocNameAccess, boolean i_createTemplate) + { + try + { + XModel xDocumentModel = UnoRuntime.queryInterface( XModel.class, _xComponent ); + String documentURL = xDocumentModel.getURL(); + String basename = FileAccess.getBasename(documentURL, "/"); + XCloseable xCloseable = UnoRuntime.queryInterface( XCloseable.class, _xComponent ); + xCloseable.close(false); + + NamedValueCollection creationArgs = new NamedValueCollection(); + creationArgs.put( PropertyNames.PROPERTY_NAME, basename ); + creationArgs.put( PropertyNames.URL, documentURL ); + creationArgs.put( "AsTemplate", i_createTemplate ); + XMultiServiceFactory xDocMSF = UnoRuntime.queryInterface( XMultiServiceFactory.class, _xDocNameAccess ); + Object oDBDocument = xDocMSF.createInstanceWithArguments( "com.sun.star.sdb.DocumentDefinition", creationArgs.getPropertyValues() ); + XHierarchicalNameContainer xHier = UnoRuntime.queryInterface( XHierarchicalNameContainer.class, _xDocNameAccess ); + String sdocname = Desktop.getUniqueName(_xDocNameAccess, basename); + xHier.insertByHierarchicalName(sdocname, oDBDocument); + XInterface xInterface = (XInterface) xMSF.createInstance("com.sun.star.ucb.SimpleFileAccess"); + XSimpleFileAccess xSimpleFileAccess = UnoRuntime.queryInterface( XSimpleFileAccess.class, xInterface ); + xSimpleFileAccess.kill(documentURL); + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + } + + public void createTypeInspector() throws SQLException + { + oTypeInspector = new TypeInspector(xDBMetaData.getTypeInfo()); + } + + public TypeInspector getDBDataTypeInspector() + { + return oTypeInspector; + } + + private String[] StringsFromResultSet(XResultSet _xResultSet, int _icol) + { + String[] sColValues = null; + if (_xResultSet == null) + return sColValues; + try + { + XRow xRow = UnoRuntime.queryInterface( XRow.class, _xResultSet ); + ArrayList<String> aColVector = new ArrayList<String>(); + while (_xResultSet.next()) + { + aColVector.add(xRow.getString(_icol)); + } + sColValues = new String[aColVector.size()]; + aColVector.toArray(sColValues); + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + } + return sColValues; + } + + public String[] getCatalogNames() + { + try + { + XResultSet xResultSet = xDBMetaData.getCatalogs(); + return StringsFromResultSet(xResultSet, 1); + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return null; + } + } + + public String[] getSchemaNames() + { + try + { + XResultSet xResultSet = xDBMetaData.getSchemas(); + return StringsFromResultSet(xResultSet, 1); + } + catch (SQLException e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return null; + } + } + + public boolean storeDatabaseDocumentToTempPath(XComponent _xcomponent, String _storename) + { + try + { + String storepath = FileAccess.getOfficePath(xMSF, "Temp") + "/" + _storename; + XStorable xStoreable = UnoRuntime.queryInterface( XStorable.class, _xcomponent ); + PropertyValue[] oStoreProperties = new PropertyValue[1]; + oStoreProperties[0] = Properties.createProperty("FilterName", "writer8"); + storepath += ".odt"; + xStoreable.storeAsURL(storepath, oStoreProperties); + return true; + } + catch (Exception e) + { + Logger.getLogger( DBMetaData.class.getName() ).log( Level.SEVERE, null, e ); + return false; + } + } + + public int showMessageBox(String windowServiceName, int windowAttribute, String MessageText) + { + if (getWindowPeer() != null) + { + return SystemDialog.showMessageBox(xMSF, xWindowPeer, windowServiceName, windowAttribute, MessageText); + } + else + { + return SystemDialog.showMessageBox(xMSF, windowServiceName, windowAttribute, MessageText); + } + } + + /** + * @return Returns the xWindowPeer. + */ + private XWindowPeer getWindowPeer() + { + return xWindowPeer; + } + + /** + * @param windowPeer The xWindowPeer to set. + * Should be called as soon as a Windowpeer of a wizard dialog is available + * The windowpeer is needed to call a Messagebox + */ + public void setWindowPeer(XWindowPeer windowPeer) + { + xWindowPeer = windowPeer; + } + + public void callSQLErrorMessageDialog(SQLException oSQLException, XWindow _xWindow) + { + try + { + Object oDialog = xMSF.createInstance("com.sun.star.sdb.ErrorMessageDialog"); + XInitialization xInitialization = UnoRuntime.queryInterface( XInitialization.class, oDialog ); + PropertyValue[] aPropertyValue = new PropertyValue[2]; + aPropertyValue[0] = Properties.createProperty("SQLException", oSQLException); + aPropertyValue[1] = Properties.createProperty("ParentWindow", _xWindow); + xInitialization.initialize(aPropertyValue); + XExecutableDialog xExecutableDialog = UnoRuntime.queryInterface( XExecutableDialog.class, oDialog ); + xExecutableDialog.execute(); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger( getClass().getName() ).log( Level.SEVERE, "error calling the error dialog", ex ); + } + } + + public void finish() + { + xQueryNames = null; + xNameAccess = null; + xDatabaseContext = null; + xDBMetaData = null; + m_dataSource = null; + xModel = null; + xDataSourcePropertySet = null; + xWindowPeer = null; + DBConnection = null; + m_connectionTools = null; + xMSF = null; + xConnectionComponent = null; + CommandObjects = null; + } +} diff --git a/wizards/com/sun/star/wizards/db/DatabaseObjectWizard.java b/wizards/com/sun/star/wizards/db/DatabaseObjectWizard.java new file mode 100644 index 000000000..013fb547c --- /dev/null +++ b/wizards/com/sun/star/wizards/db/DatabaseObjectWizard.java @@ -0,0 +1,170 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.db; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.frame.XController; +import com.sun.star.frame.XFrame; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.NamedValueCollection; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.ui.WizardDialog; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * is a base class for a wizard creating a database object + */ +public abstract class DatabaseObjectWizard extends WizardDialog +{ + protected final PropertyValue[] m_wizardContext; + protected final XDatabaseDocumentUI m_docUI; + protected final XFrame m_frame; + + protected DatabaseObjectWizard( final XMultiServiceFactory i_orb, final int i_helpIDBase, final PropertyValue[] i_wizardContext ) + { + super( i_orb, i_helpIDBase ); + m_wizardContext = i_wizardContext; + + final NamedValueCollection wizardContext = new NamedValueCollection( m_wizardContext ); + m_docUI = wizardContext.queryOrDefault( "DocumentUI", (XDatabaseDocumentUI)null, XDatabaseDocumentUI.class ); + + if ( m_docUI != null ) + { + XController docController = UnoRuntime.queryInterface( XController.class, m_docUI ); + m_frame = docController.getFrame(); + } + else + { + XFrame parentFrame = wizardContext.queryOrDefault( "ParentFrame", (XFrame)null, XFrame.class ); + if ( parentFrame != null ) + m_frame = parentFrame; + else + m_frame = Desktop.getActiveFrame( xMSF ); + } + } + + protected final void loadSubComponent( final int i_type, final String i_name, final boolean i_forEditing ) + { + try + { + if ( m_docUI != null ) + m_docUI.loadComponent( i_type, i_name, i_forEditing ); + } + catch ( IllegalArgumentException ex ) + { + Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, null, ex ); + } + catch ( NoSuchElementException ex ) + { + Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, null, ex ); + } + catch ( SQLException ex ) + { + Logger.getLogger( this.getClass().getName() ).log( Level.SEVERE, null, ex ); + } + } + + public interface WizardFromCommandLineStarter + { + void start(XMultiServiceFactory factory, PropertyValue[] curproperties); + } + + protected static void executeWizardFromCommandLine( final String i_args[], WizardFromCommandLineStarter starter ) + { + final String settings[] = new String[] { null, null, null }; + final int IDX_PIPE_NAME = 0; + final int IDX_LOCATION = 1; + final int IDX_DSN = 2; + + // some simple parsing + boolean failure = false; + int settingsIndex = -1; + for ( int i=0; i<i_args.length; ++i ) + { + if ( settingsIndex >= 0 ) + { + settings[ settingsIndex ] = i_args[i]; + settingsIndex = -1; + continue; + } + + if ( i_args[i].equals( "--pipe-name" ) ) + { + settingsIndex = IDX_PIPE_NAME; + continue; + } + + if ( i_args[i].equals( "--database-location" ) ) + { + settingsIndex = IDX_LOCATION; + continue; + } + + if ( i_args[i].equals( "--data-source-name" ) ) + { + settingsIndex = IDX_DSN; + continue; + } + + failure = true; + } + + if ( settings[ IDX_PIPE_NAME ] == null ) + failure = true; + + if ( ( settings[ IDX_DSN ] == null ) && ( settings[ IDX_LOCATION ] == null ) ) + failure = true; + + if ( failure ) + { + System.err.println( "supported arguments: " ); + System.err.println( " --pipe-name <name> : specifies the name of the pipe to connect to the running OOo instance" ); + System.err.println( " --database-location <url> : specifies the URL of the database document to work with" ); + System.err.println( " --data-source-name <name> : specifies the name of the data source to work with" ); + return; + } + + final String ConnectStr = "uno:pipe,name=" + settings[IDX_PIPE_NAME] + ";urp;StarOffice.ServiceManager"; + try + { + final XMultiServiceFactory serviceFactory = Desktop.connect(ConnectStr); + if (serviceFactory != null) + { + PropertyValue[] curproperties = new PropertyValue[1]; + if ( settings[ IDX_LOCATION ] != null ) + curproperties[0] = Properties.createProperty( "DatabaseLocation", settings[ IDX_LOCATION ] ); + else + curproperties[0] = Properties.createProperty( "DataSourceName", settings[ IDX_DSN ] ); + + starter.start(serviceFactory, curproperties); + } + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/db/FieldColumn.java b/wizards/com/sun/star/wizards/db/FieldColumn.java new file mode 100644 index 000000000..dd8b85a92 --- /dev/null +++ b/wizards/com/sun/star/wizards/db/FieldColumn.java @@ -0,0 +1,403 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.sdbc.DataType; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.*; + +public class FieldColumn +{ + protected int ColIndex; + + private Object DefaultValue; + private String m_sFieldName; + private String m_sDisplayFieldName; + private String FieldTitle; + private String m_sCommandName; + private int m_nDBFormatKey; + private int m_nFieldType; + private XPropertySet m_xColPropertySet; + + // field meta data + private int FieldWidth; + private boolean bIsNumberFormat; + + private static boolean bFormatKeysInitialized = false; + private static int iDateFormatKey; + private static int iDateTimeFormatKey; + private static int iNumberFormatKey; + private static int iTextFormatKey; + private static int iTimeFormatKey; + private static int iLogicalFormatKey; + + private CommandMetaData m_aCommandMetaData; + + public FieldColumn(CommandMetaData oCommandMetaData, String _FieldName, String _CommandName, boolean _bInstantiateByDisplayName) + { + m_sCommandName = _CommandName; + if (_bInstantiateByDisplayName) + { + m_sDisplayFieldName = _FieldName; + m_sFieldName = getOnlyFieldName(_FieldName, _CommandName); + } + else + { + m_sFieldName = _FieldName; + m_sDisplayFieldName = composeDisplayFieldName(_CommandName, m_sFieldName); + } + FieldTitle = m_sFieldName; + m_aCommandMetaData = oCommandMetaData; + } + + public FieldColumn(CommandMetaData oCommandMetaData, XNameAccess _xColumns, String _FieldName) + { + m_sFieldName = _FieldName; +// FieldTitle = m_sFieldName; + m_sDisplayFieldName = m_sFieldName; + ColIndex = JavaTools.FieldInList(_xColumns.getElementNames(), m_sFieldName) + 1; + initializeFormatKeys(oCommandMetaData, _xColumns); + try + { + m_sCommandName = (String)m_xColPropertySet.getPropertyValue("TableName"); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + catch (com.sun.star.lang.WrappedTargetException e) + { + } + } + + public int getFieldType() + { + if (m_nFieldType == 0) + { + DBMetaData.CommandObject oTable = m_aCommandMetaData.getTableByName(m_sCommandName); + initializeFormatKeys(m_aCommandMetaData, oTable.getColumns()); + } + return m_nFieldType; + } + + public int getFieldWidth() + { + getFieldType(); // will collect meta data 'bout the column, if not already done so + return FieldWidth; + } + + public int getDBFormatKey() + { + getFieldType(); // will collect meta data 'bout the column, if not already done so + return m_nDBFormatKey; + } + + public boolean isNumberFormat() + { + getFieldType(); // will collect meta data 'bout the column, if not already done so + return bIsNumberFormat; + } + + /** + * Remove the pre name, we want the name after the 'dot' + * @param _DisplayFieldName + * @param _CommandName + * @return + */ + private String getOnlyFieldName(String _DisplayFieldName, String _CommandName) + { + return _DisplayFieldName.substring(_CommandName.length() + 1); + } + + public static String composeDisplayFieldName(String _sCommandName, String _sFieldName) + { + return _sCommandName + "." + _sFieldName; + } + + private void initializeFormatKeys(CommandMetaData oCommandMetaData, XNameAccess _xColumns) + { + try + { + if (!bFormatKeysInitialized) + { + final NumberFormatter aNumberFormatter = oCommandMetaData.getNumberFormatter(); + + iDateFormatKey = aNumberFormatter.getDateFormatKey(); + iDateTimeFormatKey = aNumberFormatter.getDateTimeFormatKey(); + iNumberFormatKey = aNumberFormatter.getNumberFormatKey(); + iTextFormatKey = aNumberFormatter.getTextFormatKey(); + iTimeFormatKey = aNumberFormatter.getTimeFormatKey(); + iLogicalFormatKey = aNumberFormatter.getLogicalFormatKey(); + bFormatKeysInitialized = true; + } + + m_xColPropertySet = UnoRuntime.queryInterface(XPropertySet.class, _xColumns.getByName(m_sFieldName)); + ColIndex = JavaTools.FieldInList(_xColumns.getElementNames(), m_sFieldName) + 1; + m_nFieldType = AnyConverter.toInt(m_xColPropertySet.getPropertyValue("Type")); + getTyperelatedFieldData(); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public XPropertySet getXColumnPropertySet() + { + getFieldType(); // will collect meta data 'bout the column, if not already done so + return m_xColPropertySet; + } + + public String getDisplayFieldName() + { + return m_sDisplayFieldName; + } + + public String getCommandName() + { + return m_sCommandName; + } + + public String getFieldName() + { + return m_sFieldName; + } + + public String getFieldTitle() + { + return FieldTitle; + } + + public void setFieldTitle(String _sTitle) + { + FieldTitle = _sTitle; + } + + + + public boolean isBoolean() + { + boolean bIsBoolean = false; + switch ( getFieldType() ) + { + case DataType.BIT: // == -7; + case DataType.BOOLEAN: + bIsBoolean = true; + break; + default: + bIsBoolean = false; + } + return bIsBoolean; + } + + private void getTyperelatedFieldData() + { + int StandardFormatKey = 0; + try + { + switch ( getFieldType() ) + { + case DataType.BIT: // == -7; + case DataType.BOOLEAN: + // Todo: Look if the defaultvalue has been set in the Datasource + StandardFormatKey = iLogicalFormatKey; + FieldWidth = 5; + bIsNumberFormat = true; + break; + + case DataType.TINYINT: // == -6; + case DataType.SMALLINT: // == 5; + StandardFormatKey = iNumberFormatKey; + FieldWidth = 5; + bIsNumberFormat = true; + break; + + case DataType.INTEGER: // == 4; + StandardFormatKey = iNumberFormatKey; + FieldWidth = 10; + bIsNumberFormat = true; + break; + + case DataType.BIGINT: // == -5; + StandardFormatKey = iNumberFormatKey; + FieldWidth = 15; + bIsNumberFormat = true; + break; + + case DataType.CHAR: // == 1; + StandardFormatKey = iTextFormatKey; + getTextFieldWidth(10); + bIsNumberFormat = false; + break; + + case DataType.VARCHAR: // == 12; + StandardFormatKey = iTextFormatKey; + getTextFieldWidth(30); + bIsNumberFormat = false; + break; + + case DataType.LONGVARCHAR: // == -1; + StandardFormatKey = iTextFormatKey; + getTextFieldWidth(60); + bIsNumberFormat = false; + break; + + case DataType.NUMERIC: // == 2; + StandardFormatKey = iNumberFormatKey; + FieldWidth = 20; + bIsNumberFormat = true; + break; + + case DataType.DECIMAL: // == 3; [with fractional part] + case DataType.FLOAT: // == 6; + case DataType.REAL: // == 7; + case DataType.DOUBLE: // == 8; + StandardFormatKey = iNumberFormatKey; + FieldWidth = 10 + AnyConverter.toInt(m_xColPropertySet.getPropertyValue("Scale")) + 1; + bIsNumberFormat = true; + break; + + case DataType.DATE: // == 91; + StandardFormatKey = iDateFormatKey; + FieldWidth = 10; + bIsNumberFormat = true; + break; + + case DataType.TIME: // == 92; + StandardFormatKey = iTimeFormatKey; + FieldWidth = 10; + bIsNumberFormat = true; + break; + + case DataType.TIMESTAMP: // == 93; + StandardFormatKey = iDateTimeFormatKey; + FieldWidth = 20; + bIsNumberFormat = true; + break; + } + + Object oKey = m_xColPropertySet.getPropertyValue("FormatKey"); + if (AnyConverter.isVoid(oKey)) + { + m_nDBFormatKey = StandardFormatKey; + } + else + { + m_nDBFormatKey = AnyConverter.toInt(oKey); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + m_nDBFormatKey = StandardFormatKey; + } + } + + private void getTextFieldWidth(int iWidth) + { + try + { + FieldWidth = AnyConverter.toInt(m_xColPropertySet.getPropertyValue("Precision")); + if (FieldWidth > 0) + { + if (FieldWidth > (2 * iWidth)) + { + FieldWidth = 2 * iWidth; + } + else if (FieldWidth == 0) + { + FieldWidth = iWidth; + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void initDefaultValue() + { + switch (getFieldType()) + { + case DataType.BIT: // == -7; + case DataType.BOOLEAN: + DefaultValue = Integer.valueOf("1"); + break; + + case DataType.TINYINT: // == -6; + DefaultValue = Integer.valueOf("98"); + break; + + case DataType.SMALLINT: // == 5; + DefaultValue = Integer.valueOf("987"); + break; + + case DataType.INTEGER: // == 4; + DefaultValue = Integer.valueOf("9876"); + break; + + case DataType.BIGINT: // == -5; + DefaultValue = Integer.valueOf("98765"); + break; + + case DataType.CHAR: // == 1; + DefaultValue = String.valueOf('x'); + break; + + case DataType.VARCHAR: // == 12; + case DataType.LONGVARCHAR: // == -1; + DefaultValue = BlindtextCreator.getBlindTextString(FieldTitle, FieldWidth); + break; + + case DataType.NUMERIC: // == 2; + case DataType.DECIMAL: // == 3; [with fractional part] + case DataType.FLOAT: // == 6; + case DataType.REAL: // == 7; + case DataType.DOUBLE: // == 8; + DefaultValue = Double.valueOf("9876.54"); + break; + + case DataType.DATE: // == 91; + DefaultValue = Double.valueOf("42510"); + break; + + case DataType.TIME: // == 92; + DefaultValue = Double.valueOf("10"); + break; + + case DataType.TIMESTAMP: // == 93; + DefaultValue = Double.valueOf("5454110"); + break; + + default: + break; + } + } + + public Object getDefaultValue() + { + if ( DefaultValue == null ) + initDefaultValue(); + return DefaultValue; + } + +} diff --git a/wizards/com/sun/star/wizards/db/MANIFEST.MF b/wizards/com/sun/star/wizards/db/MANIFEST.MF new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/db/MANIFEST.MF diff --git a/wizards/com/sun/star/wizards/db/QueryMetaData.java b/wizards/com/sun/star/wizards/db/QueryMetaData.java new file mode 100644 index 000000000..abbc60367 --- /dev/null +++ b/wizards/com/sun/star/wizards/db/QueryMetaData.java @@ -0,0 +1,244 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.beans.PropertyValue; + +import java.util.*; +import com.sun.star.wizards.common.*; + +public class QueryMetaData extends CommandMetaData +{ + + private SQLQueryComposer oSQLQueryComposer = null; + public String Command; + // Vector CommandNamesV; + private PropertyValue[][] m_aFilterConditions; /* = new PropertyValue[][] {}; */ + + public PropertyValue[][] GroupByFilterConditions = new PropertyValue[][] + { + }; + public int Type = QueryType.SODETAILQUERY; + + public interface QueryType + { + int SOSUMMARYQUERY = 0; + int SODETAILQUERY = 1; + } + + public QueryMetaData(XMultiServiceFactory _xMSF) + { + super(_xMSF); + } + + public void setFilterConditions(PropertyValue[][] _FilterConditions) + { + this.m_aFilterConditions = _FilterConditions; + } + + public PropertyValue[][] getFilterConditions() + { + if (m_aFilterConditions == null) + { + m_aFilterConditions = new PropertyValue[][] + { + }; + } + return m_aFilterConditions; + } + + public void setGroupByFilterConditions(PropertyValue[][] _GroupByFilterConditions) + { + this.GroupByFilterConditions = _GroupByFilterConditions; + } + + public PropertyValue[][] getGroupByFilterConditions() + { + return this.GroupByFilterConditions; + } + + public void addSeveralFieldColumns(String[] _FieldNames, String _sCommandName) + { + ArrayList<FieldColumn> oToBeAddedFieldColumns = new ArrayList<FieldColumn>(); + for (int i = 0; i < _FieldNames.length; i++) + { + FieldColumn oFieldColumn = getFieldColumn(_FieldNames[i], _sCommandName); + if (oFieldColumn == null) + { + oToBeAddedFieldColumns.add(new FieldColumn(this, _FieldNames[i], _sCommandName, false)); + } + } + if (oToBeAddedFieldColumns.size() > 0) + { + int nOldFieldCount = FieldColumns.length; + FieldColumn[] LocFieldColumns = new FieldColumn[nOldFieldCount + oToBeAddedFieldColumns.size()]; + System.arraycopy(FieldColumns, 0, LocFieldColumns, 0, nOldFieldCount); + for (int i = 0; i < oToBeAddedFieldColumns.size(); i++) + { + LocFieldColumns[nOldFieldCount + i] = oToBeAddedFieldColumns.get(i); + } + FieldColumns = LocFieldColumns; + } + } + + public void reorderFieldColumns(String[] _sDisplayFieldNames) + { + FieldColumn[] LocFieldColumns = new FieldColumn[FieldColumns.length]; + for (int i = 0; i < _sDisplayFieldNames.length; i++) + { + FieldColumn LocFieldColumn = this.getFieldColumnByDisplayName(_sDisplayFieldNames[i]); + LocFieldColumns[i] = LocFieldColumn; + } + System.arraycopy(LocFieldColumns, 0, FieldColumns, 0, LocFieldColumns.length); + } + + public void removeSeveralFieldColumnsByDisplayFieldName(String[] _DisplayFieldNames) + { + ArrayList<FieldColumn> oRemainingFieldColumns = new ArrayList<FieldColumn>(); + for (int n = 0; n < FieldColumns.length; n++) + { + String sDisplayFieldName = FieldColumns[n].getDisplayFieldName(); + if (JavaTools.FieldInList(_DisplayFieldNames, sDisplayFieldName) <= -1) + { + oRemainingFieldColumns.add(FieldColumns[n]); + } + } + FieldColumns = new FieldColumn[oRemainingFieldColumns.size()]; + oRemainingFieldColumns.toArray(FieldColumns); + } + + + + public String[] getIncludedCommandNames() + { + ArrayList<String> CommandNamesV = new ArrayList<String>(1); + for (int i = 0; i < FieldColumns.length; i++) + { + final FieldColumn CurQueryField = FieldColumns[i]; + final String CurCommandName = CurQueryField.getCommandName(); + if (!CommandNamesV.contains(CurCommandName)) + { + CommandNamesV.add(CurCommandName); + } + } + String[] sIncludedCommandNames = new String[CommandNamesV.size()]; + CommandNamesV.toArray(sIncludedCommandNames); + return sIncludedCommandNames; + } + + public static String[] getIncludedCommandNames(String[] _FieldNames) + { + ArrayList<String> CommandNames = new ArrayList<String>(1); + for (int i = 0; i < _FieldNames.length; i++) + { + String[] MetaList = JavaTools.ArrayoutofString(_FieldNames[i], "."); + if (MetaList.length > 1) + { + StringBuilder sb = new StringBuilder(PropertyNames.EMPTY_STRING); + for (int a = 0; a < MetaList.length - 1; a++) + { + sb.append(MetaList[a]); + } + String CurCommandName = sb.toString(); + if (!CommandNames.contains(CurCommandName)) + { + CommandNames.add(CurCommandName); + } + } + } + String[] sIncludedCommandNames = new String[CommandNames.size()]; + CommandNames.toArray(sIncludedCommandNames); + return sIncludedCommandNames; + } + + public void initializeFieldTitleSet() + { + try + { + if (FieldTitleSet == null) + { + FieldTitleSet = new HashMap<String, String>(); + } + String[] aCommandNames = getIncludedCommandNames(); + for (int i = 0; i < aCommandNames.length; i++) + { + String sCommandName = aCommandNames[i]; + CommandObject oTable = getTableByName(sCommandName); + String sTableName = oTable.getName(); + String[] LocFieldNames = oTable.getColumns().getElementNames(); + for (int a = 0; a < LocFieldNames.length; a++) + { + String sDisplayFieldName = FieldColumn.composeDisplayFieldName(sTableName, LocFieldNames[a]); + if (!FieldTitleSet.containsKey(sDisplayFieldName)) + { + FieldTitleSet.put(sDisplayFieldName, LocFieldNames[a]); + } + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public String[] getUniqueAggregateFieldNames() + { + ArrayList<String> UniqueAggregateFieldVector = new ArrayList<String>(); + for (int i = 0; i < AggregateFieldNames.length; i++) + { + if (!UniqueAggregateFieldVector.contains(AggregateFieldNames[i][0])) + { + UniqueAggregateFieldVector.add(AggregateFieldNames[i][0]); + } + } + return UniqueAggregateFieldVector.toArray(new String[UniqueAggregateFieldVector.size()]); + } + + public boolean hasNumericalFields() + { + for (int i = 0; i < FieldColumns.length; i++) + { + if (FieldColumns[i].isNumberFormat()) + { + return true; + } + } + return false; + } + + public int getAggregateIndex(String _DisplayFieldName) + { + int iAggregate = -1; + if (Type == QueryType.SOSUMMARYQUERY) + { + iAggregate = JavaTools.FieldInTable(AggregateFieldNames, _DisplayFieldName); + } + return iAggregate; + } + + public SQLQueryComposer getSQLQueryComposer() + { + if (oSQLQueryComposer == null) + { + oSQLQueryComposer = new SQLQueryComposer(this); + } + return oSQLQueryComposer; + } +} diff --git a/wizards/com/sun/star/wizards/db/RecordParser.java b/wizards/com/sun/star/wizards/db/RecordParser.java new file mode 100644 index 000000000..bb35b041f --- /dev/null +++ b/wizards/com/sun/star/wizards/db/RecordParser.java @@ -0,0 +1,244 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XComponent; +import com.sun.star.sdbc.DataType; +import com.sun.star.sdbcx.XColumnsSupplier; +import com.sun.star.uno.Any; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.wizards.common.Helper; +import com.sun.star.sdb.XCompletedExecution; +import com.sun.star.wizards.common.InvalidQueryException; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.sdbc.XResultSet; +import com.sun.star.task.XInteractionHandler; +import com.sun.star.wizards.common.PropertyNames; + +public class RecordParser extends QueryMetaData +{ + + private XNameAccess xColumns; + private com.sun.star.sdbc.XRow xResultSetRow; + public XResultSet ResultSet; + private XInterface xRowSet; + private XCompletedExecution xExecute; + private XComponent xRowSetComponent; + private XInteractionHandler xInteraction; + public FieldColumn[] GroupFieldColumns; + public FieldColumn[] RecordFieldColumns; + + /** Creates a new instance of RecordParser */ + public RecordParser(XMultiServiceFactory _xMSF) + { + super(_xMSF); + getInterfaces(); + } + + private void getInterfaces() + { + try + { + xRowSet = (XInterface) xMSF.createInstance("com.sun.star.sdb.RowSet"); + UnoRuntime.queryInterface(XColumnsSupplier.class, xRowSet); + xRowSetComponent = UnoRuntime.queryInterface(XComponent.class, xRowSet); + xExecute = UnoRuntime.queryInterface(XCompletedExecution.class, xRowSet); + XInterface oInteraction = (XInterface) xMSF.createInstance("com.sun.star.task.InteractionHandler"); + xInteraction = UnoRuntime.queryInterface(XInteractionHandler.class, oInteraction); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private Object getColumnStringValue(int ColIndex) + { + try + { + com.sun.star.uno.Type CurType; + Object oAny; + String sValue = xResultSetRow.getString(ColIndex); //??? + CurType = new com.sun.star.uno.Type(String.class); + oAny = AnyConverter.toObject(CurType, sValue); + return oAny; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + private Object getColumnDoubleValue(int ColIndex, boolean bisDate) + { + try + { + Double DblValue; + if (bisDate) + { + DblValue = new Double(xResultSetRow.getDouble(ColIndex) + super.getNullDateCorrection()); + } + else + { + DblValue = new Double(xResultSetRow.getDouble(ColIndex)); + } + if (!xResultSetRow.wasNull()) + { + return DblValue; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return Any.VOID; + } + + private Object getColumnValue(int ColIndex, int iType) + { + Object oAny = Any.VOID; + switch (iType) + { + case DataType.BIT: // == -7; + case DataType.BOOLEAN: + case DataType.TINYINT: // == -6; + case DataType.BIGINT: // == -5; + case DataType.NUMERIC: // == 2; + case DataType.INTEGER: // == 4; + case DataType.SMALLINT: // == 5; + case DataType.DECIMAL: // == 3; [with fractional part] + case DataType.FLOAT: // == 6; + case DataType.REAL: // == 7; + case DataType.DOUBLE: // == 8; + case DataType.TIME: // == 92; + oAny = getColumnDoubleValue(ColIndex, false); + break; + + case DataType.DATE: // == 91; + case DataType.TIMESTAMP: // == 93; + oAny = getColumnDoubleValue(ColIndex, true); + break; + case DataType.CHAR: // == 1; + case DataType.VARCHAR: // == 12; + case DataType.LONGVARCHAR: // == -1; + oAny = getColumnStringValue(ColIndex); + break; + + } + + // Is the index OK; increment? + return oAny; + } + + public boolean executeCommand(int _nCommandType) throws InvalidQueryException + { + try + { + Helper.setUnoPropertyValue(xRowSet, "DataSourceName", DataSourceName); + Helper.setUnoPropertyValue(xRowSet, PropertyNames.ACTIVE_CONNECTION, DBConnection); + Helper.setUnoPropertyValue(xRowSet, PropertyNames.COMMAND, Command); + Helper.setUnoPropertyValue(xRowSet, PropertyNames.COMMAND_TYPE, Integer.valueOf(_nCommandType)); // CommandType + xExecute.executeWithCompletion(xInteraction); + com.sun.star.sdb.XResultSetAccess xResultAccess = UnoRuntime.queryInterface(com.sun.star.sdb.XResultSetAccess.class, xRowSet); + ResultSet = xResultAccess.createResultSet(); + xResultSetRow = UnoRuntime.queryInterface(com.sun.star.sdbc.XRow.class, ResultSet); + XColumnsSupplier xDBCols = UnoRuntime.queryInterface(XColumnsSupplier.class, ResultSet); + xColumns = xDBCols.getColumns(); + setCommandType(_nCommandType); + return true; + } + catch (Exception exception) + { + throw new InvalidQueryException(xMSF, Command, exception); + } + } + + public boolean getFields(String[] _sFieldNames, boolean binitializeDBColumns) + { + try + { + if (binitializeDBColumns) + { + initializeFieldColumns(_sFieldNames, xColumns); + } + String[] AllQueryFieldNames = xColumns.getElementNames(); + for (int i = 0; i < FieldColumns.length; i++) + { + String sFieldName = FieldColumns[i].getFieldName(); + int nColIndex = JavaTools.FieldInList(AllQueryFieldNames, sFieldName) + 1; + FieldColumns[i].ColIndex = nColIndex; + if (nColIndex == -1) + { + throw new InvalidQueryException(xMSF, Command); + } + } + GroupFieldColumns = getFieldColumnList(GroupFieldNames); + RecordFieldColumns = getFieldColumnList(getRecordFieldNames()); + return true; + } + catch (InvalidQueryException queryexception) + { + queryexception.printStackTrace(System.err); + return false; + } + } + + private FieldColumn[] getFieldColumnList(String[] _FieldNames) + { + FieldColumn[] LocFieldColumns = new FieldColumn[_FieldNames.length]; + for (int i = 0; i < _FieldNames.length; i++) + { + LocFieldColumns[i] = super.getFieldColumnByFieldName(_FieldNames[i]); + } + return LocFieldColumns; + } + + public Object getGroupColumnValue(int ColIndex) + { + FieldColumn CurDBFieldColumn = this.GroupFieldColumns[ColIndex]; + return getColumnValue(CurDBFieldColumn.ColIndex, CurDBFieldColumn.getFieldType()); + } + + public boolean getcurrentRecordData(java.util.ArrayList<Object[]> DataVector) + { + Object[] RecordValueArray = new Object[RecordFieldColumns.length]; + for (int i = 0; i < RecordFieldColumns.length; i++) + { + FieldColumn CurDBFieldColumn = this.RecordFieldColumns[i]; + RecordValueArray[i] = getColumnValue(CurDBFieldColumn.ColIndex, CurDBFieldColumn.getFieldType()); //FinalColIndex + } + DataVector.add(RecordValueArray); + return true; + } + + @Override + public void dispose() + { + if (xRowSetComponent != null) + { + xRowSetComponent.dispose(); + } + super.dispose(); + } +} diff --git a/wizards/com/sun/star/wizards/db/RelationController.java b/wizards/com/sun/star/wizards/db/RelationController.java new file mode 100644 index 000000000..0c77d92bb --- /dev/null +++ b/wizards/com/sun/star/wizards/db/RelationController.java @@ -0,0 +1,145 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import java.util.ArrayList; + +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbc.XResultSet; +import com.sun.star.sdbc.XRow; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; + +/** + * TODO To change the template for this generated type comment go to + * Window - Preferences - Java - Code Style - Code Templates + */ +public class RelationController extends CommandName +{ + + private static final int PKTABLE_CAT = 1; + private static final int PKTABLE_SCHEM = 2; + private static final int PKTABLE_NAME = 3; + private static final int PKCOLUMN_NAME = 4; + private static final int FKTABLE_CAT = 5; + private static final int FKTABLE_SCHEM = 6; + private static final int FKTABLE_NAME = 7; + private static final int FKCOLUMN_NAME = 8; + + public RelationController(CommandMetaData _CommandMetaData, String _DisplayName) + { + super(_CommandMetaData, _DisplayName); + } + + public String[] getExportedKeys() + { + String[] sReferencedTableNames = new String[] + { + }; + try + { + ArrayList<String> aReferencedTableVector = new ArrayList<String>(); + XResultSet xResultSet = super.getCommandMetaData().xDBMetaData.getExportedKeys(getCatalogName(this), getSchemaName(), getTableName()); + XRow xRow = UnoRuntime.queryInterface(XRow.class, xResultSet); + while (xResultSet.next()) + { + String sForeignCatalog = xRow.getString(FKTABLE_CAT); + String sForeignScheme = xRow.getString(FKTABLE_SCHEM); + String sForeignTableName = xRow.getString(FKTABLE_NAME); + CommandName oCommandName = new CommandName(getCommandMetaData(), sForeignCatalog, sForeignScheme, sForeignTableName, false); + aReferencedTableVector.add(oCommandName.getComposedName()); + } + sReferencedTableNames = new String[aReferencedTableVector.size()]; + aReferencedTableVector.toArray(sReferencedTableNames); + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + return sReferencedTableNames; + } + + private Object getCatalogName(CommandName _oCommandName) + { + String sLocCatalog = _oCommandName.getCatalogName(); + if (sLocCatalog.equals(PropertyNames.EMPTY_STRING)) + { + return null; + } + else + { + return sLocCatalog; + } + } + + public String[][] getImportedKeyColumns(String _sreferencedtablename) + { + String[][] sKeyColumnNames = new String[][] + { + }; + try + { + CommandName oLocCommandName = new CommandName(super.getCommandMetaData(), _sreferencedtablename); + XResultSet xResultSet = super.getCommandMetaData().xDBMetaData.getImportedKeys(getCatalogName(oLocCommandName), oLocCommandName.getSchemaName(), oLocCommandName.getTableName()); + XRow xRow = UnoRuntime.queryInterface(XRow.class, xResultSet); + boolean bleaveLoop = false; + ArrayList<String> aMasterFieldNamesVector = new ArrayList<String>(); + ArrayList<String> aSlaveFieldNamesVector = new ArrayList<String>(); + while (xResultSet.next() && !bleaveLoop) + { + String sPrimaryCatalog = null; + String sPrimarySchema = null; + if (super.getCommandMetaData().xDBMetaData.supportsCatalogsInDataManipulation()) + { + sPrimaryCatalog = xRow.getString(PKTABLE_CAT); + } + if (super.getCommandMetaData().xDBMetaData.supportsSchemasInDataManipulation()) + { + sPrimarySchema = xRow.getString(PKTABLE_SCHEM); + } + String sPrimaryTableName = xRow.getString(PKTABLE_NAME); + String sPrimaryColumnName = xRow.getString(PKCOLUMN_NAME); + String sForeignColumnName = xRow.getString(FKCOLUMN_NAME); + if (JavaTools.isSame(getTableName(), sPrimaryTableName)) + { + if (sPrimarySchema == null || JavaTools.isSame(getSchemaName(), sPrimarySchema)) + { + if (JavaTools.isSame(getCatalogName(), sPrimaryCatalog)) + { + aSlaveFieldNamesVector.add(sForeignColumnName); + aMasterFieldNamesVector.add(sPrimaryColumnName); + bleaveLoop = true; //Only one relation may exist between two tables... + } + } + + } + } + sKeyColumnNames = new String[2][aMasterFieldNamesVector.size()]; + sKeyColumnNames[0] = new String[aSlaveFieldNamesVector.size()]; + sKeyColumnNames[1] = new String[aMasterFieldNamesVector.size()]; + aSlaveFieldNamesVector.toArray(sKeyColumnNames[0]); + aMasterFieldNamesVector.toArray(sKeyColumnNames[1]); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return sKeyColumnNames; + } +} diff --git a/wizards/com/sun/star/wizards/db/SQLQueryComposer.java b/wizards/com/sun/star/wizards/db/SQLQueryComposer.java new file mode 100644 index 000000000..17bc953af --- /dev/null +++ b/wizards/com/sun/star/wizards/db/SQLQueryComposer.java @@ -0,0 +1,436 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.beans.*; +import com.sun.star.container.XIndexAccess; +import com.sun.star.sdb.XSingleSelectQueryComposer; +import com.sun.star.sdb.XSingleSelectQueryAnalyzer; +import com.sun.star.ui.dialogs.XExecutableDialog; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.sdbc.SQLException; +import com.sun.star.lang.XInitialization; +import com.sun.star.awt.XWindow; +import com.sun.star.sdb.SQLFilterOperator; + +import com.sun.star.wizards.common.*; +import java.util.ArrayList; + +public class SQLQueryComposer +{ + + private QueryMetaData CurDBMetaData; + public XSingleSelectQueryAnalyzer m_xQueryAnalyzer; + private ArrayList<CommandName> composedCommandNames = new ArrayList<CommandName>(1); + private XSingleSelectQueryComposer m_queryComposer; + private XMultiServiceFactory xMSF; + private boolean bincludeGrouping = true; + + public SQLQueryComposer(QueryMetaData _CurDBMetaData) + { + try + { + setDBMetaData(_CurDBMetaData); + xMSF = UnoRuntime.queryInterface(XMultiServiceFactory.class, CurDBMetaData.DBConnection); + final Object oQueryComposer = xMSF.createInstance("com.sun.star.sdb.SingleSelectQueryComposer"); + m_xQueryAnalyzer = UnoRuntime.queryInterface(XSingleSelectQueryAnalyzer.class, oQueryComposer); + m_queryComposer = UnoRuntime.queryInterface(XSingleSelectQueryComposer.class, m_xQueryAnalyzer); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private boolean addtoSelectClause(String DisplayFieldName) throws SQLException + { + return !(bincludeGrouping && CurDBMetaData.xDBMetaData.supportsGroupByUnrelated() && CurDBMetaData.GroupFieldNames != null && JavaTools.FieldInList(CurDBMetaData.GroupFieldNames, DisplayFieldName) > -1); + } + + public String getSelectClause(boolean _baddAliasFieldNames) throws SQLException + { + // getFromClause() must be called first to populate composedCommandNames, + // but it's idempotent, so let's call it now in case the caller didn't already: + getFromClause(); + + String sSelectBaseClause = "SELECT "; + StringBuilder sb = new StringBuilder(sSelectBaseClause); + for (int i = 0; i < CurDBMetaData.FieldColumns.length; i++) + { + if (addtoSelectClause(CurDBMetaData.FieldColumns[i].getDisplayFieldName())) + { + int iAggregate = CurDBMetaData.getAggregateIndex(CurDBMetaData.FieldColumns[i].getDisplayFieldName()); + if (iAggregate > -1) + { + sb.append(CurDBMetaData.AggregateFieldNames[iAggregate][1]).append("(").append(getComposedAliasDisplayName(CurDBMetaData.AggregateFieldNames[iAggregate][0])).append(")"); + if (_baddAliasFieldNames) + { + sb.append(getAliasFieldNameClause(CurDBMetaData.AggregateFieldNames[iAggregate][0])); + } + } + else + { + sb.append(getComposedAliasDisplayName(CurDBMetaData.FieldColumns[i].getDisplayFieldName())); + if (_baddAliasFieldNames) + { + sb.append(getAliasFieldNameClause(CurDBMetaData.FieldColumns[i].getDisplayFieldName())); + } + } + sb.append(", "); + } + } + String sSelectClause = sb.toString(); + // TODO: little bit unhandy version of remove the append 'comma' at the end + if (sSelectClause.equals(sSelectBaseClause)) + { + sSelectClause = sSelectClause.substring(0, sSelectClause.length() - 1); + } + else + { + sSelectClause = sSelectClause.substring(0, sSelectClause.length() - 2); + } + return sSelectClause; + } + + private String getAliasFieldNameClause(String _FieldName) + { + String FieldTitle = CurDBMetaData.getFieldTitle(_FieldName); + if (!FieldTitle.equals(_FieldName)) + { + return " AS " + CommandName.quoteName(FieldTitle, CurDBMetaData.getIdentifierQuote()); + } + else + { + return ""; + } + } + + + + public void prependSortingCriteria() throws SQLException + { + prependSortingCriteria(false); + } + + private void prependSortingCriteria(boolean _baddAliasFieldNames) throws SQLException + { + XIndexAccess xColumnIndexAccess = m_xQueryAnalyzer.getOrderColumns(); + m_queryComposer.setOrder(""); + for (int i = 0; i < CurDBMetaData.getSortFieldNames().length; i++) + { + appendSortingCriterion(i, _baddAliasFieldNames); + } + for (int i = 0; i < xColumnIndexAccess.getCount(); i++) + { + try + { + XPropertySet xColumnPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xColumnIndexAccess.getByIndex(i)); + String sName = (String) xColumnPropertySet.getPropertyValue(PropertyNames.PROPERTY_NAME); + if (JavaTools.FieldInTable(CurDBMetaData.getSortFieldNames(), sName) == -1) + { + boolean bascend = AnyConverter.toBoolean(xColumnPropertySet.getPropertyValue("IsAscending")); + m_queryComposer.appendOrderByColumn(xColumnPropertySet, bascend); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + } + + private void appendSortingCriterion(int _SortIndex, boolean _baddAliasFieldNames) throws SQLException + { + String sSortValue = CurDBMetaData.getSortFieldNames()[_SortIndex][0]; + XPropertySet xColumn = CurDBMetaData.getColumnObjectByFieldName(sSortValue, _baddAliasFieldNames); + + String sSort = "ASC"; + if(CurDBMetaData.getSortFieldNames()[_SortIndex].length > 1) + { + sSort = CurDBMetaData.getSortFieldNames()[_SortIndex][1]; + } + boolean bascend = !(sSort.equals("DESC")); + m_queryComposer.appendOrderByColumn(xColumn, bascend); + } + + private void appendSortingcriteria(boolean _baddAliasFieldNames) throws SQLException + { + m_queryComposer.setOrder(""); + for (int i = 0; i < CurDBMetaData.getSortFieldNames().length; i++) + { + String sSortValue = CurDBMetaData.getSortFieldNames()[i][0]; + int iAggregate = CurDBMetaData.getAggregateIndex(sSortValue); + if (iAggregate > -1) + { + String sOrder = m_xQueryAnalyzer.getOrder(); + if (sOrder.length() > 0) + { + sOrder += ", "; + } + sOrder += CurDBMetaData.AggregateFieldNames[iAggregate][1] + "(" + getComposedAliasDisplayName(CurDBMetaData.AggregateFieldNames[iAggregate][0]) + ")"; + sOrder += " " + CurDBMetaData.getSortFieldNames()[i][1]; + m_queryComposer.setOrder(sOrder); + } + else + { + appendSortingCriterion(i, _baddAliasFieldNames); + } + } + } + + private void appendGroupByColumns(boolean _baddAliasFieldNames) throws SQLException + { + for (int i = 0; i < CurDBMetaData.GroupFieldNames.length; i++) + { + XPropertySet xColumn = CurDBMetaData.getColumnObjectByFieldName(CurDBMetaData.GroupFieldNames[i], _baddAliasFieldNames); + m_queryComposer.appendGroupByColumn(xColumn); + } + } + + private void setDBMetaData(QueryMetaData _oDBMetaData) + { + this.CurDBMetaData = _oDBMetaData; + updateComposedCommandNames(); + } + + private PropertyValue[][] replaceConditionsByAlias(PropertyValue _filterconditions[][]) + { + for (int n = 0; n < _filterconditions.length; n++) + { + for (int m = 0; m < _filterconditions[n].length; m++) + { + final String aliasName = getComposedAliasFieldName(_filterconditions[n][m].Name); + _filterconditions[n][m].Name = aliasName; + } + } + return _filterconditions; + } + + public String getQuery() + { + return m_xQueryAnalyzer.getQuery(); + } + + private void updateComposedCommandNames() + { + composedCommandNames.clear(); + String[] sCommandNames = CurDBMetaData.getIncludedCommandNames(); + for (int i = 0; i < sCommandNames.length; i++) + { + CommandName curCommandName = new CommandName(CurDBMetaData, sCommandNames[i]); + curCommandName.setAliasName(getuniqueAliasName(curCommandName.getTableName())); + composedCommandNames.add(curCommandName); + } + } + + public StringBuilder getFromClause() throws SQLException + { + StringBuilder sFromClause = new StringBuilder("FROM"); + String[] sCommandNames = CurDBMetaData.getIncludedCommandNames(); + for (int i = 0; i < sCommandNames.length; i++) + { + CommandName curCommandName = getComposedCommandByDisplayName(sCommandNames[i]); + if (curCommandName == null) { + throw new SQLException("Error: CommandName unavailable"); + } + sFromClause.append(" ").append(curCommandName.getComposedName()).append(" ").append(quoteName(curCommandName.getAliasName())); + if (i < sCommandNames.length - 1) + { + sFromClause.append(", "); + } + } + return sFromClause; + } + + public boolean setQueryCommand(XWindow _xParentWindow, boolean _bincludeGrouping, boolean _baddAliasFieldNames) + { + return setQueryCommand(_xParentWindow, _bincludeGrouping, _baddAliasFieldNames, true); + } + + private boolean setQueryCommand(XWindow _xParentWindow, boolean _bincludeGrouping, boolean _baddAliasFieldNames, boolean addQuery) + { + return setQueryCommand(_xParentWindow, _bincludeGrouping, _baddAliasFieldNames, addQuery, false); + } + + private boolean setQueryCommand(XWindow _xParentWindow, boolean _bincludeGrouping, boolean _baddAliasFieldNames, boolean addQuery, boolean prependSortingCriteria) + { + try + { + bincludeGrouping = _bincludeGrouping; + if (addQuery) + { + StringBuilder fromClause = getFromClause(); + String sSelectClause = getSelectClause(_baddAliasFieldNames); + StringBuilder queryclause = new StringBuilder(sSelectClause).append(" ").append(fromClause); + m_xQueryAnalyzer.setQuery(queryclause.toString()); + if (CurDBMetaData.getFilterConditions() != null && CurDBMetaData.getFilterConditions().length > 0) + { + CurDBMetaData.setFilterConditions(replaceConditionsByAlias(CurDBMetaData.getFilterConditions())); + m_queryComposer.setStructuredFilter(CurDBMetaData.getFilterConditions()); + } + } + if (_bincludeGrouping) + { + appendGroupByColumns(_baddAliasFieldNames); + if (CurDBMetaData.GroupByFilterConditions.length > 0) + { + m_queryComposer.setStructuredHavingClause(CurDBMetaData.GroupByFilterConditions); + } + } + if (prependSortingCriteria) + { + prependSortingCriteria(_baddAliasFieldNames); + } + else + { + appendSortingcriteria(_baddAliasFieldNames); + } + + return true; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + displaySQLErrorDialog(exception, _xParentWindow); + return false; + } + } + + private String getComposedAliasDisplayName(String _fieldname) + { + FieldColumn CurFieldColumn = CurDBMetaData.getFieldColumnByDisplayName(_fieldname); + final String curCommandName = CurFieldColumn.getCommandName(); + final String curFieldName = CurFieldColumn.getFieldName(); + CommandName curComposedCommandName = getComposedCommandByDisplayName(curCommandName); + if (curComposedCommandName == null) + { + //return _fieldname; + if ( curCommandName.length() > 0 ) + return quoteName(curCommandName) + "." + quoteName(curFieldName); + else + return quoteName(curFieldName); + } + String curAliasName = curComposedCommandName.getAliasName(); + return quoteName(curAliasName) + "." + quoteName(curFieldName); + } + + private String getComposedAliasFieldName(String _fieldname) + { + FieldColumn CurFieldColumn = CurDBMetaData.getFieldColumnByFieldName(_fieldname); + final String curCommandName = CurFieldColumn.getCommandName(); + final String curFieldName = CurFieldColumn.getFieldName(); + CommandName curComposedCommandName = getComposedCommandByDisplayName(curCommandName); + if (curComposedCommandName == null) + { + //return _fieldname; + if ( curCommandName.length() > 0 ) + return quoteName(curCommandName) + "." + quoteName(curFieldName); + else + return quoteName(curFieldName); + } + String curAliasName = curComposedCommandName.getAliasName(); + return quoteName(curAliasName) + "." + quoteName(curFieldName); + } + + private CommandName getComposedCommandByAliasName(String _AliasName) + { + if (composedCommandNames != null) + { + for (CommandName commandName : composedCommandNames) + { + if (commandName.getAliasName().equals(_AliasName)) + { + return commandName; + } + } + } + return null; + } + + private CommandName getComposedCommandByDisplayName(String _DisplayName) + { + if (composedCommandNames != null) + { + for (CommandName commandName : composedCommandNames) + { + if (commandName.getDisplayName().equals(_DisplayName)) + { + return commandName; + } + } + } + return null; + } + + private String getuniqueAliasName(String _TableName) + { + int a = 0; + String AliasName = ""; + boolean bAliasNameexists = true; + String locAliasName = _TableName; + while (bAliasNameexists) + { + bAliasNameexists = (getComposedCommandByAliasName(locAliasName) != null); + if (bAliasNameexists) + { + a++; + locAliasName = _TableName + "_" + a; + } + else + { + AliasName = locAliasName; + } + } + return AliasName; + } + + private String quoteName(String _sname) + { + return CommandName.quoteName(_sname, CurDBMetaData.getIdentifierQuote()); + } + + private void displaySQLErrorDialog(Exception _exception, XWindow _xParentWindow) + { + try + { + Object oErrorDialog = CurDBMetaData.xMSF.createInstance("com.sun.star.sdb.ErrorMessageDialog"); + XInitialization xInitialize = UnoRuntime.queryInterface(XInitialization.class, oErrorDialog); + XExecutableDialog xExecute = UnoRuntime.queryInterface(XExecutableDialog.class, oErrorDialog); + PropertyValue[] rDispatchArguments = new PropertyValue[3]; + rDispatchArguments[0] = Properties.createProperty(PropertyNames.PROPERTY_TITLE, Configuration.getProductName(CurDBMetaData.xMSF) + " Base"); + rDispatchArguments[1] = Properties.createProperty("ParentWindow", _xParentWindow); + rDispatchArguments[2] = Properties.createProperty("SQLException", _exception); + xInitialize.initialize(rDispatchArguments); + xExecute.execute(); + //TODO dispose??? + } + catch (Exception typeexception) + { + typeexception.printStackTrace(System.err); + } + } + + public XSingleSelectQueryComposer getQueryComposer() + { + return m_queryComposer; + } +} diff --git a/wizards/com/sun/star/wizards/db/TableDescriptor.java b/wizards/com/sun/star/wizards/db/TableDescriptor.java new file mode 100644 index 000000000..fca261989 --- /dev/null +++ b/wizards/com/sun/star/wizards/db/TableDescriptor.java @@ -0,0 +1,809 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import java.util.ArrayList; + +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XWindow; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.ContainerEvent; +import com.sun.star.container.XContainer; +import com.sun.star.container.XContainerListener; +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbcx.KeyType; +import com.sun.star.sdbcx.XAppend; +import com.sun.star.sdbcx.XColumnsSupplier; +import com.sun.star.sdbcx.XDataDescriptorFactory; +import com.sun.star.sdbcx.XDrop; +import com.sun.star.sdbcx.XKeysSupplier; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +public class TableDescriptor extends CommandMetaData implements XContainerListener +{ + + private XDataDescriptorFactory xTableDataDescriptorFactory; + private XPropertySet xPropTableDataDescriptor; + private XNameAccess xNameAccessColumns; + private XIndexAccess xIndexAccessKeys; + private XDataDescriptorFactory xColumnDataDescriptorFactory; + private XContainer xTableContainer; + private XAppend xTableAppend; + private XDrop xTableDrop; + private XAppend xKeyAppend; + private XDrop xKeyDrop; + private String[] sTableFilters = null; + private final ArrayList<ColumnDescriptor> columncontainer; + private final ArrayList<XPropertySet> keycolumncontainer; + private CommandName ComposedTableName; + private XAppend xKeyColAppend; + private XColumnsSupplier xKeyColumnSupplier; + private XPropertySet xKey; + private boolean bIDFieldisInserted = false; + private String IDFieldName = PropertyNames.EMPTY_STRING; + private final String sColumnAlreadyExistsMessage; + private final XWindow xWindow; + + public TableDescriptor(XMultiServiceFactory xMSF, XWindow _xWindow, String _sColumnAlreadyExistsMessage) + { + super(xMSF); + columncontainer = new ArrayList<ColumnDescriptor>(); + keycolumncontainer = new ArrayList<XPropertySet>(); + sColumnAlreadyExistsMessage = _sColumnAlreadyExistsMessage; + xWindow = _xWindow; + } + + private static class ColumnDescriptor + { + String Name; + XPropertySet xColPropertySet; + + public ColumnDescriptor(XPropertySet _xColPropertySet, String _Name) + { + Name = _Name; + xColPropertySet = _xColPropertySet; + } + } + + @Override + public boolean getConnection(PropertyValue[] _curPropertyValue) + { + if (super.getConnection(_curPropertyValue)) + { + xTableAppend = UnoRuntime.queryInterface( XAppend.class, getTableNamesAsNameAccess() ); + xTableDrop = UnoRuntime.queryInterface( XDrop.class, getTableNamesAsNameAccess() ); + xTableDataDescriptorFactory = UnoRuntime.queryInterface( XDataDescriptorFactory.class, getTableNamesAsNameAccess() ); + xPropTableDataDescriptor = xTableDataDescriptorFactory.createDataDescriptor(); + XColumnsSupplier xColumnsSupplier = UnoRuntime.queryInterface( XColumnsSupplier.class, xPropTableDataDescriptor ); + xNameAccessColumns = xColumnsSupplier.getColumns(); + xColumnDataDescriptorFactory = UnoRuntime.queryInterface( XDataDescriptorFactory.class, xNameAccessColumns ); + try + { + createTypeInspector(); + sTableFilters = (String[]) AnyConverter.toArray(getDataSourcePropertySet().getPropertyValue("TableFilter")); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return true; + } + else + { + return false; + } + } + + private void removePrimaryKeys() + { + if (keycolumncontainer.size() > 0) + { + for (int i = (keycolumncontainer.size() - 1); i >= 0; i--) + { + keycolumncontainer.remove(i); + } + } + } + + private boolean createPrimaryKeys(String[] _fieldnames, boolean _bAutoincrementation) + { + try + { + XKeysSupplier xKeySupplier = UnoRuntime.queryInterface(XKeysSupplier.class, xPropTableDataDescriptor); + xIndexAccessKeys = xKeySupplier.getKeys(); + XDataDescriptorFactory xKeyFac = UnoRuntime.queryInterface(XDataDescriptorFactory.class, xIndexAccessKeys); + xKeyDrop = UnoRuntime.queryInterface(XDrop.class, xIndexAccessKeys); + xKeyAppend = UnoRuntime.queryInterface(XAppend.class, xKeyFac); + xKey = xKeyFac.createDataDescriptor(); + xKey.setPropertyValue("Type", Integer.valueOf(KeyType.PRIMARY)); + xKeyColumnSupplier = UnoRuntime.queryInterface(XColumnsSupplier.class, xKey); + XDataDescriptorFactory xKeyColFac = UnoRuntime.queryInterface(XDataDescriptorFactory.class, xKeyColumnSupplier.getColumns()); + xKeyColAppend = UnoRuntime.queryInterface(XAppend.class, xKeyColFac); + removePrimaryKeys(); + for (int i = 0; i < _fieldnames.length; i++) + { + XPropertySet xKeyColPropertySet = xKeyColFac.createDataDescriptor(); + xKeyColPropertySet.setPropertyValue(PropertyNames.PROPERTY_NAME, _fieldnames[i]); + keycolumncontainer.add(xKeyColPropertySet); + XPropertySet xColPropertySet = null; + if (hasByName(_fieldnames[i])) + { + xColPropertySet = getByName(_fieldnames[i]); + } + else + { + xColPropertySet = addPrimaryKeyColumn(_fieldnames[i]); + } + xColPropertySet.setPropertyValue("IsNullable", Integer.valueOf(com.sun.star.sdbc.ColumnValue.NO_NULLS)); + if (_bAutoincrementation) + { + int nDataType = oTypeInspector.getAutoIncrementIndex(xColPropertySet); + if (nDataType != TypeInspector.INVALID) + { + if (xColPropertySet.getPropertySetInfo().hasPropertyByName("IsAutoIncrement")) + { + xColPropertySet.setPropertyValue("Type", Integer.valueOf(nDataType)); + xColPropertySet.setPropertyValue("IsAutoIncrement", Boolean.valueOf(_bAutoincrementation)); + } + } + } + modifyColumn(_fieldnames[i], xColPropertySet); + } + return true; + } + catch (UnknownPropertyException e) + { + e.printStackTrace(System.err); + } + catch (PropertyVetoException e) + { + e.printStackTrace(System.err); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + catch (WrappedTargetException e) + { + e.printStackTrace(System.err); + } + + return false; + } + + private boolean isColumnNameDuplicate(XNameAccess _xColumns, XPropertySet _xToBeAppendedPropertySet) + { + try + { + String sColumnName = AnyConverter.toString(_xToBeAppendedPropertySet.getPropertyValue(PropertyNames.PROPERTY_NAME)); + if (_xColumns.hasByName(sColumnName)) + { + String sMessage = JavaTools.replaceSubString(sColumnAlreadyExistsMessage, sColumnName, "%FIELDNAME"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sMessage); + return true; + } + return false; + } + catch (Exception ex) + { + ex.printStackTrace(System.err); + return false; + } + } + + /** + * creates the table under the passed name + * @param _tablename is made unique if necessary + * @return true or false to indicate successful creation or not + */ + public boolean createTable(String _catalogname, String _schemaname, String _tablename) + { + boolean breturn = true; + try + { + XAppend xAppendColumns = UnoRuntime.queryInterface(XAppend.class, xNameAccessColumns); + for (int i = 0; i < columncontainer.size(); i++) + { + XPropertySet xColPropertySet = getByIndex(i); + if (xColPropertySet != null && !isColumnNameDuplicate(xNameAccessColumns, xColPropertySet)) + { + xAppendColumns.appendByDescriptor(xColPropertySet); //xColPropertySet.setPropertyValue("Type", 32423) + } + else + { + breturn = false; + } + } + if (breturn) + { + assignTableProperty(PropertyNames.PROPERTY_NAME, _tablename); + assignTableProperty("CatalogName", _catalogname); + assignTableProperty("SchemaName", _schemaname); + xTableContainer = UnoRuntime.queryInterface(XContainer.class, getTableNamesAsNameAccess()); + xTableContainer.addContainerListener(this); + if (keycolumncontainer.size() > 0) + { + for (int i = 0; i < keycolumncontainer.size(); i++) + { + XPropertySet xKeyColPropertySet = keycolumncontainer.get(i); + if (!isColumnNameDuplicate(xKeyColumnSupplier.getColumns(), xKeyColPropertySet)) + { + xKeyColAppend.appendByDescriptor(xKeyColPropertySet); + } + else + { + breturn = false; + } + } + if (breturn) + { + xKeyAppend.appendByDescriptor(xKey); + } + } + if (breturn) + { + // TODO: LLA: describe what is he doing here. + xTableAppend.appendByDescriptor(xPropTableDataDescriptor); + } + } + } + catch (SQLException oSQLException) + { + super.callSQLErrorMessageDialog(oSQLException, xWindow); + breturn = false; + } + catch (Exception e) + { + e.printStackTrace(System.err); + breturn = false; + } + if (!breturn) + { + removeAllColumnsFromDescriptor(_tablename); + this.removePrimaryKeys(); + } + return breturn; + } + + private boolean removeAllColumnsFromDescriptor(String _tablename) + { + try + { + xPropTableDataDescriptor.setPropertyValue(PropertyNames.PROPERTY_NAME, PropertyNames.EMPTY_STRING); + if ((xKeyDrop != null) && (xIndexAccessKeys != null)) + { + int icount = xIndexAccessKeys.getCount(); + if (icount > 0) + { + for (int i = xIndexAccessKeys.getCount() - 1; i >= 0; i--) + { + xKeyDrop.dropByIndex(i); + } + } + } + XDrop xColumnDrop = UnoRuntime.queryInterface(XDrop.class, xNameAccessColumns); + for (int i = xNameAccessColumns.getElementNames().length - 1; i >= 0; i--) + { + xColumnDrop.dropByIndex(i); + } + if (xTableDrop != null) + { + if (getTableNamesAsNameAccess().hasByName(_tablename)) + { + xTableDrop.dropByName(_tablename); + } + } + if (bIDFieldisInserted) + { + this.dropColumnbyName(this.IDFieldName); + bIDFieldisInserted = false; + } + return false; + } + catch (SQLException oSQLException) + { + super.callSQLErrorMessageDialog(oSQLException, xWindow); + } + catch (Exception e1) + { + e1.printStackTrace(System.err); + } + return false; + } + + public boolean createTable(String _catalogname, String _schemaname, String _tablename, String[] _keycolumnnames, boolean _bAutoincrementation) + { + if (createPrimaryKeys(_keycolumnnames, _bAutoincrementation)) + { + return createTable(_catalogname, _schemaname, _tablename); + } + return false; + } + + private void assignTableProperty(String _spropname, String _svalue) + { + if (_svalue != null && !_svalue.equals(PropertyNames.EMPTY_STRING)) + { + try + { + xPropTableDataDescriptor.setPropertyValue(_spropname, _svalue); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + } + + public boolean modifyColumnName(String _soldname, String _snewname) + { + try + { + return modifyColumn(_soldname, PropertyNames.PROPERTY_NAME, _snewname); + } + catch (Exception e) + { + e.printStackTrace(System.err); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, e.getMessage()); + return false; + } + } + + private boolean modifyColumn(String _sname, String _spropname, Object _oValue) + { + try + { + if (this.columncontainer.size() > 0) + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + if (oColumnDescriptor.Name.equals(_sname)) + { + oColumnDescriptor.xColPropertySet.setPropertyValue(_spropname, _oValue); + if (_spropname.equals(PropertyNames.PROPERTY_NAME)) + { + oColumnDescriptor.Name = (String) _oValue; + } + columncontainer.remove(i); + columncontainer.add(i, oColumnDescriptor); + return true; + } + } + } + } + catch (UnknownPropertyException e) + { + e.printStackTrace(System.err); + } + catch (PropertyVetoException e) + { + e.printStackTrace(System.err); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + catch (WrappedTargetException e) + { + e.printStackTrace(System.err); + } + return false; + } + + public boolean modifyColumn(String _sname, XPropertySet _xColPropertySet) + { + try + { + if (this.columncontainer.size() > 0) + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + if (oColumnDescriptor.Name.equals(_sname)) + { + oColumnDescriptor.xColPropertySet = _xColPropertySet; + oColumnDescriptor.Name = (String) _xColPropertySet.getPropertyValue(PropertyNames.PROPERTY_NAME); + columncontainer.remove(i); + columncontainer.add(i, oColumnDescriptor); + return true; + } + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return false; + } + + public void dropColumnbyName(String _sname) + { + try + { + if (columncontainer.size() > 0) + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + if (oColumnDescriptor != null) + { + if (oColumnDescriptor.Name.equals(_sname)) + { + columncontainer.remove(i); + } + } + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private String[] getColumnNames() + { + if (columncontainer.size() > 0) + { + try + { + String[] fieldnames = new String[columncontainer.size()]; + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + fieldnames[i] = oColumnDescriptor.Name; + } + return fieldnames; + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + } + return new String[] + { + }; + } + + private boolean hasByName(String _fieldname) + { + try + { + if (columncontainer.size() > 0) + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + if (oColumnDescriptor.Name.equals(_fieldname)) + { + return true; + } + } + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + return false; + } + + private ColumnDescriptor getColumnDescriptorByName(String _fieldname) + { + try + { + if (this.columncontainer.size() > 0) + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + if (oColumnDescriptor.Name.equals(_fieldname)) + { + return oColumnDescriptor; + } + } + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + return null; + } + + public XPropertySet getByName(String _fieldname) + { + ColumnDescriptor oColumnDescriptor = getColumnDescriptorByName(_fieldname); + if (oColumnDescriptor != null) + { + return oColumnDescriptor.xColPropertySet; + } + else + { + return null; + } + } + + private XPropertySet getByIndex(int _index) + { + try + { + if (columncontainer.size() > _index) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(_index); + return oColumnDescriptor.xColPropertySet; + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + return null; + } + + public XPropertySet clonePropertySet(String _snewname, XPropertySet _xnewPropertySet) + { + XPropertySet xRetPropertySet = xColumnDataDescriptorFactory.createDataDescriptor(); + try + { + if (hasByName(_snewname)) + { + Object oColumn = getByName(_snewname); + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, oColumn); + Property[] aColProperties = xPropertySet.getPropertySetInfo().getProperties(); + for (int i = 0; i < aColProperties.length; i++) + { + String sPropName = aColProperties[i].Name; + Object oColValue = _xnewPropertySet.getPropertyValue(sPropName); + xRetPropertySet.setPropertyValue(sPropName, oColValue); + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return xRetPropertySet; + } + + public boolean addColumn(PropertyValue[] _aNewPropertyValues) + { + try + { + String sname = (String) Properties.getPropertyValue(_aNewPropertyValues, PropertyNames.PROPERTY_NAME); + if (!hasByName(sname)) + { + ColumnPropertySet oPropertySet = new ColumnPropertySet(oTypeInspector, xColumnDataDescriptorFactory.createDataDescriptor()); + oPropertySet.assignPropertyValues(_aNewPropertyValues, true); + ColumnDescriptor oColumnDescriptor = new ColumnDescriptor(oPropertySet.xPropertySet, sname); + this.columncontainer.add(oColumnDescriptor); + return true; + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return false; + } + + public boolean moveColumn(int _nOldIndex, int _nNewIndex) + { + try + { + ColumnDescriptor oColumnDescriptor = this.columncontainer.get(_nOldIndex); + this.columncontainer.remove(_nOldIndex); + columncontainer.add(_nNewIndex, oColumnDescriptor); + return true; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return false; + } + } + + + + private XPropertySet addPrimaryKeyColumn(String _columnname) + { + try + { + if (!hasByName(_columnname)) + { + try + { + XPropertySet xColPropertySet = xColumnDataDescriptorFactory.createDataDescriptor(); + IDFieldName = Desktop.getUniqueName(getColumnNames(), _columnname, PropertyNames.EMPTY_STRING); + xColPropertySet.setPropertyValue(PropertyNames.PROPERTY_NAME, IDFieldName); + + int nDataType = oTypeInspector.convertDataType(com.sun.star.sdbc.DataType.INTEGER); + xColPropertySet.setPropertyValue("Type", Integer.valueOf(nDataType)); + xColPropertySet.setPropertyValue("TypeName", oTypeInspector.getDefaultTypeName(nDataType, null)); + ColumnDescriptor oColumnDescriptor = new ColumnDescriptor(xColPropertySet, IDFieldName); + this.columncontainer.add(0, oColumnDescriptor); + this.bIDFieldisInserted = true; + return xColPropertySet; + } + catch (RuntimeException e1) + { + e1.printStackTrace(System.err); + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } + + public String[] getNonBinaryFieldNames() + { + ArrayList<String> NonBinaryFieldNameVector = new ArrayList<String>(); + try + { + for (int i = 0; i < columncontainer.size(); i++) + { + ColumnDescriptor oColumnDescriptor = columncontainer.get(i); + XPropertySet xColPropertySet = getByName(oColumnDescriptor.Name); + int itype; + try + { + itype = AnyConverter.toInt(xColPropertySet.getPropertyValue("Type")); + if (!isBinaryDataType(itype)) + { + NonBinaryFieldNameVector.add(oColumnDescriptor.Name); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + String[] sbinaryfieldnames = new String[NonBinaryFieldNameVector.size()]; + NonBinaryFieldNameVector.toArray(sbinaryfieldnames); + return sbinaryfieldnames; + } + + public String getComposedTableName(String _scatalogname, String _sschemaname, String _stablename) + { + ComposedTableName = new CommandName(this, _scatalogname, _sschemaname, _stablename, false); + return ComposedTableName.getComposedName(); + } + + public String getComposedTableName() + { + if (ComposedTableName != null) + { + return this.ComposedTableName.getComposedName(); + } + else + { + return null; + } + } + + /* (non-Javadoc) + * @see com.sun.star.container.XContainerListener#elementInserted(com.sun.star.container.ContainerEvent) + */ + public void elementInserted(ContainerEvent arg0) + { + try + { + XPropertySet xTablePropertySet = UnoRuntime.queryInterface(XPropertySet.class, arg0.Element); + String stablename = AnyConverter.toString(xTablePropertySet.getPropertyValue(PropertyNames.PROPERTY_NAME)); + String sschemaname = AnyConverter.toString(xPropTableDataDescriptor.getPropertyValue("SchemaName")); + String scatalogname = AnyConverter.toString(xPropTableDataDescriptor.getPropertyValue("CatalogName")); + ComposedTableName = new CommandName(this, scatalogname, sschemaname, stablename, false); + appendTableNameToFilter(ComposedTableName.getComposedName()); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + /* (non-Javadoc) + * @see com.sun.star.container.XContainerListener#elementRemoved(com.sun.star.container.ContainerEvent) + */ + public void elementRemoved(ContainerEvent arg0) + { + } + + /* (non-Javadoc) + * @see com.sun.star.container.XContainerListener#elementReplaced(com.sun.star.container.ContainerEvent) + */ + public void elementReplaced(ContainerEvent arg0) + { + } + + /* (non-Javadoc) + * @see com.sun.star.lang.XEventListener#disposing(com.sun.star.lang.EventObject) + */ + public void disposing(EventObject arg0) + { + } + + private boolean appendTableNameToFilter(String _scomposedtablename) + { + boolean bhastoinsert = true; + for (int i = 0; i < sTableFilters.length; i++) + { + if (sTableFilters[i].compareTo("%") > -1) + { + if (sTableFilters[i].endsWith("." + _scomposedtablename)) + { + bhastoinsert = false; + } + else if (sTableFilters[i].length() == 1) + { + bhastoinsert = false; + } + } + else if (sTableFilters[i].equals(_scomposedtablename)) + { + bhastoinsert = false; + } + if (!bhastoinsert) + { + break; + } + } + if (bhastoinsert) + { + String[] sNewTableFilters = new String[sTableFilters.length + 1]; + System.arraycopy(sTableFilters, 0, sNewTableFilters, 0, sTableFilters.length); + sNewTableFilters[sTableFilters.length] = _scomposedtablename; + sTableFilters = sNewTableFilters; + try + { + getDataSourcePropertySet().setPropertyValue("TableFilter", sTableFilters); + } + catch (Exception e) + { + e.printStackTrace(System.err); + bhastoinsert = false; + } + } + return bhastoinsert; + } +} + diff --git a/wizards/com/sun/star/wizards/db/TypeInspector.java b/wizards/com/sun/star/wizards/db/TypeInspector.java new file mode 100644 index 000000000..831378e96 --- /dev/null +++ b/wizards/com/sun/star/wizards/db/TypeInspector.java @@ -0,0 +1,367 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.db; + +import java.util.ArrayList; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.sdbc.ColumnValue; +import com.sun.star.sdbc.DataType; +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbc.XResultSet; +import com.sun.star.sdbc.XRow; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; + +public class TypeInspector +{ + + private String[] sDataTypeNames; + private int[] nDataTypeInfos; + private int[] nPrecisionInfos; + private int[] nNullableInfos; + private boolean[] bisAutoIncrementableInfos; + private int[] nMinScaleInfos; + private int[] nMaxScaleInfos; + private final int[] nNumericFallBackList = new int[] + { + DataType.INTEGER, DataType.FLOAT, DataType.REAL, DataType.DOUBLE, DataType.NUMERIC, DataType.DECIMAL + }; + static final int INVALID = 999999; + + public TypeInspector(XResultSet _xResultSet) + { + try + { + ArrayList<String> aTypeNameVector = new ArrayList<String>(); + ArrayList<Integer> aTypeVector = new ArrayList<Integer>(); + ArrayList<Integer> aNullableVector = new ArrayList<Integer>(); + ArrayList<Boolean> aAutoIncrementVector = new ArrayList<Boolean>(); + ArrayList<Integer> aPrecisionVector = new ArrayList<Integer>(); + ArrayList<Integer> aMinScaleVector = new ArrayList<Integer>(); + ArrayList<Integer> aMaxScaleVector = new ArrayList<Integer>(); + XRow xRow = UnoRuntime.queryInterface(XRow.class, _xResultSet); + while (_xResultSet.next()) + { + aTypeNameVector.add(xRow.getString(1)); + aTypeVector.add(Integer.valueOf(xRow.getShort(2))); + aPrecisionVector.add(Integer.valueOf(xRow.getInt(3))); + aNullableVector.add(Integer.valueOf(xRow.getShort(7))); + aAutoIncrementVector.add(Boolean.valueOf(xRow.getBoolean(12))); + aMinScaleVector.add(Integer.valueOf(xRow.getShort(14))); + aMaxScaleVector.add(Integer.valueOf(xRow.getShort(15))); + + } + sDataTypeNames = new String[aTypeNameVector.size()]; + aTypeNameVector.toArray(sDataTypeNames); + nDataTypeInfos = JavaTools.IntegerTointList(aTypeVector); + nNullableInfos = JavaTools.IntegerTointList(aNullableVector); + bisAutoIncrementableInfos = JavaTools.BooleanTobooleanList(aAutoIncrementVector); + nPrecisionInfos = JavaTools.IntegerTointList(aPrecisionVector); + nMinScaleInfos = JavaTools.IntegerTointList(aMinScaleVector); + nMaxScaleInfos = JavaTools.IntegerTointList(aMaxScaleVector); + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + } + + public int getScale(XPropertySet _xColPropertySet) + { + try + { + int i = getDataTypeIndex(_xColPropertySet, false); + int nScale = AnyConverter.toInt(_xColPropertySet.getPropertyValue("Scale")); + if (i == -1) + { + return nScale; + } + if (nScale > nMaxScaleInfos[i]) + { + return nMaxScaleInfos[i]; + } + else if (nScale < nMinScaleInfos[i]) + { + return nMinScaleInfos[i]; + } + else + { + return nScale; + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + return 0; + } + } + + public int getNullability(XPropertySet _xColPropertySet, int _nNullable) + { + int i = getDataTypeIndex(_xColPropertySet, false); + if (i == -1) + { + return ColumnValue.NO_NULLS; + } + if (_nNullable == ColumnValue.NULLABLE) + { + return nNullableInfos[i]; //probably nullability is not allowed + } + return _nNullable; + } + + + + public int isNullable(XPropertySet _xColPropertySet) + { + int i = getDataTypeIndex(_xColPropertySet, false); + if (i > -1) + { + return nNullableInfos[i]; + } + else + { + return ColumnValue.NO_NULLS; + } + } + + private int getDataTypeIndex(XPropertySet _xColPropertySet, boolean _bCheckNumericAttributes) + { + try + { + int nPrecision = -1; + int nScale = -1; + int nDataType = AnyConverter.toInt(_xColPropertySet.getPropertyValue("Type")); + String sTypeName = AnyConverter.toString(_xColPropertySet.getPropertyValue("TypeName")); + if (_bCheckNumericAttributes) + { + nPrecision = AnyConverter.toInt(_xColPropertySet.getPropertyValue("Precision")); + nScale = AnyConverter.toInt(_xColPropertySet.getPropertyValue("Scale")); + } + boolean bleaveloop = false; + int startindex = 0; + while (!bleaveloop) + { + int i = JavaTools.FieldInIntTable(nDataTypeInfos, nDataType, startindex); + startindex = i + 1; + bleaveloop = (i < 0); + if (!bleaveloop && sTypeName.equals(sDataTypeNames[i])) + { + if (_bCheckNumericAttributes) + { + if (nPrecision <= nPrecisionInfos[i] && (nScale >= nMinScaleInfos[i]) && (nScale <= nMinScaleInfos[i]) ) + { + return i; + } + } + else + { + return i; + } + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return -1; + } + + private boolean supportsDataType(int _curDataType) + { + return (JavaTools.FieldInIntTable(nDataTypeInfos, _curDataType) > -1); + } + + private int getLastConversionFallbackDataType() + { + if (supportsDataType(DataType.VARCHAR)) + { + return DataType.VARCHAR; + } + else + { + return DataType.LONGVARCHAR; + } + } + + /** + * an empty string is returned when no appropriate Typename can be found + * finds the first TypeName of the passed datatype. + */ + public String getDefaultTypeName(int _curDataType, Integer precision) + { + String ret = PropertyNames.EMPTY_STRING; + for (int i = 0; i < nDataTypeInfos.length; i++) + { + if (nDataTypeInfos[i] == _curDataType) + { + if (precision == null || nPrecisionInfos[i] >= precision.intValue()) + { + ret = sDataTypeNames[i]; // this fits best ! + break; + } + else if (ret.length() == 0) + { + // in case we don't find anything else, we at return a typename + // with the correct class + ret = sDataTypeNames[i]; + } + } + } + return ret; + } + + public int getDataType(String _sTypeName) + { + int i = JavaTools.FieldInList(sDataTypeNames, _sTypeName); + if (i > -1) + { + return nDataTypeInfos[i]; + } + else + { + return getLastConversionFallbackDataType(); + } + } + + public int convertDataType(int _curDataType) + { + int retDataType = _curDataType; + if (!supportsDataType(_curDataType)) + { + switch (_curDataType) + { + case DataType.BIT: + retDataType = convertDataType(DataType.BOOLEAN); + break; + case DataType.BOOLEAN: + retDataType = convertDataType(DataType.BIT); + break; + case DataType.TINYINT: + retDataType = convertDataType(DataType.SMALLINT); + break; + case DataType.SMALLINT: + retDataType = convertDataType(DataType.INTEGER); + break; + case DataType.INTEGER: + retDataType = convertDataType(DataType.FLOAT); + break; + case DataType.FLOAT: + retDataType = convertDataType(DataType.REAL); + break; + case DataType.DATE: + case DataType.TIME: + retDataType = convertDataType(DataType.TIMESTAMP); + break; + case DataType.TIMESTAMP: + case DataType.REAL: + case DataType.BIGINT: + retDataType = convertDataType(DataType.DOUBLE); + break; + case DataType.DOUBLE: + retDataType = convertDataType(DataType.NUMERIC); + break; + case DataType.NUMERIC: + retDataType = convertDataType(DataType.DECIMAL); + break; + case DataType.DECIMAL: + if (supportsDataType(DataType.DOUBLE)) + { + retDataType = convertDataType(DataType.DOUBLE); + } + else if (supportsDataType(DataType.NUMERIC)) + { + retDataType = DataType.NUMERIC; + } + else + { + retDataType = getLastConversionFallbackDataType(); + } + break; + case DataType.VARCHAR: + retDataType = getLastConversionFallbackDataType(); + break; + default: + retDataType = getLastConversionFallbackDataType(); + } + } + return retDataType; + } + + public int getAutoIncrementIndex(XPropertySet _xColPropertySet) + { + try + { + boolean bleaveloop = false; + int startindex = 0; + int curDataType = ((Integer) _xColPropertySet.getPropertyValue("Type")).intValue(); + while (!bleaveloop) + { + int i = JavaTools.FieldInIntTable(nDataTypeInfos, curDataType, startindex); + startindex = i + 1; + bleaveloop = (i == -1); + if (!bleaveloop && bisAutoIncrementableInfos[i]) + { + return nDataTypeInfos[i]; + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return INVALID; + + } + + public boolean isAutoIncrementable(XPropertySet _xColPropertySet) + { + return (getAutoIncrementIndex(_xColPropertySet) != INVALID); + } + + /** Do we have a datatype that supports AutoIncrementation? + */ + public boolean isAutoIncrementationSupported() + { + for (int n = 0; n < this.nNumericFallBackList.length; n++) + { + int nDataType = nNumericFallBackList[n]; + boolean bleaveloop = false; + int startindex = 0; + while (!bleaveloop) + { + int i = JavaTools.FieldInIntTable(nDataTypeInfos, nDataType, startindex); + bleaveloop = (i < 0); + if (!bleaveloop) + { + if (this.bisAutoIncrementableInfos[i]) + { + return true; + } + startindex = i + 1; + } + startindex = i + 1; + } + } + return false; + } +} diff --git a/wizards/com/sun/star/wizards/document/Control.java b/wizards/com/sun/star/wizards/document/Control.java new file mode 100644 index 000000000..5731aa7cf --- /dev/null +++ b/wizards/com/sun/star/wizards/document/Control.java @@ -0,0 +1,346 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XLayoutConstrains; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.wizards.common.*; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.AnyConverter; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.util.Date; +import com.sun.star.util.Time; + +public class Control extends Shape +{ + + XControlModel xControlModel; + private XControl xControl; + public XPropertySet xPropertySet; + XWindowPeer xWindowPeer; + private static final int SOMAXTEXTSIZE = 50; + private int icontroltype; + private XNameContainer xFormName; + private static final int IIMGFIELDWIDTH = 3000; + + public Control() + { + } + + public Control(FormHandler _oFormHandler, String _sServiceName, Point _aPoint) + { + super(_oFormHandler, _sServiceName, _aPoint, null); + } + + public Control(FormHandler _oFormHandler, XNameContainer _xFormName, int _icontroltype, String _FieldName, Point _aPoint, Size _aSize) + { + super(_oFormHandler, _aPoint, _aSize); + xFormName = _xFormName; + createControl(_icontroltype, null, _FieldName); + } + + public Control(FormHandler _oFormHandler, int _icontroltype, Point _aPoint, Size _aSize) + { + super(_oFormHandler, _aPoint, _aSize); + createControl(_icontroltype, null, null); + } + + private void createControl(int _icontroltype, XShapes _xGroupShapes, String _FieldName) + { + try + { + icontroltype = _icontroltype; + String sServiceName = oFormHandler.sModelServices[icontroltype]; + Object oControlModel = oFormHandler.xMSFDoc.createInstance(sServiceName); + xControlModel = UnoRuntime.queryInterface( XControlModel.class, oControlModel ); + xPropertySet = UnoRuntime.queryInterface( XPropertySet.class, oControlModel ); + + XPropertySetInfo xPSI = xPropertySet.getPropertySetInfo(); + if ( xPSI.hasPropertyByName( "MouseWheelBehavior" ) ) + xPropertySet.setPropertyValue( "MouseWheelBehavior", Short.valueOf( com.sun.star.awt.MouseWheelBehavior.SCROLL_DISABLED ) ); + + insertControlInContainer(_FieldName); + xControlShape.setControl(xControlModel); + if (_xGroupShapes == null) + { + oFormHandler.xDrawPage.add(xShape); + } + else + { + _xGroupShapes.add(xShape); + } + xControl = oFormHandler.xControlAccess.getControl(xControlModel); + UnoRuntime.queryInterface( XPropertySet.class, xControl ); + xWindowPeer = xControl.getPeer(); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void insertControlInContainer(String _fieldname) + { + try + { + if (xFormName != null) + { + XNameAccess xNameAccess = UnoRuntime.queryInterface(XNameAccess.class, xFormName); + String sControlName = Desktop.getUniqueName(xNameAccess, getControlName(_fieldname)); + xPropertySet.setPropertyValue(PropertyNames.PROPERTY_NAME, sControlName); + xFormName.insertByName(sControlName, xControlModel); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private String getControlName(String _fieldname) + { + String controlname = PropertyNames.EMPTY_STRING; + switch (getControlType()) + { + case FormHandler.SOLABEL: + controlname = "lbl" + _fieldname; + break; + case FormHandler.SOTEXTBOX: + controlname = "txt" + _fieldname; + break; + case FormHandler.SOCHECKBOX: + controlname = "chk" + _fieldname; + break; + case FormHandler.SODATECONTROL: + controlname = "dat" + _fieldname; + break; + case FormHandler.SOTIMECONTROL: + controlname = "tim" + _fieldname; + break; + case FormHandler.SONUMERICCONTROL: + controlname = "fmt" + _fieldname; + break; + case FormHandler.SOGRIDCONTROL: + controlname = "grd" + _fieldname; + break; + case FormHandler.SOIMAGECONTROL: + controlname = "img" + _fieldname; + break; + default: + controlname = "ctrl" + _fieldname; + } + return controlname; + } + + public int getPreferredWidth(String sText) + { + Size aPeerSize = getPreferredSize(sText); + return ((aPeerSize.Width + 10) * oFormHandler.getXPixelFactor()); + } + + public int getPreferredHeight(String sText) + { + Size aPeerSize = getPreferredSize(sText); + if (getControlType() == FormHandler.SOCHECKBOX) + { + return (aPeerSize.Height * oFormHandler.getXPixelFactor()); + } + else + { + return ((aPeerSize.Height + 2) * oFormHandler.getXPixelFactor()); + } + } + + public int getPreferredWidth() + { + if (getControlType() == FormHandler.SOIMAGECONTROL) + { + return IIMGFIELDWIDTH; + } + else + { + Size aPeerSize = getPeerSize(); + int nWidth; + if (aPeerSize == null) + nWidth = 0; + else + nWidth = aPeerSize.Width; + + // We increase the preferred Width a bit so that the control does not become too small + // when we change the border from "3D" to "Flat" + if (getControlType() == FormHandler.SOCHECKBOX) + { + return nWidth * oFormHandler.getXPixelFactor(); + } + else + { + return (nWidth * oFormHandler.getXPixelFactor()) + 200; + } + } + } + + public int getPreferredHeight() + { + if (getControlType() == FormHandler.SOIMAGECONTROL) + { + return 2000; + } + else + { + Size aPeerSize = getPeerSize(); + int nHeight; + if (aPeerSize == null) + nHeight = 0; + else + nHeight = aPeerSize.Height; + + // We increase the preferred Height a bit so that the control does not become too small + // when we change the border from "3D" to "Flat" + return ((nHeight + 1) * oFormHandler.getYPixelFactor()); + } + } + + private Size getPreferredSize(String sText) + { + try + { + if (xPropertySet.getPropertySetInfo().hasPropertyByName("Text")) + { + xPropertySet.setPropertyValue("Text", sText); + } + else if (xPropertySet.getPropertySetInfo().hasPropertyByName(PropertyNames.PROPERTY_LABEL)) + { + xPropertySet.setPropertyValue(PropertyNames.PROPERTY_LABEL, sText); + } + else + { + throw new IllegalArgumentException(); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return getPeer().getPreferredSize(); + } + + public void setPropertyValue(String _sPropertyName, Object _aPropertyValue) throws Exception + { + if (xPropertySet.getPropertySetInfo().hasPropertyByName(_sPropertyName)) + { + xPropertySet.setPropertyValue(_sPropertyName, _aPropertyValue); + } + } + + /** the peer should be retrieved every time before it is used because it + * might be disposed otherwise + */ + private XLayoutConstrains getPeer() + { + return UnoRuntime.queryInterface(XLayoutConstrains.class, xControl.getPeer()); + } + + private Size getPeerSize() + { + try + { + Size aPreferredSize = null; + double dblEffMax = 0; + if (xPropertySet.getPropertySetInfo().hasPropertyByName("EffectiveMax")) + { + if (xPropertySet.getPropertyValue("EffectiveMax") != com.sun.star.uno.Any.VOID) + { + dblEffMax = AnyConverter.toDouble(xPropertySet.getPropertyValue("EffectiveMax")); + } + if (dblEffMax == 0) + { + // This is relevant for decimal fields + xPropertySet.setPropertyValue("EffectiveValue", new Double(99999)); + } + else + { + xPropertySet.setPropertyValue("EffectiveValue", new Double(dblEffMax)); //new Double(100000.2)); + } + aPreferredSize = getPeer().getPreferredSize(); + xPropertySet.setPropertyValue("EffectiveValue", com.sun.star.uno.Any.VOID); + } + else if (getControlType() == FormHandler.SOCHECKBOX) + { + aPreferredSize = getPeer().getPreferredSize(); + } + else if (getControlType() == FormHandler.SODATECONTROL) + { + Date d = new Date(); + d.Day = 30; + d.Month = 12; + d.Year = 9999; + xPropertySet.setPropertyValue("Date", d); + aPreferredSize = getPeer().getPreferredSize(); + xPropertySet.setPropertyValue("Date", com.sun.star.uno.Any.VOID); + } + else if (getControlType() == FormHandler.SOTIMECONTROL) + { + Time t = new Time(); + t.NanoSeconds = 999999999; + t.Seconds = 59; + t.Minutes = 59; + t.Hours = 22; + xPropertySet.setPropertyValue("Time", t); + aPreferredSize = getPeer().getPreferredSize(); + xPropertySet.setPropertyValue("Time", com.sun.star.uno.Any.VOID); + } + else + { + String stext; + short iTextLength = AnyConverter.toShort(xPropertySet.getPropertyValue("MaxTextLen")); + if (iTextLength < SOMAXTEXTSIZE) + { + stext = FormHandler.SOSIZETEXT.substring(0, SOMAXTEXTSIZE); + } + else + { + stext = FormHandler.SOSIZETEXT.substring(0, iTextLength); + } + xPropertySet.setPropertyValue("Text", stext); + aPreferredSize = getPeer().getPreferredSize(); + xPropertySet.setPropertyValue("Text", PropertyNames.EMPTY_STRING); + } + return aPreferredSize; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return null; + } + } + + public int getControlType() + { + return icontroltype; + } +} diff --git a/wizards/com/sun/star/wizards/document/DatabaseControl.java b/wizards/com/sun/star/wizards/document/DatabaseControl.java new file mode 100644 index 000000000..a90cc849f --- /dev/null +++ b/wizards/com/sun/star/wizards/document/DatabaseControl.java @@ -0,0 +1,208 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.container.XNameContainer; +import com.sun.star.sdbc.DataType; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.FieldColumn; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class DatabaseControl extends Control +{ + + private int m_nFieldType; + + public DatabaseControl(GridControl _oGridControl, FieldColumn _curfieldcolumn) + { + super(); + if (_curfieldcolumn.getFieldType() != DataType.TIMESTAMP) + { + createGridColumn(_oGridControl, _curfieldcolumn, _curfieldcolumn.getFieldType(), _curfieldcolumn.getFieldTitle()); + } + } + + public DatabaseControl(GridControl _oGridControl, FieldColumn _curfieldcolumn, int _fieldtype, String _columntitle) + { + super(); + createGridColumn(_oGridControl, _curfieldcolumn, _fieldtype, _columntitle); + } + + private int getFieldType() + { + return m_nFieldType; + } + + private void createGridColumn(GridControl _oGridControl, FieldColumn _curfieldcolumn, int _fieldtype, String _columntitle) + { + try + { + m_nFieldType = _fieldtype; + String sFieldName = _curfieldcolumn.getFieldName(); + String sUniqueName = Desktop.getUniqueName(_oGridControl.xNameAccess, sFieldName); + + String sGridColumnName = getGridColumnName(); + XPropertySet xPropColumn = _oGridControl.xGridColumnFactory.createColumn(sGridColumnName); + xPropColumn.setPropertyValue(PropertyNames.PROPERTY_NAME, sUniqueName); + boolean bHidden = false; + if (_fieldtype == DataType.LONGVARBINARY) //TODO CONTROLType abfragen!!!!!! + { + bHidden = true; + } + xPropColumn.setPropertyValue("Hidden", Boolean.valueOf(bHidden)); + xPropColumn.setPropertyValue("DataField", sFieldName); + xPropColumn.setPropertyValue(PropertyNames.PROPERTY_LABEL, _columntitle); + xPropColumn.setPropertyValue(PropertyNames.PROPERTY_WIDTH, 0); // Width of column is adjusted to Columname + + XPropertySetInfo xPSI = xPropColumn.getPropertySetInfo(); + if ( xPSI.hasPropertyByName( "MouseWheelBehavior" ) ) + xPropColumn.setPropertyValue( "MouseWheelBehavior", Short.valueOf( com.sun.star.awt.MouseWheelBehavior.SCROLL_DISABLED ) ); + + setNumericLimits(); + _oGridControl.xNameContainer.insertByName(sFieldName, xPropColumn); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public DatabaseControl(FormHandler _oFormHandler, String _sServiceName, Point _aPoint) + { + super(_oFormHandler, _sServiceName, _aPoint); + } + + public DatabaseControl(FormHandler _oFormHandler, XNameContainer _xFormName, String _curFieldName, int _fieldtype, Point _aPoint) + { + super(_oFormHandler, _xFormName, _oFormHandler.getControlType(_fieldtype), _curFieldName, _aPoint, null); + try + { + m_nFieldType = _fieldtype; + Helper.setUnoPropertyValue(xControlModel, "DataField", _curFieldName); + setNumericLimits(); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private String getGridColumnName() + { + for (int i = 0; i < FormHandler.oControlData.length; i++) + { + if (FormHandler.oControlData[i].DataType == getFieldType()) + { + return FormHandler.oControlData[i].GridColumnName; + } + } + return PropertyNames.EMPTY_STRING; + } + + public int getControlHeight() + { + if (getControlType() == FormHandler.SOIMAGECONTROL) + { + return oFormHandler.getControlReferenceHeight() * 4; + } + else + { + if (getFieldType() == DataType.LONGVARCHAR) + { + return oFormHandler.getControlReferenceHeight() * 4; + } + else if (getControlType() == FormHandler.SOCHECKBOX) + { + return super.getPreferredHeight(); + } + } + return oFormHandler.getControlReferenceHeight(); + } + + public int getControlWidth() + { + if (getControlType() == FormHandler.SOIMAGECONTROL) + { + return 2 * getControlHeight(); + } + if (getFieldType() == DataType.LONGVARCHAR) + { + return 2 * getControlHeight(); + } + else + { + return getPreferredWidth(); + } + } + + private void setNumericLimits() + { + try + { + if (getControlType() == FormHandler.SONUMERICCONTROL) + { + xPropertySet.setPropertyValue("TreatAsNumber", Boolean.TRUE); + switch (getFieldType()) + { + case DataType.BIGINT: + xPropertySet.setPropertyValue("EffectiveMax", new Double(Long.MAX_VALUE)); + xPropertySet.setPropertyValue("EffectiveMin", new Double(Long.MIN_VALUE)); + break; + case DataType.INTEGER: + xPropertySet.setPropertyValue("EffectiveMax", new Double(Integer.MAX_VALUE)); + xPropertySet.setPropertyValue("EffectiveMin", new Double(Integer.MIN_VALUE)); + break; + case DataType.SMALLINT: + xPropertySet.setPropertyValue("EffectiveMax", new Double(Short.MAX_VALUE)); + xPropertySet.setPropertyValue("EffectiveMin", new Double(Short.MIN_VALUE)); + break; + case DataType.TINYINT: + xPropertySet.setPropertyValue("EffectiveMax", new Double(Byte.MAX_VALUE)); + xPropertySet.setPropertyValue("EffectiveMin", new Double(Byte.MIN_VALUE)); + break; + case DataType.FLOAT: + case DataType.REAL: + case DataType.DOUBLE: + case DataType.DECIMAL: + case DataType.NUMERIC: + break; + } + } + else if (getControlType() == FormHandler.SOIMAGECONTROL) + { + xPropertySet.setPropertyValue("ScaleMode", com.sun.star.awt.ImageScaleMode.ISOTROPIC); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + /** + * @return + */ +} diff --git a/wizards/com/sun/star/wizards/document/FormHandler.java b/wizards/com/sun/star/wizards/document/FormHandler.java new file mode 100644 index 000000000..6ff44ceb3 --- /dev/null +++ b/wizards/com/sun/star/wizards/document/FormHandler.java @@ -0,0 +1,447 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XDevice; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.NoSuchElementException; +import com.sun.star.container.XChild; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.view.XControlAccess; +import com.sun.star.wizards.common.*; + +import com.sun.star.sdbc.DataType; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.Exception; +import com.sun.star.uno.Type; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.XInterface; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XDrawPage; +import com.sun.star.drawing.XDrawPageSupplier; +import com.sun.star.drawing.XShape; +import com.sun.star.drawing.XShapeGrouper; +import com.sun.star.drawing.XShapes; +import com.sun.star.form.XFormsSupplier; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.container.XNamed; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class FormHandler +{ + private static final String CHECKBOX = "CheckBox"; + private static final String DATEFIELD = "DateField"; + private static final String FORMATTEDFIELD = "FormattedField"; + private static final String TEXTFIELD = "TextField"; + private static final String TIMEFIELD = "TimeField"; + + private XFormsSupplier xFormsSupplier; + public XMultiServiceFactory xMSFDoc; + public XMultiServiceFactory xMSF; + public XDrawPage xDrawPage; + public String[] sModelServices = new String[8]; + public static ControlData[] oControlData; + + public static final int SOLABEL = 0; + public static final int SOTEXTBOX = 1; + public static final int SOCHECKBOX = 2; + public static final int SODATECONTROL = 3; + public static final int SOTIMECONTROL = 4; + public static final int SONUMERICCONTROL = 5; + public static final int SOGRIDCONTROL = 6; + public static final int SOIMAGECONTROL = 7; + public static final int SODATETIMECONTROL = 8; + public static String SOSIZETEXT = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog."; + private int iXPixelFactor = -1; + private int iYPixelFactor = -1; + private int iXNirwanaPos = 50000; + private int iYNirwanaPos = 50000; + private int nLabelHeight = -1; + private int nDBRefHeight = -1; + private int BasicLabelDiffHeight = -1; + private XNameAccess xNamedForms; + XControlAccess xControlAccess; + XShapeGrouper xShapeGrouper; + + public static class ControlData + { + int DataType; + private int ControlType; + String GridColumnName; + } + + /** Creates a new instance of FormHandler */ + public FormHandler(XMultiServiceFactory _xMSF, XTextDocument xTextDocument) + { + this.xMSF = _xMSF; + XDrawPageSupplier xDrawPageSupplier = UnoRuntime.queryInterface(XDrawPageSupplier.class, xTextDocument); + xDrawPage = xDrawPageSupplier.getDrawPage(); + xFormsSupplier = UnoRuntime.queryInterface(XFormsSupplier.class, xDrawPage); + xShapeGrouper = UnoRuntime.queryInterface(XShapeGrouper.class, xDrawPage); + xControlAccess = UnoRuntime.queryInterface(XControlAccess.class, xTextDocument.getCurrentController()); + xMSFDoc = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument); + sModelServices[SOLABEL] = "com.sun.star.form.component.FixedText"; + sModelServices[SOTEXTBOX] = "com.sun.star.form.component.TextField"; + sModelServices[SOCHECKBOX] = "com.sun.star.form.component.CheckBox"; + sModelServices[SODATECONTROL] = "com.sun.star.form.component.DateField"; + sModelServices[SOTIMECONTROL] = "com.sun.star.form.component.TimeField"; + sModelServices[SONUMERICCONTROL] = "com.sun.star.form.component.FormattedField"; + sModelServices[SOGRIDCONTROL] = "com.sun.star.form.component.GridControl"; + sModelServices[SOIMAGECONTROL] = "com.sun.star.form.component.DatabaseImageControl"; + + oControlData = new ControlData[23]; + oControlData[0] = createControlData(DataType.BIT, SOCHECKBOX, CHECKBOX); + oControlData[1] = createControlData(DataType.BOOLEAN, SOCHECKBOX, CHECKBOX); + oControlData[2] = createControlData(DataType.TINYINT, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[3] = createControlData(DataType.SMALLINT, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[4] = createControlData(DataType.INTEGER, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[5] = createControlData(DataType.BIGINT, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[6] = createControlData(DataType.FLOAT, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[7] = createControlData(DataType.REAL, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[8] = createControlData(DataType.DOUBLE, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[9] = createControlData(DataType.NUMERIC, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[10] = createControlData(DataType.DECIMAL, SONUMERICCONTROL, FORMATTEDFIELD); + oControlData[11] = createControlData(DataType.CHAR, SOTEXTBOX, TEXTFIELD); + oControlData[12] = createControlData(DataType.VARCHAR, SOTEXTBOX, TEXTFIELD); + oControlData[13] = createControlData(DataType.LONGVARCHAR, SOTEXTBOX, TEXTFIELD); + oControlData[14] = createControlData(DataType.DATE, SODATECONTROL, DATEFIELD); + oControlData[15] = createControlData(DataType.TIME, SOTIMECONTROL, TIMEFIELD); + oControlData[16] = createControlData(DataType.TIMESTAMP, SODATECONTROL, TEXTFIELD); + oControlData[17] = createControlData(DataType.BINARY, SOIMAGECONTROL, TEXTFIELD); + oControlData[18] = createControlData(DataType.VARBINARY, SOIMAGECONTROL, TEXTFIELD); + oControlData[19] = createControlData(DataType.LONGVARBINARY, SOIMAGECONTROL, TEXTFIELD); + oControlData[20] = createControlData(DataType.BLOB, SOIMAGECONTROL, TEXTFIELD); + oControlData[21] = createControlData(DataType.CLOB, SOIMAGECONTROL, TEXTFIELD); + + oControlData[22] = createControlData(DataType.OTHER, SOIMAGECONTROL, TEXTFIELD); + } + + public int getControlType(int _fieldtype) + { + for (int i = 0; i < oControlData.length; i++) + { + if (oControlData[i].DataType == _fieldtype) + { + return oControlData[i].ControlType; + } + } + return -1; + } + + private void initializeBasicControlValues() + { + Control oLabelControl = new Control(this, SOLABEL, new Point(), new Size()); + XDevice xDevice = UnoRuntime.queryInterface(XDevice.class, oLabelControl.xWindowPeer); + iXPixelFactor = (int) (100000 / xDevice.getInfo().PixelPerMeterX); + iYPixelFactor = (int) (100000 / xDevice.getInfo().PixelPerMeterY); + + nLabelHeight = (oLabelControl.getPreferredHeight("The quick brown fox...") + 1); + Control oTextControl = new Control(this, SOTEXTBOX, new Point(), new Size()); + nDBRefHeight = (oTextControl.getPreferredHeight("The quick brown fox...") + 1); + BasicLabelDiffHeight = (nDBRefHeight - nLabelHeight) / 2; + xDrawPage.remove(oLabelControl.xShape); + xDrawPage.remove(oTextControl.xShape); + } + + private ControlData createControlData(int _datatype, int _controltype, String _gridcolumnname) + { + ControlData curControlData = new ControlData(); + curControlData.DataType = _datatype; + curControlData.ControlType = _controltype; + curControlData.GridColumnName = _gridcolumnname; + return curControlData; + } + + public XNameContainer getDocumentForms() + { + return xFormsSupplier.getForms(); + } + + public String getValueofHiddenControl(XNameAccess xNamedForm, String ControlName) + { + String value = ""; + try + { + if (xNamedForm.hasByName(ControlName)) + { + value = AnyConverter.toString(com.sun.star.wizards.common.Helper.getUnoPropertyValue(xNamedForm.getByName(ControlName), "HiddenValue")); + } + } + catch (Exception ex) + { + Logger.getLogger( FormHandler.class.getName() ).log( Level.SEVERE, null, ex ); + } + return value; + } + + public void insertHiddenControl(XNameAccess xNameAccess, XNameContainer xNamedForm, String ControlName, String ControlValue) + { + try + { + XInterface xHiddenControl; + if (xNameAccess.hasByName(ControlName)) + { + xHiddenControl = (XInterface) AnyConverter.toObject(new Type(XInterface.class), xNameAccess.getByName(ControlName)); + } + else + { + xHiddenControl = (XInterface) xMSFDoc.createInstance("com.sun.star.form.component.HiddenControl"); + xNamedForm.insertByName(ControlName, xHiddenControl); + } + Helper.setUnoPropertyValue(xHiddenControl, "HiddenValue", ControlValue); + } + catch (Exception ex) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private boolean hasFormByName(String _FormName) + { + XNameContainer xNamedFormContainer = getDocumentForms(); + xNamedForms = UnoRuntime.queryInterface(XNameAccess.class, xNamedFormContainer); + return xNamedForms.hasByName(_FormName); + } + + public void removeControlsofForm(String _FormName) + { + try + { + for (int i = xDrawPage.getCount() - 1; i >= 0; i--) + { + if (belongsToForm(xDrawPage.getByIndex(i), _FormName)) + { + XShape xShape = UnoRuntime.queryInterface(XShape.class, xDrawPage.getByIndex(i)); + xDrawPage.remove(xShape); + } + } + } + catch (Exception e) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + } + } + + public void removeElement( XNameContainer _parentContainer, String _formName ) + { + try + { + _parentContainer.removeByName( _formName ); + } + catch ( WrappedTargetException e ) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + } + catch( final NoSuchElementException e ) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + } + } + + private boolean belongsToForm(Object _oDrawPageElement, String _FormName) + { + XServiceInfo xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, _oDrawPageElement); + while (xServiceInfo.supportsService("com.sun.star.drawing.GroupShape")) + { + XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, _oDrawPageElement); + try + { + _oDrawPageElement = xShapes.getByIndex(0); + xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, _oDrawPageElement); + } + catch(final com.sun.star.uno.Exception e) + { + return false; + } + } + if (xServiceInfo.supportsService("com.sun.star.drawing.ControlShape")) + { + XControlShape xControlShape = UnoRuntime.queryInterface(XControlShape.class, _oDrawPageElement); + XControlModel xControlModel = xControlShape.getControl(); + xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, xControlShape.getControl()); + if (xServiceInfo.supportsService("com.sun.star.form.FormComponent")) + { + XChild xChild = UnoRuntime.queryInterface(XChild.class, xControlModel); + XNamed xNamed = UnoRuntime.queryInterface(XNamed.class, xChild.getParent()); + String sName = xNamed.getName(); + return _FormName.equals(sName); + } + } + return false; + } + + public XNameContainer insertFormbyName(String _FormName, XNameContainer _xNamedFormContainer) + { + try + { + Object oDBForm; + if (!hasFormByName(_FormName)) + { + oDBForm = xMSFDoc.createInstance("com.sun.star.form.component.Form"); + _xNamedFormContainer.insertByName(_FormName, oDBForm); + XNameContainer xNamedForm; + xNamedForm = UnoRuntime.queryInterface(XNameContainer.class, oDBForm); + return xNamedForm; + } + else + { + return getFormByName(_FormName); + } + } + catch (com.sun.star.uno.Exception e) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + return null; + } + } + + public XNameContainer insertFormbyName(String _FormName) + { + return insertFormbyName(_FormName, getDocumentForms()); + } + + private XNameContainer getFormByName(String _sname) + { + XNameContainer xNamedForm = null; + try + { + if (xNamedForms.hasByName(_sname)) + { + Object oDBForm = AnyConverter.toObject(new Type(XInterface.class), Helper.getUnoObjectbyName(xNamedForms, _sname)); + xNamedForm = UnoRuntime.queryInterface(XNameContainer.class, oDBForm); + } + } + catch (IllegalArgumentException e) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + } + return xNamedForm; + } + + public int getXPixelFactor() + { + if (iXPixelFactor == -1) + { + initializeBasicControlValues(); + } + return iXPixelFactor; + } + + public int getYPixelFactor() + { + if (iYPixelFactor == -1) + { + initializeBasicControlValues(); + } + return iYPixelFactor; + } + + // Note: as Shapes cannot be removed from the DrawPage without destroying + // the object we have to park them somewhere beyond the visible area of the page + public void moveShapesToNirwana(Control[] ControlList) + { + if (ControlList != null) + { + for (int i = 0; i < ControlList.length; i++) + { + if (ControlList[i] != null) + { + ControlList[i].setPosition(new Point(this.iXNirwanaPos, this.iYNirwanaPos)); + } + } + } + } + + /** + * By removing the shape the whole control is disposed too + * + */ + public void removeShape(XShape _xShape) + { + xDrawPage.remove(_xShape); + XComponent xComponent = UnoRuntime.queryInterface(XComponent.class, _xShape); + xComponent.dispose(); + } + + public XShape groupShapesTogether(XMultiServiceFactory _xMSF, XShape _xLabelShape, XShape _xControlShape) + { + try + { + Object oGroupShape = _xMSF.createInstance("com.sun.star.drawing.ShapeCollection"); + XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, oGroupShape); + xShapes.add(_xLabelShape); + xShapes.add(_xControlShape); + return this.xShapeGrouper.group(xShapes); + } + catch (Exception e) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + return null; + } + } + + public int getBasicLabelDiffHeight() + { + if (this.BasicLabelDiffHeight == -1) + { + initializeBasicControlValues(); + } + return BasicLabelDiffHeight; + } + + public int getControlReferenceHeight() + { + if (this.nDBRefHeight == -1) + { + initializeBasicControlValues(); + } + return nDBRefHeight; + } + + public int getLabelHeight() + { + if (this.nLabelHeight == -1) + { + initializeBasicControlValues(); + } + return nLabelHeight; + } + + public void setDrawObjectsCaptureMode(boolean _bCaptureObjects) + { + try + { + XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, this.xMSFDoc.createInstance("com.sun.star.text.DocumentSettings")); + xPropertySet.setPropertyValue("DoNotCaptureDrawObjsOnPage", Boolean.valueOf(!_bCaptureObjects)); + } + catch (Exception e) + { + Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e); + } + } +} diff --git a/wizards/com/sun/star/wizards/document/GridControl.java b/wizards/com/sun/star/wizards/document/GridControl.java new file mode 100644 index 000000000..79f35de33 --- /dev/null +++ b/wizards/com/sun/star/wizards/document/GridControl.java @@ -0,0 +1,90 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControlModel; +import com.sun.star.beans.XPropertySet; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.db.FieldColumn; +import com.sun.star.sdbc.*; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.form.XGridColumnFactory; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; + +public class GridControl extends Shape +{ + + public XNameContainer xNameContainer; + public XGridColumnFactory xGridColumnFactory; + public XPropertySet xPropertySet; + XNameAccess xNameAccess; + public XComponent xComponent; + + public GridControl(XMultiServiceFactory _xMSF, String _sname, FormHandler _oFormHandler, XNameContainer _xFormName, FieldColumn[] _fieldcolumns, Point _aPoint, Size _aSize) + { + super(_oFormHandler, _aPoint, _aSize); + try + { + Object oGridModel = oFormHandler.xMSFDoc.createInstance(oFormHandler.sModelServices[FormHandler.SOGRIDCONTROL]); + xNameContainer = UnoRuntime.queryInterface( XNameContainer.class, oGridModel ); + xNameAccess = UnoRuntime.queryInterface( XNameAccess.class, oGridModel ); + _xFormName.insertByName(_sname, oGridModel); + XControlModel xControlModel = UnoRuntime.queryInterface( XControlModel.class, oGridModel ); + // test if the interface was available + if (xControlModel == null) { + throw new Exception( + "Error: GridModel does not export XControlModel interface"); + } + + if (xControlShape == null) { + throw new Exception( + "Error: GridModel does not have a XControlShape"); + } + + xControlShape.setControl(xControlModel); + xPropertySet = UnoRuntime.queryInterface( XPropertySet.class, oGridModel ); + oFormHandler.xDrawPage.add(xShape); + xGridColumnFactory = UnoRuntime.queryInterface( XGridColumnFactory.class, oGridModel ); + xComponent = UnoRuntime.queryInterface( XComponent.class, oGridModel ); + + for (int i = 0; i < _fieldcolumns.length; i++) + { + FieldColumn curfieldcolumn = _fieldcolumns[i]; + if (curfieldcolumn.getFieldType() == DataType.TIMESTAMP) + { + new TimeStampControl(new Resource(_xMSF), this, curfieldcolumn); + } + else + { + new DatabaseControl(this, curfieldcolumn); + } + } + + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/document/OfficeDocument.java b/wizards/com/sun/star/wizards/document/OfficeDocument.java new file mode 100644 index 000000000..1868c1989 --- /dev/null +++ b/wizards/com/sun/star/wizards/document/OfficeDocument.java @@ -0,0 +1,229 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.common.*; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.WindowAttribute; +import com.sun.star.awt.WindowDescriptor; +import com.sun.star.awt.XToolkit; +import com.sun.star.awt.XWindow; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.sheet.XCellRangeData; +import com.sun.star.table.XCellRange; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.frame.XComponentLoader; +import com.sun.star.frame.XDesktop; +import com.sun.star.frame.XFrame; +import com.sun.star.frame.XFrames; +import com.sun.star.frame.XFramesSupplier; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XTerminateListener; +import com.sun.star.util.XCloseable; +import com.sun.star.util.XModifiable; + +public class OfficeDocument +{ + + public static void dispose(XMultiServiceFactory xMSF, XComponent xComponent) + { + try + { + if (xComponent != null) + { + XModifiable xModified = UnoRuntime.queryInterface(XModifiable.class, xComponent); + XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent); + XFrame xFrame = xModel.getCurrentController().getFrame(); + if (xModified.isModified()) + { + xModified.setModified(false); + } + Desktop.dispatchURL(xMSF, ".uno:CloseDoc", xFrame); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public static XFrame createNewFrame(XMultiServiceFactory xMSF, XTerminateListener listener) + { + return createNewFrame(xMSF, listener, "_blank"); + } + + private static XFrame createNewFrame(XMultiServiceFactory xMSF, XTerminateListener listener, String FrameName) + { + XFrame xFrame = null; + if (FrameName.equalsIgnoreCase("WIZARD_LIVE_PREVIEW")) + { + xFrame = createNewPreviewFrame(xMSF, listener); + } + else + { + XFrame xF = UnoRuntime.queryInterface(XFrame.class, Desktop.getDesktop(xMSF)); + xFrame = xF.findFrame(FrameName, 0); + if (listener != null) + { + XFramesSupplier xFS = UnoRuntime.queryInterface(XFramesSupplier.class, xF); + XFrames xFF = xFS.getFrames(); + xFF.remove(xFrame); + XDesktop xDesktop = UnoRuntime.queryInterface(XDesktop.class, xF); + xDesktop.addTerminateListener(listener); + } + } + return xFrame; + } + + private static XFrame createNewPreviewFrame(XMultiServiceFactory xMSF, XTerminateListener listener) + { + XFrame xFrame = null; + try + { + XToolkit xToolkit = UnoRuntime.queryInterface(XToolkit.class, xMSF.createInstance("com.sun.star.awt.Toolkit")); + + //describe the window and its properties + WindowDescriptor aDescriptor = new WindowDescriptor(); + aDescriptor.Type = com.sun.star.awt.WindowClass.TOP; + aDescriptor.WindowServiceName = "window"; + aDescriptor.ParentIndex = -1; + aDescriptor.Parent = null; + aDescriptor.Bounds = new Rectangle(10, 10, 640, 480); + aDescriptor.WindowAttributes = WindowAttribute.BORDER | + WindowAttribute.MOVEABLE | + WindowAttribute.SIZEABLE | + //WindowAttribute.CLOSEABLE | + VclWindowPeerAttribute.CLIPCHILDREN; + + //create a new blank container window + XWindowPeer xPeer = UnoRuntime.queryInterface(XWindowPeer.class, xToolkit.createWindow(aDescriptor)); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, xPeer); + + //define some further properties of the frame window + //if it's needed .-) + //xPeer->setBackground(...); + + //create new empty frame and set window on it + xFrame = UnoRuntime.queryInterface(XFrame.class, xMSF.createInstance("com.sun.star.frame.Frame")); + xFrame.initialize(xWindow); + + //from now this frame is usable ... + //and not part of the desktop tree. + //You are alone with him .-) + + if (listener != null) + { + Desktop.getDesktop(xMSF).addTerminateListener(listener); + } + } + catch (Exception e) + { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return xFrame; + + } + + public static Object load(XInterface xInterface, String sURL, String sFrame, PropertyValue[] xValues) + { + Object oDocument = null; + com.sun.star.frame.XComponentLoader xComponentLoader = null; + try + { + xComponentLoader = UnoRuntime.queryInterface(XComponentLoader.class, xInterface); + com.sun.star.lang.XComponent xComponent = xComponentLoader.loadComponentFromURL(sURL, sFrame, 0, xValues); + + XServiceInfo xComponentService = UnoRuntime.queryInterface(XServiceInfo.class, xComponent); + if (xComponentService.supportsService("com.sun.star.text.TextDocument")) + { + oDocument = UnoRuntime.queryInterface(XTextDocument.class, xComponent); //TODO: write if clauses for Calc, Impress and Draw + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return oDocument; + } + + public static boolean close(XComponent xComponent) + { + boolean bState = false; + XModel xModel = UnoRuntime.queryInterface(XModel.class, xComponent); + + if (xModel != null) + { + XCloseable xCloseable = UnoRuntime.queryInterface(XCloseable.class, xModel); + + if (xCloseable != null) + { + try + { + xCloseable.close(true); + bState = true; + } + catch (com.sun.star.util.CloseVetoException exCloseVeto) + { + System.out.println("could not close doc"); + bState = false; + } + } + else + { + XComponent xDisposeable = UnoRuntime.queryInterface(XComponent.class, xModel); + xDisposeable.dispose(); + bState = true; + } + } + return bState; + } + + public static void ArraytoCellRange(Object[][] datalist, Object oTable, int xpos, int ypos) + { + try + { + int rowcount = datalist.length; + if (rowcount > 0) + { + int colcount = datalist[0].length; + if (colcount > 0) + { + XCellRange xCellRange = UnoRuntime.queryInterface(XCellRange.class, oTable); + XCellRange xNewRange = xCellRange.getCellRangeByPosition(xpos, ypos, (colcount + xpos) - 1, (rowcount + ypos) - 1); + XCellRangeData xDataArray = UnoRuntime.queryInterface(XCellRangeData.class, xNewRange); + xDataArray.setDataArray(datalist); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + +} diff --git a/wizards/com/sun/star/wizards/document/OfficeDocument.py b/wizards/com/sun/star/wizards/document/OfficeDocument.py new file mode 100644 index 000000000..1483f902d --- /dev/null +++ b/wizards/com/sun/star/wizards/document/OfficeDocument.py @@ -0,0 +1,208 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback +from unohelper import systemPathToFileUrl, absolutize +from ..common.Desktop import Desktop +from ..common.SystemDialog import SystemDialog + +from com.sun.star.awt import WindowDescriptor +from com.sun.star.awt import Rectangle +from com.sun.star.awt.WindowClass import TOP +from com.sun.star.task import ErrorCodeIOException + +#Window Constants +com_sun_star_awt_WindowAttribute_BORDER \ + = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.BORDER" ) +com_sun_star_awt_WindowAttribute_SIZEABLE \ + = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.SIZEABLE" ) +com_sun_star_awt_WindowAttribute_MOVEABLE \ + = uno.getConstantByName( "com.sun.star.awt.WindowAttribute.MOVEABLE" ) +com_sun_star_awt_VclWindowPeerAttribute_CLIPCHILDREN \ + = uno.getConstantByName( + "com.sun.star.awt.VclWindowPeerAttribute.CLIPCHILDREN" ) + +class OfficeDocument(object): + '''Creates a new instance of OfficeDocument ''' + + def __init__(self, _xMSF): + self.xMSF = _xMSF + + @classmethod + def attachEventCall(self, xComponent, EventName, EventType, EventURL): + try: + oEventProperties = list(range(2)) + oEventProperties[0] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + oEventProperties[0].Name = "EventType" + oEventProperties[0].Value = EventType + # "Service", "StarBasic" + oEventProperties[1] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + oEventProperties[1].Name = "Script" #"URL"; + oEventProperties[1].Value = EventURL + uno.invoke(xComponent.Events, "replaceByName", + (EventName, uno.Any("[]com.sun.star.beans.PropertyValue", + tuple(oEventProperties)))) + except Exception: + traceback.print_exc() + + def dispose(self, xMSF, xComponent): + try: + if xComponent is not None: + xFrame = xComponent.CurrentController.Frame + if xComponent.isModified(): + xComponent.setModified(False) + + Desktop.dispatchURL(xMSF, ".uno:CloseDoc", xFrame) + + except Exception: + traceback.print_exc() + + @classmethod + def createNewFrame(self, xMSF, listener, FrameName="_blank"): + xFrame = None + if FrameName.lower() == "WIZARD_LIVE_PREVIEW".lower(): + xFrame = self.createNewPreviewFrame(xMSF, listener) + else: + xF = Desktop.getDesktop(xMSF) + xFrame = xF.findFrame(FrameName, 0) + if listener is not None: + xFF = xF.getFrames() + xFF.remove(xFrame) + xF.addTerminateListener(listener) + + return xFrame + + @classmethod + def createNewPreviewFrame(self, xMSF, listener): + xToolkit = None + try: + xToolkit = xMSF.createInstance("com.sun.star.awt.Toolkit") + except Exception: + # TODO Auto-generated catch block + traceback.print_exc() + + #describe the window and its properties + aDescriptor = WindowDescriptor() + aDescriptor.Type = TOP + aDescriptor.WindowServiceName = "window" + aDescriptor.ParentIndex = -1 + aDescriptor.Parent = None + aDescriptor.Bounds = Rectangle(10, 10, 640, 480) + + #Set Window Attributes + gnDefaultWindowAttributes = \ + com_sun_star_awt_WindowAttribute_BORDER + \ + com_sun_star_awt_WindowAttribute_MOVEABLE + \ + com_sun_star_awt_WindowAttribute_SIZEABLE + \ + com_sun_star_awt_VclWindowPeerAttribute_CLIPCHILDREN + + aDescriptor.WindowAttributes = gnDefaultWindowAttributes + #create a new blank container window + xPeer = None + try: + xPeer = xToolkit.createWindow(aDescriptor) + except Exception: + traceback.print_exc() + + #define some further properties of the frame window + #if it's needed .-) + #xPeer->setBackground(...); + #create new empty frame and set window on it + xFrame = None + try: + xFrame = xMSF.createInstance("com.sun.star.frame.Frame") + except Exception: + traceback.print_exc() + + xFrame.initialize(xPeer) + #from now this frame is usable ... + #and not part of the desktop tree. + #You are alone with him .-) + if listener is not None: + Desktop.getDesktop(xMSF).addTerminateListener(listener) + + return xFrame + + @classmethod + def load(self, xInterface, sURL, sFrame, xValues): + xComponent = None + try: + if not sURL.startswith("file://"): + sURL = systemPathToFileUrl(sURL) + xComponent = xInterface.loadComponentFromURL( + sURL, sFrame, 0, tuple(xValues)) + except Exception: + traceback.print_exc() + + return xComponent + + @classmethod + def store(self, xMSF, xComponent, StorePath, FilterName): + try: + if len(FilterName): + oStoreProperties = list(range(2)) + oStoreProperties[0] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + oStoreProperties[0].Name = "FilterName" + oStoreProperties[0].Value = FilterName + oStoreProperties[1] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + oStoreProperties[1].Name = "InteractionHandler" + oStoreProperties[1].Value = xMSF.createInstance( + "com.sun.star.comp.uui.UUIInteractionHandler") + else: + oStoreProperties = list(range(0)) + + StorePath = systemPathToFileUrl(StorePath) + sPath = StorePath[:(StorePath.rfind("/") + 1)] + sFile = StorePath[(StorePath.rfind("/") + 1):] + xComponent.storeToURL( + absolutize(sPath, sFile), tuple(oStoreProperties)) + return True + except ErrorCodeIOException: + #Throw this exception when trying to save a file + #which is already opened in Libreoffice + #TODO: handle it properly + return True + pass + except Exception: + traceback.print_exc() + return False + + def close(self, xComponent): + bState = False + if xComponent is not None: + try: + xComponent.close(True) + bState = True + except Exception: + print ("could not close doc") + bState = False + + else: + bState = True + + return bState + + def showMessageBox( + self, xMSF, windowServiceName, windowAttribute, MessageText): + + return SystemDialog.showMessageBox( + xMSF, windowServiceName, windowAttribute, MessageText) diff --git a/wizards/com/sun/star/wizards/document/Shape.java b/wizards/com/sun/star/wizards/document/Shape.java new file mode 100644 index 000000000..72c17d7f8 --- /dev/null +++ b/wizards/com/sun/star/wizards/document/Shape.java @@ -0,0 +1,131 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XShape; +import com.sun.star.drawing.XShapes; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.text.TextContentAnchorType; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Helper; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class Shape +{ + + public XShape xShape; + protected FormHandler oFormHandler; + public XServiceInfo xServiceInfo; + protected Point aPoint; + private Size aSize; + protected XControlShape xControlShape; + private XMultiServiceFactory xMSF; + XShapes xShapes; + + public Shape(FormHandler _oFormHandler, Point _aPoint, Size _aSize) + { + this.aPoint = _aPoint; + this.aSize = _aSize; + this.oFormHandler = _oFormHandler; + createShape("com.sun.star.drawing.ControlShape"); + } + + public Shape(FormHandler _oFormHandler, String _sServiceName, Point _aPoint, Size _aSize) + { + try + { + this.aPoint = _aPoint; + this.aSize = _aSize; + this.oFormHandler = _oFormHandler; + Object oShape = oFormHandler.xMSF.createInstance(_sServiceName); + xShapes = UnoRuntime.queryInterface(XShapes.class, oShape); + xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, oShape); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public Shape() + { + } + + private void createShape(String sServiceName) + { + try + { + xMSF = oFormHandler.xMSFDoc; + Object oShape = xMSF.createInstance(sServiceName); + xShape = UnoRuntime.queryInterface(XShape.class, oShape); + xShape.setPosition(aPoint); + if (aSize != null) + { + xShape.setSize(aSize); + } + else + { + xShape.setSize(new Size(1000, 100)); + } + Helper.setUnoPropertyValue(xShape, "AnchorType", TextContentAnchorType.AT_PARAGRAPH); + xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, xShape); + xControlShape = UnoRuntime.queryInterface(XControlShape.class, xShape); + + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public Size getSize() + { + return xShape.getSize(); + } + + public void setSize(Size _aSize) + { + try + { + xShape.setSize(_aSize); + } + catch (PropertyVetoException e) + { + e.printStackTrace(System.err); + } + } + + public Point getPosition() + { + return xShape.getPosition(); + } + + public void setPosition(Point _aPoint) + { + xShape.setPosition(_aPoint); + } +} diff --git a/wizards/com/sun/star/wizards/document/TimeStampControl.java b/wizards/com/sun/star/wizards/document/TimeStampControl.java new file mode 100644 index 000000000..0ce10a33c --- /dev/null +++ b/wizards/com/sun/star/wizards/document/TimeStampControl.java @@ -0,0 +1,111 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.document; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.beans.XPropertySet; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.db.FieldColumn; +import com.sun.star.wizards.ui.*; +import com.sun.star.sdbc.*; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.container.XNameContainer; +import com.sun.star.drawing.XControlShape; +import com.sun.star.drawing.XShapes; + +public class TimeStampControl extends DatabaseControl +{ + + private DatabaseControl oDateControl; + private DatabaseControl oTimeControl; + private Resource oResource; + private int nDBWidth; + + public TimeStampControl(Resource _oResource, FormHandler _oFormHandler, XNameContainer _xFormName, String _curFieldName, Point _aPoint) + { + super(_oFormHandler, "com.sun.star.drawing.ShapeCollection", _aPoint); + oResource = _oResource; + oDateControl = new DatabaseControl(oFormHandler, _xFormName, _curFieldName, DataType.DATE, aPoint); + int nDBHeight = oDateControl.getControlHeight(); + int nDateWidth = oDateControl.getPreferredWidth(); + oDateControl.setSize(new Size(nDateWidth, nDBHeight)); + Point aTimePoint = new Point(aPoint.X + 10 + nDateWidth, aPoint.Y); + oTimeControl = new DatabaseControl(oFormHandler, _xFormName, _curFieldName, DataType.TIME, aTimePoint); + int nTimeWidth = oTimeControl.getPreferredWidth(); + oTimeControl.setSize(new Size(nTimeWidth, nDBHeight)); + nDBWidth = nDateWidth + nTimeWidth + 10; + xShapes.add(oDateControl.xShape); + xShapes.add(oTimeControl.xShape); + xShape = _oFormHandler.xShapeGrouper.group(xShapes); + xShapes = UnoRuntime.queryInterface(XShapes.class, xShape); + } + + public XPropertySet getControlofGroupShapeByIndex(int _i) + { + try + { + if (_i < xShapes.getCount()) + { + Object oControl = xShapes.getByIndex(_i); + XControlShape xControlShape = UnoRuntime.queryInterface(XControlShape.class, oControl); + return UnoRuntime.queryInterface(XPropertySet.class, xControlShape.getControl()); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } + + public TimeStampControl(Resource _oResource, GridControl _oGridControl, FieldColumn _curfieldcolumn) + { + super(_oGridControl, _curfieldcolumn); + oResource = _oResource; + String sDateAppendix = oResource.getResText("RID_FORM_88"); + String sTimeAppendix = oResource.getResText("RID_FORM_89"); + oDateControl = new DatabaseControl(_oGridControl, _curfieldcolumn, DataType.DATE, _curfieldcolumn.getFieldTitle() + PropertyNames.SPACE + sDateAppendix); + oTimeControl = new DatabaseControl(_oGridControl, _curfieldcolumn, DataType.TIME, _curfieldcolumn.getFieldTitle() + PropertyNames.SPACE + sTimeAppendix); + } + + @Override + public void setPropertyValue(String _sPropertyName, Object _aPropertyValue) throws Exception + { + oDateControl.setPropertyValue(_sPropertyName, _aPropertyValue); + oTimeControl.setPropertyValue(_sPropertyName, _aPropertyValue); + } + + @Override + public int getPreferredWidth() + { + return nDBWidth; + } + + @Override + public int getControlType() + { + return FormHandler.SODATETIMECONTROL; + } +} + + + + + diff --git a/wizards/com/sun/star/wizards/document/__init__.py b/wizards/com/sun/star/wizards/document/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/document/__init__.py diff --git a/wizards/com/sun/star/wizards/fax/CGFax.py b/wizards/com/sun/star/wizards/fax/CGFax.py new file mode 100644 index 000000000..ff69cf134 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/CGFax.py @@ -0,0 +1,48 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.ConfigGroup import ConfigGroup + +class CGFax(ConfigGroup): + + def __init__(self): + + self.cp_Style = int() + self.cp_PrintCompanyLogo = bool() + self.cp_PrintDate = bool() + self.cp_PrintSubjectLine = bool() + self.cp_PrintSalutation = bool() + self.cp_PrintCommunicationType = bool() + self.cp_PrintGreeting = bool() + self.cp_PrintFooter = bool() + self.cp_CommunicationType = str() + self.cp_Salutation = str() + self.cp_Greeting = str() + self.cp_SenderAddressType = int() + self.cp_SenderCompanyName = str() + self.cp_SenderStreet = str() + self.cp_SenderPostCode = str() + self.cp_SenderState = str() + self.cp_SenderCity = str() + self.cp_SenderFax = str() + self.cp_ReceiverAddressType = int() + self.cp_Footer = str() + self.cp_FooterOnlySecondPage = bool() + self.cp_FooterPageNumbers = bool() + self.cp_CreationType = int() + self.cp_TemplateName = str() + self.cp_TemplatePath = str() diff --git a/wizards/com/sun/star/wizards/fax/CGFaxWizard.py b/wizards/com/sun/star/wizards/fax/CGFaxWizard.py new file mode 100644 index 000000000..30f211a84 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/CGFaxWizard.py @@ -0,0 +1,27 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .CGFax import CGFax +from ..common.ConfigGroup import ConfigGroup + +class CGFaxWizard(ConfigGroup): + + def __init__(self): + self.cp_FaxType = int() + self.cp_BusinessFax = CGFax() + self.cp_PrivateFax = CGFax() + diff --git a/wizards/com/sun/star/wizards/fax/CallWizard.py b/wizards/com/sun/star/wizards/fax/CallWizard.py new file mode 100644 index 000000000..ca222132f --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/CallWizard.py @@ -0,0 +1,75 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import unohelper +import traceback + +from .FaxWizardDialogImpl import FaxWizardDialogImpl, Desktop + +from com.sun.star.lang import XServiceInfo +from com.sun.star.task import XJobExecutor + +# pythonloader looks for a static g_ImplementationHelper variable +g_ImplementationHelper = unohelper.ImplementationHelper() +g_implName = "com.sun.star.wizards.fax.CallWizard" + +# implement a UNO component by deriving from the standard unohelper.Base class +# and from the interface(s) you want to implement. +class CallWizard(unohelper.Base, XJobExecutor, XServiceInfo): + def __init__(self, ctx): + # store the component context for later use + self.ctx = ctx + + def trigger(self, args): + try: + fw = FaxWizardDialogImpl(self.ctx.ServiceManager) + fw.startWizard(self.ctx.ServiceManager) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + @classmethod + def callRemote(self): + #Call the wizard remotely(see README) + try: + ConnectStr = \ + "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" + xLocMSF = Desktop.connect(ConnectStr) + lw = FaxWizardDialogImpl(xLocMSF) + lw.startWizard(xLocMSF) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + def getImplementationName(self): + return g_implName + + def supportsService(self, ServiceName): + return g_ImplementationHelper.supportsService(g_implName, ServiceName) + + def getSupportedServiceNames(self): + return g_ImplementationHelper.getSupportedServiceNames(g_implName) + +g_ImplementationHelper.addImplementation( \ + CallWizard, # UNO object class + g_implName, # implementation name + ("com.sun.star.task.Job",),) # list of implemented services + # (the only service) + +# vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/wizards/com/sun/star/wizards/fax/FaxDocument.py b/wizards/com/sun/star/wizards/fax/FaxDocument.py new file mode 100644 index 000000000..b695ffe55 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/FaxDocument.py @@ -0,0 +1,142 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..text.TextDocument import TextDocument, traceback, \ + TextFieldHandler, Configuration +from ..text.TextSectionHandler import TextSectionHandler + +from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK +from com.sun.star.style.ParagraphAdjust import CENTER +from com.sun.star.text.PageNumberType import CURRENT +from com.sun.star.style.NumberingType import ARABIC + +class FaxDocument(TextDocument): + + def __init__(self, xMSF, listener): + super(FaxDocument,self).__init__(xMSF, listener, None, + "WIZARD_LIVE_PREVIEW") + self.keepLogoFrame = True + self.keepTypeFrame = True + + def switchElement(self, sElement, bState): + try: + mySectionHandler = TextSectionHandler(self.xMSF, + self.xTextDocument) + oSection = \ + mySectionHandler.xTextDocument.TextSections.getByName(sElement) + oSection.IsVisible = bState + except Exception: + traceback.print_exc() + + def updateDateFields(self): + FH = TextFieldHandler( + self.xTextDocument, self.xTextDocument) + FH.updateDateFields() + + def switchFooter(self, sPageStyle, bState, bPageNumber, sText): + if self.xTextDocument is not None: + try: + self.xTextDocument.lockControllers() + xPageStyleCollection = \ + self.xTextDocument.StyleFamilies.getByName("PageStyles") + xPageStyle = xPageStyleCollection.getByName(sPageStyle) + + if bState: + xPageStyle.setPropertyValue("FooterIsOn", True) + xFooterText = xPageStyle.FooterText + xFooterText.String = sText + + if bPageNumber: + #Adding the Page Number + myCursor = xFooterText.Text.createTextCursor() + myCursor.gotoEnd(False) + xFooterText.insertControlCharacter(myCursor, + PARAGRAPH_BREAK, False) + myCursor.setPropertyValue("ParaAdjust", CENTER ) + + xPageNumberField = \ + self.xTextDocument.createInstance( + "com.sun.star.text.TextField.PageNumber") + xPageNumberField.setPropertyValue("SubType", CURRENT) + xPageNumberField.NumberingType = ARABIC + xFooterText.insertTextContent(xFooterText.End, + xPageNumberField, False) + else: + xPageStyle.FooterIsOn = False + + self.xTextDocument.unlockControllers() + except Exception: + self.xTextDocument.lockControllers() + traceback.print_exc() + + def hasElement(self, sElement): + if self.xTextDocument is not None: + mySectionHandler = TextSectionHandler(self.xMSF, + self.xTextDocument) + return mySectionHandler.hasTextSectionByName(sElement) + else: + return False + + def switchUserField(self, sFieldName, sNewContent, bState): + myFieldHandler = TextFieldHandler( self.xMSF, self.xTextDocument) + if bState: + myFieldHandler.changeUserFieldContent(sFieldName, sNewContent) + else: + myFieldHandler.changeUserFieldContent(sFieldName, "") + + def fillSenderWithUserData(self): + try: + myFieldHandler = TextFieldHandler(self.xTextDocument, + self.xTextDocument) + oUserDataAccess = Configuration.getConfigurationRoot( + self.xMSF, "org.openoffice.UserProfile/Data", False) + myFieldHandler.changeUserFieldContent( + "Company", oUserDataAccess.getByName("o")) + myFieldHandler.changeUserFieldContent( + "Street", oUserDataAccess.getByName("street")) + myFieldHandler.changeUserFieldContent( + "PostCode", oUserDataAccess.getByName("postalcode")) + myFieldHandler.changeUserFieldContent( + "State", oUserDataAccess.getByName("st")) + myFieldHandler.changeUserFieldContent( + "City", oUserDataAccess.getByName("l")) + myFieldHandler.changeUserFieldContent( + "Fax", oUserDataAccess.getByName("facsimiletelephonenumber")) + except Exception: + traceback.print_exc() + + def killEmptyUserFields(self): + myFieldHandler = TextFieldHandler( + self.xMSF, self.xTextDocument) + myFieldHandler.removeUserFieldByContent() + + def killEmptyFrames(self): + try: + if not self.keepLogoFrame: + xTF = self.getFrameByName("Company Logo", + self.xTextDocument) + if xTF is not None: + xTF.dispose() + + if not self.keepTypeFrame: + xTF = self.getFrameByName("Communication Type", + self.xTextDocument) + if xTF is not None: + xTF.dispose() + + except Exception: + traceback.print_exc() diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py new file mode 100644 index 000000000..6c8d4a40f --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialog.py @@ -0,0 +1,660 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .FaxWizardDialogResources import FaxWizardDialogResources +from .FaxWizardDialogConst import FaxWizardDialogConst, HIDMAIN, HID +from ..ui.WizardDialog import WizardDialog, uno, UIConsts, PropertyNames + +from com.sun.star.awt.FontUnderline import SINGLE + +class FaxWizardDialog(WizardDialog): + + def __init__(self, xmsf): + super(FaxWizardDialog,self).__init__(xmsf, HIDMAIN ) + + #Load Resources + self.resources = FaxWizardDialogResources() + + #set dialog properties... + self.setDialogProperties(True, 210, True, 104, 52, 1, 1, + self.resources.resFaxWizardDialog_title, 310) + + self.fontDescriptor4 = \ + uno.createUnoStruct('com.sun.star.awt.FontDescriptor') + self.fontDescriptor5 = \ + uno.createUnoStruct('com.sun.star.awt.FontDescriptor') + self.fontDescriptor4.Weight = 100 + self.fontDescriptor5.Weight = 150 + + def buildStep1(self): + self.optBusinessFax = self.insertRadioButton("optBusinessFax", + FaxWizardDialogConst.OPTBUSINESSFAX_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTBUSINESSFAX_HID, + self.resources.resoptBusinessFax_value, 97, 28, 1, 1, 184), + self) + self.lstBusinessStyle = self.insertListBox("lstBusinessStyle", + FaxWizardDialogConst.LSTBUSINESSSTYLE_ACTION_PERFORMED, + FaxWizardDialogConst.LSTBUSINESSSTYLE_ITEM_CHANGED, + ("Dropdown", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, FaxWizardDialogConst.LSTBUSINESSSTYLE_HID, + 180, 40, 1, 3, 74), self) + self.optPrivateFax = self.insertRadioButton("optPrivateFax", + FaxWizardDialogConst.OPTPRIVATEFAX_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTPRIVATEFAX_HID, + self.resources.resoptPrivateFax_value,97, 81, 1, 2, 184), self) + self.lstPrivateStyle = self.insertListBox("lstPrivateStyle", + FaxWizardDialogConst.LSTPRIVATESTYLE_ACTION_PERFORMED, + FaxWizardDialogConst.LSTPRIVATESTYLE_ITEM_CHANGED, + ("Dropdown", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, FaxWizardDialogConst.LSTPRIVATESTYLE_HID, + 180, 95, 1, 4, 74), self) + self.insertLabel("lblBusinessStyle", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblBusinessStyle_value, + 110, 42, 1, 32, 60)) + + self.insertLabel("lblTitle1", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 16, self.resources.reslblTitle1_value, + True, 91, 8, 1, 37, 212)) + self.insertLabel("lblPrivateStyle", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblPrivateStyle_value, 110, 95, 1, 50, 60)) + self.insertLabel("lblIntroduction", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (39, self.resources.reslblIntroduction_value, + True, 104, 145, 1, 55, 199)) + self.ImageControl3 = self.insertInfoImage(92, 145, 1) + + def buildStep2(self): + self.chkUseLogo = self.insertCheckBox("chkUseLogo", + FaxWizardDialogConst.CHKUSELOGO_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSELOGO_HID, + self.resources.reschkUseLogo_value, 97, 28, 0, 2, 5, 212), + self) + self.chkUseDate = self.insertCheckBox("chkUseDate", + FaxWizardDialogConst.CHKUSEDATE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSEDATE_HID, + self.resources.reschkUseDate_value, 97, 43, 0, 2, 6, 212), + self) + self.chkUseCommunicationType = self.insertCheckBox( + "chkUseCommunicationType", + FaxWizardDialogConst.CHKUSECOMMUNICATIONTYPE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSECOMMUNICATIONTYPE_HID, + self.resources.reschkUseCommunicationType_value, + 97, 57, 0, 2, 7, 100), self) + self.lstCommunicationType = self.insertComboBox( + "lstCommunicationType", + FaxWizardDialogConst.LSTCOMMUNICATIONTYPE_ACTION_PERFORMED, + FaxWizardDialogConst.LSTCOMMUNICATIONTYPE_ITEM_CHANGED, + FaxWizardDialogConst.LSTCOMMUNICATIONTYPE_TEXT_CHANGED, + ("Dropdown", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, FaxWizardDialogConst.LSTCOMMUNICATIONTYPE_HID, + 105, 68, 2, 8, 174), self) + self.chkUseSubject = self.insertCheckBox("chkUseSubject", + FaxWizardDialogConst.CHKUSESUBJECT_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSESUBJECT_HID, + self.resources.reschkUseSubject_value, 97, 87, 0, 2, 9, 212), + self) + self.chkUseSalutation = self.insertCheckBox("chkUseSalutation", + FaxWizardDialogConst.CHKUSESALUTATION_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSESALUTATION_HID, + self.resources.reschkUseSalutation_value, + 97, 102, 0, 2, 10, 100), self) + self.lstSalutation = self.insertComboBox("lstSalutation", + FaxWizardDialogConst.LSTSALUTATION_ACTION_PERFORMED, + FaxWizardDialogConst.LSTSALUTATION_ITEM_CHANGED, + FaxWizardDialogConst.LSTSALUTATION_TEXT_CHANGED, + ("Dropdown", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, FaxWizardDialogConst.LSTSALUTATION_HID, + 105, 113, 2, 11, 174), self) + self.chkUseGreeting = self.insertCheckBox("chkUseGreeting", + FaxWizardDialogConst.CHKUSEGREETING_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSEGREETING_HID, + self.resources.reschkUseGreeting_value, + 97, 132, 0, 2, 12, 100), self) + self.lstGreeting = self.insertComboBox("lstGreeting", + FaxWizardDialogConst.LSTGREETING_ACTION_PERFORMED, + FaxWizardDialogConst.LSTGREETING_ITEM_CHANGED, + FaxWizardDialogConst.LSTGREETING_TEXT_CHANGED, + ("Dropdown", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, FaxWizardDialogConst.LSTGREETING_HID, + 105, 143, 2, 13, 174), self) + self.chkUseFooter = self.insertCheckBox("chkUseFooter", + FaxWizardDialogConst.CHKUSEFOOTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKUSEFOOTER_HID, + self.resources.reschkUseFooter_value, 97, 163, + 0, 2, 14, 212), self) + self.insertLabel("lblTitle3", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 16, self.resources.reslblTitle3_value, + True, 91, 8, 2, 59, 212)) + + def buildStep3(self): + self.optSenderPlaceholder = self.insertRadioButton( + "optSenderPlaceholder", + FaxWizardDialogConst.OPTSENDERPLACEHOLDER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTSENDERPLACEHOLDER_HID, + self.resources.resoptSenderPlaceholder_value, + 104, 42, 3, 15, 149), self) + self.optSenderDefine = self.insertRadioButton("optSenderDefine", + FaxWizardDialogConst.OPTSENDERDEFINE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTSENDERDEFINE_HID, + self.resources.resoptSenderDefine_value, + 104, 54, 3, 16, 149), self) + self.txtSenderName = self.insertTextField("txtSenderName", + FaxWizardDialogConst.TXTSENDERNAME_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERNAME_HID, + 182, 67, 3, 17, 119), self) + self.txtSenderStreet = self.insertTextField("txtSenderStreet", + FaxWizardDialogConst.TXTSENDERSTREET_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERSTREET_HID, + 182, 81, 3, 18, 119), self) + self.txtSenderPostCode = self.insertTextField("txtSenderPostCode", + FaxWizardDialogConst.TXTSENDERPOSTCODE_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERPOSTCODE_HID, + 182, 95, 3, 19, 25), self) + self.txtSenderState = self.insertTextField("txtSenderState", + FaxWizardDialogConst.TXTSENDERSTATE_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERSTATE_HID, + 211, 95, 3, 20, 21), self) + self.txtSenderCity = self.insertTextField("txtSenderCity", + FaxWizardDialogConst.TXTSENDERCITY_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERCITY_HID, + 236, 95, 3, 21, 65), self) + self.txtSenderFax = self.insertTextField("txtSenderFax", + FaxWizardDialogConst.TXTSENDERFAX_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTSENDERFAX_HID, + 182, 109, 3, 22, 119), self) + self.optReceiverPlaceholder = self.insertRadioButton( + "optReceiverPlaceholder", + FaxWizardDialogConst.OPTRECEIVERPLACEHOLDER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTRECEIVERPLACEHOLDER_HID, + self.resources.resoptReceiverPlaceholder_value, + 104, 148, 3, 23, 200), self) + self.optReceiverDatabase = self.insertRadioButton( + "optReceiverDatabase", + FaxWizardDialogConst.OPTRECEIVERDATABASE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTRECEIVERDATABASE_HID, + self.resources.resoptReceiverDatabase_value, + 104, 160, 3, 24, 200), self) + self.insertLabel("lblSenderAddress", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderAddress_value, + 97, 28, 3, 46, 136)) + self.insertFixedLine("FixedLine2", (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (5, 90, 126, 3, 51, 212)) + self.insertLabel("lblSenderName", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderName_value, + 113, 69, 3, 52, 68)) + self.insertLabel("lblSenderStreet", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderStreet_value, + 113, 82, 3, 53, 68)) + self.insertLabel("lblPostCodeCity", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblPostCodeCity_value, + 113, 97, 3, 54, 68)) + self.insertLabel("lblTitle4", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 16, self.resources.reslblTitle4_value, + True, 91, 8, 3, 60, 212)) + self.insertLabel("lblSenderFax", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.resLabel1_value, 113, 111, 3, 68, 68)) + self.insertLabel("Label2", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.resLabel2_value, 97, 137, 3, 69, 136)) + + def buildStep4(self): + self.txtFooter = self.insertTextField("txtFooter", + FaxWizardDialogConst.TXTFOOTER_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (47, FaxWizardDialogConst.TXTFOOTER_HID, + True, 97, 40, 4, 25, 203), self) + self.chkFooterNextPages = self.insertCheckBox("chkFooterNextPages", + FaxWizardDialogConst.CHKFOOTERNEXTPAGES_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKFOOTERNEXTPAGES_HID, + self.resources.reschkFooterNextPages_value, + 97, 92, 0, 4, 26, 202), self) + self.chkFooterPageNumbers = self.insertCheckBox("chkFooterPageNumbers", + FaxWizardDialogConst.CHKFOOTERPAGENUMBERS_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.CHKFOOTERPAGENUMBERS_HID, + self.resources.reschkFooterPageNumbers_value, + 97, 106, 0, 4, 27, 201), self) + self.insertLabel("lblFooter", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor4, 8, self.resources.reslblFooter_value, + 97, 28, 4, 33, 116)) + self.insertLabel("lblTitle5", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 16, self.resources.reslblTitle5_value, + True, 91, 8, 4, 61, 212)) + + def buildStep5(self): + self.txtTemplateName = self.insertTextField("txtTemplateName", + FaxWizardDialogConst.TXTTEMPLATENAME_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Text", + PropertyNames.PROPERTY_WIDTH), + (12, FaxWizardDialogConst.TXTTEMPLATENAME_HID, 202, 56, 5, 28, + self.resources.restxtTemplateName_value, 100), self) + + self.optCreateFax = self.insertRadioButton("optCreateFax", + FaxWizardDialogConst.OPTCREATEFAX_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTCREATEFAX_HID, + self.resources.resoptCreateFax_value, + 104, 111, 5, 30, 198), self) + self.optMakeChanges = self.insertRadioButton("optMakeChanges", + FaxWizardDialogConst.OPTMAKECHANGES_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, FaxWizardDialogConst.OPTMAKECHANGES_HID, + self.resources.resoptMakeChanges_value, + 104, 123, 5, 31, 198), self) + self.insertLabel("lblFinalExplanation1", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (28, self.resources.reslblFinalExplanation1_value, + True, 97, 28, 5, 34, 205)) + self.insertLabel("lblProceed", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblProceed_value, 97, 100, 5, + 35, 204)) + self.insertLabel("lblFinalExplanation2", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (33, self.resources.reslblFinalExplanation2_value, + True, 104, 145, 5, 36, 199)) + self.insertImage("ImageControl2", + ("Border", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_IMAGEURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "ScaleImage", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (0, 10, UIConsts.INFOIMAGEURL, 92, 145, + False, 5, 47, 10)) + self.insertLabel("lblTemplateName", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblTemplateName_value, 97, 58, 5, + 57, 101)) + + self.insertLabel("lblTitle6", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 16, self.resources.reslblTitle6_value, + True, 91, 8, 5, 62, 212)) diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py new file mode 100644 index 000000000..faececb1b --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogConst.py @@ -0,0 +1,99 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.HelpIds import HelpIds + +HID = 41119 #enter first hid here +HIDMAIN = 41180 + +class FaxWizardDialogConst: + + OPTBUSINESSFAX_ITEM_CHANGED = "optBusinessFaxItemChanged" + LSTBUSINESSSTYLE_ACTION_PERFORMED = None + LSTBUSINESSSTYLE_ITEM_CHANGED = "lstBusinessStyleItemChanged" + OPTPRIVATEFAX_ITEM_CHANGED = "optPrivateFaxItemChanged" + LSTPRIVATESTYLE_ACTION_PERFORMED = None + LSTPRIVATESTYLE_ITEM_CHANGED = "lstPrivateStyleItemChanged" + CHKUSELOGO_ITEM_CHANGED = "chkUseLogoItemChanged" + CHKUSEDATE_ITEM_CHANGED = "chkUseDateItemChanged" + CHKUSECOMMUNICATIONTYPE_ITEM_CHANGED = "chkUseCommunicationItemChanged" + LSTCOMMUNICATIONTYPE_ACTION_PERFORMED = None + LSTCOMMUNICATIONTYPE_ITEM_CHANGED = "lstCommunicationItemChanged" + LSTCOMMUNICATIONTYPE_TEXT_CHANGED = "lstCommunicationItemChanged" + CHKUSESUBJECT_ITEM_CHANGED = "chkUseSubjectItemChanged" + CHKUSESALUTATION_ITEM_CHANGED = "chkUseSalutationItemChanged" + LSTSALUTATION_ACTION_PERFORMED = None + LSTSALUTATION_ITEM_CHANGED = "lstSalutationItemChanged" + LSTSALUTATION_TEXT_CHANGED = "lstSalutationItemChanged" + CHKUSEGREETING_ITEM_CHANGED = "chkUseGreetingItemChanged" + LSTGREETING_ACTION_PERFORMED = None + LSTGREETING_ITEM_CHANGED = "lstGreetingItemChanged" + LSTGREETING_TEXT_CHANGED = "lstGreetingItemChanged" + CHKUSEFOOTER_ITEM_CHANGED = "chkUseFooterItemChanged" + OPTSENDERPLACEHOLDER_ITEM_CHANGED = "optSenderPlaceholderItemChanged" + OPTSENDERDEFINE_ITEM_CHANGED = "optSenderDefineItemChanged" + TXTSENDERNAME_TEXT_CHANGED = "txtSenderNameTextChanged" + TXTSENDERSTREET_TEXT_CHANGED = "txtSenderStreetTextChanged" + TXTSENDERPOSTCODE_TEXT_CHANGED = "txtSenderPostCodeTextChanged" + TXTSENDERSTATE_TEXT_CHANGED = "txtSenderStateTextChanged" + TXTSENDERCITY_TEXT_CHANGED = "txtSenderCityTextChanged" + TXTSENDERFAX_TEXT_CHANGED = "txtSenderFaxTextChanged" + OPTRECEIVERPLACEHOLDER_ITEM_CHANGED = "optReceiverPlaceholderItemChanged" + OPTRECEIVERDATABASE_ITEM_CHANGED = "optReceiverDatabaseItemChanged" + TXTFOOTER_TEXT_CHANGED = "txtFooterTextChanged" + CHKFOOTERNEXTPAGES_ITEM_CHANGED = "chkFooterNextPagesItemChanged" + CHKFOOTERPAGENUMBERS_ITEM_CHANGED = "chkFooterPageNumbersItemChanged" + TXTTEMPLATENAME_TEXT_CHANGED = "txtTemplateNameTextChanged" + FILETEMPLATEPATH_TEXT_CHANGED = None + OPTCREATEFAX_ITEM_CHANGED = "optCreateFromTemplateItemChanged" + OPTMAKECHANGES_ITEM_CHANGED = "optMakeChangesItemChanged" + + #Help IDs + + OPTBUSINESSFAX_HID = HelpIds.getHelpIdString(HID + 1) + LSTBUSINESSSTYLE_HID = HelpIds.getHelpIdString(HID + 2) + OPTPRIVATEFAX_HID = HelpIds.getHelpIdString(HID + 3) + LSTPRIVATESTYLE_HID = HelpIds.getHelpIdString(HID + 4) + IMAGECONTROL3_HID = HelpIds.getHelpIdString(HID + 5) + CHKUSELOGO_HID = HelpIds.getHelpIdString(HID + 6) + CHKUSEDATE_HID = HelpIds.getHelpIdString(HID + 7) + CHKUSECOMMUNICATIONTYPE_HID = HelpIds.getHelpIdString(HID + 8) + LSTCOMMUNICATIONTYPE_HID = HelpIds.getHelpIdString(HID + 9) + CHKUSESUBJECT_HID = HelpIds.getHelpIdString(HID + 10) + CHKUSESALUTATION_HID = HelpIds.getHelpIdString(HID + 11) + LSTSALUTATION_HID = HelpIds.getHelpIdString(HID + 12) + CHKUSEGREETING_HID = HelpIds.getHelpIdString(HID + 13) + LSTGREETING_HID = HelpIds.getHelpIdString(HID + 14) + CHKUSEFOOTER_HID = HelpIds.getHelpIdString(HID + 15) + OPTSENDERPLACEHOLDER_HID = HelpIds.getHelpIdString(HID + 16) + OPTSENDERDEFINE_HID = HelpIds.getHelpIdString(HID + 17) + TXTSENDERNAME_HID = HelpIds.getHelpIdString(HID + 18) + TXTSENDERSTREET_HID = HelpIds.getHelpIdString(HID + 19) + TXTSENDERPOSTCODE_HID = HelpIds.getHelpIdString(HID + 20) + TXTSENDERSTATE_HID = HelpIds.getHelpIdString(HID + 21) + TXTSENDERCITY_HID = HelpIds.getHelpIdString(HID + 22) + TXTSENDERFAX_HID = HelpIds.getHelpIdString(HID + 23) + OPTRECEIVERPLACEHOLDER_HID = HelpIds.getHelpIdString(HID + 24) + OPTRECEIVERDATABASE_HID = HelpIds.getHelpIdString(HID + 25) + TXTFOOTER_HID = HelpIds.getHelpIdString(HID + 26) + CHKFOOTERNEXTPAGES_HID = HelpIds.getHelpIdString(HID + 27) + CHKFOOTERPAGENUMBERS_HID = HelpIds.getHelpIdString(HID + 28) + TXTTEMPLATENAME_HID = HelpIds.getHelpIdString(HID + 29) + FILETEMPLATEPATH_HID = HelpIds.getHelpIdString(HID + 30) + OPTCREATEFAX_HID = HelpIds.getHelpIdString(HID + 31) + OPTMAKECHANGES_HID = HelpIds.getHelpIdString(HID + 32) + IMAGECONTROL2_HID = HelpIds.getHelpIdString(HID + 33) diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py new file mode 100644 index 000000000..72952dce2 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogImpl.py @@ -0,0 +1,631 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +import os.path +from .FaxWizardDialog import FaxWizardDialog, uno, HID +from .CGFaxWizard import CGFaxWizard +from .FaxDocument import FaxDocument +from ..ui.PathSelection import PathSelection +from ..ui.event.UnoDataAware import UnoDataAware +from ..ui.event.RadioDataAware import RadioDataAware +from ..ui.event.CommonListener import TerminateListenerProcAdapter +from ..text.TextFieldHandler import TextFieldHandler +from ..text.TextElement import TextElement +from ..common.Configuration import Configuration +from ..common.SystemDialog import SystemDialog +from ..common.NoValidPathException import NoValidPathException +from ..common.HelpIds import HelpIds +from ..common.FileAccess import FileAccess +from ..common.Desktop import Desktop +from ..document.OfficeDocument import OfficeDocument + +from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO +from com.sun.star.util import CloseVetoException +from com.sun.star.view.DocumentZoomType import OPTIMAL +from com.sun.star.document.UpdateDocMode import FULL_UPDATE +from com.sun.star.document.MacroExecMode import ALWAYS_EXECUTE + +class FaxWizardDialogImpl(FaxWizardDialog): + + def leaveStep(self, nOldStep, nNewStep): + pass + + def enterStep(self, nOldStep, nNewStep): + pass + + RM_SENDERRECEIVER = 3 + RM_FOOTER = 4 + + def __init__(self, xmsf): + super(FaxWizardDialogImpl, self).__init__(xmsf) + self.lstBusinessStylePos = None + self.lstPrivateStylePos = None + self.bSaveSuccess = False + self.filenameChanged = False + + def startWizard(self, xMSF): + self.running = True + try: + #Number of steps on WizardDialog + self.nMaxStep = 5 + + #instantiate The Document Frame for the Preview + self.terminateListener = TerminateListenerProcAdapter(self.queryTermination) + self.myFaxDoc = FaxDocument(xMSF, self.terminateListener) + + #create the dialog: + self.drawNaviBar() + + self.buildStep1() + self.buildStep2() + self.buildStep3() + self.buildStep4() + self.buildStep5() + + self.initializeSalutation() + self.initializeGreeting() + self.initializeCommunication() + self.initializePaths() + + #special Control for setting the save Path: + self.insertPathSelectionControl() + + self.initializeTemplates(xMSF) + + #load the last used settings + #from the registry and apply listeners to the controls: + self.initConfiguration() + + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + + xContainerWindow = self.myFaxDoc.xFrame.ContainerWindow + self.createWindowPeer(xContainerWindow) + + #add the Roadmap to the dialog: + self.insertRoadmap() + + #load the last used document and apply last used settings: + #TODO: + self.setConfiguration() + + #If the configuration does not define + #Greeting/Salutation/CommunicationType yet choose a default + self.__setDefaultForGreetingAndSalutationAndCommunication() + + #disable functionality that is not supported by the template: + self.initializeElements() + + #disable the document, so that the user cannot change anything: + self.myFaxDoc.xFrame.ComponentWindow.Enable = False + self.executeDialogFromComponent(self.myFaxDoc.xFrame) + self.removeTerminateListener() + self.closeDocument() + self.running = False + except Exception: + self.removeTerminateListener() + traceback.print_exc() + self.running = False + return + + def cancelWizard(self): + self.xUnoDialog.endExecute() + self.running = False + + def finishWizard(self): + self.switchToStep(self.getCurrentStep(), self.nMaxStep) + endWizard = True + try: + self.sPath = self.myPathSelection.getSelectedPath() + if not self.sPath or not os.path.exists(self.sPath): + self.myPathSelection.triggerPathPicker() + self.sPath = self.myPathSelection.getSelectedPath() + + #first, if the filename was not changed, thus + #it is coming from a saved session, check if the + # file exists and warn the user. + if not self.filenameChanged: + answer = SystemDialog.showMessageBox( + self.xMSF, "MessBox", YES_NO + DEF_NO, + self.resources.resOverwriteWarning, + self.xUnoDialog.Peer) + if answer == 3: + # user said: no, do not overwrite... + endWizard = False + return False + + self.myFaxDoc.setWizardTemplateDocInfo( \ + self.resources.resFaxWizardDialog_title, + self.resources.resTemplateDescription) + self.myFaxDoc.killEmptyUserFields() + self.myFaxDoc.keepLogoFrame = bool(self.chkUseLogo.State) + self.myFaxDoc.keepTypeFrame = \ + bool(self.chkUseCommunicationType.State) + self.myFaxDoc.killEmptyFrames() + self.bSaveSuccess = OfficeDocument.store(self.xMSF, + self.myFaxDoc.xTextDocument, self.sPath, "writer8_template") + if self.bSaveSuccess: + self.saveConfiguration() + xIH = self.xMSF.createInstance( \ + "com.sun.star.comp.uui.UUIInteractionHandler") + loadValues = list(range(4)) + loadValues[0] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[0].Name = "AsTemplate" + loadValues[0].Value = True + loadValues[1] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[1].Name = "MacroExecutionMode" + loadValues[1].Value = ALWAYS_EXECUTE + loadValues[2] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[2].Name = "UpdateDocMode" + loadValues[2].Value = FULL_UPDATE + loadValues[3] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[3].Name = "InteractionHandler" + loadValues[3].Value = xIH + if self.bEditTemplate: + loadValues[0].Value = False + else: + loadValues[0].Value = True + + oDoc = OfficeDocument.load(Desktop.getDesktop(self.xMSF), + self.sPath, "_default", loadValues) + oDoc.CurrentController.ViewSettings.ZoomType = OPTIMAL + else: + pass + #TODO: Error Handling + + except Exception: + traceback.print_exc() + finally: + if endWizard: + self.xUnoDialog.endExecute() + self.running = False + + return True + + def closeDocument(self): + try: + self.myFaxDoc.xFrame.close(False) + except CloseVetoException: + traceback.print_exc() + + def drawConstants(self): + '''Localise the template''' + constRangeList = self.myFaxDoc.searchFillInItems(1) + + for i in constRangeList: + text = i.String.lower() + aux = TextElement(i, self.resources.dictConstants[text]) + aux.write() + + def insertRoadmap(self): + self.addRoadmap() + self.insertRoadMapItems( + self.resources.RoadmapLabels, [True, True, True, False, True]) + + self.setRoadmapInteractive(True) + self.setRoadmapComplete(True) + self.setCurrentRoadmapItemID(1) + + def insertPathSelectionControl(self): + self.myPathSelection = PathSelection(self.xMSF, + self, PathSelection.TransferMode.SAVE, + PathSelection.DialogTypes.FILE) + self.myPathSelection.insert( + 5, 97, 70, 205, 45, self.resources.reslblTemplatePath_value, + True, HelpIds.getHelpIdString(HID + 34), + HelpIds.getHelpIdString(HID + 35)) + self.myPathSelection.sDefaultDirectory = self.sUserTemplatePath + self.myPathSelection.sDefaultName = "myFaxTemplate.ott" + self.myPathSelection.sDefaultFilter = "writer8_template" + self.myPathSelection.addSelectionListener(self) + + def initializeTemplates(self, xMSF): + try: + self.sFaxPath = self.sTemplatePath + "/wizard/fax" + self.BusinessFiles = FileAccess.getFolderTitles(xMSF, "bus", + self.sFaxPath, self.resources.dictBusinessTemplate) + self.PrivateFiles = FileAccess.getFolderTitles(xMSF, "pri", + self.sFaxPath, self.resources.dictPrivateTemplate) + + self.xDialogModel.lstBusinessStyle.StringItemList = \ + tuple(self.BusinessFiles[0]) + self.xDialogModel.lstPrivateStyle.StringItemList = \ + tuple(self.PrivateFiles[0]) + self.xDialogModel.lstBusinessStyle.SelectedItems = (0,) + self.xDialogModel.lstPrivateStyle.SelectedItems = (0,) + return True + except NoValidPathException: + traceback.print_exc() + return False + + def initializeElements(self): + self.xDialogModel.chkUseLogo.Enabled = \ + self.myFaxDoc.hasElement("Company Logo") + self.xDialogModel.chkUseSubject.Enabled = \ + self.myFaxDoc.hasElement("Subject Line") + self.xDialogModel.chkUseDate.Enabled = \ + self.myFaxDoc.hasElement("Date") + self.myFaxDoc.updateDateFields() + + def initializeSalutation(self): + #'Salutation' listbox + self.xDialogModel.lstSalutation.StringItemList = \ + tuple(self.resources.SalutationLabels) + + def initializeGreeting(self): + #'Complimentary Close' listbox + self.xDialogModel.lstGreeting.StringItemList = \ + tuple(self.resources.GreetingLabels) + + def initializeCommunication(self): + #'Type of message' listbox + self.xDialogModel.lstCommunicationType.StringItemList = \ + tuple(self.resources.CommunicationLabels) + + def __setDefaultForGreetingAndSalutationAndCommunication(self): + if not self.lstSalutation.Text: + self.lstSalutation.setText(self.resources.SalutationLabels[0]) + + if not self.lstGreeting.Text: + self.lstGreeting.setText(self.resources.GreetingLabels[0]) + + if not self.lstCommunicationType.Text: + self.lstCommunicationType.setText( \ + self.resources.CommunicationLabels[0]) + + def initConfiguration(self): + try: + self.myConfig = CGFaxWizard() + root = Configuration.getConfigurationRoot(self.xMSF, + "/org.openoffice.Office.Writer/Wizards/Fax", False) + self.myConfig.readConfiguration(root, "cp_") + RadioDataAware.attachRadioButtons( + self.myConfig, "cp_FaxType", + (self.optBusinessFax, self.optPrivateFax), True).updateUI() + UnoDataAware.attachListBox( + self.myConfig.cp_BusinessFax, "cp_Style", + self.lstBusinessStyle, True).updateUI() + UnoDataAware.attachListBox( + self.myConfig.cp_PrivateFax, "cp_Style", self.lstPrivateStyle, + True).updateUI() + cgl = self.myConfig.cp_BusinessFax + UnoDataAware.attachCheckBox(cgl, + "cp_PrintCompanyLogo", self.chkUseLogo, True).updateUI() + UnoDataAware.attachCheckBox(cgl, + "cp_PrintSubjectLine", self.chkUseSubject, True).updateUI() + UnoDataAware.attachCheckBox(cgl, + "cp_PrintSalutation", self.chkUseSalutation, True).updateUI() + UnoDataAware.attachCheckBox(cgl, + "cp_PrintDate", self.chkUseDate, True).updateUI() + UnoDataAware.attachCheckBox(cgl, "cp_PrintCommunicationType", + self.chkUseCommunicationType, True).updateUI() + UnoDataAware.attachCheckBox(cgl, + "cp_PrintGreeting", self.chkUseGreeting, True).updateUI() + UnoDataAware.attachCheckBox(cgl, + "cp_PrintFooter", self.chkUseFooter, True).updateUI() + UnoDataAware.attachEditControl(cgl, + "cp_Salutation", self.lstSalutation, True).updateUI() + UnoDataAware.attachEditControl(cgl, + "cp_Greeting", self.lstGreeting, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_CommunicationType", + self.lstCommunicationType, True).updateUI() + RadioDataAware.attachRadioButtons(cgl, "cp_SenderAddressType", + (self.optSenderDefine, self.optSenderPlaceholder), + True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderCompanyName", + self.txtSenderName, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderStreet", + self.txtSenderStreet, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderPostCode", + self.txtSenderPostCode, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderState", + self.txtSenderState, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderCity", + self.txtSenderCity, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_SenderFax", + self.txtSenderFax, True).updateUI() + RadioDataAware.attachRadioButtons(cgl, "cp_ReceiverAddressType", + (self.optReceiverDatabase, self.optReceiverPlaceholder), + True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_Footer", + self.txtFooter, True).updateUI() + UnoDataAware.attachCheckBox(cgl, "cp_FooterOnlySecondPage", + self.chkFooterNextPages, True).updateUI() + UnoDataAware.attachCheckBox(cgl, "cp_FooterPageNumbers", + self.chkFooterPageNumbers, True).updateUI() + RadioDataAware.attachRadioButtons(cgl, "cp_CreationType", + (self.optCreateFax, self.optMakeChanges), True).updateUI() + UnoDataAware.attachEditControl(cgl, + "cp_TemplateName", self.txtTemplateName, True).updateUI() + UnoDataAware.attachEditControl(cgl, "cp_TemplatePath", + self.myPathSelection.xSaveTextBox, True).updateUI() + except Exception: + traceback.print_exc() + + def saveConfiguration(self): + try: + root = Configuration.getConfigurationRoot(self.xMSF, + "/org.openoffice.Office.Writer/Wizards/Fax", True) + self.myConfig.writeConfiguration(root, "cp_") + root.commitChanges() + except Exception: + traceback.print_exc() + + def setConfiguration(self): + #set correct Configuration tree: + if self.optBusinessFax.State: + self.optBusinessFaxItemChanged() + elif self.optPrivateFax.State: + self.optPrivateFaxItemChanged() + + def optBusinessFaxItemChanged(self): + self.lstPrivateStylePos = None + self.xDialogModel.lblBusinessStyle.Enabled = True + self.xDialogModel.lstBusinessStyle.Enabled = True + self.xDialogModel.lblPrivateStyle.Enabled = False + self.xDialogModel.lstPrivateStyle.Enabled = False + + self.lstBusinessStyleItemChanged() + self.__enableSenderReceiver() + self.__setPossibleFooter(True) + + def lstBusinessStyleItemChanged(self): + selectedItemPos = self.lstBusinessStyle.SelectedItemPos + #avoid to load the same item again + if self.lstBusinessStylePos != selectedItemPos: + self.lstBusinessStylePos = selectedItemPos + self.myFaxDoc.loadAsPreview( + self.BusinessFiles[1][selectedItemPos], False) + self.initializeElements() + self.setElements() + self.drawConstants() + + def optPrivateFaxItemChanged(self): + self.lstBusinessStylePos = None + self.xDialogModel.lblBusinessStyle.Enabled = False + self.xDialogModel.lstBusinessStyle.Enabled = False + self.xDialogModel.lblPrivateStyle.Enabled = True + self.xDialogModel.lstPrivateStyle.Enabled = True + + self.lstPrivateStyleItemChanged() + self.__disableSenderReceiver() + self.__setPossibleFooter(False) + + def lstPrivateStyleItemChanged(self): + selectedItemPos = self.lstPrivateStyle.SelectedItemPos + #avoid to load the same item again + if self.lstPrivateStylePos != selectedItemPos: + self.lstPrivateStylePos = selectedItemPos + self.myFaxDoc.loadAsPreview( + self.PrivateFiles[1][selectedItemPos], False) + self.initializeElements() + self.setElements() + + def txtTemplateNameTextChanged(self): + # Change Template Title in Properties + xDocProps = self.myFaxDoc.xTextDocument.DocumentProperties + xDocProps.Title = self.txtTemplateName.Text + + def optSenderPlaceholderItemChanged(self): + self.xDialogModel.lblSenderName.Enabled = False + self.xDialogModel.lblSenderStreet.Enabled = False + self.xDialogModel.lblPostCodeCity.Enabled = False + self.xDialogModel.lblSenderFax.Enabled = False + self.xDialogModel.txtSenderName.Enabled = False + self.xDialogModel.txtSenderStreet.Enabled = False + self.xDialogModel.txtSenderPostCode.Enabled = False + self.xDialogModel.txtSenderState.Enabled = False + self.xDialogModel.txtSenderCity.Enabled = False + self.xDialogModel.txtSenderFax.Enabled = False + self.myFaxDoc.fillSenderWithUserData() + + def optSenderDefineItemChanged(self): + self.xDialogModel.lblSenderName.Enabled = True + self.xDialogModel.lblSenderStreet.Enabled = True + self.xDialogModel.lblPostCodeCity.Enabled = True + self.xDialogModel.lblSenderFax.Enabled = True + self.xDialogModel.txtSenderName.Enabled = True + self.xDialogModel.txtSenderStreet.Enabled = True + self.xDialogModel.txtSenderPostCode.Enabled = True + self.xDialogModel.txtSenderState.Enabled = True + self.xDialogModel.txtSenderCity.Enabled = True + self.xDialogModel.txtSenderFax.Enabled = True + + self.myFieldHandler = TextFieldHandler(self.myFaxDoc.xMSF, + self.myFaxDoc.xTextDocument) + self.txtSenderNameTextChanged() + self.txtSenderStreetTextChanged() + self.txtSenderPostCodeTextChanged() + self.txtSenderStateTextChanged() + self.txtSenderCityTextChanged() + self.txtSenderFaxTextChanged() + + def txtSenderNameTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "Company", self.txtSenderName.Text) + + def txtSenderStreetTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "Street", self.txtSenderStreet.Text) + + def txtSenderCityTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "City", self.txtSenderCity.Text) + + def txtSenderPostCodeTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "PostCode", self.txtSenderPostCode.Text) + + def txtSenderStateTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "State", self.txtSenderState.Text) + + def txtSenderFaxTextChanged(self): + self.myFieldHandler.changeUserFieldContent( + "Fax", self.txtSenderFax.Text) + + #switch Elements on/off -------------------------------------------------- + + def setElements(self): + #UI relevant: + if self.optSenderDefine.State: + self.optSenderDefineItemChanged() + + if self.optSenderPlaceholder.State: + self.optSenderPlaceholderItemChanged() + + self.chkUseLogoItemChanged() + self.chkUseSubjectItemChanged() + self.chkUseSalutationItemChanged() + self.chkUseGreetingItemChanged() + self.chkUseCommunicationItemChanged() + self.chkUseDateItemChanged() + self.chkUseFooterItemChanged() + self.txtTemplateNameTextChanged() + #not UI relevant: + if self.optReceiverDatabase.State: + self.optReceiverDatabaseItemChanged() + + elif self.optReceiverPlaceholder.State: + self.optReceiverPlaceholderItemChanged() + + if self.optCreateFax.State: + self.optCreateFromTemplateItemChanged() + + elif self.optMakeChanges.State: + self.optMakeChangesItemChanged() + + def chkUseLogoItemChanged(self): + if self.myFaxDoc.hasElement("Company Logo"): + self.myFaxDoc.switchElement("Company Logo", + bool(self.chkUseLogo.State)) + + def chkUseSubjectItemChanged(self): + if self.myFaxDoc.hasElement("Subject Line"): + self.myFaxDoc.switchElement("Subject Line", + bool(self.chkUseSubject.State)) + + def chkUseDateItemChanged(self): + if self.myFaxDoc.hasElement("Date"): + self.myFaxDoc.switchElement("Date", + bool(self.chkUseDate.State)) + + def chkUseFooterItemChanged(self): + try: + bFooterPossible = bool(self.chkUseFooter.State) \ + and bool(self.xDialogModel.chkUseFooter.Enabled) + if bool(self.chkFooterNextPages.State): + self.myFaxDoc.switchFooter("First Page", False, + bool(self.chkFooterPageNumbers.State), + self.txtFooter.Text) + self.myFaxDoc.switchFooter("Standard", bFooterPossible, + bool(self.chkFooterPageNumbers.State), + self.txtFooter.Text) + else: + self.myFaxDoc.switchFooter("First Page", bFooterPossible, + bool(self.chkFooterPageNumbers.State), + self.txtFooter.Text) + self.myFaxDoc.switchFooter("Standard", bFooterPossible, + bool(self.chkFooterPageNumbers.State), + self.txtFooter.Text) + + #enable/disable roadmap item for footer page + BPaperItem = self.getRoadmapItemByID( \ + FaxWizardDialogImpl.RM_FOOTER) + BPaperItem.Enabled = bFooterPossible + except Exception: + traceback.print_exc() + + def chkFooterNextPagesItemChanged(self): + self.chkUseFooterItemChanged() + + def chkFooterPageNumbersItemChanged(self): + self.chkUseFooterItemChanged() + + def txtFooterTextChanged(self): + self.myFaxDoc.switchFooter("First Page", True, + bool(self.chkFooterPageNumbers.State), + self.txtFooter.Text) + + def chkUseSalutationItemChanged(self): + self.myFaxDoc.switchUserField("Salutation", + self.lstSalutation.Text, bool(self.chkUseSalutation.State)) + self.xDialogModel.lstSalutation.Enabled = \ + bool(self.chkUseSalutation.State) + + def lstSalutationItemChanged(self): + self.myFaxDoc.switchUserField("Salutation", + self.lstSalutation.Text, bool(self.chkUseSalutation.State)) + + def chkUseCommunicationItemChanged(self): + self.myFaxDoc.switchUserField("CommunicationType", + self.lstCommunicationType.Text, + bool(self.chkUseCommunicationType.State)) + self.xDialogModel.lstCommunicationType.Enabled = \ + bool(self.chkUseCommunicationType.State) + + def lstCommunicationItemChanged(self): + self.myFaxDoc.switchUserField("CommunicationType", + self.lstCommunicationType.Text, + bool(self.chkUseCommunicationType.State)) + + def chkUseGreetingItemChanged(self): + self.myFaxDoc.switchUserField("Greeting", + self.lstGreeting.Text, bool(self.chkUseGreeting.State)) + self.xDialogModel.lstGreeting.Enabled = \ + bool(self.chkUseGreeting.State) + + def lstGreetingItemChanged(self): + self.myFaxDoc.switchUserField("Greeting", self.lstGreeting.Text, + bool(self.chkUseGreeting.State)) + + def __setPossibleFooter(self, bState): + self.xDialogModel.chkUseFooter.Enabled = bState + if not bState: + self.chkUseFooter.State = 0 + + self.chkUseFooterItemChanged() + + def optReceiverPlaceholderItemChanged(self): + OfficeDocument.attachEventCall( + self.myFaxDoc.xTextDocument, "OnNew", "StarBasic", + "macro:///Template.Correspondence.Placeholder()") + + def optReceiverDatabaseItemChanged(self): + OfficeDocument.attachEventCall( + self.myFaxDoc.xTextDocument, "OnNew", "StarBasic", + "macro:///Template.Correspondence.Database()") + + def __enableSenderReceiver(self): + BPaperItem = self.getRoadmapItemByID( \ + FaxWizardDialogImpl.RM_SENDERRECEIVER) + BPaperItem.Enabled = True + + def __disableSenderReceiver(self): + BPaperItem = self.getRoadmapItemByID( \ + FaxWizardDialogImpl.RM_SENDERRECEIVER) + BPaperItem.Enabled = False + + def validatePath(self): + if self.myPathSelection.usedPathPicker: + self.filenameChanged = True + self.myPathSelection.usedPathPicker = False diff --git a/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py b/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py new file mode 100644 index 000000000..6ee89bf9b --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/FaxWizardDialogResources.py @@ -0,0 +1,114 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +class FaxWizardDialogResources(object): + + def __init__(self): + import imp, os + imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')) + import strings + + self.resFaxWizardDialog_title = strings.RID_FAXWIZARDDIALOG_START_1 + self.resoptBusinessFax_value = strings.RID_FAXWIZARDDIALOG_START_3 + self.resoptPrivateFax_value = strings.RID_FAXWIZARDDIALOG_START_4 + self.reschkUseLogo_value = strings.RID_FAXWIZARDDIALOG_START_5 + self.reschkUseSubject_value = strings.RID_FAXWIZARDDIALOG_START_6 + self.reschkUseSalutation_value = strings.RID_FAXWIZARDDIALOG_START_7 + self.reschkUseGreeting_value = strings.RID_FAXWIZARDDIALOG_START_8 + self.reschkUseFooter_value = strings.RID_FAXWIZARDDIALOG_START_9 + self.resoptSenderPlaceholder_value = strings.RID_FAXWIZARDDIALOG_START_10 + self.resoptSenderDefine_value = strings.RID_FAXWIZARDDIALOG_START_11 + self.restxtTemplateName_value = strings.RID_FAXWIZARDDIALOG_START_12 + self.resoptCreateFax_value = strings.RID_FAXWIZARDDIALOG_START_13 + self.resoptMakeChanges_value = strings.RID_FAXWIZARDDIALOG_START_14 + self.reslblBusinessStyle_value = strings.RID_FAXWIZARDDIALOG_START_15 + self.reslblPrivateStyle_value = strings.RID_FAXWIZARDDIALOG_START_16 + self.reslblIntroduction_value = strings.RID_FAXWIZARDDIALOG_START_17 + self.reslblSenderAddress_value = strings.RID_FAXWIZARDDIALOG_START_18 + self.reslblSenderName_value = strings.RID_FAXWIZARDDIALOG_START_19 + self.reslblSenderStreet_value = strings.RID_FAXWIZARDDIALOG_START_20 + self.reslblPostCodeCity_value = strings.RID_FAXWIZARDDIALOG_START_21 + self.reslblFooter_value = strings.RID_FAXWIZARDDIALOG_START_22 + self.reslblFinalExplanation1_value = strings.RID_FAXWIZARDDIALOG_START_23 + self.reslblFinalExplanation2_value = strings.RID_FAXWIZARDDIALOG_START_24 + self.reslblTemplateName_value = strings.RID_FAXWIZARDDIALOG_START_25 + self.reslblTemplatePath_value = strings.RID_FAXWIZARDDIALOG_START_26 + self.reslblProceed_value = strings.RID_FAXWIZARDDIALOG_START_27 + self.reslblTitle1_value = strings.RID_FAXWIZARDDIALOG_START_28 + self.reslblTitle3_value = strings.RID_FAXWIZARDDIALOG_START_29 + self.reslblTitle4_value = strings.RID_FAXWIZARDDIALOG_START_30 + self.reslblTitle5_value = strings.RID_FAXWIZARDDIALOG_START_31 + self.reslblTitle6_value = strings.RID_FAXWIZARDDIALOG_START_32 + self.reschkFooterNextPages_value = strings.RID_FAXWIZARDDIALOG_START_33 + self.reschkFooterPageNumbers_value = strings.RID_FAXWIZARDDIALOG_START_34 + self.reschkUseDate_value = strings.RID_FAXWIZARDDIALOG_START_35 + self.reschkUseCommunicationType_value = strings.RID_FAXWIZARDDIALOG_START_36 + self.resLabel1_value = strings.RID_FAXWIZARDDIALOG_START_37 + self.resoptReceiverPlaceholder_value = strings.RID_FAXWIZARDDIALOG_START_38 + self.resoptReceiverDatabase_value = strings.RID_FAXWIZARDDIALOG_START_39 + self.resLabel2_value = strings.RID_FAXWIZARDDIALOG_START_40 + + #Create a Dictionary for the constants values. + self.dictConstants = { + "#to#" : strings.RID_FAXWIZARDDIALOG_START_41, + "#from#" : strings.RID_FAXWIZARDDIALOG_START_42, + "#faxconst#" : strings.RID_FAXWIZARDDIALOG_START_43, + "#telconst#" : strings.RID_FAXWIZARDDIALOG_START_44, + "#emailconst#" : strings.RID_FAXWIZARDDIALOG_START_45, + "#consist1#" : strings.RID_FAXWIZARDDIALOG_START_46, + "#consist2#" : strings.RID_FAXWIZARDDIALOG_START_47, + "#consist3#" : strings.RID_FAXWIZARDDIALOG_START_48} + + #Create a dictionary for localising the private template + self.dictPrivateTemplate = { + "Bottle" : strings.RID_FAXWIZARDDIALOG_START_49, + "Fax" : strings.RID_FAXWIZARDDIALOG_START_56, + "Lines" : strings.RID_FAXWIZARDDIALOG_START_50, + "Marine" : strings.RID_FAXWIZARDDIALOG_START_51} + + #Create a dictionary for localising the business template + self.dictBusinessTemplate = { + "Classic Fax" : strings.RID_FAXWIZARDDIALOG_START_52, + "Classic Fax from Private" : strings.RID_FAXWIZARDDIALOG_START_53, + "Modern Fax" : strings.RID_FAXWIZARDDIALOG_START_54, + "Modern Fax from Private" : strings.RID_FAXWIZARDDIALOG_START_55} + + #Common Resources + self.resOverwriteWarning = strings.RID_COMMON_START_19 + self.resTemplateDescription = strings.RID_COMMON_START_20 + + self.RoadmapLabels = [] + self.RoadmapLabels.append(strings.RID_FAXWIZARDROADMAP_START_1) + self.RoadmapLabels.append(strings.RID_FAXWIZARDROADMAP_START_2) + self.RoadmapLabels.append(strings.RID_FAXWIZARDROADMAP_START_3) + self.RoadmapLabels.append(strings.RID_FAXWIZARDROADMAP_START_4) + self.RoadmapLabels.append(strings.RID_FAXWIZARDROADMAP_START_5) + self.SalutationLabels = [] + self.SalutationLabels.append(strings.RID_FAXWIZARDSALUTATION_START_1) + self.SalutationLabels.append(strings.RID_FAXWIZARDSALUTATION_START_2) + self.SalutationLabels.append(strings.RID_FAXWIZARDSALUTATION_START_3) + self.SalutationLabels.append(strings.RID_FAXWIZARDSALUTATION_START_4) + self.GreetingLabels = [] + self.GreetingLabels.append(strings.RID_FAXWIZARDGREETING_START_1) + self.GreetingLabels.append(strings.RID_FAXWIZARDGREETING_START_2) + self.GreetingLabels.append(strings.RID_FAXWIZARDGREETING_START_3) + self.GreetingLabels.append(strings.RID_FAXWIZARDGREETING_START_4) + self.CommunicationLabels = [] + self.CommunicationLabels.append(strings.RID_FAXWIZARDCOMMUNICATION_START_1) + self.CommunicationLabels.append(strings.RID_FAXWIZARDCOMMUNICATION_START_2) + self.CommunicationLabels.append(strings.RID_FAXWIZARDCOMMUNICATION_START_3) diff --git a/wizards/com/sun/star/wizards/fax/__init__.py b/wizards/com/sun/star/wizards/fax/__init__.py new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/__init__.py @@ -0,0 +1 @@ + diff --git a/wizards/com/sun/star/wizards/fax/fax.component b/wizards/com/sun/star/wizards/fax/fax.component new file mode 100644 index 000000000..abc871137 --- /dev/null +++ b/wizards/com/sun/star/wizards/fax/fax.component @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<component loader="com.sun.star.loader.Python" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.wizards.fax.CallWizard"> + <service name="com.sun.star.task.Job"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/form/CallFormWizard.java b/wizards/com/sun/star/wizards/form/CallFormWizard.java new file mode 100644 index 000000000..297ce5775 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/CallFormWizard.java @@ -0,0 +1,170 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.uno.Type; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +/** This class capsulates the class, that implements the minimal component, a + * factory for creating the service (<CODE>__getServiceFactory</CODE>). + */ +public class CallFormWizard +{ + + /** Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return Returns a <code>XSingleServiceFactory</code> for creating the component. + * @see com.sun.star.comp.loader.JavaLoader + * @param stringImplementationName The implementation name of the component. + * @param xMSF The service manager, who gives access to every known service. + * @param xregistrykey Makes structural information (except regarding tree structures) of a single + * registry key accessible. + */ + public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory(String stringImplementationName, com.sun.star.lang.XMultiServiceFactory xMSF, com.sun.star.registry.XRegistryKey xregistrykey) + { + com.sun.star.lang.XSingleServiceFactory xsingleservicefactory = null; + if (stringImplementationName.equals(FormWizardImplementation.class.getName())) + { + xsingleservicefactory = com.sun.star.comp.loader.FactoryHelper.getServiceFactory(FormWizardImplementation.class, FormWizardImplementation.__serviceName, xMSF, xregistrykey); + } + return xsingleservicefactory; + } + + /** This class implements the component. At least the interfaces XServiceInfo, + * XTypeProvider, and XInitialization should be provided by the service. + */ + public static class FormWizardImplementation extends com.sun.star.lib.uno.helper.PropertySet implements com.sun.star.lang.XInitialization, com.sun.star.lang.XServiceInfo, com.sun.star.task.XJobExecutor + { + private PropertyValue[] m_wizardContext; + + /** The constructor of the inner class has a XMultiServiceFactory parameter. + * @param xmultiservicefactoryInitialization A special service factory + * could be introduced while initializing. + */ + public FormWizardImplementation(com.sun.star.lang.XMultiServiceFactory xmultiservicefactoryInitialization) + { + super(); + m_serviceFactory = xmultiservicefactoryInitialization; + } + + public void trigger(String sEvent) + { + try + { + if (sEvent.equals(PropertyNames.START)) + { + FormWizard CurFormWizard = new FormWizard( m_serviceFactory, m_wizardContext ); + CurFormWizard.start(); + } + } + catch (Exception exception) + { + System.err.println(exception); + } + System.gc(); + } + /** The service name, that must be used to get an instance of this service. + */ + private static final String __serviceName = "com.sun.star.wizards.form.CallFormWizard"; + /** The service manager, that gives access to all registered services. + */ + private final com.sun.star.lang.XMultiServiceFactory m_serviceFactory; + + /** This method is a member of the interface for initializing an object + * directly after its creation. + * @param object This array of arbitrary objects will be passed to the + * component after its creation. + * @throws com.sun.star.uno.Exception Every exception will not be handled, but will be + * passed to the caller. + */ + public void initialize(Object[] object) throws com.sun.star.uno.Exception + { + m_wizardContext = Properties.convertToPropertyValueArray(object); + } + + /** This method returns an array of all supported service names. + * @return Array of supported service names. + */ + public java.lang.String[] getSupportedServiceNames() + { + String[] stringSupportedServiceNames = new String[] { __serviceName }; + + return stringSupportedServiceNames; + } + + /** This method returns true, if the given service will be + * supported by the component. + * @param stringService Service name. + * @return True, if the given service name will be supported. + */ + public boolean supportsService(String stringService) + { + boolean booleanSupportsService = false; + + if (stringService.equals(__serviceName)) + { + booleanSupportsService = true; + } + return booleanSupportsService; + } + + @Override + public byte[] getImplementationId() + { + return new byte[0]; + } + + /** Return the class name of the component. + * @return Class name of the component. + */ + public java.lang.String getImplementationName() + { + return FormWizardImplementation.class.getName(); + } + + /** Provides a sequence of all types (usually interface types) + * provided by the object. + * @return Sequence of all types (usually interface types) provided by the + * service. + */ + @Override + public Type[] getTypes() + { + Type[] typeReturn = + { + }; + + try + { + typeReturn = new Type[] + { + new Type(com.sun.star.task.XJobExecutor.class), new Type(com.sun.star.lang.XTypeProvider.class), new Type(com.sun.star.lang.XServiceInfo.class), new Type(com.sun.star.beans.XPropertySet.class), new Type(com.sun.star.beans.XFastPropertySet.class), new Type(com.sun.star.beans.XMultiPropertySet.class), new Type(com.sun.star.lang.XInitialization.class) + }; + } + catch (Exception exception) + { + System.err.println(exception); + } + + return typeReturn; + } + } +} diff --git a/wizards/com/sun/star/wizards/form/DataEntrySetter.java b/wizards/com/sun/star/wizards/form/DataEntrySetter.java new file mode 100644 index 000000000..4b4a3e0cf --- /dev/null +++ b/wizards/com/sun/star/wizards/form/DataEntrySetter.java @@ -0,0 +1,147 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XCheckBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.beans.PropertyValue; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.WizardDialog; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +public class DataEntrySetter +{ + + private final XRadioButton optDisplayAllData; + private final XCheckBox chknomodification; + private final XCheckBox chknodeletion; + private final XCheckBox chknoaddition; + + public DataEntrySetter(WizardDialog CurUnoDialog) + { + short curtabindex = (short) (FormWizard.SODATA_PAGE * 100); + Integer IDataStep = Integer.valueOf(FormWizard.SODATA_PAGE); + String sNewDataOnly = CurUnoDialog.m_oResource.getResText("RID_FORM_44"); + String sDisplayAllData = CurUnoDialog.m_oResource.getResText("RID_FORM_46"); + String sNoModification = CurUnoDialog.m_oResource.getResText("RID_FORM_47"); // AllowUpdates + String sNoDeletion = CurUnoDialog.m_oResource.getResText("RID_FORM_48"); // AllowDeletes + String sNoAddition = CurUnoDialog.m_oResource.getResText("RID_FORM_49"); // AllowInserts + String sdontdisplayExistingData = CurUnoDialog.m_oResource.getResText("RID_FORM_45"); + + CurUnoDialog.insertRadioButton("optNewDataOnly", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleCheckBoxes(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTNEWDATAONLY", sNewDataOnly, 98, 25, IDataStep, Short.valueOf(curtabindex++), 195 + }); + + optDisplayAllData = CurUnoDialog.insertRadioButton("optDisplayAllData", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleCheckBoxes(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTDISPLAYALLDATA", sDisplayAllData, 98, 50, Short.valueOf((short) 1), IDataStep, Short.valueOf(curtabindex++), 197 + }); + chknomodification = CurUnoDialog.insertCheckBox("chknomodification", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_CHKNOMODIFICATION", sNoModification, 108, 62, Short.valueOf((short) 0), IDataStep, Short.valueOf(curtabindex++), 189 + }); + chknodeletion = CurUnoDialog.insertCheckBox("chknodeletion", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_CHKNODELETION", sNoDeletion, 108, 74, Short.valueOf((short) 0), IDataStep, Short.valueOf(curtabindex++), 189 + }); + chknoaddition = CurUnoDialog.insertCheckBox("chknoaddition", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_CHKNOADDITION", sNoAddition, 108, 86, Short.valueOf((short) 0), IDataStep, Short.valueOf(curtabindex++), 191 + }); + CurUnoDialog.insertLabel("lbldontdisplayExistingData", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sdontdisplayExistingData, 108, 33, IDataStep, Short.valueOf(curtabindex++), 134 + }); + } + + public PropertyValue[] getFormProperties() + { + PropertyValue[] retProperties; + if (optDisplayAllData.getState()) + { + retProperties = new PropertyValue[3]; + boolean bAllowUpdates = (((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(chknomodification), PropertyNames.PROPERTY_STATE)).shortValue()) != 1; + boolean bAllowDeletes = (((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(chknodeletion), PropertyNames.PROPERTY_STATE)).shortValue()) != 1; + boolean bAllowInserts = (((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(chknoaddition), PropertyNames.PROPERTY_STATE)).shortValue()) != 1; + retProperties[0] = Properties.createProperty("AllowUpdates", Boolean.valueOf(bAllowUpdates)); + retProperties[1] = Properties.createProperty("AllowDeletes", Boolean.valueOf(bAllowDeletes)); + retProperties[2] = Properties.createProperty("AllowInserts", Boolean.valueOf(bAllowInserts)); + } + else + { + retProperties = new PropertyValue[1]; + retProperties[0] = Properties.createProperty("IgnoreResult", Boolean.TRUE); + } + return retProperties; + + } + + private void toggleCheckBoxes() + { + boolean bdisplayalldata = optDisplayAllData.getState(); + Helper.setUnoPropertyValue(UnoDialog.getModel(chknomodification), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdisplayalldata)); + Helper.setUnoPropertyValue(UnoDialog.getModel(chknodeletion), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdisplayalldata)); + Helper.setUnoPropertyValue(UnoDialog.getModel(chknoaddition), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdisplayalldata)); + } +} diff --git a/wizards/com/sun/star/wizards/form/FieldLinker.java b/wizards/com/sun/star/wizards/form/FieldLinker.java new file mode 100644 index 000000000..74dc5707e --- /dev/null +++ b/wizards/com/sun/star/wizards/form/FieldLinker.java @@ -0,0 +1,308 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XFixedText; +import com.sun.star.awt.XListBox; +import com.sun.star.uno.Exception; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.db.RelationController; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.WizardDialog; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.DBLimitedFieldSelection; +import com.sun.star.wizards.common.PropertyNames; + +public class FieldLinker extends DBLimitedFieldSelection +{ + + private XFixedText[] lblSlaveFields; + private XFixedText[] lblMasterFields; + private XListBox[] lstSlaveFields; + private XListBox[] lstMasterFields; + private int[] SOLINKLST = null; + private String[] sSlaveListHeader; + private String[] sMasterListHeader; //CurUnoDialog.m_oResource.getResText("RID_FORM_40"); + + public FieldLinker(WizardDialog _CurUnoDialog, int iStep, int iCompPosY, int _firsthelpid) + { + super(_CurUnoDialog, iStep, iCompPosY, _firsthelpid); + } + + @Override + protected void insertControlGroup(int i) + { + try + { + if (i == 0) + { + lblSlaveFields = new XFixedText[rowcount]; + lblMasterFields = new XFixedText[rowcount]; + lstSlaveFields = new XListBox[rowcount]; + lstMasterFields = new XListBox[rowcount]; + int SOFIRSTLINKLST = 0; + int SOSECLINKLST = 1; + int SOTHIRDLINKLST = 2; + int SOFOURTHLINKLST = 3; + sSlaveListHeader = new String[4]; //new String[rowcount];PropertyNames.EMPTY_STRING; //CurUnoDialog.m_oResource.getResText(UIConsts.RID_FORM + 40); + sSlaveListHeader[0] = CurUnoDialog.m_oResource.getResText("RID_FORM_20"); + sSlaveListHeader[1] = CurUnoDialog.m_oResource.getResText("RID_FORM_21"); + sSlaveListHeader[2] = CurUnoDialog.m_oResource.getResText("RID_FORM_22"); + sSlaveListHeader[3] = CurUnoDialog.m_oResource.getResText("RID_FORM_23"); + sMasterListHeader = new String[4]; // new String[rowcount];PropertyNames.EMPTY_STRING; //CurUnoDialog.m_oResource.getResText(UIConsts.RID_FORM + 40); + sMasterListHeader[0] = CurUnoDialog.m_oResource.getResText("RID_FORM_24"); + sMasterListHeader[1] = CurUnoDialog.m_oResource.getResText("RID_FORM_25"); + sMasterListHeader[2] = CurUnoDialog.m_oResource.getResText("RID_FORM_26"); + sMasterListHeader[3] = CurUnoDialog.m_oResource.getResText("RID_FORM_27"); + SOLINKLST = new int[] + { + SOFIRSTLINKLST, SOSECLINKLST, SOTHIRDLINKLST, SOFOURTHLINKLST + }; + } + String sSlaveHidString = HelpIds.getHelpIdString(FirstHelpIndex + (i * 2)); + String sMasterHidString = HelpIds.getHelpIdString(FirstHelpIndex + (i * 2) + 1); + boolean bDoEnable = (i < 2); + lblSlaveFields[i] = CurUnoDialog.insertLabel("lblSlaveFieldLink" + Integer.toString(i + 1), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(bDoEnable), 8, sSlaveListHeader[i], 97, Integer.valueOf(iCurPosY), IStep, Short.valueOf(curtabindex++), 97 + }); + lstSlaveFields[i] = CurUnoDialog.insertListBox("lstSlaveFieldLink" + (i + 1), SOLINKLST[i], null, new ItemListenerImpl(), + new String[] + { + "Dropdown", + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + "LineCount", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, + Boolean.valueOf(bDoEnable), + UIConsts.INTEGER_12, + sSlaveHidString, + Short.valueOf(UnoDialog.getListBoxLineCount()), + 97, + Integer.valueOf(iCurPosY + 10), + IStep, + Short.valueOf(curtabindex++), + 97 + }); + + lblMasterFields[i] = CurUnoDialog.insertLabel("lblMasterFieldLink" + Integer.toString(i + 1), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(bDoEnable), 8, sMasterListHeader[i], 206, Integer.valueOf(iCurPosY), IStep, Short.valueOf(curtabindex++), 97 + }); + + lstMasterFields[i] = CurUnoDialog.insertListBox("lstMasterFieldLink" + Integer.toString(i + 1), SOLINKLST[i], null, new ItemListenerImpl(), + new String[] + { + "Dropdown", + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + "LineCount", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, + Boolean.valueOf(bDoEnable), + UIConsts.INTEGER_12, + sMasterHidString, + Short.valueOf(UnoDialog.getListBoxLineCount()), + 206, + Integer.valueOf(iCurPosY + 10), + IStep, + Short.valueOf(curtabindex++), + 97 + }); + iCurPosY = iCurPosY + 38; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + @Override + protected void enableNextControlRow(int curindex) + { + boolean bSlaveField = lstSlaveFields[curindex].getSelectedItemPos() > 0; + boolean bMasterField = lstMasterFields[curindex].getSelectedItemPos() > 0; + boolean bDoEnable = (bSlaveField && bMasterField); + if (!bDoEnable) + { + moveupSelectedItems(curindex, bDoEnable); + } + else + { + toggleControlRow(curindex + 1, true); + } + } + + @Override + protected int getMaxSelIndex() + { + int MaxSelIndex = -1; + for (int i = 0; i < rowcount; i++) + { + if ((lstSlaveFields[i].getSelectedItemPos() > 0) && (lstMasterFields[i].getSelectedItemPos() > 0)) + { + MaxSelIndex += 1; + } + } + return MaxSelIndex; + } + + @Override + protected void toggleControlRow(int i, boolean bDoEnable) + { + if (i < rowcount) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(lblSlaveFields[i]), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSlaveFields[i]), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(lblMasterFields[i]), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstMasterFields[i]), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + if (!bDoEnable) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSlaveFields[i]), PropertyNames.SELECTED_ITEMS, new short[] { 0 }); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstMasterFields[i]), PropertyNames.SELECTED_ITEMS, new short[] { 0 }); + } + } + } + + @Override + protected void updateFromNextControlRow(int curindex) + { + short iNextMasterItemPos = lstMasterFields[curindex + 1].getSelectedItemPos(); + short iNextSlaveItemPos = lstSlaveFields[curindex + 1].getSelectedItemPos(); + + if ((iNextMasterItemPos != 0) && (iNextSlaveItemPos != 0)) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(lstMasterFields[curindex]), PropertyNames.SELECTED_ITEMS, new short[] {iNextMasterItemPos }); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSlaveFields[curindex]), PropertyNames.SELECTED_ITEMS, new short[] {iNextSlaveItemPos}); + + Helper.setUnoPropertyValue(UnoDialog.getModel(lstMasterFields[curindex + 1]), PropertyNames.SELECTED_ITEMS, new short[] { 0 }); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSlaveFields[curindex + 1]), PropertyNames.SELECTED_ITEMS, new short[] { 0 }); + toggleControlRow(curindex, true); + } + } + + public void initialize(String[] _AllMasterFieldNames, String[] _AllSlaveFieldNames, String[][] _LinkFieldNames) + { + int SOMASTERINDEX = 1; + String[] MasterLinkNames = JavaTools.ArrayOutOfMultiDimArray(_LinkFieldNames, SOMASTERINDEX); + int SOSLAVEINDEX = 0; + String[] SlaveLinkNames = JavaTools.ArrayOutOfMultiDimArray(_LinkFieldNames, SOSLAVEINDEX); + String[] ViewMasterFieldNames = addNoneFieldItemToList(_AllMasterFieldNames); // add '-undefined-' + String[] ViewSlaveFieldNames = addNoneFieldItemToList(_AllSlaveFieldNames); + for (int i = 0; i < rowcount; i++) + { + super.initializeListBox(lstMasterFields[i], ViewMasterFieldNames, MasterLinkNames, i); + super.initializeListBox(lstSlaveFields[i], ViewSlaveFieldNames, SlaveLinkNames, i); + if (_LinkFieldNames != null) + { + toggleControlRow(i, (i <= _LinkFieldNames.length)); + } + else + { + toggleControlRow(i, i == 0); + } + } + } + + public String[][] getLinkFieldNames(RelationController _oRelationController, String _sReferencedTableName) + { + return _oRelationController.getImportedKeyColumns(_sReferencedTableName); + } + + /** + * @return the LinkFieldnames of the joins. When no LinkFieldNames were selected the returned Array is empty. + * When Joins were assigned duplicate a null value is returned + * + */ + public String[][] getLinkFieldNames() + { + int nSelectedIndex = getMaxSelIndex(); + String[][] LinkFieldNames = new String[2][nSelectedIndex + 1]; + for (int i = 0; i <= nSelectedIndex; i++) + { + LinkFieldNames[0][i] = lstSlaveFields[i].getSelectedItem(); + LinkFieldNames[1][i] = lstMasterFields[i].getSelectedItem(); + } + int iduplicate = JavaTools.getDuplicateFieldIndex(LinkFieldNames); + if (iduplicate != -1) + { + String sLinkFieldsAreDuplicate = CurUnoDialog.m_oResource.getResText("RID_FORM_19"); + String sLocLinkFieldsAreDuplicate = JavaTools.replaceSubString(sLinkFieldsAreDuplicate, LinkFieldNames[0][iduplicate], "<FIELDNAME1>"); + sLocLinkFieldsAreDuplicate = JavaTools.replaceSubString(sLocLinkFieldsAreDuplicate, LinkFieldNames[1][iduplicate], "<FIELDNAME2>"); + CurUnoDialog.setCurrentStep(FormWizard.SOFIELDLINKER_PAGE); + CurUnoDialog.enableNavigationButtons(true, true, true); + CurUnoDialog.showMessageBox("WarningBox", VclWindowPeerAttribute.OK, sLocLinkFieldsAreDuplicate); + CurUnoDialog.setFocus("lstSlaveFieldLink" + (iduplicate + 1)); + return null; + } + return LinkFieldNames; + + } + + public void enable(boolean _bdoenable) + { + CurUnoDialog.setStepEnabled(IStep.intValue(), _bdoenable); + } + + private class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + public void itemStateChanged(ItemEvent EventObject) + { + if (EventObject == null) { + return; + } + int ikey = CurUnoDialog.getControlKey(EventObject.Source, CurUnoDialog.ControlList); + enableNextControlRow(ikey); + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/form/Finalizer.java b/wizards/com/sun/star/wizards/form/Finalizer.java new file mode 100644 index 000000000..1fa97b0ac --- /dev/null +++ b/wizards/com/sun/star/wizards/form/Finalizer.java @@ -0,0 +1,133 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.XRadioButton; +import com.sun.star.awt.XTextComponent; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.ui.*; +import com.sun.star.wizards.ui.event.XTextListenerAdapter; + +/** + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class Finalizer +{ + + private WizardDialog CurUnoDialog; + private XRadioButton optModifyForm; + private XTextComponent txtFormName; + private FormDocument oFormDocument; + + public Finalizer(WizardDialog _CurUnoDialog) + { + this.CurUnoDialog = _CurUnoDialog; + short curtabindex = (short) (FormWizard.SOSTORE_PAGE * 100); + + String slblFormName = CurUnoDialog.m_oResource.getResText("RID_FORM_50"); + String slblProceed = CurUnoDialog.m_oResource.getResText("RID_FORM_51"); + String sWorkWithForm = CurUnoDialog.m_oResource.getResText("RID_FORM_52"); + String sModifyForm = CurUnoDialog.m_oResource.getResText("RID_FORM_53"); + CurUnoDialog.insertLabel("lblFormName", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], slblFormName, 97, 25, UIConsts.INTEGERS[8], Short.valueOf(curtabindex++), 111 + }); + txtFormName = CurUnoDialog.insertTextField("txtFormName", new XTextListenerAdapter() { + @Override + public void textChanged(TextEvent event) { + toggleFinishButton(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Text", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGER_12, "HID:WIZARDS_HID_DLGFORM_TXTPATH", 97, 35, UIConsts.INTEGERS[8], Short.valueOf((short) 82), PropertyNames.EMPTY_STRING, 185 + }); + CurUnoDialog.insertLabel("lblProceed", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], slblProceed, 97, 62, UIConsts.INTEGERS[8], Short.valueOf(curtabindex++), 185 + }); + CurUnoDialog.insertRadioButton("optWorkWithForm", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTWORKWITHFORM", sWorkWithForm, 101, 77, Short.valueOf((short) 1), UIConsts.INTEGERS[8], Short.valueOf(curtabindex++), 107 + }); + optModifyForm = CurUnoDialog.insertRadioButton("optModifyForm", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTMODIFYFORM", sModifyForm, 101, 89, UIConsts.INTEGERS[8], Short.valueOf(curtabindex++), 107 + }); + } + + public void initialize(String _formname, FormDocument _oFormDocument) + { + if (oFormDocument == null) + { + oFormDocument = _oFormDocument; + } + if (txtFormName.getText().length() == 0) + { + txtFormName.setText(Desktop.getUniqueName(_oFormDocument.oMainFormDBMetaData.getFormDocuments(), _formname)); + } + } + + private void toggleFinishButton() + { + CurUnoDialog.enableFinishButton(txtFormName.getText().length() > 0); + } + + public String getName() + { + return txtFormName.getText(); + } + + public boolean getOpenForEditing() + { + return optModifyForm.getState(); + } + + public boolean finish() + { + return oFormDocument.oMainFormDBMetaData.storeDatabaseDocumentToTempPath(this.oFormDocument.xComponent, getName()); + } +} diff --git a/wizards/com/sun/star/wizards/form/FormConfiguration.java b/wizards/com/sun/star/wizards/form/FormConfiguration.java new file mode 100644 index 000000000..9f74c2437 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/FormConfiguration.java @@ -0,0 +1,246 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XCheckBox; +import com.sun.star.awt.XFixedText; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.RelationController; +import com.sun.star.wizards.ui.CommandFieldSelection; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.WizardDialog; +import com.sun.star.wizards.ui.event.XActionListenerAdapter; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class FormConfiguration +{ + + private WizardDialog CurUnoDialog; + private XRadioButton optOnExistingRelation; + private XCheckBox chkcreateSubForm; + private XRadioButton optSelectManually; + private XFixedText lblRelations; + private XListBox lstRelations; + private String[] sreferencedTables; + private CommandFieldSelection CurSubFormFieldSelection; + private boolean bsupportsRelations; + private RelationController oRelationController = null; + + public FormConfiguration(WizardDialog _CurUnoDialog) + { + this.CurUnoDialog = _CurUnoDialog; + short curtabindex = (short) (FormWizard.SOSUBFORM_PAGE * 100); + Integer ISubFormStep = Integer.valueOf(FormWizard.SOSUBFORM_PAGE); + String sOnExistingRelation = CurUnoDialog.m_oResource.getResText("RID_FORM_5"); + String sOnManualRelation = CurUnoDialog.m_oResource.getResText("RID_FORM_7"); + String sSelectManually = CurUnoDialog.m_oResource.getResText("RID_FORM_4"); + String sSelectRelation = CurUnoDialog.m_oResource.getResText("RID_FORM_8"); + String sSubFormDescription = CurUnoDialog.m_oResource.getResText("RID_FORM_3"); + + // CheckBox 'Add sub form' + chkcreateSubForm = CurUnoDialog.insertCheckBox("chkcreateSubForm", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSubFormMode(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_CHKCREATESUBFORM", sSelectManually, 97, 26, ISubFormStep, Short.valueOf(curtabindex++), 160 + }); + optOnExistingRelation = CurUnoDialog.insertRadioButton("optOnExistingRelation", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSteps(); + } + }, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTONEXISTINGRELATION", sOnExistingRelation, 107, 43, ISubFormStep, Short.valueOf(curtabindex++), 160 + }); + optSelectManually = CurUnoDialog.insertRadioButton("optSelectManually", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSteps(); + } + }, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGFORM_OPTSELECTMANUALLY", sOnManualRelation, 107, 99, Short.valueOf((short) 1), ISubFormStep, Short.valueOf(curtabindex++), 160 + }); + lblRelations = CurUnoDialog.insertLabel("lblSelectRelation", + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 19, sSelectRelation, Boolean.TRUE, 119, 56, ISubFormStep, Short.valueOf(curtabindex++), 80 + }); + lstRelations = CurUnoDialog.insertListBox("lstrelations", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + onexistingRelationSelection(); + } + }, new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + onexistingRelationSelection(); + } + }, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 37, "HID:WIZARDS_HID_DLGFORM_lstRELATIONS", 201, 55, ISubFormStep, Short.valueOf(curtabindex++), 103 + }); + CurUnoDialog.insertLabel("lblSubFormDescription", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 59, sSubFormDescription, Boolean.TRUE, 110, 120, ISubFormStep, Short.valueOf(curtabindex++), 190 + }); + CurUnoDialog.insertInfoImage(97, 120, ISubFormStep.intValue()); + } + + + public RelationController getRelationController() + { + return oRelationController; + } + + public boolean areexistingRelationsdefined() + { + return ((chkcreateSubForm.getState() == 1) && (optOnExistingRelation.getState())); + } + + private void toggleSubFormMode() + { + boolean bdoEnable = (this.chkcreateSubForm.getState() == 1); + Helper.setUnoPropertyValue(UnoDialog.getModel(optOnExistingRelation), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoEnable && bsupportsRelations)); + Helper.setUnoPropertyValue(UnoDialog.getModel(optSelectManually), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoEnable)); + toggleSteps(); + } + + public void initialize(CommandFieldSelection _CurSubFormFieldSelection, RelationController _oRelationController) + { + oRelationController = _oRelationController; + sreferencedTables = oRelationController.getExportedKeys(); + bsupportsRelations = (sreferencedTables.length > 0); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstRelations), PropertyNames.STRING_ITEM_LIST, sreferencedTables); + this.CurSubFormFieldSelection = _CurSubFormFieldSelection; + toggleRelationsListbox(); + Helper.setUnoPropertyValue(UnoDialog.getModel(optOnExistingRelation), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bsupportsRelations && (chkcreateSubForm.getState() == 1))); + } + + private void toggleSteps() + { + if (chkcreateSubForm.getState() == 1) + { + if (optOnExistingRelation.getState()) + { + onexistingRelationSelection(); + } + else if (optSelectManually.getState()) + { + CurUnoDialog.enablefromStep(FormWizard.SOFIELDLINKER_PAGE, (CurSubFormFieldSelection.getSelectedFieldNames().length > 0)); + CurUnoDialog.setStepEnabled(FormWizard.SOSUBFORMFIELDS_PAGE, true); + } + } + else + { + CurUnoDialog.setStepEnabled(FormWizard.SOSUBFORMFIELDS_PAGE, false); + CurUnoDialog.setStepEnabled(FormWizard.SOFIELDLINKER_PAGE, false); + CurUnoDialog.enablefromStep(FormWizard.SOCONTROL_PAGE, true); + } + toggleRelationsListbox(); + } + + public String getreferencedTableName() + { + if (areexistingRelationsdefined()) + { + short[] iselected = (short[]) Helper.getUnoArrayPropertyValue(UnoDialog.getModel(lstRelations), PropertyNames.SELECTED_ITEMS); + if (iselected != null && iselected.length > 0) + { + return sreferencedTables[iselected[0]]; + } + } + return PropertyNames.EMPTY_STRING; + } + + private void onexistingRelationSelection() + { + String scurreferencedTableName = getreferencedTableName(); + if (scurreferencedTableName.length() > 0) + { + if (CurSubFormFieldSelection.getSelectedCommandName().equals(scurreferencedTableName)) + { + CurUnoDialog.enablefromStep(FormWizard.SOSUBFORMFIELDS_PAGE, true); + CurUnoDialog.setStepEnabled(FormWizard.SOFIELDLINKER_PAGE, false); + return; + } + else + { + CurUnoDialog.setStepEnabled(FormWizard.SOSUBFORMFIELDS_PAGE, true); + CurUnoDialog.enablefromStep(FormWizard.SOFIELDLINKER_PAGE, false); + return; + } + } + CurUnoDialog.enablefromStep(FormWizard.SOSUBFORMFIELDS_PAGE, false); + } + + private void toggleRelationsListbox() + { + boolean bdoenable = bsupportsRelations && this.optOnExistingRelation.getState() && (chkcreateSubForm.getState() == 1); + Helper.setUnoPropertyValue(UnoDialog.getModel(lblRelations), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstRelations), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable)); + } + + public boolean hasSubForm() + { + return (this.chkcreateSubForm.getState() == 1); + } +} diff --git a/wizards/com/sun/star/wizards/form/FormControlArranger.java b/wizards/com/sun/star/wizards/form/FormControlArranger.java new file mode 100644 index 000000000..93becab45 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/FormControlArranger.java @@ -0,0 +1,675 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.container.XNameContainer; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdbc.ColumnValue; +import com.sun.star.sdbc.DataType; +import com.sun.star.task.XStatusIndicator; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.*; +import com.sun.star.wizards.document.Control; +import com.sun.star.wizards.document.DatabaseControl; +import com.sun.star.wizards.document.FormHandler; +import com.sun.star.wizards.document.Shape; +import com.sun.star.wizards.document.TimeStampControl; + +public class FormControlArranger +{ + + private static final String LABELCONTROL = "LabelControl"; + protected DatabaseControl[] DBControlList = null; + private final XNameContainer xFormName; + private final XMultiServiceFactory xMSF; + private Control[] LabelControlList = null; + private final XStatusIndicator xProgressBar; + private final FieldColumn[] FieldColumns; + // Control curLabelControl; + private int icurArrangement; + private boolean bIsFirstRun; + private boolean bIsVeryFirstRun; + private boolean bControlsareCreated; + private int cXOffset; + private int cYOffset; + private static final int cVertDistance = 200; + private static final int cHoriDistance = 300; + private static final int cLabelGap = 100; + private static final double CMAXREDUCTION = 0.7; + private final FormHandler oFormHandler; + private int iReduceWidth; + private int m_currentLabelPosX; + private int m_currentLabelPosY; + private int m_currentControlPosX; + private int m_currentControlPosY; + private int m_LabelHeight; + private int m_LabelWidth; + private int m_dbControlHeight; + private int m_dbControlWidth; + private int m_MaxLabelWidth; + private int nFormWidth; + private int nFormHeight; + private int m_currentMaxRowHeight; + private int nSecMaxRowY; + private int m_maxPositionX; + private int a; + private int StartA; + private int m_controlMaxPosY = 0; //the maximum YPosition of a DBControl in the form + private Short NBorderType = Short.valueOf((short) 1); //3-D Border + + public FormControlArranger(FormHandler _oFormHandler, XNameContainer _xFormName, CommandMetaData oDBMetaData, XStatusIndicator _xProgressBar, Point _StartPoint, Size _FormSize) + { + FieldColumns = oDBMetaData.FieldColumns; + xMSF = oDBMetaData.xMSF; + xFormName = _xFormName; + xProgressBar = _xProgressBar; + LabelControlList = new Control[FieldColumns.length]; + DBControlList = new DatabaseControl[FieldColumns.length]; + oFormHandler = _oFormHandler; + cXOffset = _StartPoint.X; + cYOffset = _StartPoint.Y; + setFormSize(_FormSize); + } + // Note: on all Controls except for the checkbox the Label has to be set + // a bit under the DBControl because its Height is also smaller + + private int getLabelDiffHeight(int _index) + { + final DatabaseControl curDBControl = DBControlList[_index]; + if (curDBControl != null && curDBControl.getControlType() == FormHandler.SOCHECKBOX) + { + return getCheckBoxDiffHeight(_index); + } + return oFormHandler.getBasicLabelDiffHeight(); + } + + public Control[] getLabelControlList() + { + return LabelControlList; + } + + private int getCheckBoxDiffHeight(int LastIndex) + { + if (LastIndex < DBControlList.length && DBControlList[LastIndex].getControlType() == FormHandler.SOCHECKBOX) + { + return (oFormHandler.getControlReferenceHeight() - DBControlList[LastIndex].getControlHeight()) / 2; + } + return 0; + } + + private boolean isReducable(int _index, int i_labelWidth, int i_dbControlWidth) + { + boolean bisreducable = false; + int ntype = FieldColumns[_index].getFieldType(); + switch (ntype) + { + case DataType.TINYINT: + case DataType.SMALLINT: + case DataType.INTEGER: + case DataType.FLOAT: + case DataType.DATE: + case DataType.TIME: + case DataType.TIMESTAMP: + case DataType.REAL: + case DataType.DOUBLE: + case DataType.NUMERIC: + case DataType.DECIMAL: + case DataType.BIT: + case DataType.BOOLEAN: + bisreducable = false; + break; + case DataType.VARCHAR: + short nTextLen; + try + { + nTextLen = AnyConverter.toShort(DBControlList[_index].xPropertySet.getPropertyValue("MaxTextLen")); + if ((nTextLen == 0) || (nTextLen > 20)) + { + bisreducable = true; + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + break; + case DataType.BIGINT: + bisreducable = true; + break; + default: + bisreducable = true; + } + if (bisreducable && i_labelWidth > 0.9 * CMAXREDUCTION * i_dbControlWidth) + { + bisreducable = false; + } + return bisreducable; + } + + private void checkJustifiedPosition(int a) + { + int nBaseWidth = nFormWidth + cXOffset; + int nLeftDist = m_maxPositionX - nBaseWidth; + int nRightDist = nBaseWidth - (DBControlList[a].getPosition().X - cHoriDistance); + if (nLeftDist < 0.5 * nRightDist) + { + // Fieldwidths in the line can be made smaller... + adjustLineWidth(StartA, a, nLeftDist, -1); + m_currentLabelPosY = m_currentMaxRowHeight + cVertDistance; + m_currentControlPosY = m_currentLabelPosY + m_LabelHeight; + m_currentLabelPosX = cXOffset; + m_currentControlPosX = cXOffset; + bIsFirstRun = true; + StartA = a + 1; + } + else + { + // FieldWidths in the line can be made wider... + if (m_currentControlPosY + m_dbControlHeight == m_currentMaxRowHeight) + { + // The last Control was the highest in the row + m_currentLabelPosY = nSecMaxRowY; + } + else + { + m_currentLabelPosY = m_currentMaxRowHeight; + } + m_currentLabelPosY += cVertDistance; + m_currentControlPosY = m_currentLabelPosY + m_LabelHeight; + m_currentControlPosX = cXOffset; + m_currentLabelPosX = cXOffset; + LabelControlList[a].setPosition(new Point(cXOffset, m_currentLabelPosY)); + DBControlList[a].setPosition(new Point(cXOffset, m_currentControlPosY)); + bIsFirstRun = true; + checkOuterPoints(m_currentControlPosX, m_dbControlWidth > m_LabelWidth ? m_dbControlWidth : m_LabelWidth, m_currentControlPosY, m_dbControlHeight, true); + m_currentLabelPosX = m_maxPositionX + cHoriDistance; + m_currentControlPosX = m_currentLabelPosX; + adjustLineWidth(StartA, a - 1, nRightDist, 1); + StartA = a; + } + } + + private int getCorrWidth(int StartIndex, int EndIndex, int nDist, int Widthfactor) + { + int ShapeCount; + if (Widthfactor > 0) + { + // shapes are made wide + ShapeCount = EndIndex - StartIndex + 1; + } + else + { + // shapes are made more narrow + ShapeCount = iReduceWidth; + } + if(ShapeCount == 0) + return 0; + else + return (nDist) / ShapeCount; + } + + /** + * + * @param StartIndex + * @param EndIndex + * @param nDist + * @param WidthFactor is either '+1' or '-1' and determines whether the control shapes widths are to be made smaller or larger + */ + private void adjustLineWidth(final int StartIndex, final int EndIndex, final int nDist, final int WidthFactor) + { + if(StartIndex <= EndIndex) + { + int CorrWidth = getCorrWidth(StartIndex, EndIndex, nDist, WidthFactor); + int iLocTCPosX = cXOffset; + for (int i = StartIndex; i <= EndIndex; i++) + { + int nControlBaseWidth = 0; + DatabaseControl dbControl = DBControlList[i]; + Control curLabelControl = LabelControlList[i]; + if (i != StartIndex) + { + curLabelControl.setPosition(new Point(iLocTCPosX, curLabelControl.getPosition().Y)); + dbControl.setPosition(new Point(iLocTCPosX, curLabelControl.getPosition().Y + m_LabelHeight)); + } + final Size labelSize = curLabelControl.getSize(); + Size controlSize = dbControl.getSize(); + if (((labelSize.Width > controlSize.Width)) && (WidthFactor > 0)) + { + nControlBaseWidth = labelSize.Width; + } + else + { + nControlBaseWidth = controlSize.Width; + } + if (FieldColumns[i].getFieldType() == DataType.TIMESTAMP) + { + TimeStampControl oDBTimeStampControl = (TimeStampControl) dbControl; + nControlBaseWidth = oDBTimeStampControl.getSize().Width; + } + if (WidthFactor > 0 || isReducable(i, labelSize.Width, controlSize.Width)) + { + controlSize.Width = nControlBaseWidth + WidthFactor * CorrWidth; + dbControl.setSize(controlSize); + controlSize = dbControl.getSize(); + } + + if (labelSize.Width > controlSize.Width) + { + iLocTCPosX += labelSize.Width; + } + else + { + iLocTCPosX += controlSize.Width; + } + iLocTCPosX += cHoriDistance; + } + } + if (WidthFactor > 0) + { + iReduceWidth = 1; + } + else + { + iReduceWidth = 0; + } + } + + private void checkOuterPoints(int i_nXPos, int i_nWidth, int i_nYPos, int i_nHeight, boolean i_bIsDBField) + { + if (icurArrangement == FormWizard.IN_BLOCK_TOP && i_bIsDBField) + { + // Only at DBControls you can measure the Value of nMaxRowY + if (bIsFirstRun) + { + m_currentMaxRowHeight = i_nYPos + i_nHeight; + nSecMaxRowY = m_currentMaxRowHeight; + } + else + { + int nRowY = i_nYPos + i_nHeight; + if (nRowY >= m_currentMaxRowHeight) + { + nSecMaxRowY = m_currentMaxRowHeight; + m_currentMaxRowHeight = nRowY; + } + } + } + // Find the outer right point + if (bIsFirstRun) + { + m_maxPositionX = i_nXPos + i_nWidth; + bIsFirstRun = false; + } + else + { + int nColRightX = i_nXPos + i_nWidth; + if (nColRightX > m_maxPositionX) + { + m_maxPositionX = nColRightX; + } + } + } + + public void positionControls(int _icurArrangement, Point _aStartPoint, short _iAlign, Short _NBorderType) + { + try + { + NBorderType = _NBorderType; + setStartPoint(_aStartPoint); + icurArrangement = _icurArrangement; + initializePosSizes(); + initializeControlColumn(-1); + bIsVeryFirstRun = true; + m_currentMaxRowHeight = 0; + nSecMaxRowY = 0; + m_maxPositionX = 0; + xProgressBar.start(PropertyNames.EMPTY_STRING, FieldColumns.length); + for (int i = 0; i < FieldColumns.length; i++) + { + try + { + insertLabel(i, _iAlign); + insertDBControl(i); + bIsVeryFirstRun = false; + DBControlList[i].setPropertyValue(LABELCONTROL, LabelControlList[i].xPropertySet); + resetPosSizes(i); + xProgressBar.setValue(i + 1); + } + catch (RuntimeException e) + { + } + } + xProgressBar.end(); + bControlsareCreated = true; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public boolean areControlsexisting() + { + if (DBControlList != null) + { + if (DBControlList.length > 0) + { + return (DBControlList[0] != null); + } + } + return false; + } + + private void initializeControlColumn(int LastIndex) + { + bIsFirstRun = true; + StartA = LastIndex + 1; + a = 0; + } + + private void resetPosSizes(int LastIndex) + { + int nYRefPos = m_currentControlPosY; + switch (icurArrangement) + { + case FormWizard.COLUMNAR_LEFT: + m_currentControlPosY = m_currentControlPosY + m_dbControlHeight + cVertDistance + getCheckBoxDiffHeight(LastIndex); + nYRefPos = m_currentControlPosY; + if ((m_currentControlPosY > cYOffset + nFormHeight) || (LastIndex == (FieldColumns.length - 1))) + { + repositionColumnarLeftControls(LastIndex); + m_currentLabelPosX = m_maxPositionX + 2 * cHoriDistance; + m_currentControlPosX = m_currentLabelPosX + cLabelGap + m_MaxLabelWidth; + m_currentControlPosY = cYOffset; + nYRefPos = m_currentControlPosY; + initializeControlColumn(LastIndex); + } + else + { + /*a = a + 1;*/ + /* a += 1;*/ + ++a; + } + m_currentLabelPosY = m_currentControlPosY + getLabelDiffHeight(LastIndex); + if ((nYRefPos + m_dbControlHeight) > m_controlMaxPosY) + { + m_controlMaxPosY = nYRefPos + m_dbControlHeight; + } + + break; + case FormWizard.COLUMNAR_TOP: + m_currentLabelPosY = m_currentControlPosY + m_dbControlHeight + cVertDistance + getCheckBoxDiffHeight(LastIndex); + + if ((m_currentLabelPosY > cYOffset + nFormHeight) || (LastIndex == (FieldColumns.length - 1))) + { + m_currentControlPosX = m_maxPositionX + cHoriDistance; + m_currentLabelPosX = m_currentControlPosX; + nYRefPos = m_currentControlPosY; + m_currentControlPosY = cYOffset + m_LabelHeight + cVertDistance; + m_currentLabelPosY = cYOffset; + initializeControlColumn(LastIndex); + } + else + { + ++a; + } + if ((nYRefPos + m_dbControlHeight + cVertDistance) > m_controlMaxPosY) + { + m_controlMaxPosY = nYRefPos + m_dbControlHeight + cVertDistance; + } + break; + + case FormWizard.IN_BLOCK_TOP: + if (isReducable(a, m_LabelWidth, m_dbControlWidth)) + { + ++iReduceWidth; + } + if (m_maxPositionX > cXOffset + nFormWidth) + { + checkJustifiedPosition(a); + nYRefPos = m_currentControlPosY; + } + else + { + m_currentLabelPosX = m_maxPositionX + cHoriDistance; + } + if (a == FieldColumns.length - 1) + { + checkJustifiedPosition(a); + nYRefPos = m_currentControlPosY; + } + m_currentControlPosX = m_currentLabelPosX; + ++a; + if ((nYRefPos + m_dbControlHeight) > m_controlMaxPosY) + { + m_controlMaxPosY = nYRefPos + m_dbControlHeight; + } + break; + } + } + + private void repositionColumnarLeftControls(int LastIndex) + { + bIsFirstRun = true; + for (int i = StartA; i <= LastIndex; i++) + { + if (i == StartA) + { + m_currentLabelPosX = LabelControlList[i].getPosition().X; + m_currentControlPosX = m_currentLabelPosX + m_MaxLabelWidth + cHoriDistance; + } + LabelControlList[i].setSize(new Size(m_MaxLabelWidth, m_LabelHeight)); + resetDBShape(DBControlList[i], m_currentControlPosX); + checkOuterPoints(m_currentControlPosX, m_dbControlWidth, m_currentControlPosY, m_dbControlHeight, true); + } + } + + private void resetDBShape(Shape _curDBControl, int iXPos) + { + m_dbControlWidth = _curDBControl.getSize().Width; + m_dbControlHeight = _curDBControl.getSize().Height; + _curDBControl.setPosition(new Point(iXPos, _curDBControl.getPosition().Y)); + } + + private void initializePosSizes() + { + m_controlMaxPosY = 0; + m_currentLabelPosX = cXOffset; + m_LabelWidth = 2000; + m_dbControlWidth = 2000; + m_dbControlHeight = oFormHandler.getControlReferenceHeight(); + m_LabelHeight = oFormHandler.getLabelHeight(); + iReduceWidth = 0; + if (icurArrangement == FormWizard.COLUMNAR_LEFT) + { + m_currentLabelPosY = cYOffset + getLabelDiffHeight(0); + m_currentControlPosX = cXOffset + 3050; + m_currentControlPosY = cYOffset; + } + else + { + m_currentControlPosX = cXOffset; + m_currentLabelPosY = cYOffset; + } + } + + private void insertLabel(int i, int _iAlign) + { + try + { + Point aPoint = new Point(m_currentLabelPosX, m_currentLabelPosY); + Size aSize = new Size(m_LabelWidth, m_LabelHeight); + if (bControlsareCreated) + { + LabelControlList[i].setPosition(aPoint); + if (icurArrangement != FormWizard.COLUMNAR_LEFT) + { + m_LabelWidth = LabelControlList[i].getPreferredWidth(FieldColumns[i].getFieldTitle()); + aSize.Width = m_LabelWidth; + LabelControlList[i].setSize(aSize); + } + else + { + m_LabelWidth = LabelControlList[i].getSize().Width; + } + } + else + { + final String sFieldName = FieldColumns[i].getFieldName(); + LabelControlList[i] = new Control(oFormHandler, xFormName, FormHandler.SOLABEL, sFieldName, aPoint, aSize); + if (bIsVeryFirstRun && icurArrangement == FormWizard.COLUMNAR_TOP) + { + m_currentControlPosY = m_currentLabelPosY + m_LabelHeight; + } + final String sTitle = FieldColumns[i].getFieldTitle(); + m_LabelWidth = LabelControlList[i].getPreferredWidth(sTitle); + aSize.Width = m_LabelWidth; + LabelControlList[i].setSize(aSize); + } + Control curLabelControl = LabelControlList[i]; + if (icurArrangement == FormWizard.COLUMNAR_LEFT) + { + // Note This If Sequence must be called before retrieving the outer Points + if (bIsFirstRun) + { + m_MaxLabelWidth = m_LabelWidth; + bIsFirstRun = false; + } + else if (m_LabelWidth > m_MaxLabelWidth) + { + m_MaxLabelWidth = m_LabelWidth; + } + } + checkOuterPoints(m_currentLabelPosX, m_LabelWidth, m_currentLabelPosY, m_LabelHeight, false); + if ((icurArrangement == FormWizard.COLUMNAR_TOP) || (icurArrangement == FormWizard.IN_BLOCK_TOP)) + { + m_currentControlPosX = m_currentLabelPosX; + m_currentControlPosY = m_currentLabelPosY + m_LabelHeight; + curLabelControl.xPropertySet.setPropertyValue(PropertyNames.PROPERTY_ALIGN, Short.valueOf((short) com.sun.star.awt.TextAlign.LEFT)); + } + else + { + curLabelControl.xPropertySet.setPropertyValue(PropertyNames.PROPERTY_ALIGN, Short.valueOf((short) _iAlign)); + } + if (!bControlsareCreated) + { + curLabelControl.setSize(new Size(m_LabelWidth, m_LabelHeight)); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void insertDBControl(int i) + { + try + { + String sFieldName = FieldColumns[i].getFieldName(); + int nFieldType = FieldColumns[i].getFieldType(); + boolean bFieldNullable = AnyConverter.toInt(FieldColumns[i].getXColumnPropertySet().getPropertyValue(PropertyNames.PROPERTY_IS_NULLABLE)) != ColumnValue.NO_NULLS; + boolean bFieldHasDefaultValue = !AnyConverter.toString(FieldColumns[i].getXColumnPropertySet().getPropertyValue(PropertyNames.PROPERTY_DEFAULT_VALUE)).isEmpty(); + + Point aPoint = new Point(m_currentControlPosX, m_currentControlPosY); + if (bControlsareCreated) + { + DBControlList[i].setPosition(aPoint); + } + else + { + if (nFieldType == DataType.TIMESTAMP) + { + DBControlList[i] = new TimeStampControl(new Resource(xMSF), oFormHandler, xFormName, sFieldName, aPoint); + } + else + { + DBControlList[i] = new DatabaseControl(oFormHandler, xFormName, sFieldName, nFieldType, aPoint); + if (DBControlList[i].getControlType() == FormHandler.SOCHECKBOX) + { + // Checkboxes have no Label near by + DBControlList[i].setPropertyValue(PropertyNames.PROPERTY_LABEL, PropertyNames.EMPTY_STRING); + } + } + } + DatabaseControl aDBControl = DBControlList[i]; + m_dbControlHeight = aDBControl.getControlHeight(); + m_dbControlWidth = aDBControl.getControlWidth(); + if (nFieldType != DataType.TIMESTAMP) + { + aDBControl.setSize(new Size(m_dbControlWidth, m_dbControlHeight)); + } + if (aDBControl.getControlType() == FormHandler.SOCHECKBOX) + { + m_currentControlPosY = m_currentControlPosY + /*(int)*/ ((oFormHandler.getControlReferenceHeight() - m_dbControlHeight) / 2); + aPoint = new Point(m_currentControlPosX, m_currentControlPosY); + aDBControl.setPosition(aPoint); + } + if (nFieldType == DataType.LONGVARCHAR) /* memo */ + { + Helper.setUnoPropertyValue(aDBControl.xPropertySet, PropertyNames.PROPERTY_MULTILINE, Boolean.TRUE); + } + checkOuterPoints(m_currentControlPosX, m_dbControlWidth, m_currentControlPosY, m_dbControlHeight, true); + aDBControl.setPropertyValue(PropertyNames.PROPERTY_BORDER, NBorderType); + aDBControl.setPropertyValue(PropertyNames.PROPERTY_INPUT_REQUIRED, !(bFieldNullable || bFieldHasDefaultValue)); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public int getFormHeight() + { + return m_controlMaxPosY - cYOffset; + } + + public int getEntryPointY() + { + if (icurArrangement == FormWizard.COLUMNAR_TOP) + { + Control curLabelControl2 = LabelControlList[0]; + return curLabelControl2.getPosition().Y; + } + else + { + DatabaseControl curDBControl2 = DBControlList[0]; + return curDBControl2.getPosition().Y; + } + } + + public void setStartPoint(Point _aPoint) + { + cXOffset = _aPoint.X; + cYOffset = _aPoint.Y; + } + + + + public void setFormSize(Size _FormSize) + { + nFormHeight = _FormSize.Height; + nFormWidth = _FormSize.Width; + } +} diff --git a/wizards/com/sun/star/wizards/form/FormDocument.java b/wizards/com/sun/star/wizards/form/FormDocument.java new file mode 100644 index 000000000..af7244950 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/FormDocument.java @@ -0,0 +1,554 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import java.util.ArrayList; + +import com.sun.star.awt.Point; +import com.sun.star.awt.Size; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameContainer; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.CommandMetaData; +import com.sun.star.wizards.document.Control; +import com.sun.star.wizards.document.DatabaseControl; +import com.sun.star.wizards.document.FormHandler; +import com.sun.star.wizards.document.GridControl; +import com.sun.star.wizards.text.TextDocument; +import com.sun.star.wizards.text.TextStyleHandler; +import com.sun.star.wizards.text.ViewHandler; + +public class FormDocument extends TextDocument +{ + protected ArrayList<ControlForm> oControlForms = new ArrayList<ControlForm>(); + protected CommandMetaData oMainFormDBMetaData; + protected CommandMetaData oSubFormDBMetaData; + protected String[][] LinkFieldNames; + + private FormHandler oFormHandler; + private XPropertySet xPropPageStyle; + private static final int SOFORMGAP = 2000; + private boolean bhasSubForm; + private UIControlArranger curUIControlArranger; + private StyleApplier curStyleApplier; + private int nPageWidth; + private int nPageHeight; + private int nFormWidth; + private int nFormHeight; + private Point aMainFormPoint; + private static final String SOMAINFORM = "MainForm"; + private static final String SOSUBFORM = "SubForm"; + + public FormDocument(XMultiServiceFactory xMSF) + { + super(xMSF, new TextDocument.ModuleIdentifier("com.sun.star.sdb.FormDesign"), true); + try + { + oFormHandler = new FormHandler(xMSF, xTextDocument); + oFormHandler.setDrawObjectsCaptureMode(false); + TextStyleHandler oTextStyleHandler = new TextStyleHandler(xTextDocument); + new ViewHandler(xTextDocument); + oMainFormDBMetaData = new CommandMetaData(xMSF);// , CharLocale); + oSubFormDBMetaData = new CommandMetaData(xMSF);// , CharLocale); + ViewHandler oViewHandler = new ViewHandler(xTextDocument); + TextStyleHandler oTextStyleSupplier = new TextStyleHandler(xTextDocument); + Helper.setUnoPropertyValue(xTextDocument, "ApplyFormDesignMode", Boolean.FALSE); + oViewHandler.setViewSetting("ShowTableBoundaries", Boolean.FALSE); + oViewHandler.setViewSetting("ShowOnlineLayout", Boolean.TRUE); + xPropPageStyle = oTextStyleSupplier.getStyleByName("PageStyles", "Standard"); + Size aSize = oTextStyleHandler.changePageAlignment(xPropPageStyle, true); + nPageWidth = aSize.Width; + nPageHeight = aSize.Height; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public void addUIFormController(UIControlArranger _curUIControlArranger) + { + this.curUIControlArranger = _curUIControlArranger; + } + + public void addStyleApplier(StyleApplier _curStyleApplier) + { + this.curStyleApplier = _curStyleApplier; + } + + private String getDataSourceName() + { + return this.oMainFormDBMetaData.DataSourceName; + } + + private void adjustPageStyle() + { + try + { + int nMargin; + int totfieldcount = getMainFieldCount() + getSubFieldCount(); + if (totfieldcount > 30) + { + nMargin = 500; + } + else if (totfieldcount > 20) + { + nMargin = 750; + } + else + { + nMargin = 1000; + } + xPropPageStyle.setPropertyValue("RightMargin", Integer.valueOf(nMargin)); + xPropPageStyle.setPropertyValue("LeftMargin", Integer.valueOf(nMargin)); + xPropPageStyle.setPropertyValue("TopMargin", Integer.valueOf(nMargin)); + xPropPageStyle.setPropertyValue("BottomMargin", Integer.valueOf(nMargin)); + aMainFormPoint = new Point(nMargin, nMargin); + nFormWidth = (int) (0.8 * nPageWidth) - 2 * nMargin; + nFormHeight = (int) (0.65 * nPageHeight) - 2 * nMargin; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public void initialize(boolean _baddParentForm, boolean _bShouldHaveSubForm, boolean _bModifySubForm, Short _NBorderType) + { + bhasSubForm = _bShouldHaveSubForm; + adjustPageStyle(); + if (_baddParentForm) + { + if (oControlForms.isEmpty()) + { + final ControlForm aMainControlForm = new ControlForm(this, SOMAINFORM, aMainFormPoint, getMainFormSize(FormWizard.AS_GRID)); + oControlForms.add(aMainControlForm); + } + else + { + oFormHandler.removeControlsofForm(SOMAINFORM); + oControlForms.get(0).oFormController = null; + } + oControlForms.get(0).initialize(curUIControlArranger.getSelectedArrangement(0), _NBorderType); + } + if (_bShouldHaveSubForm) + { + if (oControlForms.size() == 1) + { + adjustMainFormSize(_NBorderType); + final ControlForm aSubControlForm = new ControlForm(this, SOSUBFORM, getSubFormPoint(), getSubFormSize()); + oControlForms.add(aSubControlForm); + /* ((ControlForm) oControlForms.get(1))*/ + aSubControlForm.initialize(curUIControlArranger.getSelectedArrangement(1), _NBorderType); + } + else if (_bModifySubForm) + { + if (oControlForms.size() > 1) + { + oFormHandler.removeControlsofForm(SOSUBFORM); + oControlForms.get(1).oFormController = null; + oControlForms.get(1).initialize(curUIControlArranger.getSelectedArrangement(1), _NBorderType); + } + } + } + else + { + ControlForm aMainForm = oControlForms.get(0); + // WRONG if (oFormHandler.hasFormByName(SOSUBFORM)) + if (aMainForm.xFormContainer != null && aMainForm.xFormContainer.hasByName(SOSUBFORM)) + { + oFormHandler.removeControlsofForm(SOSUBFORM); + oFormHandler.removeElement( aMainForm.xFormContainer, SOSUBFORM ); + oControlForms.get(1).oFormController = null; + oControlForms.remove(1); + adjustMainFormSize(_NBorderType); + } + } + } + + private int getMainFieldCount() + { + return oMainFormDBMetaData.getFieldNames().length; + } + private int getSubFieldCount() + { + return oSubFormDBMetaData.getFieldNames().length; + } + + private Size getMainFormSize(int _curArrangement) + { + int nMainFormHeight = nFormHeight; + if (bhasSubForm) + { + if (_curArrangement == FormWizard.AS_GRID) + { + nMainFormHeight = (int) ((double) (nFormHeight - SOFORMGAP) / 2); + } + else + { + int nTotalFieldCount = getMainFieldCount() + getSubFieldCount(); + nMainFormHeight = (int) (((double) getMainFieldCount() / (double) nTotalFieldCount) * ((double) (nFormHeight - SOFORMGAP) / 2)); + } + } + return new Size(nFormWidth, nMainFormHeight); + } + + private Size getSubFormSize() + { + int nMainFormHeight = oControlForms.get(0).getActualFormHeight(); + return new Size(nFormWidth, nFormHeight - nMainFormHeight - SOFORMGAP); + } + + private Point getSubFormPoint() + { + ControlForm curMainControlForm = oControlForms.get(0); + return new Point(curMainControlForm.aStartPoint.X, + (curMainControlForm.aStartPoint.Y + curMainControlForm.getFormSize().Height + SOFORMGAP)); + } + + private void adjustMainFormSize(Short _NBorderType) + { + ControlForm oMainControlForm = oControlForms.get(0); + oMainControlForm.setFormSize(getMainFormSize(oMainControlForm.curArrangement)); + if (oMainControlForm.curArrangement == FormWizard.AS_GRID) + { + oMainControlForm.oGridControl.setSize(oMainControlForm.getFormSize()); + } + else + { + oMainControlForm.oFormController.positionControls(oMainControlForm.curArrangement, + oMainControlForm.aStartPoint, + curUIControlArranger.getAlignValue(), + _NBorderType); + } + } + + private void adjustSubFormPosSize(Short _NBorderType) + { + ControlForm oMainControlForm = oControlForms.get(0); + ControlForm oSubControlForm = oControlForms.get(1); + oSubControlForm.setFormSize(new Size(nFormWidth, nFormHeight - oMainControlForm.getFormSize().Height)); + if (oSubControlForm.curArrangement == FormWizard.AS_GRID) + { + Point aPoint = oSubControlForm.oGridControl.getPosition(); + int idiffheight = oSubControlForm.getEntryPointY() - oMainControlForm.getActualFormHeight() - oMainControlForm.aStartPoint.Y - SOFORMGAP; + oSubControlForm.setStartPoint(new Point(aPoint.X, (aPoint.Y - idiffheight))); + oSubControlForm.oGridControl.setPosition(oSubControlForm.aStartPoint); + oSubControlForm.oGridControl.setSize(getSubFormSize()); + } + else + { +// oSubControlForm.oFormController.adjustYPositions(_idiffheight); + oSubControlForm.setStartPoint(new Point(oSubControlForm.aStartPoint.X, oMainControlForm.getActualFormHeight() + oMainControlForm.aStartPoint.Y + SOFORMGAP)); + oSubControlForm.oFormController.positionControls(oSubControlForm.curArrangement, oSubControlForm.aStartPoint, curUIControlArranger.getAlignValue(), _NBorderType); + } + } + + private ControlForm getControlFormByName(String _sname) + { + for (int i = 0; i < oControlForms.size(); i++) + { + ControlForm curControlForm = oControlForms.get(i); + if (curControlForm.Name.equals(_sname)) + { + return curControlForm; + } + } + throw new IllegalArgumentException("Searching for control " + _sname + " failed"); + } + + public boolean finalizeForms(DataEntrySetter _curDataEntrySetter, FieldLinker _curFieldLinker, FormConfiguration _curFormConfiguration) + { + try + { + this.xTextDocument.lockControllers(); + PropertyValue[] aFormProperties = _curDataEntrySetter.getFormProperties(); + ControlForm oMasterControlForm = getControlFormByName(SOMAINFORM); + oMasterControlForm.setFormProperties(aFormProperties, oMainFormDBMetaData); + oMasterControlForm.finalizeControls(); + if (oMasterControlForm.xFormContainer.hasByName(SOSUBFORM)) + { + ControlForm oSubControlForm = getControlFormByName(SOSUBFORM); + oSubControlForm.setFormProperties(aFormProperties, oSubFormDBMetaData); + String sRefTableName = _curFormConfiguration.getreferencedTableName(); + if (sRefTableName.equals(PropertyNames.EMPTY_STRING)) + { + LinkFieldNames = _curFieldLinker.getLinkFieldNames(); + } + else + { + LinkFieldNames = _curFieldLinker.getLinkFieldNames(_curFormConfiguration.getRelationController(), sRefTableName); + } + if (LinkFieldNames != null && LinkFieldNames.length > 0) + { + oSubControlForm.xPropertySet.setPropertyValue("DetailFields", LinkFieldNames[0]); + oSubControlForm.xPropertySet.setPropertyValue("MasterFields", LinkFieldNames[1]); + oSubControlForm.finalizeControls(); + return true; + } + return false; + } + return true; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return false; + } + finally + { + unlockallControllers(); + } + } + + public class ControlForm + { + + private XNameContainer xFormContainer; + GridControl oGridControl; + private FormControlArranger oFormController; + private int curArrangement; + private FormDocument oFormDocument; + private String Name; + private Point aStartPoint; + private Size aFormSize; + private CommandMetaData oDBMetaData; + private XPropertySet xPropertySet; + + public ControlForm(FormDocument _oFormDocument, String _sname, Point _astartPoint, Size _aFormSize) + { + aStartPoint = _astartPoint; + aFormSize = _aFormSize; + oFormDocument = _oFormDocument; + Name = _sname; + if (_sname.equals(SOSUBFORM)) + { + ControlForm oMainControlForm = oControlForms.get(0); + xFormContainer = oFormHandler.insertFormbyName(_sname, oMainControlForm.xFormContainer); + } + else + { + xFormContainer = oFormHandler.insertFormbyName(_sname); + } + xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xFormContainer); + if (_sname.equals(SOMAINFORM)) + { + oDBMetaData = oFormDocument.oMainFormDBMetaData; + } + else + { + oDBMetaData = oFormDocument.oSubFormDBMetaData; + } + } + + public void initialize(int _curArrangement, Short _NBorderType) + { + boolean adaptControlStyles = false; + xTextDocument.lockControllers(); + curArrangement = _curArrangement; + if (oGridControl != null) + { + oFormHandler.xDrawPage.remove(oGridControl.xShape); + oGridControl.xComponent.dispose(); + oGridControl = null; + } + if (oFormController == null) + { + oFormController = new FormControlArranger(oFormHandler, xFormContainer, oDBMetaData, xProgressBar, aStartPoint, aFormSize); + } + else + { + if (curArrangement == FormWizard.AS_GRID) + { + oFormHandler.moveShapesToNirwana(getLabelControls()); + oFormHandler.moveShapesToNirwana(getDatabaseControls()); + } + } + if (curArrangement == FormWizard.AS_GRID) + { + insertGridControl(_NBorderType); + adaptControlStyles = true; + } + else + { + adaptControlStyles = !oFormController.areControlsexisting(); + oFormController.positionControls(_curArrangement, aStartPoint, curUIControlArranger.getAlignValue(), _NBorderType); + } + if (adaptControlStyles) + { + curStyleApplier.applyStyle(true); + } + if ((Name.equals(SOMAINFORM)) && (oControlForms.size() > 1)) + { + ControlForm curSubControlForm = oControlForms.get(1); + if (curSubControlForm != null) + { + adjustSubFormPosSize(_NBorderType); + } + } + setFormSize(new Size(aFormSize.Width, getActualFormHeight())); + unlockallControllers(); + } + + public Control[] getLabelControls() + { + if (oFormController != null) + { + return oFormController.getLabelControlList(); + } + else + { + return null; + } + } + + private Size getFormSize() + { + return aFormSize; + } + + private void setFormSize(Size _aSize) + { + aFormSize = _aSize; + oFormController.setFormSize(aFormSize); + } + + private void setStartPoint(Point _aPoint) + { + aStartPoint = _aPoint; + if (oFormController != null) + { + oFormController.setStartPoint(_aPoint); + } + } + + private int getActualFormHeight() + { + if (curArrangement == FormWizard.AS_GRID) + { + return oGridControl.xShape.getSize().Height; + } + else + { + return oFormController.getFormHeight(); + } + } + + private int getEntryPointY() + { + if (curArrangement == FormWizard.AS_GRID) + { + return oGridControl.xShape.getPosition().Y; + } + else + { + return oFormController.getEntryPointY(); + } + } + + private void setFormProperties(PropertyValue[] _aPropertySetList, CommandMetaData _oDBMetaData) + { + try + { + xPropertySet.setPropertyValue("DataSourceName", getDataSourceName()); + xPropertySet.setPropertyValue(PropertyNames.COMMAND, _oDBMetaData.getCommandName()); + xPropertySet.setPropertyValue(PropertyNames.COMMAND_TYPE, Integer.valueOf(_oDBMetaData.getCommandType())); + for (int i = 0; i < _aPropertySetList.length; i++) + { + xPropertySet.setPropertyValue(_aPropertySetList[i].Name, _aPropertySetList[i].Value); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public DatabaseControl[] getDatabaseControls() + { + if (oFormController != null) + { + return oFormController.DBControlList; + } + else + { + return null; + } + } + + public GridControl getGridControl() + { + return oGridControl; + } + + public int getArrangemode() + { + return curArrangement; + } + + private void insertGridControl(Short _NBorderType) + { + try + { + curArrangement = FormWizard.AS_GRID; + if (Name.equals(SOMAINFORM)) + { + oGridControl = new GridControl(xMSF, Name + "_Grid", oFormHandler, xFormContainer, oDBMetaData.FieldColumns, aStartPoint, getMainFormSize(FormWizard.AS_GRID)); + } + else + { + oGridControl = new GridControl(xMSF, Name + "_Grid", oFormHandler, xFormContainer, oDBMetaData.FieldColumns, aStartPoint, getSubFormSize()); + } + oGridControl.xPropertySet.setPropertyValue(PropertyNames.PROPERTY_BORDER, _NBorderType); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void finalizeControls() + { + Control[] oLabelControls = getLabelControls(); + Control[] oDBControls = getDatabaseControls(); + if (oLabelControls != null) + { + for (int i = 0; i < getLabelControls().length; i++) + { + if (curArrangement == FormWizard.AS_GRID) + { + if ((oLabelControls[i] != null) && (oDBControls[i] != null)) + { + oFormHandler.removeShape(oLabelControls[i].xShape); + oFormHandler.removeShape(oDBControls[i].xShape); + } + } + else + { + oFormHandler.groupShapesTogether(xMSF, oLabelControls[i].xShape, oDBControls[i].xShape); + } + } + } + } + } +} diff --git a/wizards/com/sun/star/wizards/form/FormWizard.java b/wizards/com/sun/star/wizards/form/FormWizard.java new file mode 100644 index 000000000..4534d8ac5 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/FormWizard.java @@ -0,0 +1,464 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.application.DatabaseObject; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.db.DatabaseObjectWizard; +import com.sun.star.wizards.db.RelationController; +import com.sun.star.wizards.document.OfficeDocument; +import com.sun.star.wizards.ui.CommandFieldSelection; +import com.sun.star.wizards.ui.UIConsts; + +public class FormWizard extends DatabaseObjectWizard +{ + + private CommandFieldSelection curDBCommandFieldSelection; + private FormConfiguration curFormConfiguration; + private CommandFieldSelection curSubFormFieldSelection; + private FormDocument curFormDocument; + private FieldLinker curFieldLinker; + private UIControlArranger curControlArranger; + private DataEntrySetter CurDataEntrySetter; + private StyleApplier curStyleApplier; + private Finalizer curFinalizer; + private static String slblFields; + private static String slblSelFields; + private String sShowBinaryFields = PropertyNames.EMPTY_STRING; + private String serrFormNameexists = PropertyNames.EMPTY_STRING; + private static final int SOMAIN_PAGE = 1; + public static final int SOSUBFORM_PAGE = 2; + public static final int SOSUBFORMFIELDS_PAGE = 3; + public static final int SOFIELDLINKER_PAGE = 4; + public static final int SOCONTROL_PAGE = 5; + public static final int SODATA_PAGE = 6; + public static final int SOSTYLE_PAGE = 7; + public static final int SOSTORE_PAGE = 8; + public static final int COLUMNAR_LEFT = 1; + public static final int COLUMNAR_TOP = 2; + public static final int AS_GRID = 3; + public static final int IN_BLOCK_TOP = 4; + private String slblTables; + private boolean m_openForEditing; + private boolean m_success = false; + private String FormName; + + public FormWizard(XMultiServiceFactory i_servicFactory, final PropertyValue[] i_wizardContext) + { + super(i_servicFactory, 34400, i_wizardContext); + super.addResourceHandler(); + Helper.setUnoPropertyValues(xDialogModel, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_MOVEABLE, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_TITLE, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 210, Boolean.TRUE, "DialogForm", 102, 41, 1, Short.valueOf((short) 0), m_oResource.getResText("RID_FORM_0"), 310 + }); + drawNaviBar(); + getFormResources(); + setRightPaneHeaders(m_oResource, "RID_FORM_", 90, 8); + } + + public static void main(String i_args[]) + { + executeWizardFromCommandLine( i_args, new WizardFromCommandLineStarter() { + public void start(XMultiServiceFactory factory, PropertyValue[] curproperties) { + FormWizard wizard = new FormWizard(factory, curproperties); + wizard.start(); + } + }); + } + + // @Override + @Override + protected void enterStep(int nOldStep, int nNewStep) + { + try + { + if ((nOldStep < SOCONTROL_PAGE) && (nNewStep >= SOCONTROL_PAGE)) + { + curFormDocument.initialize(curDBCommandFieldSelection.isModified(), curFormConfiguration.hasSubForm(), curSubFormFieldSelection.isModified(), getBorderType()); + curDBCommandFieldSelection.setModified(false); + curSubFormFieldSelection.setModified(false); + } + switch (nNewStep) + { + case SOMAIN_PAGE: + curDBCommandFieldSelection.setModified(false); + break; + case SOSUBFORM_PAGE: + { + final String sCommandName = curDBCommandFieldSelection.getSelectedCommandName(); + RelationController oRelationController = new RelationController(curFormDocument.oMainFormDBMetaData, sCommandName); + curFormConfiguration.initialize(curSubFormFieldSelection, oRelationController); + } + break; + case SOSUBFORMFIELDS_PAGE: + { + String sPreSelectedTableName = curFormConfiguration.getreferencedTableName(); + boolean bReadOnly = (sPreSelectedTableName.length() > 0); + if (sPreSelectedTableName.length() == 0) + { + final String sTableName = curSubFormFieldSelection.getSelectedCommandName(); + String[] aFieldNames = curSubFormFieldSelection.getSelectedFieldNames(); + curFormDocument.oSubFormDBMetaData.initializeFieldColumns(sTableName, aFieldNames); + } + else + { + curSubFormFieldSelection.preselectCommand(sPreSelectedTableName, bReadOnly); + } + } + break; + case SOFIELDLINKER_PAGE: + { + final String[] aMainFieldNames = curFormDocument.oMainFormDBMetaData.getFieldNames(); + final String[] aSubFieldNames = curFormDocument.oSubFormDBMetaData.getFieldNames(); + curFieldLinker.initialize(aMainFieldNames, aSubFieldNames, curFormDocument.LinkFieldNames); + } + break; + case SOCONTROL_PAGE: + curControlArranger.enableSubFormImageList(curFormConfiguration.hasSubForm()); + break; + case SODATA_PAGE: + break; + case SOSTYLE_PAGE: + break; + case SOSTORE_PAGE: + { + String sTableName = this.curDBCommandFieldSelection.getSelectedCommandName(); + this.curFinalizer.initialize(sTableName, curFormDocument); + } + break; + default: + break; + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + protected Short getBorderType() + { + return curStyleApplier.getBorderType(); + } + + // @Override + @Override + protected void leaveStep(int nOldStep, int nNewStep) + { + switch (nOldStep) + { + case SOMAIN_PAGE: + { + final String sTableName = curDBCommandFieldSelection.getSelectedCommandName(); + final String[] aFieldNames = curDBCommandFieldSelection.getSelectedFieldNames(); + curFormDocument.oMainFormDBMetaData.initializeFieldColumns(sTableName, aFieldNames); + + final String[] aMainFieldNames = curFormDocument.oMainFormDBMetaData.getFieldNames(); + curFormDocument.LinkFieldNames = JavaTools.removeOutdatedFields(curFormDocument.LinkFieldNames, aMainFieldNames, 1); + } + break; + case SOSUBFORM_PAGE: + break; + case SOSUBFORMFIELDS_PAGE: + { + final String sTableName = curSubFormFieldSelection.getSelectedCommandName(); + final String[] aFieldNames = curSubFormFieldSelection.getSelectedFieldNames(); + curFormDocument.oSubFormDBMetaData.initializeFieldColumns(sTableName, aFieldNames); + + final String[] aSubFieldNames = curFormDocument.oSubFormDBMetaData.getFieldNames(); + curFormDocument.LinkFieldNames = JavaTools.removeOutdatedFields(curFormDocument.LinkFieldNames, aSubFieldNames, 0); + } + break; + case SOFIELDLINKER_PAGE: + curFormDocument.LinkFieldNames = curFieldLinker.getLinkFieldNames(); + break; + case SOCONTROL_PAGE: + break; + case SODATA_PAGE: + break; + case SOSTYLE_PAGE: + break; + case SOSTORE_PAGE: + break; + default: + break; + } + } + + private void buildSteps() + { + curDBCommandFieldSelection = new CommandFieldSelection(this, curFormDocument.oMainFormDBMetaData, 92, slblFields, slblSelFields, slblTables, true, 34411); + curDBCommandFieldSelection.addFieldSelectionListener(new FieldSelectionListener()); + curFormDocument.xProgressBar.setValue(20); + // Label Help Text + insertLabel("lblBinaryHelpText", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 28, sShowBinaryFields, Boolean.TRUE, 95, 154, Integer.valueOf(SOMAIN_PAGE), 210 + }); + + curFormConfiguration = new FormConfiguration(this); + curFormDocument.xProgressBar.setValue(30); + + curSubFormFieldSelection = new CommandFieldSelection(this, curFormDocument.oSubFormDBMetaData, SOSUBFORMFIELDS_PAGE, 92, slblFields, slblSelFields, slblTables, true, 34431); + curSubFormFieldSelection.addFieldSelectionListener(new FieldSelectionListener()); + insertLabel("lblSubFormBinaryHelpText", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 28, sShowBinaryFields, Boolean.TRUE, 95, 154, Integer.valueOf(SOSUBFORMFIELDS_PAGE), 210 + }); + + curFormDocument.xProgressBar.setValue(40); + + curFieldLinker = new FieldLinker(this, SOFIELDLINKER_PAGE, 30, 34441); + curFormDocument.xProgressBar.setValue(50); + + curControlArranger = new UIControlArranger(this, curFormDocument); + curFormDocument.addUIFormController(curControlArranger); + curFormDocument.xProgressBar.setValue(60); + + CurDataEntrySetter = new DataEntrySetter(this); + curFormDocument.xProgressBar.setValue(70); + + curStyleApplier = new StyleApplier(this, curFormDocument); + curFormDocument.addStyleApplier(curStyleApplier); + curFormDocument.xProgressBar.setValue(80); + + curFinalizer = new Finalizer(this); + curFormDocument.xProgressBar.setValue(100); + + enableNavigationButtons(false, false, false); + curFormDocument.xProgressBar.end(); + } + + // @Override + @Override + public boolean finishWizard() + { + int ncurStep = getCurrentStep(); + if ((switchToStep(ncurStep, SOSTORE_PAGE)) || (ncurStep == SOSTORE_PAGE)) + { + this.curFinalizer.initialize(curDBCommandFieldSelection.getSelectedCommandName(), this.curFormDocument); + String sNewFormName = curFinalizer.getName(); + if (!curFormDocument.oMainFormDBMetaData.hasFormDocumentByName(sNewFormName)) + { + m_openForEditing = curFinalizer.getOpenForEditing(); + FormName = curFinalizer.getName(); + if (curFormDocument.finalizeForms(CurDataEntrySetter, curFieldLinker, curFormConfiguration)) + { + + if (curFinalizer.finish()) + { + m_success = true; + xDialog.endExecute(); + return true; + } + } + } + else + { + String smessage = JavaTools.replaceSubString(serrFormNameexists, sNewFormName, "%FORMNAME"); + showMessageBox("WarningBox", com.sun.star.awt.VclWindowPeerAttribute.OK, smessage); + } + } + return false; + } + + // @Override + @Override + public void cancelWizard() + { + m_success = false; + xDialog.endExecute(); + } + + private void insertFormRelatedSteps() + { + addRoadmap(); + int i = 0; + i = insertRoadmapItem(0, true, m_oResource.getResText("RID_FORM_80"), SOMAIN_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_81"), SOSUBFORM_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_82"), SOSUBFORMFIELDS_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_83"), SOFIELDLINKER_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_84"), SOCONTROL_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_85"), SODATA_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_86"), SOSTYLE_PAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_FORM_87"), SOSTORE_PAGE); + setRoadmapInteractive(true); + setRoadmapComplete(true); + setCurrentRoadmapItemID((short) 1); + } + + public void start() + { + try + { + curFormDocument = new FormDocument(xMSF); + if (curFormDocument.oMainFormDBMetaData.getConnection(m_wizardContext)) + { + curFormDocument.oSubFormDBMetaData.getConnection(new PropertyValue[] + { + Properties.createProperty(PropertyNames.ACTIVE_CONNECTION, curFormDocument.oMainFormDBMetaData.DBConnection) + }); + curFormDocument.xProgressBar.setValue(20); + buildSteps(); + this.curDBCommandFieldSelection.preselectCommand(m_wizardContext, false); + XWindowPeer xWindowPeer2 = createWindowPeer(curFormDocument.xWindowPeer); + curFormDocument.oMainFormDBMetaData.setWindowPeer(xWindowPeer2); + insertFormRelatedSteps(); + short dialogReturn = executeDialog(curFormDocument.xFrame); + xComponent.dispose(); + if ((dialogReturn == 0) && m_success) + { + curFormDocument.oMainFormDBMetaData.addFormDocument(curFormDocument.xComponent); + loadSubComponent(DatabaseObject.FORM, FormName, m_openForEditing); + } + } + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + if ((!m_success) && (curFormDocument != null)) + { + OfficeDocument.close(curFormDocument.xComponent); + } + } + + private void getFormResources() + { + sShowBinaryFields = m_oResource.getResText("RID_FORM_2"); + slblTables = m_oResource.getResText("RID_FORM_6"); + slblFields = m_oResource.getResText("RID_FORM_12"); + slblSelFields = m_oResource.getResText("RID_FORM_1"); + serrFormNameexists = m_oResource.getResText("RID_FORM_98"); + } + + private class FieldSelectionListener implements com.sun.star.wizards.ui.XFieldSelectionListener + { + + private int ID; + + // @Override + public void setID(String sIncSuffix) + { + ID = 1; + if (sIncSuffix != null) + { + if ((!sIncSuffix.equals(PropertyNames.EMPTY_STRING)) && (!sIncSuffix.equals("_"))) + { + String sID = JavaTools.ArrayoutofString(sIncSuffix, "_")[1]; + ID = Integer.parseInt(sID); + } + } + } + + // @Override + public void shiftFromLeftToRight(String[] SelItems, String[] NewItems) + { + if (ID == 1) + { + toggleMainFormSteps(); + } + else + { + toggleSubFormSteps(); + } + } + + // @Override + public void shiftFromRightToLeft(String[] SelItems, String[] NewItems) + { + // TODO When the ListFieldbox is refilled only fields of the current Command may be merged into the Listbox + if (ID == 1) + { + toggleMainFormSteps(); + } + else + { + toggleSubFormSteps(); + } + } + // @Override + + public void moveItemDown(String item) + { + } + + // @Override + public void moveItemUp(String item) + { + } + + private boolean toggleSubFormSteps() + { + curSubFormFieldSelection.setModified(true); + boolean benabled = curSubFormFieldSelection.getSelectedFieldNames().length > 0; + enablefromStep(SOFIELDLINKER_PAGE, benabled); + if (benabled) + curFieldLinker.enable(!curFormConfiguration.areexistingRelationsdefined()); + return benabled; + } + + private void toggleMainFormSteps() + { + curDBCommandFieldSelection.setModified(true); + boolean enabled = curDBCommandFieldSelection.getSelectedFieldNames().length > 0; + enablefromStep(SOSUBFORM_PAGE, enabled); + setControlProperty("btnWizardNext", PropertyNames.PROPERTY_ENABLED, enabled); + if (enabled) + { + if (curFormConfiguration.hasSubForm()) + { + enabled = toggleSubFormSteps(); + } + else + { + setStepEnabled(SOSUBFORMFIELDS_PAGE, false); + setStepEnabled(SOFIELDLINKER_PAGE, false); + } + } + setControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED, enabled); + } + } +} diff --git a/wizards/com/sun/star/wizards/form/MANIFEST.MF b/wizards/com/sun/star/wizards/form/MANIFEST.MF new file mode 100644 index 000000000..af4c0a07d --- /dev/null +++ b/wizards/com/sun/star/wizards/form/MANIFEST.MF @@ -0,0 +1,2 @@ +RegistrationClassName: com.sun.star.wizards.form.CallFormWizard +UNO-Type-Path: diff --git a/wizards/com/sun/star/wizards/form/StyleApplier.java b/wizards/com/sun/star/wizards/form/StyleApplier.java new file mode 100644 index 000000000..f780273a9 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/StyleApplier.java @@ -0,0 +1,444 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.NoValidPathException; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.document.Control; +import com.sun.star.wizards.document.DatabaseControl; +import com.sun.star.wizards.document.GridControl; +import com.sun.star.wizards.document.TimeStampControl; +import com.sun.star.wizards.text.TextStyleHandler; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.WizardDialog; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +public class StyleApplier +{ + + private final XPropertySet xPageStylePropertySet; + private final XMultiServiceFactory xMSF; + private final XRadioButton optNoBorder; + private final XRadioButton opt3DLook; + private final XListBox lstStyles; + private final FormDocument curFormDocument; + private short iOldLayoutPos; + private String[] StyleNames; + private String[] FileNames; + private static final int SOBACKGROUNDCOLOR = 0; + private static final int SODBTEXTCOLOR = 1; + private static final int SOLABELTEXTCOLOR = 2; + private static final int SOBORDERCOLOR = 5; + private Short IBorderValue = Short.valueOf((short) 1); + + public StyleApplier(WizardDialog CurUnoDialog, FormDocument _curFormDocument) + { + this.curFormDocument = _curFormDocument; + xMSF = curFormDocument.xMSF; + + TextStyleHandler oTextStyleHandler = new TextStyleHandler(curFormDocument.xTextDocument); + xPageStylePropertySet = oTextStyleHandler.getStyleByName("PageStyles", "Standard"); + short curtabindex = (short) (FormWizard.SOSTYLE_PAGE * 100); + Integer IStyleStep = Integer.valueOf(FormWizard.SOSTYLE_PAGE); + String sPageStyles = CurUnoDialog.m_oResource.getResText("RID_FORM_86"); + String sNoBorder = CurUnoDialog.m_oResource.getResText("RID_FORM_29"); + String s3DLook = CurUnoDialog.m_oResource.getResText("RID_FORM_30"); + String sFlat = CurUnoDialog.m_oResource.getResText("RID_FORM_31"); + String sFieldBorder = CurUnoDialog.m_oResource.getResText("RID_FORM_28"); + setStyles(); + short[] SelLayoutPos; + SelLayoutPos = new short[] + { + 0 + }; + + CurUnoDialog.insertLabel("lblStyles", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], sPageStyles, 92, 25, IStyleStep, Short.valueOf(curtabindex++), 90 + }); + + lstStyles = CurUnoDialog.insertListBox("lstStyles", null, new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + changeLayout(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.SELECTED_ITEMS, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 143, "HID:WIZARDS_HID_DLGFORM_LSTSTYLES", 92, 35, SelLayoutPos, IStyleStep, this.StyleNames, Short.valueOf(curtabindex++), 90 + }); + + optNoBorder = CurUnoDialog.insertRadioButton("otpNoBorder", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + changeBorderLayouts(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tag", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[10], "HID:WIZARDS_HID_DLGFORM_CMDNOBORDER", sNoBorder, 196, 39, IStyleStep, Short.valueOf(curtabindex++), "0", 93 + }); + + opt3DLook = CurUnoDialog.insertRadioButton("otp3DLook", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + changeBorderLayouts(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tag", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[10], "HID:WIZARDS_HID_DLGFORM_CMD3DBORDER", s3DLook, 196, 53, Short.valueOf((short) 1), IStyleStep, Short.valueOf(curtabindex++), "1", 93 + }); + + CurUnoDialog.insertRadioButton("otpFlat", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + changeBorderLayouts(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tag", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[10], "HID:WIZARDS_HID_DLGFORM_CMDSIMPLEBORDER", sFlat, 196, 67, IStyleStep, Short.valueOf(curtabindex++), "2", 93 + }); + + CurUnoDialog.insertFixedLine("lnFieldBorder", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], sFieldBorder, 192, 25, IStyleStep, Short.valueOf(curtabindex++), 98 + }); + } + + private void setStyles() + { + try + { + Object oRootNode = Configuration.getConfigurationRoot(xMSF, "org.openoffice.Office.FormWizard/FormWizard/Styles", false); + XNameAccess xNameAccess = UnoRuntime.queryInterface(XNameAccess.class, oRootNode); + String[] StyleNodeNames = xNameAccess.getElementNames(); + StyleNames = new String[StyleNodeNames.length]; + FileNames = new String[StyleNodeNames.length]; + for (int i = 0; i < StyleNodeNames.length; i++) + { + Object oStyleNode = xNameAccess.getByName(StyleNodeNames[i]); + StyleNames[i] = (String) Helper.getUnoPropertyValue(oStyleNode, PropertyNames.PROPERTY_NAME); + FileNames[i] = (String) Helper.getUnoPropertyValue(oStyleNode, "CssHref"); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private short getStyleIndex() + { + try + { + short[] SelFields = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(lstStyles), PropertyNames.SELECTED_ITEMS)); + if (SelFields != null) + { + return SelFields[0]; + } + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + return (short) -1; + } + + public void applyStyle(boolean _bapplyalways) + { + short iStyle = getStyleIndex(); + if ((iStyle != iOldLayoutPos) || _bapplyalways) + { + if (iStyle > -1) + { + iOldLayoutPos = iStyle; + String sFileName = FileNames[iStyle]; + int[] iStyles = getStyleColors(sFileName); + applyDBControlProperties(iStyles); + } + } + } + + private void changeLayout() + { + short iPos = lstStyles.getSelectedItemPos(); + if (iPos != iOldLayoutPos) + { + iOldLayoutPos = iPos; + String sFileName = FileNames[iPos]; + int[] iStyles = getStyleColors(sFileName); + applyDBControlProperties(iStyles); + } + curFormDocument.unlockallControllers(); + } + + public Short getBorderType() + { + return IBorderValue; + } + + private void changeBorderLayouts() + { + try + { + curFormDocument.xTextDocument.lockControllers(); + + if (optNoBorder.getState()) + { + IBorderValue = Short.valueOf((short) 0); + } + else if (opt3DLook.getState()) + { + IBorderValue = Short.valueOf((short) 1); + } + else + { + IBorderValue = Short.valueOf((short) 2); + } + for (int m = 0; m < curFormDocument.oControlForms.size(); m++) + { + FormDocument.ControlForm curControlForm = curFormDocument.oControlForms.get(m); + if (curControlForm.getArrangemode() == FormWizard.AS_GRID) + { + GridControl oGridControl = curControlForm.getGridControl(); + oGridControl.xPropertySet.setPropertyValue(PropertyNames.PROPERTY_BORDER, IBorderValue); + } + else + { + DatabaseControl[] DBControls = curControlForm.getDatabaseControls(); + for (int n = 0; n < DBControls.length; n++) + { + if (DBControls[n].xServiceInfo.supportsService("com.sun.star.drawing.ShapeCollection")) + { + TimeStampControl oTimeStampControl = (TimeStampControl) DBControls[n]; + for (int i = 0; i < 2; i++) + { + XPropertySet xPropertySet = oTimeStampControl.getControlofGroupShapeByIndex(i); + if (xPropertySet == null) { + continue; + } + if (xPropertySet.getPropertySetInfo().hasPropertyByName(PropertyNames.PROPERTY_BORDER)) + { + xPropertySet.setPropertyValue(PropertyNames.PROPERTY_BORDER, IBorderValue); + } + } + } + else + { + if (DBControls[n].xPropertySet.getPropertySetInfo().hasPropertyByName(PropertyNames.PROPERTY_BORDER)) + { + DBControls[n].xPropertySet.setPropertyValue(PropertyNames.PROPERTY_BORDER, IBorderValue); + } + } + } + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + curFormDocument.unlockallControllers(); + } + + + + private int getStyleColor(String[] _sDataList, String _sHeader, String _sPropertyDescription) + { + int index = JavaTools.FieldInList(_sDataList, _sHeader); + if (index > -1) + { + String sPropName = PropertyNames.EMPTY_STRING; + while (((sPropName.indexOf('}') < 0) && (index < _sDataList.length - 1))) + { + String scurline = _sDataList[index++]; + if ((scurline.indexOf(_sPropertyDescription)) > 0) + { + if (scurline.indexOf(':') > 0) + { + String[] sPropList = JavaTools.ArrayoutofString(scurline, ":"); + String sPropValue = sPropList[1]; + sPropValue = sPropValue.trim(); + if (sPropValue.indexOf('#') > -1) + { + sPropValue = JavaTools.replaceSubString(sPropValue, PropertyNames.EMPTY_STRING, PropertyNames.SEMI_COLON); + sPropValue = JavaTools.replaceSubString(sPropValue, PropertyNames.EMPTY_STRING, PropertyNames.SPACE); + return Integer.decode(sPropValue).intValue(); + } + } + } + } + } + return -1; + } + + private String getStylePath() + { + String StylesPath = ""; + try + { + StylesPath = FileAccess.getOfficePath(xMSF, "Config", "", ""); + StylesPath = FileAccess.combinePaths(xMSF, StylesPath, "/wizard/form/styles"); + } + catch (NoValidPathException e) + { + } + return StylesPath; + } + + private int[] getStyleColors(String _filename) + { + String sFilePath = getStylePath() + "/" + _filename; + int[] oStylePropList = new int[6]; + String[] sData = FileAccess.getDataFromTextFile(xMSF, sFilePath); + if (sData != null) { + oStylePropList[SOBACKGROUNDCOLOR] = getStyleColor(sData, ".toctitle {", "background-color:"); + oStylePropList[SODBTEXTCOLOR] = getStyleColor(sData, ".doctitle {", "color:"); + oStylePropList[SOLABELTEXTCOLOR] = getStyleColor(sData, ".toctitle {", "color:"); + oStylePropList[SOBORDERCOLOR] = getStyleColor(sData, ".tcolor {", "border-color:"); + } + return oStylePropList; + } + + private void setDBControlColors(XPropertySet xPropertySet, int[] _iStyleColors) + { + try + { + if (xPropertySet.getPropertySetInfo().hasPropertyByName("TextColor")) + { + if (_iStyleColors[SODBTEXTCOLOR] > -1) + { + xPropertySet.setPropertyValue("TextColor", Integer.decode("#00000")); + } + } + if (xPropertySet.getPropertySetInfo().hasPropertyByName("BackgroundColor")) + { + xPropertySet.setPropertyValue("BackgroundColor", Integer.decode("#DDDDDD")); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void applyDBControlProperties(int[] _iStyleColors) + { + try + { + for (int m = 0; m < curFormDocument.oControlForms.size(); m++) + { + FormDocument.ControlForm curControlForm = curFormDocument.oControlForms.get(m); + if (curControlForm.getArrangemode() == FormWizard.AS_GRID) + { + if (_iStyleColors[SOLABELTEXTCOLOR] > -1) + { + curControlForm.oGridControl.xPropertySet.setPropertyValue("TextColor", Integer.valueOf(_iStyleColors[SODBTEXTCOLOR])); + } + curControlForm.oGridControl.xPropertySet.setPropertyValue("BackgroundColor", Integer.decode("#DDDDDD")); + } + else + { + DatabaseControl[] DBControls = curControlForm.getDatabaseControls(); + for (int n = 0; n < DBControls.length; n++) + { + if (_iStyleColors[SODBTEXTCOLOR] > -1) + { + DatabaseControl aDBControl = DBControls[n]; + if (aDBControl != null) + { + if (aDBControl.xServiceInfo.supportsService("com.sun.star.drawing.ShapeCollection")) + { + TimeStampControl oTimeStampControl = (TimeStampControl) aDBControl; + for (int i = 0; i < 2; i++) + { + XPropertySet xPropertySet = oTimeStampControl.getControlofGroupShapeByIndex(i); + if (xPropertySet == null) { + continue; + } + setDBControlColors(xPropertySet, _iStyleColors); + } + } + else + { + setDBControlColors(aDBControl.xPropertySet, _iStyleColors); + } + } + } + } + Control[] LabelControls = curControlForm.getLabelControls(); + for (int n = 0; n < LabelControls.length; n++) + { + if (_iStyleColors[SOLABELTEXTCOLOR] > -1) + { + LabelControls[n].xPropertySet.setPropertyValue("TextColor", Integer.valueOf(_iStyleColors[SOLABELTEXTCOLOR])); + } + } + } + } + xPageStylePropertySet.setPropertyValue("BackColor", Integer.valueOf(_iStyleColors[SOBACKGROUNDCOLOR])); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/form/UIControlArranger.java b/wizards/com/sun/star/wizards/form/UIControlArranger.java new file mode 100644 index 000000000..b73796eca --- /dev/null +++ b/wizards/com/sun/star/wizards/form/UIControlArranger.java @@ -0,0 +1,295 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.form; + +import java.util.Map; +import java.util.HashMap; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XItemListener; +import com.sun.star.awt.XRadioButton; +import com.sun.star.lang.EventObject; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.IRenderer; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.document.Control; +import com.sun.star.wizards.ui.ButtonList; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +import javax.swing.DefaultListModel; +import javax.swing.ListModel; + +public class UIControlArranger +{ + + private final FormWizard CurUnoDialog; + private final FormDocument curFormDocument; + private short curtabindex; + private final XRadioButton optAlignLeft; + private final XRadioButton optAlignRight; + private final XControl flnLabelPlacement; + private final Map helpTexts = new HashMap(4); + private final ArrangeButtonList[] m_aArrangeList = new ArrangeButtonList[2]; + private final Integer IControlStep; + private static final int SOBASEIMAGEYPOSITION = 66; + private static final int SOIMAGELISTHEIGHT = 60; + private static final String ARRANGELISTSIDE = "private:graphicrepository/wizards/res/formarrangelistside_42.png"; + private static final String ARRANGELISTTOP = "private:graphicrepository/wizards/res/formarrangelisttop_42.png"; + private static final String ARRANGETABLE = "private:graphicrepository/wizards/res/formarrangetable_42.png"; + private static final String ARRANGEFREE = "private:graphicrepository/wizards/res/formarrangefree_42.png"; + + public UIControlArranger(FormWizard _CurUnoDialog, FormDocument _curFormDocument) + { + this.CurUnoDialog = _CurUnoDialog; + this.curFormDocument = _curFormDocument; + curtabindex = (short) (FormWizard.SOCONTROL_PAGE * 100); + IControlStep = Integer.valueOf(FormWizard.SOCONTROL_PAGE); + String sLabelPlacment = CurUnoDialog.m_oResource.getResText("RID_FORM_32"); + String sAlignLeft = CurUnoDialog.m_oResource.getResText("RID_FORM_33"); + String sAlignRight = CurUnoDialog.m_oResource.getResText("RID_FORM_34"); + + // Label "Label Placement" ----------------- + flnLabelPlacement = CurUnoDialog.insertFixedLine("lnLabelPlacement", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], sLabelPlacment, 97, 25, IControlStep, Short.valueOf(curtabindex++), 207 + }); + // Radio Button "Align Left" + optAlignLeft = CurUnoDialog.insertRadioButton("optAlignLeft", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + alignLabelControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[10], "HID:WIZARDS_HID_DLGFORM_CMDALIGNLEFT", sAlignLeft, 107, 38, Short.valueOf((short) 1), IControlStep, Short.valueOf(curtabindex++), 171 + }); + // Radio Button "Align Right" + optAlignRight = CurUnoDialog.insertRadioButton("optAlignRight", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + alignLabelControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[10], "HID:WIZARDS_HID_DLGFORM_CMDALIGNRIGHT", sAlignRight, Boolean.TRUE, 107, 50, IControlStep, Short.valueOf(curtabindex++), 171 + }); + + + DefaultListModel imageModel = new DefaultListModel(); + imageModel.addElement(ARRANGELISTSIDE); + imageModel.addElement(ARRANGELISTTOP); + imageModel.addElement(ARRANGETABLE); + imageModel.addElement(ARRANGEFREE); + + // "Columnar - Labels Left" + helpTexts.put(ARRANGELISTSIDE, CurUnoDialog.m_oResource.getResText("RID_FORM_36")); + + // "Columnar - Labels of Top" + helpTexts.put(ARRANGELISTTOP, CurUnoDialog.m_oResource.getResText("RID_FORM_37")); + + // "As Data Sheet" + helpTexts.put(ARRANGETABLE, CurUnoDialog.m_oResource.getResText("RID_FORM_40")); + + // "In Blocks - Labels Above" + helpTexts.put(ARRANGEFREE, CurUnoDialog.m_oResource.getResText("RID_FORM_39")); + + String sMainArrangementHeader = CurUnoDialog.m_oResource.getResText("RID_FORM_41"); // "Arrangement of the main form" + m_aArrangeList[0] = new ArrangeButtonList(0, imageModel, sMainArrangementHeader); + + String sSubArrangementHeader = CurUnoDialog.m_oResource.getResText("RID_FORM_42"); // "Arrangement of the sub form" + m_aArrangeList[1] = new ArrangeButtonList(1, imageModel, sSubArrangementHeader); + enableAlignControlGroup(false); + } + + public int getSelectedArrangement(int _formindex) + { + return m_aArrangeList[_formindex].m_aButtonList.getSelected() + 1; + } + + private class LayoutRenderer implements IRenderer + { + public String render(Object listItem) + { + if (listItem == null) + { + return PropertyNames.EMPTY_STRING; + } + return (String) helpTexts.get(listItem); + + } + } + + public void enableSubFormImageList(boolean _bdoEnable) + { + m_aArrangeList[1].m_aButtonList.setenabled(_bdoEnable); + CurUnoDialog.setControlProperty("lnLabelPlacment_2", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoEnable)); + } + + public short getAlignValue() + { + return optAlignLeft.getState() ? (short)0 : (short)2; + } + + private void alignLabelControls() + { + try + { + short iAlignValue = getAlignValue(); + for (int m = 0; m < curFormDocument.oControlForms.size(); m++) + { + FormDocument.ControlForm curControlForm = curFormDocument.oControlForms.get(m); + if (curControlForm.getArrangemode() == FormWizard.COLUMNAR_LEFT) + { + Control[] LabelControls = curControlForm.getLabelControls(); + if (LabelControls == null) { + continue; + } + for (int n = 0; n < LabelControls.length; n++) + { + LabelControls[n].xPropertySet.setPropertyValue(PropertyNames.PROPERTY_ALIGN, Short.valueOf(iAlignValue)); + } + } + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void enableAlignControlGroup(boolean _bEnableAlignControlGroup) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(flnLabelPlacement), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnableAlignControlGroup)); + Helper.setUnoPropertyValue(UnoDialog.getModel(optAlignLeft), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnableAlignControlGroup)); + Helper.setUnoPropertyValue(UnoDialog.getModel(optAlignRight), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnableAlignControlGroup)); + } + + private class ArrangeButtonList implements XItemListener + { + + private final int formindex; + private final ButtonList m_aButtonList; + + public ArrangeButtonList(int _formindex, ListModel model, String _sArrangementHeader) + { + formindex = _formindex; + Integer YPos = Integer.valueOf(SOBASEIMAGEYPOSITION + _formindex * SOIMAGELISTHEIGHT); + // Label ArrangementHeader ---------------------- + CurUnoDialog.insertFixedLine("lnLabelPlacment_" + (_formindex + 1), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], + _sArrangementHeader, + 97, + YPos, + IControlStep, + Short.valueOf(curtabindex++), + 207 + }); + + int nypos = SOBASEIMAGEYPOSITION + 12 - 5 + _formindex * SOIMAGELISTHEIGHT; + m_aButtonList = new ButtonList(); + m_aButtonList.setPos(new Size(107, nypos)); + m_aButtonList.setButtonSize(new Size(26 + 6, 26 + 5)); + m_aButtonList.setCols(4); + m_aButtonList.setRows(1); + m_aButtonList.setName( "ButtonList_" + formindex ); + m_aButtonList.setStep(Short.valueOf((short) FormWizard.SOCONTROL_PAGE)); + m_aButtonList.setShowButtons(false); // shows a button line at ''wrong'' position like |<| 1..4/4 |>| + m_aButtonList.setRenderer(new LayoutRenderer()); + m_aButtonList.setGap(new Size(3, 3)); +// m_aButtonList.scaleImages = Boolean.FALSE; + m_aButtonList.tabIndex = curtabindex++; + m_aButtonList.helpURL = 34453 + (formindex * 4); + + m_aButtonList.setListModel(model); + m_aButtonList.create(CurUnoDialog); + m_aButtonList.setSelected(FormWizard.AS_GRID - 1); + m_aButtonList.addItemListener(this); + } + + public void itemStateChanged(ItemEvent arg0) + { + try + { + if (m_aArrangeList[formindex].m_aButtonList.isenabled()) + { + boolean bEnableAlignControlGroup; + if (curFormDocument.oControlForms.size() == 2) + { + final int nSelected0 = (m_aArrangeList[0].m_aButtonList.getSelected() + 1); + final int nSelected1 = (m_aArrangeList[1].m_aButtonList.getSelected() + 1); + + bEnableAlignControlGroup = ((nSelected0 == FormWizard.COLUMNAR_LEFT) || + (nSelected1 == FormWizard.COLUMNAR_LEFT)); + } + else + { + final int nSelected0 = (m_aArrangeList[0].m_aButtonList.getSelected() + 1); + bEnableAlignControlGroup = (nSelected0 == FormWizard.COLUMNAR_LEFT); + } + enableAlignControlGroup(bEnableAlignControlGroup); + final Short nBorderType = CurUnoDialog.getBorderType(); + final int nSelected = m_aButtonList.getSelected() + 1; + curFormDocument.oControlForms.get(formindex).initialize(nSelected, nBorderType); + } + } + catch (RuntimeException e) + { + e.printStackTrace(); + } + } + + /* (non-Javadoc) + * @see com.sun.star.lang.XEventListener#disposing(com.sun.star.lang.EventObject) + */ + public void disposing(EventObject arg0) + { + // TODO Auto-generated method stub + } + } +} diff --git a/wizards/com/sun/star/wizards/form/form.component b/wizards/com/sun/star/wizards/form/form.component new file mode 100644 index 000000000..27ea341a9 --- /dev/null +++ b/wizards/com/sun/star/wizards/form/form.component @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.Java2" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation + name="com.sun.star.wizards.form.CallFormWizard$FormWizardImplementation"> + <service name="com.sun.star.wizards.form.CallFormWizard"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/letter/CGLetter.py b/wizards/com/sun/star/wizards/letter/CGLetter.py new file mode 100644 index 000000000..cf9bd76fe --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/CGLetter.py @@ -0,0 +1,53 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .CGPaperElementLocation import CGPaperElementLocation +from ..common.ConfigGroup import ConfigGroup + +class CGLetter(ConfigGroup): + + def __init__(self): + self.cp_Style = int() + self.cp_BusinessPaper = bool() + self.cp_CompanyLogo = CGPaperElementLocation() + self.cp_CompanyAddress = CGPaperElementLocation() + self.cp_PaperCompanyAddressReceiverField = bool() + self.cp_PaperFooter = bool() + self.cp_PaperFooterHeight = float() + self.cp_PrintCompanyLogo = bool() + self.cp_PrintCompanyAddressReceiverField = bool() + self.cp_PrintLetterSigns = bool() + self.cp_PrintSubjectLine = bool() + self.cp_PrintSalutation = bool() + self.cp_PrintBendMarks = bool() + self.cp_PrintGreeting = bool() + self.cp_PrintFooter = bool() + self.cp_Salutation = str() + self.cp_Greeting = str() + self.cp_SenderAddressType = int() + self.cp_SenderCompanyName = str() + self.cp_SenderStreet = str() + self.cp_SenderPostCode = str() + self.cp_SenderState = str() + self.cp_SenderCity = str() + self.cp_ReceiverAddressType = int() + self.cp_Footer = str() + self.cp_FooterOnlySecondPage = bool() + self.cp_FooterPageNumbers = bool() + self.cp_CreationType = int() + self.cp_TemplateName = str() + self.cp_TemplatePath = str() diff --git a/wizards/com/sun/star/wizards/letter/CGLetterWizard.py b/wizards/com/sun/star/wizards/letter/CGLetterWizard.py new file mode 100644 index 000000000..eb1051c44 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/CGLetterWizard.py @@ -0,0 +1,27 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.ConfigGroup import ConfigGroup +from .CGLetter import CGLetter + +class CGLetterWizard (ConfigGroup): + + def __init__(self): + self.cp_LetterType = int() + self.cp_BusinessLetter = CGLetter() + self.cp_PrivateOfficialLetter = CGLetter() + self.cp_PrivateLetter = CGLetter() diff --git a/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py b/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py new file mode 100644 index 000000000..c57dde909 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/CGPaperElementLocation.py @@ -0,0 +1,27 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..common.ConfigGroup import ConfigGroup + +class CGPaperElementLocation(ConfigGroup): + + def __init__(self): + self.cp_Display = bool() + self.cp_Width = float() + self.cp_Height = float() + self.cp_X = float() + self.cp_Y = float() diff --git a/wizards/com/sun/star/wizards/letter/CallWizard.py b/wizards/com/sun/star/wizards/letter/CallWizard.py new file mode 100644 index 000000000..fc12e1b5e --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/CallWizard.py @@ -0,0 +1,75 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import unohelper +import traceback + +from .LetterWizardDialogImpl import LetterWizardDialogImpl, Desktop + +from com.sun.star.lang import XServiceInfo +from com.sun.star.task import XJobExecutor + +# pythonloader looks for a static g_ImplementationHelper variable +g_ImplementationHelper = unohelper.ImplementationHelper() +g_implName = "com.sun.star.wizards.letter.CallWizard" + +# implement a UNO component by deriving from the standard unohelper.Base class +# and from the interface(s) you want to implement. +class CallWizard(unohelper.Base, XJobExecutor, XServiceInfo): + def __init__(self, ctx): + # store the component context for later use + self.ctx = ctx + + def trigger(self, args): + try: + lw = LetterWizardDialogImpl(self.ctx.ServiceManager) + lw.startWizard(self.ctx.ServiceManager) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + @classmethod + def callRemote(self): + #Call the wizard remotely(see README) + try: + ConnectStr = \ + "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" + xLocMSF = Desktop.connect(ConnectStr) + lw = LetterWizardDialogImpl(xLocMSF) + lw.startWizard(xLocMSF) + except Exception as e: + print ("Wizard failure exception " + str(type(e)) + + " message " + str(e) + " args " + str(e.args) + + traceback.format_exc()) + + def getImplementationName(self): + return g_implName + + def supportsService(self, ServiceName): + return g_ImplementationHelper.supportsService(g_implName, ServiceName) + + def getSupportedServiceNames(self): + return g_ImplementationHelper.getSupportedServiceNames(g_implName) + +g_ImplementationHelper.addImplementation( \ + CallWizard, # UNO object class + g_implName, # implementation name + ("com.sun.star.task.Job",),) # list of implemented services + # (the only service) + +# vim:set shiftwidth=4 softtabstop=4 expandtab: diff --git a/wizards/com/sun/star/wizards/letter/LetterDocument.py b/wizards/com/sun/star/wizards/letter/LetterDocument.py new file mode 100644 index 000000000..5860f2804 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/LetterDocument.py @@ -0,0 +1,238 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from ..text.TextDocument import TextDocument, traceback, \ + TextFieldHandler, Configuration +from ..text.TextSectionHandler import TextSectionHandler + +from com.sun.star.table import BorderLine +from com.sun.star.text.ControlCharacter import PARAGRAPH_BREAK +from com.sun.star.style.ParagraphAdjust import CENTER +from com.sun.star.text.PageNumberType import CURRENT +from com.sun.star.style.NumberingType import ARABIC +from com.sun.star.text.HoriOrientation import NONE as NONEHORI +from com.sun.star.text.VertOrientation import NONE as NONEVERT +from com.sun.star.text.RelOrientation import PAGE_FRAME +from com.sun.star.text.TextContentAnchorType import AT_PAGE +from com.sun.star.text.SizeType import FIX +from com.sun.star.text.WrapTextMode import THROUGH +from com.sun.star.awt.FontWeight import BOLD +from com.sun.star.beans import UnknownPropertyException + +class LetterDocument(TextDocument): + + def __init__(self, xMSF, listener): + super(LetterDocument,self).__init__(xMSF, listener, None, + "WIZARD_LIVE_PREVIEW") + self.keepLogoFrame = True + self.keepBendMarksFrame = True + self.keepLetterSignsFrame = True + self.keepSenderAddressRepeatedFrame = True + self.keepAddressFrame = True + + def switchElement(self, sElement, bState): + try: + mySectionHandler = TextSectionHandler( + self.xMSF, self.xTextDocument) + oSection = \ + mySectionHandler.xTextDocument.TextSections.getByName(sElement) + oSection.IsVisible = bState + except Exception: + traceback.print_exc() + + def updateDateFields(self): + FH = TextFieldHandler( + self.xTextDocument, self.xTextDocument) + FH.updateDateFields() + + def switchFooter(self, sPageStyle, bState, bPageNumber, sText): + if self.xTextDocument is not None: + try: + self.xTextDocument.lockControllers() + xNameAccess = self.xTextDocument.StyleFamilies + xPageStyleCollection = xNameAccess.getByName("PageStyles") + xPageStyle = xPageStyleCollection.getByName(sPageStyle) + if bState: + xPageStyle.FooterIsOn = True + xFooterText = xPageStyle.FooterText + xFooterText.String = sText + if bPageNumber: + #Adding the Page Number + myCursor = xFooterText.Text.createTextCursor() + myCursor.gotoEnd(False) + xFooterText.insertControlCharacter(myCursor, + PARAGRAPH_BREAK, False) + myCursor.setPropertyValue("ParaAdjust", CENTER ) + + xPageNumberField = \ + self.xTextDocument.createInstance( + "com.sun.star.text.TextField.PageNumber") + xPageNumberField.setPropertyValue("SubType", CURRENT) + xPageNumberField.NumberingType = ARABIC + xFooterText.insertTextContent(xFooterText.End, + xPageNumberField, False) + + else: + xPageStyle.FooterIsOn = False + + self.xTextDocument.unlockControllers() + except Exception: + traceback.print_exc() + + def hasElement(self, sElement): + if self.xTextDocument is not None: + SH = TextSectionHandler(self.xMSF, self.xTextDocument) + return SH.hasTextSectionByName(sElement) + else: + return False + + def switchUserField(self, sFieldName, sNewContent, bState): + myFieldHandler = TextFieldHandler( + self.xMSF, self.xTextDocument) + if bState: + myFieldHandler.changeUserFieldContent(sFieldName, sNewContent) + else: + myFieldHandler.changeUserFieldContent(sFieldName, "") + + def fillSenderWithUserData(self): + try: + myFieldHandler = TextFieldHandler( + self.xTextDocument, self.xTextDocument) + oUserDataAccess = Configuration.getConfigurationRoot( + self.xMSF, "org.openoffice.UserProfile/Data", False) + myFieldHandler.changeUserFieldContent( + "Company", oUserDataAccess.getByName("o")) + myFieldHandler.changeUserFieldContent( + "Street", oUserDataAccess.getByName("street")) + myFieldHandler.changeUserFieldContent( + "PostCode", oUserDataAccess.getByName("postalcode")) + myFieldHandler.changeUserFieldContent( + "City", oUserDataAccess.getByName("l")) + myFieldHandler.changeUserFieldContent( + "State", oUserDataAccess.getByName("st")) + except Exception: + traceback.print_exc() + + def killEmptyUserFields(self): + myFieldHandler = TextFieldHandler( + self.xMSF, self.xTextDocument) + myFieldHandler.removeUserFieldByContent() + + def killEmptyFrames(self): + try: + if not self.keepLogoFrame: + xTF = self.getFrameByName( + "Company Logo", self.xTextDocument) + if xTF is not None: + xTF.dispose() + + if not self.keepBendMarksFrame: + xTF = self.getFrameByName( + "Bend Marks", self.xTextDocument) + if xTF is not None: + xTF.dispose() + + if not self.keepLetterSignsFrame: + xTF = self.getFrameByName( + "Letter Signs", self.xTextDocument) + if xTF is not None: + xTF.dispose() + + if not self.keepSenderAddressRepeatedFrame: + xTF = self.getFrameByName( + "Sender Address Repeated", self.xTextDocument) + if xTF is not None: + xTF.dispose() + + if not self.keepAddressFrame: + xTF = self.getFrameByName( + "Sender Address", self.xTextDocument) + if xTF is not None: + xTF.dispose() + + except Exception: + traceback.print_exc() + +class BusinessPaperObject(object): + + def __init__(self, xTextDocument, FrameText, Width, Height, XPos, YPos): + self.xTextDocument = xTextDocument + self.iWidth = Width + self.iHeight = Height + self.iXPos = XPos + self.iYPos = YPos + self.xFrame = None + try: + self.xFrame = \ + self.xTextDocument.createInstance( + "com.sun.star.text.TextFrame") + self.setFramePosition() + self.xFrame.AnchorType = AT_PAGE + self.xFrame.SizeType = FIX + + self.xFrame.TextWrap = THROUGH + self.xFrame.Opaque = True + self.xFrame.BackColor = 15790320 + + myBorder = BorderLine() + myBorder.OuterLineWidth = 0 + self.xFrame.LeftBorder = myBorder + self.xFrame.RightBorder = myBorder + self.xFrame.TopBorder = myBorder + self.xFrame.BottomBorder = myBorder + self.xFrame.Print = False + xTextCursor = \ + self.xTextDocument.Text.createTextCursor() + xTextCursor.gotoEnd(True) + xText = self.xTextDocument.Text + xText.insertTextContent( + xTextCursor, self.xFrame, + False) + + xFrameText = self.xFrame.Text + xFrameCursor = xFrameText.createTextCursor() + xFrameCursor.setPropertyValue("CharWeight", BOLD) + xFrameCursor.setPropertyValue("CharColor", 16777215) + xFrameCursor.setPropertyValue("CharFontName", "Albany") + xFrameCursor.setPropertyValue("CharHeight", 18) + + xFrameText.insertString(xFrameCursor, FrameText, False) + except Exception: + traceback.print_exc() + + def setFramePosition(self): + try: + self.xFrame.HoriOrient = NONEHORI + self.xFrame.VertOrient = NONEVERT + self.xFrame.Height = self.iHeight + self.xFrame.Width = self.iWidth + self.xFrame.HoriOrientPosition = self.iXPos + self.xFrame.VertOrientPosition = self.iYPos + self.xFrame.HoriOrientRelation = PAGE_FRAME + self.xFrame.VertOrientRelation = PAGE_FRAME + except Exception: + traceback.print_exc() + + def removeFrame(self): + if self.xFrame is not None: + try: + self.xTextDocument.Text.removeTextContent( + self.xFrame) + except UnknownPropertyException: + pass + except Exception: + traceback.print_exc() diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py new file mode 100644 index 000000000..0208de833 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialog.py @@ -0,0 +1,1122 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .LetterWizardDialogConst import LetterWizardDialogConst, HIDMAIN, HID +from .LetterWizardDialogResources import LetterWizardDialogResources +from ..common.HelpIds import HelpIds +from ..ui.WizardDialog import WizardDialog, uno, UIConsts, PropertyNames + +from com.sun.star.awt.FontUnderline import SINGLE + +class LetterWizardDialog(WizardDialog): + + def __init__(self, xmsf): + super(LetterWizardDialog, self).__init__(xmsf, HIDMAIN ) + + #Load Resources + self.resources = LetterWizardDialogResources() + + #set dialog properties... + self.setDialogProperties(True, 210, True, 104, 52, 1, 1, + self.resources.resLetterWizardDialog_title, 350) + + self.fontDescriptor5 = \ + uno.createUnoStruct('com.sun.star.awt.FontDescriptor') + self.fontDescriptor6 = \ + uno.createUnoStruct('com.sun.star.awt.FontDescriptor') + self.fontDescriptor5.Weight = 100 + self.fontDescriptor6.Weight = 150 + + def buildStep1(self): + self.optBusinessLetter = self.insertRadioButton( + "optBusinessLetter", + LetterWizardDialogConst.OPTBUSINESSLETTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 1), + self.resources.resoptBusinessLetter_value, + "optBusinessLetter", 97, 28, 1, 1, 184), self) + self.optPrivOfficialLetter = self.insertRadioButton( + "optPrivOfficialLetter", + LetterWizardDialogConst.OPTPRIVOFFICIALLETTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 2), + self.resources.resoptPrivOfficialLetter_value, + "optPrivOfficialLetter", 97, 74, 1, 2, 184), self) + self.optPrivateLetter = self.insertRadioButton( + "optPrivateLetter", + LetterWizardDialogConst.OPTPRIVATELETTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 3), + self.resources.resoptPrivateLetter_value, + "optPrivateLetter", 97, 106, 1, 3, 184), self) + self.lstBusinessStyle = self.insertListBox( + "lstBusinessStyle", + LetterWizardDialogConst.LSTBUSINESSSTYLE_ACTION_PERFORMED, + LetterWizardDialogConst.LSTBUSINESSSTYLE_ITEM_CHANGED, + ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, HelpIds.getHelpIdString(HID + 4), + "lstBusinessStyle", + 180, 40, 1, 4, 74), self) + self.chkBusinessPaper = self.insertCheckBox( + "chkBusinessPaper", + LetterWizardDialogConst.CHKBUSINESSPAPER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 5), + self.resources.reschkBusinessPaper_value, + "chkBusinessPaper", 110, 56, 0, 1, 5, 168), self) + self.lstPrivOfficialStyle = self.insertListBox( + "lstPrivOfficialStyle", + LetterWizardDialogConst.LSTPRIVOFFICIALSTYLE_ACTION_PERFORMED, + LetterWizardDialogConst.LSTPRIVOFFICIALSTYLE_ITEM_CHANGED, + ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, HelpIds.getHelpIdString(HID + 6), + "lstPrivOfficialStyle", 180, 86, 1, 6, 74), self) + self.lstPrivateStyle = self.insertListBox( + "lstPrivateStyle", + LetterWizardDialogConst.LSTPRIVATESTYLE_ACTION_PERFORMED, + LetterWizardDialogConst.LSTPRIVATESTYLE_ITEM_CHANGED, + ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, HelpIds.getHelpIdString(HID + 7), + "lstPrivateStyle", 180, 118, 1, 7, 74), self) + self.insertLabel("lblBusinessStyle", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblBusinessStyle_value, + "lblBusinessStyle", 110, 42, 1, 48, 60)) + self.insertLabel("lblPrivOfficialStyle", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblPrivOfficialStyle_value, + "lblPrivOfficialStyle", 110, 88, 1, 49, 60)) + self.insertLabel("lblTitle1", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle1_value, True, + "lblTitle1", 91, 8, 1, 55, 212)) + self.insertLabel("lblPrivateStyle", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblPrivateStyle_value, + "lblPrivateStyle", 110, 120, 1, 74, 60)) + self.insertLabel("lblIntroduction", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (39, self.resources.reslblIntroduction_value, + True, + "lblIntroduction", 104, 145, 1, 80, 199)) + self.ImageControl3 = self.insertInfoImage(92, 145, 1) + + def buildStep2(self): + self.chkPaperCompanyLogo = self.insertCheckBox( + "chkPaperCompanyLogo", + LetterWizardDialogConst.CHKPAPERCOMPANYLOGO_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 8), + self.resources.reschkPaperCompanyLogo_value, + "chkPaperCompanyLogo", 97, 28, 0, 2, 8, 68), self) + self.numLogoHeight = self.insertNumericField( + "numLogoHeight", + LetterWizardDialogConst.NUMLOGOHEIGHT_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + "StrictFormat", + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 9), + "numLogoHeight", 138, 40, True, 2, True, 9, 3, 50), self) + self.numLogoX = self.insertNumericField( + "numLogoX", + LetterWizardDialogConst.NUMLOGOX_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 10), + "numLogoX", 286, 40, True, 2, 10, 0, 50), self) + self.numLogoWidth = self.insertNumericField( + "numLogoWidth", + LetterWizardDialogConst.NUMLOGOWIDTH_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 11), + "numLogoWidth", 138, 56, True, 2, 11, 3.8, 50), self) + self.numLogoY = self.insertNumericField( + "numLogoY", + LetterWizardDialogConst.NUMLOGOY_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 12), + "numLogoY", 286, 56, True, 2, 12, -3.4, 50), self) + self.chkPaperCompanyAddress = self.insertCheckBox( + "chkPaperCompanyAddress", + LetterWizardDialogConst.CHKPAPERCOMPANYADDRESS_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 13), + self.resources.reschkPaperCompanyAddress_value, + "chkPaperCompanyAddress", 98, 84, 0, 2, 13, 68), self) + self.numAddressHeight = self.insertNumericField( + "numAddressHeight", + LetterWizardDialogConst.NUMADDRESSHEIGHT_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + "StrictFormat", + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 14), + "numAddressHeight", 138, 96, True, 2, True, 14, 3, 50), self) + self.numAddressX = self.insertNumericField( + "numAddressX", + LetterWizardDialogConst.NUMADDRESSX_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 15), + "numAddressX", 286, 96, True, 2, 15, 3.8, 50), self) + self.numAddressWidth = self.insertNumericField( + "numAddressWidth", + LetterWizardDialogConst.NUMADDRESSWIDTH_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 16), + "numAddressWidth", 138, 112, True, 2, 16, 13.8, 50), self) + self.numAddressY = self.insertNumericField( + "numAddressY", + LetterWizardDialogConst.NUMADDRESSY_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 17), + "numAddressY", 286, 112, True, 2, 17, -3.4, 50), self) + self.chkCompanyReceiver = self.insertCheckBox( + "chkCompanyReceiver", + LetterWizardDialogConst.CHKCOMPANYRECEIVER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 18), + self.resources.reschkCompanyReceiver_value, + "chkCompanyReceiver", 103, 131, 0, 2, 18, 185), self) + self.chkPaperFooter = self.insertCheckBox( + "chkPaperFooter", + LetterWizardDialogConst.CHKPAPERFOOTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 19), + self.resources.reschkPaperFooter_value, + "chkPaperFooter", 97, 158, 0, 2, 19, 68), self) + self.numFooterHeight = self.insertNumericField( + "numFooterHeight", + LetterWizardDialogConst.NUMFOOTERHEIGHT_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "Spin", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Value", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 20), + "numFooterHeight", 236, 156, True, 2, 20, 5, 50), self) + self.insertLabel("lblLogoHeight", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblLogoHeight_value, + "lblLogoHeight", 103, 42, 2, 68, 32)) + self.insertLabel("lblLogoWidth", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblLogoWidth_value, + "lblLogoWidth", 103, 58, 2, 69, 32)) + self.insertFixedLine( + "FixedLine5", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (2, + "FixedLine5", 90, 78, 2, 70, 255)) + self.insertFixedLine( + "FixedLine6", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (2, + "FixedLine6", 90, 150, 2, 71, 255)) + self.insertLabel("lblFooterHeight", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblFooterHeight_value, + "lblFooterHeight", 200, 158, 2, 72, 32)) + self.insertLabel("lblLogoX", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblLogoX_value, + "lblLogoX", 190, 42, 2, 84, 94)) + self.insertLabel("lblLogoY", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblLogoY_value, + "lblLogoY", 190, 58, 2, 85, 94)) + self.insertLabel("lblAddressHeight", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblAddressHeight_value, + "lblAddressHeight", 103, 98, 2, 86, 32)) + self.insertLabel("lblAddressWidth", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblAddressWidth_value, + "lblAddressWidth", 103, 114, 2, 87, 32)) + self.insertLabel("lblAddressX", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblAddressX_value, + "lblAddressX", 190, 98, 2, 88, 94)) + self.insertLabel("lblAddressY", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblAddressY_value, + "lblAddressY", 190, 114, 2, 89, 94)) + self.insertLabel("lblTitle2", + ("FontDescriptor", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle2_value, True, + "lblTitle2", 91, 8, 2, 91, 212)) + + def buildStep3(self): + self.chkUseLogo = self.insertCheckBox( + "chkUseLogo", + LetterWizardDialogConst.CHKUSELOGO_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 22), + self.resources.reschkUseLogo_value, + "chkUseLogo", 97, 34, 0, 3, 22, 212), self) + self.chkUseAddressReceiver = self.insertCheckBox( + "chkUseAddressReceiver", + LetterWizardDialogConst.CHKUSEADDRESSRECEIVER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 23), + self.resources.reschkUseAddressReceiver_value, + "chkUseAddressReceiver", 97, 49, 0, 3, 23, 212), self) + self.chkUseSigns = self.insertCheckBox( + "chkUseSigns", + LetterWizardDialogConst.CHKUSESIGNS_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 24), + self.resources.reschkUseSigns_value, + "chkUseSigns", 97, 62, 0, 3, 24, 212), self) + self.chkUseSubject = self.insertCheckBox( + "chkUseSubject", + LetterWizardDialogConst.CHKUSESUBJECT_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 25), + self.resources.reschkUseSubject_value, + "chkUseSubject", 97, 78, 0, 3, 25, 212), self) + self.chkUseSalutation = self.insertCheckBox( + "chkUseSalutation", + LetterWizardDialogConst.CHKUSESALUTATION_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 26), + self.resources.reschkUseSalutation_value, + "chkUseSalutation", 97, 93, 0, 3, 26, 66), self) + self.lstSalutation = self.insertComboBox( + "lstSalutation", + LetterWizardDialogConst.LSTSALUTATION_ACTION_PERFORMED, + LetterWizardDialogConst.LSTSALUTATION_ITEM_CHANGED, + LetterWizardDialogConst.LSTSALUTATION_TEXT_CHANGED, + ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, HelpIds.getHelpIdString(HID + 27), + "lstSalutation", 210, 90, 3, 27, 74), self) + self.chkUseBendMarks = self.insertCheckBox( + "chkUseBendMarks", + LetterWizardDialogConst.CHKUSEBENDMARKS_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 28), + self.resources.reschkUseBendMarks_value, + "chkUseBendMarks", 97, 107, 0, 3, 28, 212), self) + self.chkUseGreeting = self.insertCheckBox( + "chkUseGreeting", + LetterWizardDialogConst.CHKUSEGREETING_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 29), + self.resources.reschkUseGreeting_value, + "chkUseGreeting", 97, 122, 0, 3, 29, 66), self) + self.lstGreeting = self.insertComboBox( + "lstGreeting", + LetterWizardDialogConst.LSTGREETING_ACTION_PERFORMED, + LetterWizardDialogConst.LSTGREETING_ITEM_CHANGED, + LetterWizardDialogConst.LSTGREETING_TEXT_CHANGED, + ("Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, 12, HelpIds.getHelpIdString(HID + 30), + "lstGreeting", 210, 121, 3, 30, 74), self) + self.chkUseFooter = self.insertCheckBox( + "chkUseFooter", + LetterWizardDialogConst.CHKUSEFOOTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 31), + self.resources.reschkUseFooter_value, + "chkUseFooter", 97, 138, 0, 3, 31, 212), self) + self.insertLabel("lblTitle3", + ( + "FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle3_value, True, + "lblTitle3", 91, 8, 3, 90, 212)) + + def buildStep4(self): + self.optSenderPlaceholder = self.insertRadioButton( + "optSenderPlaceholder", + LetterWizardDialogConst.OPTSENDERPLACEHOLDER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 32), + self.resources.resoptSenderPlaceholder_value, + "optSenderPlaceholder", 104, 42, 4, 32, 149), self) + self.optSenderDefine = self.insertRadioButton( + "optSenderDefine", + LetterWizardDialogConst.OPTSENDERDEFINE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 33), + self.resources.resoptSenderDefine_value, + "optSenderDefine", 104, 54, 4, 33, 149), self) + self.txtSenderName = self.insertTextField( + "txtSenderName", + LetterWizardDialogConst.TXTSENDERNAME_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 34), + "txtSenderName", 182, 67, 4, 34, 119), self) + self.txtSenderStreet = self.insertTextField( + "txtSenderStreet", + LetterWizardDialogConst.TXTSENDERSTREET_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 35), + "txtSenderStreet", 182, 81, 4, 35, 119), self) + self.txtSenderPostCode = self.insertTextField( + "txtSenderPostCode", + LetterWizardDialogConst.TXTSENDERPOSTCODE_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 36), + "txtSenderPostCode", 182, 95, 4, 36, 25), self) + self.txtSenderState = self.insertTextField( + "txtSenderState", + LetterWizardDialogConst.TXTSENDERSTATE_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 37), + "txtSenderState", 211, 95, 4, 37, 21), self) + self.txtSenderCity = self.insertTextField( + "txtSenderCity", + LetterWizardDialogConst.TXTSENDERCITY_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 38), + "txtSenderCity", 236, 95, 4, 38, 65), self) + self.optReceiverPlaceholder = self.insertRadioButton( + "optReceiverPlaceholder", + LetterWizardDialogConst.OPTRECEIVERPLACEHOLDER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 39), + self.resources.resoptReceiverPlaceholder_value, + "optReceiverPlaceholder", 104, 145, 4, 39, 200), self) + self.optReceiverDatabase = self.insertRadioButton( + "optReceiverDatabase", + LetterWizardDialogConst.OPTRECEIVERDATABASE_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 40), + self.resources.resoptReceiverDatabase_value, + "optReceiverDatabase", 104, 157, 4, 40, 200), self) + self.insertLabel("lblSenderAddress", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderAddress_value, + "lblSenderAddress", 97, 28, 4, 64, 136)) + self.insertFixedLine("FixedLine2", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (5, + "FixedLine2", 90, 126, 4, 75, 212)) + self.insertLabel("lblReceiverAddress", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblReceiverAddress_value, + "lblReceiverAddress", 97, 134, 4, 76, 136)) + self.insertLabel("lblSenderName", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderName_value, + "lblSenderName", 113, 69, 4, 77, 68)) + self.insertLabel("lblSenderStreet", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblSenderStreet_value, + "lblSenderStreet", 113, 82, 4, 78, 68)) + self.insertLabel("lblPostCodeCity", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblPostCodeCity_value, + "lblPostCodeCity", 113, 97, 4, 79, 68)) + self.insertLabel("lblTitle4", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle4_value, True, + "lblTitle4", 91, 8, 4, 92, 212)) + + def buildStep5(self): + self.txtFooter = self.insertTextField( + "txtFooter", + LetterWizardDialogConst.TXTFOOTER_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (47, HelpIds.getHelpIdString(HID + 41), True, + "txtFooter", 97, 40, 5, 41, 203), self) + self.chkFooterNextPages = self.insertCheckBox( + "chkFooterNextPages", + LetterWizardDialogConst.CHKFOOTERNEXTPAGES_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 42), + self.resources.reschkFooterNextPages_value, + "chkFooterNextPages", 97, 92, 0, 5, 42, 202), self) + self.chkFooterPageNumbers = self.insertCheckBox( + "chkFooterPageNumbers", + LetterWizardDialogConst.CHKFOOTERPAGENUMBERS_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 43), + self.resources.reschkFooterPageNumbers_value, + "chkFooterPageNumbers", 97, 106, 0, 5, 43, 201), self) + self.insertLabel("lblFooter", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor5, 8, self.resources.reslblFooter_value, + "lblFooter", 97, 28, 5, 52, 116)) + self.insertLabel("lblTitle5", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle5_value, True, + "lblTitle5", 91, 8, 5, 93, 212)) + + def buildStep6(self): + self.txtTemplateName = self.insertTextField( + "txtTemplateName", + LetterWizardDialogConst.TXTTEMPLATENAME_TEXT_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Text", + PropertyNames.PROPERTY_WIDTH), + (12, HelpIds.getHelpIdString(HID + 44), + "txtTemplateName", 202, 56, 6, 44, + self.resources.restxtTemplateName_value, 100), self) + self.optCreateLetter = self.insertRadioButton( + "optCreateLetter", + LetterWizardDialogConst.OPTCREATELETTER_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 45), + self.resources.resoptCreateLetter_value, + "optCreateLetter", 104, 111, 6, 50, 198), self) + self.optMakeChanges = self.insertRadioButton( + "optMakeChanges", + LetterWizardDialogConst.OPTMAKECHANGES_ITEM_CHANGED, + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, HelpIds.getHelpIdString(HID + 46), + self.resources.resoptMakeChanges_value, + "optMakeChanges", 104, 123, 6, 51, 198), self) + self.insertLabel("lblFinalExplanation1", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (26, self.resources.reslblFinalExplanation1_value, True, + "lblFinalExplanation1", 97, 28, 6, 52, 205)) + self.insertLabel("lblProceed", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblProceed_value, + "lblProceed", 97, 100, 6, 53, 204)) + self.insertLabel("lblFinalExplanation2", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (33, self.resources.reslblFinalExplanation2_value, True, + "lblFinalExplanation2", 104, 145, 6, 54, 199)) + self.insertImage( + "ImageControl2", + ("Border", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_IMAGEURL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "ScaleImage", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (0, 10, + UIConsts.INFOIMAGEURL, + "ImageControl2", 92, 145, False, 6, 66, 10)) + self.insertLabel("lblTemplateName", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (8, self.resources.reslblTemplateName_value, + "lblTemplateName", 97, 58, 6, 82, 101)) + self.insertLabel("lblTitle6", + ("FontDescriptor", PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_MULTILINE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (self.fontDescriptor6, 16, + self.resources.reslblTitle6_value, True, + "lblTitle6", 91, 8, 6, 94, 212)) diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialogConst.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialogConst.py new file mode 100644 index 000000000..8517b700e --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialogConst.py @@ -0,0 +1,76 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +HID = 40768 +HIDMAIN = 40820 + +class LetterWizardDialogConst: + OPTBUSINESSLETTER_ITEM_CHANGED = "optBusinessLetterItemChanged" + OPTBUSINESSLETTER_ITEM_CHANGED = "optBusinessLetterItemChanged" + OPTPRIVOFFICIALLETTER_ITEM_CHANGED = "optPrivOfficialLetterItemChanged" + OPTPRIVATELETTER_ITEM_CHANGED = "optPrivateLetterItemChanged" + LSTBUSINESSSTYLE_ACTION_PERFORMED = None + LSTBUSINESSSTYLE_ITEM_CHANGED = "lstBusinessStyleItemChanged" + LSTPRIVOFFICIALSTYLE_ACTION_PERFORMED = None + LSTPRIVOFFICIALSTYLE_ITEM_CHANGED = "lstPrivOfficialStyleItemChanged" + CHKBUSINESSPAPER_ITEM_CHANGED = "chkBusinessPaperItemChanged" + LSTPRIVATESTYLE_ACTION_PERFORMED = None + LSTPRIVATESTYLE_ITEM_CHANGED = "lstPrivateStyleItemChanged" + CHKPAPERCOMPANYLOGO_ITEM_CHANGED = "chkPaperCompanyLogoItemChanged" + NUMLOGOHEIGHT_TEXT_CHANGED = "numLogoHeightTextChanged" + NUMLOGOX_TEXT_CHANGED = "numLogoXTextChanged" + NUMLOGOWIDTH_TEXT_CHANGED = "numLogoWidthTextChanged" + NUMLOGOY_TEXT_CHANGED = "numLogoYTextChanged" + CHKCOMPANYRECEIVER_ITEM_CHANGED = "chkCompanyReceiverItemChanged" + CHKPAPERFOOTER_ITEM_CHANGED = "chkPaperFooterItemChanged" + NUMFOOTERHEIGHT_TEXT_CHANGED = "numFooterHeightTextChanged" + CHKPAPERCOMPANYADDRESS_ITEM_CHANGED = "chkPaperCompanyAddressItemChanged" + NUMADDRESSHEIGHT_TEXT_CHANGED = "numAddressHeightTextChanged" + NUMADDRESSX_TEXT_CHANGED = "numAddressXTextChanged" + NUMADDRESSWIDTH_TEXT_CHANGED = "numAddressWidthTextChanged" + NUMADDRESSY_TEXT_CHANGED = "numAddressYTextChanged" + CHKUSELOGO_ITEM_CHANGED = "chkUseLogoItemChanged" + CHKUSEADDRESSRECEIVER_ITEM_CHANGED = "chkUseAddressReceiverItemChanged" + CHKUSESIGNS_ITEM_CHANGED = "chkUseSignsItemChanged" + CHKUSESUBJECT_ITEM_CHANGED = "chkUseSubjectItemChanged" + CHKUSEBENDMARKS_ITEM_CHANGED = "chkUseBendMarksItemChanged" + CHKUSEFOOTER_ITEM_CHANGED = "chkUseFooterItemChanged" + CHKUSESALUTATION_ITEM_CHANGED = "chkUseSalutationItemChanged" + CHKUSEGREETING_ITEM_CHANGED = "chkUseGreetingItemChanged" + LSTSALUTATION_ACTION_PERFORMED = None + LSTSALUTATION_ITEM_CHANGED = "lstSalutationItemChanged" + LSTSALUTATION_TEXT_CHANGED = "lstSalutationItemChanged" + LSTGREETING_ACTION_PERFORMED = None + LSTGREETING_ITEM_CHANGED = "lstGreetingItemChanged" + LSTGREETING_TEXT_CHANGED = "lstGreetingItemChanged" + OPTSENDERPLACEHOLDER_ITEM_CHANGED = "optSenderPlaceholderItemChanged" + OPTSENDERDEFINE_ITEM_CHANGED = "optSenderDefineItemChanged" + OPTRECEIVERPLACEHOLDER_ITEM_CHANGED = "optReceiverPlaceholderItemChanged" + OPTRECEIVERDATABASE_ITEM_CHANGED = "optReceiverDatabaseItemChanged" + TXTSENDERNAME_TEXT_CHANGED = "txtSenderNameTextChanged" + TXTSENDERSTREET_TEXT_CHANGED = "txtSenderStreetTextChanged" + TXTSENDERCITY_TEXT_CHANGED = "txtSenderCityTextChanged" + TXTSENDERPOSTCODE_TEXT_CHANGED = "txtSenderPostCodeTextChanged" + TXTSENDERSTATE_TEXT_CHANGED = "txtSenderStateTextChanged" + TXTFOOTER_TEXT_CHANGED = "txtFooterTextChanged" + CHKFOOTERNEXTPAGES_ITEM_CHANGED = "chkFooterNextPagesItemChanged" + CHKFOOTERPAGENUMBERS_ITEM_CHANGED = "chkFooterPageNumbersItemChanged" + TXTTEMPLATENAME_TEXT_CHANGED = "txtTemplateNameTextChanged" + OPTCREATELETTER_ITEM_CHANGED = "optCreateFromTemplateItemChanged" + OPTMAKECHANGES_ITEM_CHANGED = "optMakeChangesItemChanged" + FILETEMPLATEPATH_TEXT_CHANGED = None diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py new file mode 100644 index 000000000..66c0e3345 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialogImpl.py @@ -0,0 +1,976 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +import os.path +from .LetterWizardDialog import LetterWizardDialog, uno, HelpIds, HID +from .LetterDocument import LetterDocument, BusinessPaperObject +from .CGLetterWizard import CGLetterWizard +from ..common.FileAccess import FileAccess +from ..common.Configuration import Configuration +from ..common.SystemDialog import SystemDialog +from ..common.Desktop import Desktop +from ..ui.PathSelection import PathSelection +from ..ui.event.UnoDataAware import UnoDataAware +from ..ui.event.RadioDataAware import RadioDataAware +from ..ui.event.CommonListener import TerminateListenerProcAdapter +from ..text.TextElement import TextElement +from ..text.TextFieldHandler import TextFieldHandler +from ..document.OfficeDocument import OfficeDocument + +from com.sun.star.awt.VclWindowPeerAttribute import YES_NO, DEF_NO +from com.sun.star.util import CloseVetoException +from com.sun.star.view.DocumentZoomType import OPTIMAL +from com.sun.star.document.UpdateDocMode import FULL_UPDATE +from com.sun.star.document.MacroExecMode import ALWAYS_EXECUTE + + +class LetterWizardDialogImpl(LetterWizardDialog): + + RM_TYPESTYLE = 1 + RM_BUSINESSPAPER = 2 + RM_SENDERRECEIVER = 4 + RM_FOOTER = 5 + + def enterStep(self, OldStep, NewStep): + pass + + def leaveStep(self, OldStep, NewStep): + pass + + def __init__(self, xmsf): + super(LetterWizardDialogImpl, self).__init__(xmsf) + self.lstBusinessStylePos = None + self.lstPrivateStylePos = None + self.lstPrivOfficialStylePos = None + self.xmsf = xmsf + self.bSaveSuccess = False + self.filenameChanged = False + self.BusCompanyLogo = None + self.BusCompanyAddress = None + self.BusCompanyAddressReceiver = None + self.BusFooter = None + + def startWizard(self, xMSF): + self.running = True + try: + #Number of steps on WizardDialog + self.nMaxStep = 6 + + #instantiate The Document Frame for the Preview + self.terminateListener = TerminateListenerProcAdapter(self.queryTermination) + self.myLetterDoc = LetterDocument(xMSF, self.terminateListener) + + #create the dialog + self.drawNaviBar() + self.buildStep1() + self.buildStep2() + self.buildStep3() + self.buildStep4() + self.buildStep5() + self.buildStep6() + + self.initializePaths() + self.initializeSalutation() + self.initializeGreeting() + + #special Control fFrameor setting the save Path: + self.insertPathSelectionControl() + + self.myConfig = CGLetterWizard() + + self.initializeTemplates(xMSF) + + #load the last used settings + #from the registry and apply listeners to the controls: + self.initConfiguration() + + if self.myConfig.cp_BusinessLetter.cp_Greeting : + self.myConfig.cp_BusinessLetter.cp_Greeting = \ + self.resources.GreetingLabels[0] + + if self.myConfig.cp_BusinessLetter.cp_Salutation: + self.myConfig.cp_BusinessLetter.cp_Salutation = \ + self.resources.SalutationLabels[0] + + if self.myConfig.cp_PrivateOfficialLetter.cp_Greeting: + self.myConfig.cp_PrivateOfficialLetter.cp_Greeting = \ + self.resources.GreetingLabels[1] + + if self.myConfig.cp_PrivateOfficialLetter.cp_Salutation: + self.myConfig.cp_PrivateOfficialLetter.cp_Salutation = \ + self.resources.SalutationLabels[1] + + if self.myConfig.cp_PrivateLetter.cp_Greeting: + self.myConfig.cp_PrivateLetter.cp_Greeting = \ + self.resources.GreetingLabels[2] + + if self.myConfig.cp_PrivateLetter.cp_Salutation: + self.myConfig.cp_PrivateLetter.cp_Salutation = \ + self.resources.SalutationLabels[2] + + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + + xContainerWindow = self.myLetterDoc.xFrame.ContainerWindow + self.createWindowPeer(xContainerWindow) + self.insertRoadmap() + self.setConfiguration() + self.setDefaultForGreetingAndSalutation() + self.initializeElements() + self.myLetterDoc.xFrame.ComponentWindow.Enable = False + self.executeDialogFromComponent(self.myLetterDoc.xFrame) + self.removeTerminateListener() + self.closeDocument() + self.running = False + except Exception: + self.removeTerminateListener() + traceback.print_exc() + self.running = False + return + + def cancelWizard(self): + self.xUnoDialog.endExecute() + self.running = False + + def finishWizard(self): + self.switchToStep(self.getCurrentStep(), self.nMaxStep) + endWizard = True + try: + self.sPath = self.myPathSelection.getSelectedPath() + if not self.sPath or not os.path.exists(self.sPath): + self.myPathSelection.triggerPathPicker() + self.sPath = self.myPathSelection.getSelectedPath() + + if not self.filenameChanged: + answer = SystemDialog.showMessageBox( + self.xMSF, "MessBox", YES_NO + DEF_NO, + self.resources.resOverwriteWarning, + self.xUnoDialog.Peer) + if answer == 3: + # user said: no, do not overwrite... + endWizard = False + return False + + self.myLetterDoc.setWizardTemplateDocInfo( + self.resources.resLetterWizardDialog_title, + self.resources.resTemplateDescription) + self.myLetterDoc.killEmptyUserFields() + self.myLetterDoc.keepLogoFrame = self.chkUseLogo.State != 0 + if self.chkBusinessPaper.State != 0 \ + and self.chkPaperCompanyLogo.State != 0: + self.myLetterDoc.keepLogoFrame = False + + self.myLetterDoc.keepBendMarksFrame = \ + self.chkUseBendMarks.State != 0 + self.myLetterDoc.keepLetterSignsFrame = \ + self.chkUseSigns.State != 0 + self.myLetterDoc.keepSenderAddressRepeatedFrame = \ + self.chkUseAddressReceiver.State != 0 + if self.optBusinessLetter.State: + if self.chkBusinessPaper.State != 0 \ + and self.chkCompanyReceiver.State != 0: + self.myLetterDoc.keepSenderAddressRepeatedFrame = False + + if self.chkBusinessPaper.State != 0 \ + and self.chkPaperCompanyAddress.State != 0: + self.myLetterDoc.keepAddressFrame = False + + self.myLetterDoc.killEmptyFrames() + self.bSaveSuccess = \ + OfficeDocument.store( + self.xMSF, self.myLetterDoc.xTextDocument, + self.sPath, "writer8_template") + if self.bSaveSuccess: + self.saveConfiguration() + xIH = self.xMSF.createInstance( + "com.sun.star.comp.uui.UUIInteractionHandler") + loadValues = list(range(4)) + loadValues[0] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[0].Name = "AsTemplate" + loadValues[1] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[1].Name = "MacroExecutionMode" + loadValues[1].Value = ALWAYS_EXECUTE + loadValues[2] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[2].Name = "UpdateDocMode" + loadValues[2].Value = FULL_UPDATE + loadValues[3] = uno.createUnoStruct( \ + 'com.sun.star.beans.PropertyValue') + loadValues[3].Name = "InteractionHandler" + loadValues[3].Value = xIH + if self.bEditTemplate: + loadValues[0].Value = False + else: + loadValues[0].Value = True + + oDoc = OfficeDocument.load( + Desktop.getDesktop(self.xMSF), + self.sPath, "_default", loadValues) + oDoc.CurrentController.ViewSettings.ZoomType = OPTIMAL + else: + pass + + except Exception: + traceback.print_exc() + finally: + if endWizard: + self.xUnoDialog.endExecute() + self.running = False + + return True; + + def closeDocument(self): + try: + xCloseable = self.myLetterDoc.xFrame + xCloseable.close(False) + except CloseVetoException: + traceback.print_exc() + + def optBusinessLetterItemChanged(self): + self.lstPrivateStylePos = None + self.lstPrivOfficialStylePos = None + self.xDialogModel.lblBusinessStyle.Enabled = True + self.xDialogModel.lstBusinessStyle.Enabled = True + self.xDialogModel.chkBusinessPaper.Enabled = True + self.xDialogModel.lblPrivOfficialStyle.Enabled = False + self.xDialogModel.lstPrivOfficialStyle.Enabled = False + self.xDialogModel.lblPrivateStyle.Enabled = False + self.xDialogModel.lstPrivateStyle.Enabled = False + self.lstBusinessStyleItemChanged() + self.enableSenderReceiver() + self.setPossibleFooter(True) + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + + def optPrivOfficialLetterItemChanged(self): + self.lstBusinessStylePos = None + self.lstPrivateStylePos = None + self.xDialogModel.lblBusinessStyle.Enabled = False + self.xDialogModel.lstBusinessStyle.Enabled = False + self.xDialogModel.chkBusinessPaper.Enabled = False + self.xDialogModel.lblPrivOfficialStyle.Enabled = True + self.xDialogModel.lstPrivOfficialStyle.Enabled = True + self.xDialogModel.lblPrivateStyle.Enabled = False + self.xDialogModel.lstPrivateStyle.Enabled = False + self.lstPrivOfficialStyleItemChanged() + self.disableBusinessPaper() + self.disableSenderReceiver() + self.setPossibleFooter(True) + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + self.myLetterDoc.fillSenderWithUserData() + + def optPrivateLetterItemChanged(self): + self.lstBusinessStylePos = None + self.lstPrivOfficialStylePos = None + self.xDialogModel.lblBusinessStyle.Enabled = False + self.xDialogModel.lstBusinessStyle.Enabled = False + self.xDialogModel.chkBusinessPaper.Enabled = False + self.xDialogModel.lblPrivOfficialStyle.Enabled = False + self.xDialogModel.lstPrivOfficialStyle.Enabled = False + self.xDialogModel.lblPrivateStyle.Enabled = True + self.xDialogModel.lstPrivateStyle.Enabled = True + self.lstPrivateStyleItemChanged() + self.disableBusinessPaper() + self.disableSenderReceiver() + self.setPossibleFooter(False) + if self.myPathSelection.xSaveTextBox.Text.lower() == "": + self.myPathSelection.initializePath() + + def optSenderPlaceholderItemChanged(self): + self.xDialogModel.lblSenderName.Enabled = False + self.xDialogModel.lblSenderStreet.Enabled = False + self.xDialogModel.lblPostCodeCity.Enabled = False + self.xDialogModel.txtSenderName.Enabled = False + self.xDialogModel.txtSenderStreet.Enabled = False + self.xDialogModel.txtSenderPostCode.Enabled = False + self.xDialogModel.txtSenderState.Enabled = False + self.xDialogModel.txtSenderCity.Enabled = False + self.myLetterDoc.fillSenderWithUserData() + + def optSenderDefineItemChanged(self): + self.xDialogModel.lblSenderName.Enabled = True + self.xDialogModel.lblSenderStreet.Enabled = True + self.xDialogModel.lblPostCodeCity.Enabled = True + self.xDialogModel.txtSenderName.Enabled = True + self.xDialogModel.txtSenderStreet.Enabled = True + self.xDialogModel.txtSenderPostCode.Enabled = True + self.xDialogModel.txtSenderState.Enabled = True + self.xDialogModel.txtSenderCity.Enabled = True + self.txtSenderNameTextChanged() + self.txtSenderStreetTextChanged() + self.txtSenderPostCodeTextChanged() + self.txtSenderStateTextChanged() + self.txtSenderCityTextChanged() + + def lstBusinessStyleItemChanged(self): + selectedItemPos = self.lstBusinessStyle.SelectedItemPos + if self.lstBusinessStylePos != selectedItemPos: + self.lstBusinessStylePos = selectedItemPos + self.myLetterDoc.loadAsPreview( + self.BusinessFiles[1][selectedItemPos], False) + self.initializeElements() + self.chkBusinessPaperItemChanged() + self.setElements(False) + self.drawConstants() + + def lstPrivOfficialStyleItemChanged(self): + selectedItemPos = self.lstPrivOfficialStyle.SelectedItemPos + if self.lstPrivOfficialStylePos != selectedItemPos: + self.lstPrivOfficialStylePos = selectedItemPos + self.myLetterDoc.loadAsPreview( + self.OfficialFiles[1][selectedItemPos], False) + self.initializeElements() + self.setPossibleSenderData(True) + self.setElements(False) + self.drawConstants() + + def lstPrivateStyleItemChanged(self): + selectedItemPos = self.lstPrivateStyle.SelectedItemPos + if self.lstPrivateStylePos != selectedItemPos: + self.lstPrivateStylePos = selectedItemPos + self.myLetterDoc.xTextDocument = \ + self.myLetterDoc.loadAsPreview( + self.PrivateFiles[1][selectedItemPos], False) + self.initializeElements() + self.setElements(True) + + def numLogoHeightTextChanged(self): + self.BusCompanyLogo.iHeight = int(self.numLogoHeight.Value * 1000) + self.BusCompanyLogo.setFramePosition() + + def numLogoWidthTextChanged(self): + self.BusCompanyLogo.iWidth = int(self.numLogoWidth.Value * 1000) + self.BusCompanyLogo.setFramePosition() + + def numLogoXTextChanged(self): + self.BusCompanyLogo.iXPos = int(self.numLogoX.Value * 1000) + self.BusCompanyLogo.setFramePosition() + + def numLogoYTextChanged(self): + self.BusCompanyLogo.iYPos = int(self.numLogoY.Value * 1000) + self.BusCompanyLogo.setFramePosition() + + def numAddressWidthTextChanged(self): + self.BusCompanyAddress.iWidth = int(self.numAddressWidth.Value * 1000) + self.BusCompanyAddress.setFramePosition() + + def numAddressXTextChanged(self): + self.BusCompanyAddress.iXPos = int(self.numAddressX.Value * 1000) + self.BusCompanyAddress.setFramePosition() + + def numAddressYTextChanged(self): + self.BusCompanyAddress.iYPos = int(self.numAddressY.Value * 1000) + self.BusCompanyAddress.setFramePosition() + + def numAddressHeightTextChanged(self): + self.BusCompanyAddress.iHeight = int(self.numAddressHeight.Value * 1000) + self.BusCompanyAddress.setFramePosition() + + def numFooterHeightTextChanged(self): + self.BusFooter.iHeight = int(self.numFooterHeight.Value * 1000) + self.BusFooter.iYPos = \ + self.myLetterDoc.DocSize.Height - self.BusFooter.iHeight + self.BusFooter.setFramePosition() + + def chkPaperCompanyLogoItemChanged(self): + if self.chkPaperCompanyLogo.State != 0: + if self.numLogoWidth.Value == 0: + self.numLogoWidth.Value = 0.1 + + if self.numLogoHeight.Value == 0: + self.numLogoHeight.Value = 0.1 + self.BusCompanyLogo = BusinessPaperObject( + self.myLetterDoc.xTextDocument, "Company Logo", + int(self.numLogoWidth.Value * 1000), + int(self.numLogoHeight.Value * 1000), + int(self.numLogoX.Value * 1000), + self.numLogoY.Value * 1000) + self.xDialogModel.numLogoHeight.Enabled = True + self.xDialogModel.numLogoWidth.Enabled = True + self.xDialogModel.numLogoX.Enabled = True + self.xDialogModel.numLogoY.Enabled = True + self.setPossibleLogo(False) + else: + if self.BusCompanyLogo is not None: + self.BusCompanyLogo.removeFrame() + + self.xDialogModel.numLogoHeight.Enabled = False + self.xDialogModel.numLogoWidth.Enabled = False + self.xDialogModel.numLogoX.Enabled = False + self.xDialogModel.numLogoY.Enabled = False + self.setPossibleLogo(True) + + def chkPaperCompanyAddressItemChanged(self): + if self.chkPaperCompanyAddress.State != 0: + if self.numAddressWidth.Value == 0: + self.numAddressWidth.Value = 0.1 + + if self.numAddressHeight.Value == 0: + self.numAddressHeight.Value = 0.1 + + self.BusCompanyAddress = BusinessPaperObject( + self.myLetterDoc.xTextDocument, "Company Address", + int(self.numAddressWidth.Value * 1000), + int(self.numAddressHeight.Value * 1000), + int(self.numAddressX.Value * 1000), + int(self.numAddressY.Value * 1000)) + self.xDialogModel.numAddressHeight.Enabled = True + self.xDialogModel.numAddressWidth.Enabled = True + self.xDialogModel.numAddressX.Enabled = True + self.xDialogModel.numAddressY.Enabled = True + if self.myLetterDoc.hasElement("Sender Address"): + self.myLetterDoc.switchElement( + "Sender Address", False) + + if self.chkCompanyReceiver.State != 0: + self.setPossibleSenderData(False) + + else: + if self.BusCompanyAddress is not None: + self.BusCompanyAddress.removeFrame() + self.xDialogModel.numAddressHeight.Enabled = False + self.xDialogModel.numAddressWidth.Enabled = False + self.xDialogModel.numAddressX.Enabled = False + self.xDialogModel.numAddressY.Enabled = False + if self.myLetterDoc.hasElement("Sender Address"): + self.myLetterDoc.switchElement("Sender Address", True) + + self.setPossibleSenderData(True) + if self.optSenderDefine.State: + self.optSenderDefineItemChanged() + + if self.optSenderPlaceholder.State: + self.optSenderPlaceholderItemChanged() + + def chkCompanyReceiverItemChanged(self): + xReceiverFrame = None + if self.chkCompanyReceiver.State != 0: + try: + xReceiverFrame = self.myLetterDoc.getFrameByName( + "Receiver Address", self.myLetterDoc.xTextDocument) + iFrameWidth = int(xReceiverFrame.Width) + iFrameX = int(xReceiverFrame.HoriOrientPosition) + iFrameY = int(xReceiverFrame.VertOrientPosition) + iReceiverHeight = int(0.5 * 1000) + self.BusCompanyAddressReceiver = BusinessPaperObject( + self.myLetterDoc.xTextDocument, " ", iFrameWidth, iReceiverHeight, + iFrameX, iFrameY - iReceiverHeight) + self.setPossibleAddressReceiver(False) + except Exception: + traceback.print_exc() + + if self.chkPaperCompanyAddress.State != 0: + self.setPossibleSenderData(False) + + else: + if self.BusCompanyAddressReceiver is not None: + self.BusCompanyAddressReceiver.removeFrame() + + self.setPossibleAddressReceiver(True) + self.setPossibleSenderData(True) + if self.optSenderDefine.State: + self.optSenderDefineItemChanged() + + if self.optSenderPlaceholder.State: + self.optSenderPlaceholderItemChanged() + + def chkPaperFooterItemChanged(self): + if self.chkPaperFooter.State != 0: + if self.numFooterHeight.Value == 0: + self.numFooterHeight.Value = 0.1 + + self.BusFooter = BusinessPaperObject( + self.myLetterDoc.xTextDocument, "Footer", + self.myLetterDoc.DocSize.Width, + int(self.numFooterHeight.Value * 1000), 0, + int(self.myLetterDoc.DocSize.Height - \ + (self.numFooterHeight.Value * 1000))) + self.xDialogModel.numFooterHeight.Enabled = True + self.xDialogModel.lblFooterHeight.Enabled = True + self.setPossibleFooter(False) + else: + if self.BusFooter is not None: + self.BusFooter.removeFrame() + + self.xDialogModel.numFooterHeight.Enabled = False + self.xDialogModel.lblFooterHeight.Enabled = False + self.setPossibleFooter(True) + + def chkUseLogoItemChanged(self): + try: + if self.myLetterDoc.hasElement("Company Logo"): + logostatus = \ + bool(self.xDialogModel.chkUseLogo.Enabled) \ + and (self.chkUseLogo.State != 0) + self.myLetterDoc.switchElement( + "Company Logo", logostatus) + except Exception: + traceback.print_exc() + + def chkUseAddressReceiverItemChanged(self): + try: + if self.myLetterDoc.hasElement("Sender Address Repeated"): + rstatus = \ + bool(self.xDialogModel.chkUseAddressReceiver.Enabled) \ + and (self.chkUseAddressReceiver.State != 0) + self.myLetterDoc.switchElement( + "Sender Address Repeated", rstatus) + + except Exception: + traceback.print_exc() + + def chkUseSignsItemChanged(self): + if self.myLetterDoc.hasElement("Letter Signs"): + self.myLetterDoc.switchElement( + "Letter Signs", self.chkUseSigns.State != 0) + + def chkUseSubjectItemChanged(self): + if self.myLetterDoc.hasElement("Subject Line"): + self.myLetterDoc.switchElement( + "Subject Line", self.chkUseSubject.State != 0) + + def chkUseBendMarksItemChanged(self): + if self.myLetterDoc.hasElement("Bend Marks"): + self.myLetterDoc.switchElement( + "Bend Marks", self.chkUseBendMarks.State != 0) + + def chkUseFooterItemChanged(self): + try: + bFooterPossible = (self.chkUseFooter.State != 0) \ + and bool(self.xDialogModel.chkUseFooter.Enabled) + if self.chkFooterNextPages.State != 0: + self.myLetterDoc.switchFooter( + "First Page", False, self.chkFooterPageNumbers.State != 0, + self.txtFooter.Text) + self.myLetterDoc.switchFooter("Standard", bFooterPossible, + self.chkFooterPageNumbers.State != 0, self.txtFooter.Text) + else: + self.myLetterDoc.switchFooter( + "First Page", bFooterPossible, + self.chkFooterPageNumbers.State != 0, self.txtFooter.Text) + self.myLetterDoc.switchFooter( + "Standard", bFooterPossible, + self.chkFooterPageNumbers.State != 0, self.txtFooter.Text) + + BPaperItem = \ + self.getRoadmapItemByID(LetterWizardDialogImpl.RM_FOOTER) + BPaperItem.Enabled = bFooterPossible + except Exception: + traceback.print_exc() + + def chkFooterNextPagesItemChanged(self): + self.chkUseFooterItemChanged() + + def chkFooterPageNumbersItemChanged(self): + self.chkUseFooterItemChanged() + + def setPossibleFooter(self, bState): + self.xDialogModel.chkUseFooter.Enabled = bState + self.chkUseFooterItemChanged() + + def setPossibleAddressReceiver(self, bState): + if self.myLetterDoc.hasElement("Sender Address Repeated"): + self.xDialogModel.chkUseAddressReceiver.Enabled = bState + self.chkUseAddressReceiverItemChanged() + + def setPossibleLogo(self, bState): + if self.myLetterDoc.hasElement("Company Logo"): + self.xDialogModel.chkUseLogo.Enabled = bState + self.chkUseLogoItemChanged() + + def txtFooterTextChanged(self): + self.chkUseFooterItemChanged() + + def txtSenderNameTextChanged(self): + myFieldHandler = TextFieldHandler( + self.myLetterDoc.xMSF, self.myLetterDoc.xTextDocument) + myFieldHandler.changeUserFieldContent( + "Company", self.txtSenderName.Text) + + def txtSenderStreetTextChanged(self): + myFieldHandler = TextFieldHandler( + self.myLetterDoc.xMSF, self.myLetterDoc.xTextDocument) + myFieldHandler.changeUserFieldContent( + "Street", self.txtSenderStreet.Text) + + def txtSenderCityTextChanged(self): + myFieldHandler = TextFieldHandler( + self.myLetterDoc.xMSF, self.myLetterDoc.xTextDocument) + myFieldHandler.changeUserFieldContent( + "City", self.txtSenderCity.Text) + + def txtSenderPostCodeTextChanged(self): + myFieldHandler = TextFieldHandler( + self.myLetterDoc.xMSF, self.myLetterDoc.xTextDocument) + myFieldHandler.changeUserFieldContent( + "PostCode", self.txtSenderPostCode.Text) + + def txtSenderStateTextChanged(self): + myFieldHandler = TextFieldHandler( + self.myLetterDoc.xMSF, self.myLetterDoc.xTextDocument) + myFieldHandler.changeUserFieldContent( + "State", self.txtSenderState.Text) + + def txtTemplateNameTextChanged(self): + xDocProps = self.myLetterDoc.xTextDocument.DocumentProperties + TitleName = self.txtTemplateName.Text + xDocProps.Title = TitleName + + def chkUseSalutationItemChanged(self): + self.myLetterDoc.switchUserField( + "Salutation", self.lstSalutation.Text, + self.chkUseSalutation.State != 0) + self.xDialogModel.lstSalutation.Enabled = \ + self.chkUseSalutation.State != 0 + + def lstSalutationItemChanged(self): + self.myLetterDoc.switchUserField( + "Salutation", self.lstSalutation.Text, + self.chkUseSalutation.State != 0) + + def chkUseGreetingItemChanged(self): + self.myLetterDoc.switchUserField( + "Greeting", self.lstGreeting.Text, self.chkUseGreeting.State != 0) + self.xDialogModel.lstGreeting.Enabled = \ + self.chkUseGreeting.State != 0 + + def setDefaultForGreetingAndSalutation(self): + if self.lstSalutation.Text: + self.lstSalutation.Text = self.resources.SalutationLabels[0] + + if self.lstGreeting.Text: + self.lstGreeting.Text = self.resources.GreetingLabels[0] + + def lstGreetingItemChanged(self): + self.myLetterDoc.switchUserField( + "Greeting", self.lstGreeting.Text, self.chkUseGreeting.State != 0) + + def chkBusinessPaperItemChanged(self): + if self.chkBusinessPaper.State != 0: + self.enableBusinessPaper() + else: + self.disableBusinessPaper() + self.setPossibleSenderData(True) + + def setPossibleSenderData(self, bState): + self.xDialogModel.optSenderDefine.Enabled = bState + self.xDialogModel.optSenderPlaceholder.Enabled = bState + self.xDialogModel.lblSenderAddress.Enabled = bState + if not bState: + self.xDialogModel.txtSenderCity.Enabled = bState + self.xDialogModel.txtSenderName.Enabled = bState + self.xDialogModel.txtSenderPostCode.Enabled = bState + self.xDialogModel.txtSenderStreet.Enabled = bState + self.xDialogModel.txtSenderCity.Enabled = bState + self.xDialogModel.txtSenderState.Enabled = bState + self.xDialogModel.lblSenderName.Enabled = bState + self.xDialogModel.lblSenderStreet.Enabled = bState + self.xDialogModel.lblPostCodeCity.Enabled = bState + + def enableSenderReceiver(self): + BPaperItem = self.getRoadmapItemByID( + LetterWizardDialogImpl.RM_SENDERRECEIVER) + BPaperItem.Enabled = True + + def disableSenderReceiver(self): + BPaperItem = self.getRoadmapItemByID( + LetterWizardDialogImpl.RM_SENDERRECEIVER) + BPaperItem.Enabled = False + + def enableBusinessPaper(self): + try: + BPaperItem = self.getRoadmapItemByID( + LetterWizardDialogImpl.RM_BUSINESSPAPER) + BPaperItem.Enabled = True + self.chkPaperCompanyLogoItemChanged() + self.chkPaperCompanyAddressItemChanged() + self.chkPaperFooterItemChanged() + self.chkCompanyReceiverItemChanged() + except Exception: + traceback.print_exc() + + def disableBusinessPaper(self): + try: + BPaperItem = self.getRoadmapItemByID( + LetterWizardDialogImpl.RM_BUSINESSPAPER) + BPaperItem.Enabled = False + if self.BusCompanyLogo is not None: + self.BusCompanyLogo.removeFrame() + + if self.BusCompanyAddress is not None: + self.BusCompanyAddress.removeFrame() + + if self.BusFooter is not None: + self.BusFooter.removeFrame() + + if self.BusCompanyAddressReceiver is not None: + self.BusCompanyAddressReceiver.removeFrame() + + self.setPossibleAddressReceiver(True) + self.setPossibleFooter(True) + self.setPossibleLogo(True) + if self.myLetterDoc.hasElement("Sender Address"): + self.myLetterDoc.switchElement( + "Sender Address", True) + except Exception: + traceback.print_exc() + + def initializeSalutation(self): + self.xDialogModel.lstSalutation.StringItemList = \ + tuple(self.resources.SalutationLabels) + + def initializeGreeting(self): + self.xDialogModel.lstGreeting.StringItemList = \ + tuple(self.resources.GreetingLabels) + + def initializeTemplates(self, xMSF): + sLetterPath = self.sTemplatePath + "/wizard/letter" + self.BusinessFiles = \ + FileAccess.getFolderTitles( + xMSF, "bus", sLetterPath, self.resources.dictBusinessTemplate) + self.OfficialFiles = \ + FileAccess.getFolderTitles( + xMSF, "off", sLetterPath, self.resources.dictOfficialTemplate) + self.PrivateFiles = \ + FileAccess.getFolderTitles( + xMSF, "pri", sLetterPath, self.resources.dictPrivateTemplate) + self.xDialogModel.lstBusinessStyle.StringItemList = \ + tuple(self.BusinessFiles[0]) + self.xDialogModel.lstPrivOfficialStyle.StringItemList = \ + tuple(self.OfficialFiles[0]) + self.xDialogModel.lstPrivateStyle.StringItemList = \ + tuple(self.PrivateFiles[0]) + self.xDialogModel.lstBusinessStyle.SelectedItems = (0,) + self.xDialogModel.lstPrivOfficialStyle.SelectedItems = (0,) + self.xDialogModel.lstPrivateStyle.SelectedItems = (0,) + return True + + def initializeElements(self): + self.xDialogModel.chkUseLogo.Enabled = \ + self.myLetterDoc.hasElement("Company Logo") + self.xDialogModel.chkUseBendMarks.Enabled = \ + self.myLetterDoc.hasElement("Bend Marks") + self.xDialogModel.chkUseAddressReceiver.Enabled = \ + self.myLetterDoc.hasElement("Sender Address Repeated") + self.xDialogModel.chkUseSubject.Enabled = \ + self.myLetterDoc.hasElement("Subject Line") + self.xDialogModel.chkUseSigns.Enabled = \ + self.myLetterDoc.hasElement("Letter Signs") + self.myLetterDoc.updateDateFields() + + def setConfiguration(self): + if self.optBusinessLetter.State: + self.optBusinessLetterItemChanged() + + elif self.optPrivOfficialLetter.State: + self.optPrivOfficialLetterItemChanged() + + elif self.optPrivateLetter.State: + self.optPrivateLetterItemChanged() + + def optReceiverPlaceholderItemChanged(self): + OfficeDocument.attachEventCall( + self.myLetterDoc.xTextDocument, "OnNew", "StarBasic", + "macro:///Template.Correspondence.Placeholder()") + + def optReceiverDatabaseItemChanged(self): + OfficeDocument.attachEventCall( + self.myLetterDoc.xTextDocument, "OnNew", "StarBasic", + "macro:///Template.Correspondence.Database()") + + def setElements(self, privLetter): + if self.optSenderDefine.State: + self.optSenderDefineItemChanged() + + if self.optSenderPlaceholder.State: + self.optSenderPlaceholderItemChanged() + + self.chkUseSignsItemChanged() + self.chkUseSubjectItemChanged() + self.chkUseSalutationItemChanged() + self.chkUseGreetingItemChanged() + self.chkUseBendMarksItemChanged() + self.chkUseAddressReceiverItemChanged() + self.txtTemplateNameTextChanged() + if self.optReceiverDatabase.State and not privLetter: + self.optReceiverDatabaseItemChanged() + + if self.optReceiverPlaceholder.State and not privLetter: + self.optReceiverPlaceholderItemChanged() + + if self.optCreateLetter.State: + self.optCreateFromTemplateItemChanged() + + if self.optMakeChanges.State: + self.optMakeChangesItemChanged() + + def drawConstants(self): + '''Localise the template''' + constRangeList = self.myLetterDoc.searchFillInItems(1) + + for i in constRangeList: + text = i.String.lower() + aux = TextElement(i, self.resources.dictConstants[text]) + aux.write() + + def insertRoadmap(self): + self.addRoadmap() + self.insertRoadMapItems( + self.resources.RoadmapLabels, + [True, False, True, True, False, True]) + self.setRoadmapInteractive(True) + self.setRoadmapComplete(True) + self.setCurrentRoadmapItemID(1) + + def insertPathSelectionControl(self): + self.myPathSelection = \ + PathSelection(self.xMSF, self, PathSelection.TransferMode.SAVE, + PathSelection.DialogTypes.FILE) + self.myPathSelection.insert( + 6, 97, 70, 205, 45, self.resources.reslblTemplatePath_value, + True, HelpIds.getHelpIdString(HID + 47), + HelpIds.getHelpIdString(HID + 48)) + self.myPathSelection.sDefaultDirectory = self.sUserTemplatePath + self.myPathSelection.sDefaultName = "myLetterTemplate.ott" + self.myPathSelection.sDefaultFilter = "writer8_template" + self.myPathSelection.addSelectionListener(self) + + def initConfiguration(self): + try: + root = Configuration.getConfigurationRoot( + self.xMSF, "/org.openoffice.Office.Writer/Wizards/Letter", + False) + self.myConfig.readConfiguration(root, "cp_") + RadioDataAware.attachRadioButtons(self.myConfig, "cp_LetterType", + (self.optBusinessLetter, self.optPrivOfficialLetter, + self.optPrivateLetter), True).updateUI() + UnoDataAware.attachListBox( + self.myConfig.cp_BusinessLetter, "cp_Style", + self.lstBusinessStyle, True).updateUI() + UnoDataAware.attachListBox( + self.myConfig.cp_PrivateOfficialLetter, "cp_Style", + self.lstPrivOfficialStyle, True).updateUI() + UnoDataAware.attachListBox( + self.myConfig.cp_PrivateLetter, "cp_Style", + self.lstPrivateStyle, True).updateUI() + UnoDataAware.attachCheckBox( + self.myConfig.cp_BusinessLetter, "cp_BusinessPaper", + self.chkBusinessPaper, True).updateUI() + cgl = self.myConfig.cp_BusinessLetter + cgpl = self.myConfig.cp_BusinessLetter.cp_CompanyLogo + cgpa = self.myConfig.cp_BusinessLetter.cp_CompanyAddress + UnoDataAware.attachCheckBox( + cgpl, "cp_Display", self.chkPaperCompanyLogo, True).updateUI() + UnoDataAware.attachNumericControl( + cgpl, "cp_Width", self.numLogoWidth, True).updateUI() + UnoDataAware.attachNumericControl( + cgpl, "cp_Height", self.numLogoHeight, True).updateUI() + UnoDataAware.attachNumericControl( + cgpl, "cp_X", self.numLogoX, True).updateUI() + UnoDataAware.attachNumericControl( + cgpl, "cp_Y", self.numLogoY, True).updateUI() + UnoDataAware.attachCheckBox( + cgpa, "cp_Display", self.chkPaperCompanyAddress, True).updateUI() + UnoDataAware.attachNumericControl( + cgpa, "cp_Width", self.numAddressWidth, True).updateUI() + UnoDataAware.attachNumericControl( + cgpa, "cp_Height", self.numAddressHeight, True).updateUI() + UnoDataAware.attachNumericControl( + cgpa, "cp_X", self.numAddressX, True).updateUI() + UnoDataAware.attachNumericControl( + cgpa, "cp_Y", self.numAddressY, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PaperCompanyAddressReceiverField", + self.chkCompanyReceiver, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PaperFooter", self.chkPaperFooter, True).updateUI() + UnoDataAware.attachNumericControl( + cgl, "cp_PaperFooterHeight", self.numFooterHeight, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintCompanyLogo", self.chkUseLogo, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintCompanyAddressReceiverField", + self.chkUseAddressReceiver, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintLetterSigns", self.chkUseSigns, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintSubjectLine", self.chkUseSubject, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintSalutation", self.chkUseSalutation, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintBendMarks", self.chkUseBendMarks, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintGreeting", self.chkUseGreeting, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_PrintFooter", self.chkUseFooter, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_Salutation", self.lstSalutation, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_Greeting", self.lstGreeting, True).updateUI() + RadioDataAware.attachRadioButtons( + cgl, "cp_SenderAddressType", + (self.optSenderDefine, self.optSenderPlaceholder), True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_SenderCompanyName", self.txtSenderName, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_SenderStreet", self.txtSenderStreet, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_SenderPostCode", self.txtSenderPostCode, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_SenderState", self.txtSenderState, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_SenderCity", self.txtSenderCity, True).updateUI() + RadioDataAware.attachRadioButtons( + cgl, "cp_ReceiverAddressType", + (self.optReceiverDatabase, self.optReceiverPlaceholder), + True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_Footer", self.txtFooter, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_FooterOnlySecondPage", + self.chkFooterNextPages, True).updateUI() + UnoDataAware.attachCheckBox( + cgl, "cp_FooterPageNumbers", + self.chkFooterPageNumbers, True).updateUI() + RadioDataAware.attachRadioButtons( + cgl, "cp_CreationType", + (self.optCreateLetter, self.optMakeChanges), True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_TemplateName", self.txtTemplateName, True).updateUI() + UnoDataAware.attachEditControl( + cgl, "cp_TemplatePath", self.myPathSelection.xSaveTextBox, + True).updateUI() + except Exception: + traceback.print_exc() + + def saveConfiguration(self): + try: + root = Configuration.getConfigurationRoot(self.xMSF, + "/org.openoffice.Office.Writer/Wizards/Letter", True) + self.myConfig.writeConfiguration(root, "cp_") + root.commitChanges() + except Exception: + traceback.print_exc() + + def validatePath(self): + if self.myPathSelection.usedPathPicker: + self.filenameChanged = True + self.myPathSelection.usedPathPicker = False diff --git a/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py b/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py new file mode 100644 index 000000000..34a82cfd5 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/LetterWizardDialogResources.py @@ -0,0 +1,125 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +class LetterWizardDialogResources(object): + + def __init__(self): + import imp, os + imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')) + import strings + + self.resLetterWizardDialog_title = strings.RID_LETTERWIZARDDIALOG_START_1 + self.resLabel9_value = strings.RID_LETTERWIZARDDIALOG_START_2 + self.resoptBusinessLetter_value = strings.RID_LETTERWIZARDDIALOG_START_3 + self.resoptPrivOfficialLetter_value = strings.RID_LETTERWIZARDDIALOG_START_4 + self.resoptPrivateLetter_value = strings.RID_LETTERWIZARDDIALOG_START_5 + self.reschkBusinessPaper_value = strings.RID_LETTERWIZARDDIALOG_START_6 + self.reschkPaperCompanyLogo_value = strings.RID_LETTERWIZARDDIALOG_START_7 + self.reschkPaperCompanyAddress_value = strings.RID_LETTERWIZARDDIALOG_START_8 + self.reschkPaperFooter_value = strings.RID_LETTERWIZARDDIALOG_START_9 + self.reschkCompanyReceiver_value = strings.RID_LETTERWIZARDDIALOG_START_10 + self.reschkUseLogo_value = strings.RID_LETTERWIZARDDIALOG_START_11 + self.reschkUseAddressReceiver_value = strings.RID_LETTERWIZARDDIALOG_START_12 + self.reschkUseSigns_value = strings.RID_LETTERWIZARDDIALOG_START_13 + self.reschkUseSubject_value = strings.RID_LETTERWIZARDDIALOG_START_14 + self.reschkUseSalutation_value = strings.RID_LETTERWIZARDDIALOG_START_15 + self.reschkUseBendMarks_value = strings.RID_LETTERWIZARDDIALOG_START_16 + self.reschkUseGreeting_value = strings.RID_LETTERWIZARDDIALOG_START_17 + self.reschkUseFooter_value = strings.RID_LETTERWIZARDDIALOG_START_18 + self.resoptSenderPlaceholder_value = strings.RID_LETTERWIZARDDIALOG_START_19 + self.resoptSenderDefine_value = strings.RID_LETTERWIZARDDIALOG_START_20 + self.resoptReceiverPlaceholder_value = strings.RID_LETTERWIZARDDIALOG_START_21 + self.resoptReceiverDatabase_value = strings.RID_LETTERWIZARDDIALOG_START_22 + self.reschkFooterNextPages_value = strings.RID_LETTERWIZARDDIALOG_START_23 + self.reschkFooterPageNumbers_value = strings.RID_LETTERWIZARDDIALOG_START_24 + self.restxtTemplateName_value = strings.RID_LETTERWIZARDDIALOG_START_25 + self.resoptCreateLetter_value = strings.RID_LETTERWIZARDDIALOG_START_26 + self.resoptMakeChanges_value = strings.RID_LETTERWIZARDDIALOG_START_27 + self.reslblBusinessStyle_value = strings.RID_LETTERWIZARDDIALOG_START_28 + self.reslblPrivOfficialStyle_value = strings.RID_LETTERWIZARDDIALOG_START_29 + self.reslblPrivateStyle_value = strings.RID_LETTERWIZARDDIALOG_START_30 + self.reslblIntroduction_value = strings.RID_LETTERWIZARDDIALOG_START_31 + self.reslblLogoHeight_value = strings.RID_LETTERWIZARDDIALOG_START_32 + self.reslblLogoWidth_value = strings.RID_LETTERWIZARDDIALOG_START_33 + self.reslblLogoX_value = strings.RID_LETTERWIZARDDIALOG_START_34 + self.reslblLogoY_value = strings.RID_LETTERWIZARDDIALOG_START_35 + self.reslblAddressHeight_value = strings.RID_LETTERWIZARDDIALOG_START_36 + self.reslblAddressWidth_value = strings.RID_LETTERWIZARDDIALOG_START_37 + self.reslblAddressX_value = strings.RID_LETTERWIZARDDIALOG_START_38 + self.reslblAddressY_value = strings.RID_LETTERWIZARDDIALOG_START_39 + self.reslblFooterHeight_value = strings.RID_LETTERWIZARDDIALOG_START_40 + self.reslblSenderAddress_value = strings.RID_LETTERWIZARDDIALOG_START_42 + self.reslblSenderName_value = strings.RID_LETTERWIZARDDIALOG_START_43 + self.reslblSenderStreet_value = strings.RID_LETTERWIZARDDIALOG_START_44 + self.reslblPostCodeCity_value = strings.RID_LETTERWIZARDDIALOG_START_45 + self.reslblReceiverAddress_value = strings.RID_LETTERWIZARDDIALOG_START_46 + self.reslblFooter_value = strings.RID_LETTERWIZARDDIALOG_START_47 + self.reslblFinalExplanation1_value = strings.RID_LETTERWIZARDDIALOG_START_48 + self.reslblFinalExplanation2_value = strings.RID_LETTERWIZARDDIALOG_START_49 + self.reslblTemplateName_value = strings.RID_LETTERWIZARDDIALOG_START_50 + self.reslblTemplatePath_value = strings.RID_LETTERWIZARDDIALOG_START_51 + self.reslblProceed_value = strings.RID_LETTERWIZARDDIALOG_START_52 + self.reslblTitle1_value = strings.RID_LETTERWIZARDDIALOG_START_53 + self.reslblTitle3_value = strings.RID_LETTERWIZARDDIALOG_START_54 + self.reslblTitle2_value = strings.RID_LETTERWIZARDDIALOG_START_55 + self.reslblTitle4_value = strings.RID_LETTERWIZARDDIALOG_START_56 + self.reslblTitle5_value = strings.RID_LETTERWIZARDDIALOG_START_57 + self.reslblTitle6_value = strings.RID_LETTERWIZARDDIALOG_START_58 + + #Create a Dictionary for the constants values. + self.dictConstants = { + "#subjectconst#" : strings.RID_LETTERWIZARDDIALOG_START_59} + + #Create a dictionary for localising the business templates + self.dictBusinessTemplate = { + "Elegant" : strings.RID_LETTERWIZARDDIALOG_START_60, + "Modern" : strings.RID_LETTERWIZARDDIALOG_START_61, + "Office" : strings.RID_LETTERWIZARDDIALOG_START_62} + + #Create a dictionary for localising the official templates + self.dictOfficialTemplate = { + "Elegant" : strings.RID_LETTERWIZARDDIALOG_START_60, + "Modern" : strings.RID_LETTERWIZARDDIALOG_START_61, + "Office" : strings.RID_LETTERWIZARDDIALOG_START_62} + + #Create a dictionary for localising the private templates + self.dictPrivateTemplate = { + "Bottle" : strings.RID_LETTERWIZARDDIALOG_START_63, + "Mail" : strings.RID_LETTERWIZARDDIALOG_START_64, + "Marine" : strings.RID_LETTERWIZARDDIALOG_START_65, + "Red Line" : strings.RID_LETTERWIZARDDIALOG_START_66} + + #Common Resources + self.resOverwriteWarning = strings.RID_COMMON_START_19 + self.resTemplateDescription = strings.RID_COMMON_START_20 + + self.RoadmapLabels = [] + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_1) + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_2) + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_3) + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_4) + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_5) + self.RoadmapLabels.append(strings.RID_LETTERWIZARDROADMAP_START_6) + self.SalutationLabels = [] + self.SalutationLabels.append(strings.RID_LETTERWIZARDSALUTATION_START_1) + self.SalutationLabels.append(strings.RID_LETTERWIZARDSALUTATION_START_2) + self.SalutationLabels.append(strings.RID_LETTERWIZARDSALUTATION_START_3) + self.GreetingLabels = [] + self.GreetingLabels.append(strings.RID_LETTERWIZARDGREETING_START_1) + self.GreetingLabels.append(strings.RID_LETTERWIZARDGREETING_START_2) + self.GreetingLabels.append(strings.RID_LETTERWIZARDGREETING_START_3) diff --git a/wizards/com/sun/star/wizards/letter/__init__.py b/wizards/com/sun/star/wizards/letter/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/__init__.py diff --git a/wizards/com/sun/star/wizards/letter/letter.component b/wizards/com/sun/star/wizards/letter/letter.component new file mode 100644 index 000000000..f7496d829 --- /dev/null +++ b/wizards/com/sun/star/wizards/letter/letter.component @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> +<component loader="com.sun.star.loader.Python" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name="com.sun.star.wizards.letter.CallWizard"> + <service name="com.sun.star.task.Job"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/query/CallQueryWizard.java b/wizards/com/sun/star/wizards/query/CallQueryWizard.java new file mode 100644 index 000000000..6f92ea445 --- /dev/null +++ b/wizards/com/sun/star/wizards/query/CallQueryWizard.java @@ -0,0 +1,176 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.query; + +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.Type; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +/** This class capsulates the class, that implements the minimal component, a + * factory for creating the service (<CODE>__getServiceFactory</CODE>). + */ +public class CallQueryWizard +{ + + /** Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return Returns a <code>XSingleServiceFactory</code> for creating the component. + * @see com.sun.star.comp.loader.JavaLoader + * @param stringImplementationName The implementation name of the component. + * @param xMSF The service manager, who gives access to every known service. + * @param xregistrykey Makes structural information (except regarding tree structures) of a single + * registry key accessible. + */ + public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory(String stringImplementationName, com.sun.star.lang.XMultiServiceFactory xMSF, com.sun.star.registry.XRegistryKey xregistrykey) + { + com.sun.star.lang.XSingleServiceFactory xsingleservicefactory = null; + if (stringImplementationName.equals(QueryWizardImplementation.class.getName())) + { + xsingleservicefactory = com.sun.star.comp.loader.FactoryHelper.getServiceFactory(QueryWizardImplementation.class, QueryWizardImplementation.__serviceName, xMSF, xregistrykey); + } + return xsingleservicefactory; + } + + /** This class implements the component. At least the interfaces XServiceInfo, + * XTypeProvider, and XInitialization should be provided by the service. + */ + public static class QueryWizardImplementation extends com.sun.star.lib.uno.helper.PropertySet implements com.sun.star.lang.XInitialization, com.sun.star.lang.XServiceInfo, com.sun.star.task.XJobExecutor + { + private PropertyValue[] m_wizardContext; + // the next two fields are accessed by reflection, do not delete! + public String Command; + public final Integer CommandType = com.sun.star.sdb.CommandType.QUERY; + + /** The constructor of the inner class has a XMultiServiceFactory parameter. + * @param i_serviceFactory A special service factory could be introduced while initializing. + */ + public QueryWizardImplementation( XMultiServiceFactory i_serviceFactory ) + { + super(); + m_serviceFactory = i_serviceFactory; + registerProperty( PropertyNames.COMMAND, (short)( PropertyAttribute.READONLY | PropertyAttribute.MAYBEVOID ) ); + registerProperty( PropertyNames.COMMAND_TYPE, PropertyAttribute.READONLY ); + } + + public void trigger(String sEvent) + { + try + { + if (sEvent.equals(PropertyNames.START)) + { + QueryWizard CurQueryWizard = new QueryWizard( m_serviceFactory, m_wizardContext ); + CurQueryWizard.start(); + } + } + catch (Exception exception) + { + System.err.println(exception); + } + System.gc(); + } + /** The service name, that must be used to get an instance of this service. + */ + private static final String __serviceName = "com.sun.star.wizards.query.CallQueryWizard"; + /** The service manager, that gives access to all registered services. + */ + private final com.sun.star.lang.XMultiServiceFactory m_serviceFactory; + + /** This method is a member of the interface for initializing an object + * directly after its creation. + * @param object This array of arbitrary objects will be passed to the + * component after its creation. + * @throws com.sun.star.uno.Exception Every exception will not be handled, but will be + * passed to the caller. + */ + public void initialize(Object[] object) throws com.sun.star.uno.Exception + { + m_wizardContext = Properties.convertToPropertyValueArray(object); + } + + /** This method returns an array of all supported service names. + * @return Array of supported service names. + */ + public java.lang.String[] getSupportedServiceNames() + { + String[] stringSupportedServiceNames = new String[] { __serviceName }; + + return stringSupportedServiceNames; + } + + /** This method returns true, if the given service will be + * supported by the component. + * @param stringService Service name. + * @return True, if the given service name will be supported. + */ + public boolean supportsService(String stringService) + { + boolean booleanSupportsService = false; + + if (stringService.equals(__serviceName)) + { + booleanSupportsService = true; + } + return booleanSupportsService; + } + + @Override + public byte[] getImplementationId() + { + return new byte[0]; + } + + /** Return the class name of the component. + * @return Class name of the component. + */ + public java.lang.String getImplementationName() + { + return QueryWizardImplementation.class.getName(); + } + + /** Provides a sequence of all types (usually interface types) + * provided by the object. + * @return Sequence of all types (usually interface types) provided by the + * service. + */ + @Override + public Type[] getTypes() + { + Type[] typeReturn = + { + }; + + try + { + typeReturn = new Type[] + { + new Type(com.sun.star.task.XJobExecutor.class), new Type(com.sun.star.lang.XTypeProvider.class), new Type(com.sun.star.lang.XServiceInfo.class), new Type(com.sun.star.lang.XInitialization.class) + }; + } + catch (Exception exception) + { + System.err.println(exception); + } + + return typeReturn; + } + } +} diff --git a/wizards/com/sun/star/wizards/query/Finalizer.java b/wizards/com/sun/star/wizards/query/Finalizer.java new file mode 100644 index 000000000..6a556beff --- /dev/null +++ b/wizards/com/sun/star/wizards/query/Finalizer.java @@ -0,0 +1,197 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.query; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.XRadioButton; +import com.sun.star.awt.XTextComponent; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.sdb.CommandType; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.AnyConverter; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.event.XTextListenerAdapter; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Finalizer +{ + private final QueryWizard m_queryWizard; + private final String resQuery; + private final XTextComponent m_aTxtTitle; + private final XRadioButton xRadioDisplayQuery; + private final QuerySummary CurDBMetaData; + + public Finalizer( QueryWizard i_queryWizard, QuerySummary _CurDBMetaData ) + { + short curtabindex = (short) (100 * QueryWizard.SOSUMMARY_PAGE); + String reslblQueryTitle; + String resoptDisplayQuery; + String resoptModifyQuery; + String resflnSummary; + String reslblHowGoOn; + this.m_queryWizard = i_queryWizard; + this.CurDBMetaData = _CurDBMetaData; + reslblQueryTitle = m_queryWizard.m_oResource.getResText("RID_QUERY_5"); + resoptDisplayQuery = m_queryWizard.m_oResource.getResText("RID_QUERY_6"); + resoptModifyQuery = m_queryWizard.m_oResource.getResText("RID_QUERY_7"); + resflnSummary = m_queryWizard.m_oResource.getResText("RID_QUERY_87"); + reslblHowGoOn = m_queryWizard.m_oResource.getResText("RID_QUERY_8"); + resQuery = m_queryWizard.m_oResource.getResText("RID_QUERY_1"); + int curHelpIndex = 40955; + + m_queryWizard.insertLabel("lblQueryTitle", new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, reslblQueryTitle, 95, 27, Integer.valueOf(QueryWizard.SOSUMMARY_PAGE), Short.valueOf(curtabindex++), 52 + }); + m_aTxtTitle = m_queryWizard.insertTextField("txtQueryTitle", new XTextListenerAdapter() { + @Override + public void textChanged(TextEvent event) { + changeTitle(); + } + }, new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 12, HelpIds.getHelpIdString(curHelpIndex++), 95, 37, Integer.valueOf(QueryWizard.SOSUMMARY_PAGE), Short.valueOf(curtabindex++), 90 + }); + m_queryWizard.insertLabel("lblHowGoOn", new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 16, reslblHowGoOn, Boolean.TRUE, 192, 27, Integer.valueOf(QueryWizard.SOSUMMARY_PAGE), Short.valueOf(curtabindex++), 112 + }); + this.xRadioDisplayQuery = m_queryWizard.insertRadioButton("optDisplayQuery", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 9, HelpIds.getHelpIdString(curHelpIndex++), resoptDisplayQuery, 192, 46, Short.valueOf((short) 1), Integer.valueOf(QueryWizard.SOSUMMARY_PAGE), Short.valueOf(curtabindex++), 118 + }); + + m_queryWizard.insertRadioButton("optModifyQuery", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, HelpIds.getHelpIdString(curHelpIndex++), resoptModifyQuery, 192, 56, Integer.valueOf(QueryWizard.SOSUMMARY_PAGE), Short.valueOf(curtabindex++), 118 + }); + m_queryWizard.insertFixedLine("flnSummary", new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, resflnSummary, 95, 68, 8, Short.valueOf(curtabindex++), 209 + }); + m_queryWizard.insertTextField("txtSummary", 0, null, new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.READ_ONLY, PropertyNames.PROPERTY_STEP, "VScroll", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 96, HelpIds.getHelpIdString(curHelpIndex++), Boolean.TRUE, 95, 80, Boolean.TRUE, 8, Boolean.TRUE, 209 + }); + } + + private void changeTitle() + { + final String TitleName = m_aTxtTitle.getText(); + m_queryWizard.enableFinishButton( TitleName.length() > 0 ); + } + + /* TODO: The title textbox always has to be updated when + a new Table has been selected if it is clear that the user has not made any input meanwhile + */ + protected String initialize() + { + try + { + String sCurQueryName = AnyConverter.toString(Helper.getUnoPropertyValue(UnoDialog.getModel(m_aTxtTitle), "Text")); + if (sCurQueryName != null && sCurQueryName.equals(PropertyNames.EMPTY_STRING)) + { + String[] sCommandNames = CurDBMetaData.getIncludedCommandNames(); + sCurQueryName = resQuery + "_" + sCommandNames[0]; + sCurQueryName = CurDBMetaData.suggestName( CommandType.QUERY, sCurQueryName ); + Helper.setUnoPropertyValue(UnoDialog.getModel(m_aTxtTitle), "Text", sCurQueryName); + } + CurDBMetaData.setSummaryString(); + m_queryWizard.setControlProperty("txtSummary", "Text", CurDBMetaData.getSummaryString()); + return sCurQueryName; + } + catch (IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return PropertyNames.EMPTY_STRING; + } + catch (SQLException exception) + { + exception.printStackTrace(System.err); + return PropertyNames.EMPTY_STRING; + } + + } + + private String getTitle() + { + return (String) Helper.getUnoPropertyValue(UnoDialog.getModel(m_aTxtTitle), "Text"); + } + + public String finish() + { + String queryName = getTitle(); + if ( CurDBMetaData.getSQLQueryComposer().setQueryCommand( m_queryWizard.xWindow, true, true ) + && CurDBMetaData.createQuery( CurDBMetaData.getSQLQueryComposer(), queryName ) + ) + return queryName; + + return PropertyNames.EMPTY_STRING; + } + + public final boolean displayQueryDesign() + { + try + { + final short state = AnyConverter.toShort( Helper.getUnoPropertyValue( UnoDialog.getModel( xRadioDisplayQuery ), PropertyNames.PROPERTY_STATE ) ); + final boolean viewMode = state == (short)1; + return !viewMode; + } + catch ( IllegalArgumentException ex ) + { + Logger.getLogger( Finalizer.class.getName() ).log( Level.SEVERE, null, ex ); + } + return false; + } +} diff --git a/wizards/com/sun/star/wizards/query/MANIFEST.MF b/wizards/com/sun/star/wizards/query/MANIFEST.MF new file mode 100644 index 000000000..abb009f22 --- /dev/null +++ b/wizards/com/sun/star/wizards/query/MANIFEST.MF @@ -0,0 +1,2 @@ +RegistrationClassName: com.sun.star.wizards.query.CallQueryWizard +UNO-Type-Path: diff --git a/wizards/com/sun/star/wizards/query/QuerySummary.java b/wizards/com/sun/star/wizards/query/QuerySummary.java new file mode 100644 index 000000000..443c96453 --- /dev/null +++ b/wizards/com/sun/star/wizards/query/QuerySummary.java @@ -0,0 +1,223 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.query; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.db.FieldColumn; +import com.sun.star.wizards.db.QueryMetaData; +import com.sun.star.wizards.ui.FilterComponent; + +public class QuerySummary extends QueryMetaData +{ + + private String sSummary; + private Resource oResource; + private final String sSeparator; + private final String sReturnChar; + private final String sAnd; + private final String sOr; + + public QuerySummary(XMultiServiceFactory _xMSF, Resource _oResource) + { + super(_xMSF); + this.oResource = _oResource; + sAnd = oResource.getResText("RID_QUERY_38"); + sOr = oResource.getResText("RID_QUERY_39"); + sSeparator = oResource.getResText("RID_QUERY_91"); + sReturnChar = String.valueOf((char) 13) + String.valueOf((char) 13); + } + + public void setSummaryString() + { + try + { + String sFieldNamesFraction = PropertyNames.EMPTY_STRING; + String sSortingFraction = PropertyNames.EMPTY_STRING; + String sFilterFraction = PropertyNames.EMPTY_STRING; + String sAggregateFraction = PropertyNames.EMPTY_STRING; + String sGroupByFraction = PropertyNames.EMPTY_STRING; + String sHavingFraction = PropertyNames.EMPTY_STRING; + sFieldNamesFraction = combineFieldNameFraction() + sReturnChar; + sSortingFraction = combinePartString("RID_QUERY_51", getSortFieldNames(), "RID_QUERY_52", "RID_QUERY_93", new String[] + { + "<FIELDNAME>", "<SORTMODE>" + }) + sReturnChar; + sFilterFraction = combineFilterNameFraction(this.getFilterConditions(), "RID_QUERY_53", "RID_QUERY_54") + sReturnChar; + if (xDBMetaData.supportsGroupBy()) + { + sGroupByFraction = combinePartString("RID_QUERY_57", GroupFieldNames, "RID_QUERY_58") + sReturnChar; + sHavingFraction = combineFilterNameFraction(getGroupByFilterConditions(), "RID_QUERY_59", "RID_QUERY_60"); + } + // TODO: remove the last return from the string + sSummary = sFieldNamesFraction + sSortingFraction + sFilterFraction + sAggregateFraction + sGroupByFraction + sHavingFraction; + sSummary = JavaTools.replaceSubString(sSummary, PropertyNames.EMPTY_STRING, "~"); + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public String getSummaryString() + { + return sSummary; + } + + private String combineFilterNameFraction(PropertyValue[][] _filterconditions, String _InitResID, String _AlternativeResID) + { + if (_filterconditions != null && _filterconditions.length > 0) + { + String sconditions = PropertyNames.EMPTY_STRING; + String sStart = oResource.getResText(_InitResID); + String BaseString = oResource.getResText("RID_QUERY_96"); + if (_filterconditions.length == 1) + { + PropertyValue[] curfilterconditions = _filterconditions[0]; + for (int i = 0; i < curfilterconditions.length; i++) + { + sconditions += FilterComponent.getDisplayCondition(BaseString, _filterconditions[0][i], this); + sconditions = appendClauseSeparator(sconditions, PropertyNames.SPACE + sAnd + PropertyNames.SPACE, i, curfilterconditions.length); + } + } + else + { + + for (int i = 0; i < _filterconditions.length; i++) + { + sconditions += FilterComponent.getDisplayCondition(BaseString, _filterconditions[i][0], this); + sconditions = appendClauseSeparator(sconditions, PropertyNames.SPACE + sOr + PropertyNames.SPACE, i, _filterconditions.length); + } + } + return sStart + sconditions; + } + return oResource.getResText(_AlternativeResID); + } + + private String combineFieldNameFraction() + { + String CurString = PropertyNames.EMPTY_STRING; + String sReturn = oResource.getResText("RID_QUERY_50"); + String BaseString = oResource.getResText("RID_QUERY_92"); + for (int i = 0; i < FieldColumns.length; i++) + { + CurString = BaseString; + FieldColumn CurDBFieldColumn = super.getFieldColumnByDisplayName(FieldColumns[i].getDisplayFieldName()); + int iAggregate = getAggregateIndex(FieldColumns[i].getFieldName()); + if (iAggregate > -1) + { + String sAggregateDisplay = AggregateFieldNames[iAggregate][1] + "(" + AggregateFieldNames[iAggregate][0] + ")"; + CurString = JavaTools.replaceSubString(CurString, sAggregateDisplay, "<FIELDNAME>"); + } + else + { + CurString = JavaTools.replaceSubString(CurString, CurDBFieldColumn.getDisplayFieldName(), "<FIELDNAME>"); + } + sReturn += JavaTools.replaceSubString(CurString, CurDBFieldColumn.getFieldTitle(), "<FIELDTITLE>"); + sReturn = appendClauseSeparator(sReturn, sSeparator, i, FieldColumns.length); + } + return sReturn; + } + + private String appendClauseSeparator(String _basestring, String _suffix, int _i, int _fieldcount) + { + if (_i < _fieldcount - 1) + { + _basestring += _suffix; + } + return _basestring; + } + // TODO: How can you merge the following two methods to a single one in a smarter way?? + + private String combinePartString(String _InitResID, String[] _FieldNames, String _AlternativeResID) + { + if (_FieldNames != null && _FieldNames.length > 0) + { + return ArrayFieldsToString(_InitResID, _FieldNames); + } + return oResource.getResText(_AlternativeResID); + } + + private String ArrayFieldsToString(String _InitResID, String[] _FieldNames) + { + StringBuilder sReturn = new StringBuilder(oResource.getResText(_InitResID)); + int FieldCount = _FieldNames.length; + for (int i = 0; i < FieldCount; i++) + { + sReturn.append(this.getFieldColumnByDisplayName(_FieldNames[i]).getFieldTitle()); + if (i < FieldCount - 1) + { + sReturn.append(sSeparator); + } + } + return sReturn.toString(); + } + + private String combinePartString(String _InitResID, String[][] _FieldNames, String _AlternativeResID, String _BaseStringID, String[] _ReplaceTags) + { + if (_FieldNames != null && _FieldNames.length > 0) + { + return ArrayFieldsToString(_InitResID, _FieldNames, _BaseStringID, _ReplaceTags); + } + return oResource.getResText(_AlternativeResID); + } + + private String ArrayFieldsToString(String _InitResID, String[][] _FieldNames, String _BaseStringID, String[] _ReplaceTags) + { + String CurString = PropertyNames.EMPTY_STRING; + StringBuilder sReturn = new StringBuilder(oResource.getResText(_InitResID)); + int FieldCount = _FieldNames.length; + if (FieldCount > 0) + { + int DimCount = _FieldNames[0].length; + String BaseString = oResource.getResText(_BaseStringID); + for (int i = 0; i < FieldCount; i++) + { + for (int a = 0; a < DimCount; a++) + { + if (a == 0) + { + int iAggregate = getAggregateIndex(this.getFieldColumnByDisplayName(_FieldNames[i][a]).getDisplayFieldName()); + if (iAggregate > -1) + { + String sAggregateDisplay = AggregateFieldNames[iAggregate][1] + "(" + AggregateFieldNames[iAggregate][0] + ")"; + CurString = JavaTools.replaceSubString(BaseString, sAggregateDisplay, _ReplaceTags[a]); + } + else + { + CurString = JavaTools.replaceSubString(BaseString, this.getFieldColumnByDisplayName(_FieldNames[i][a]).getFieldTitle(), _ReplaceTags[a]); + } + } + else + { + CurString = JavaTools.replaceSubString(CurString, _FieldNames[i][a], _ReplaceTags[a]); + } + } + sReturn.append(CurString); + if (i < FieldCount - 1) + { + sReturn.append(sSeparator); + } + } + } + return sReturn.toString(); + } +} diff --git a/wizards/com/sun/star/wizards/query/QueryWizard.java b/wizards/com/sun/star/wizards/query/QueryWizard.java new file mode 100644 index 000000000..e67310d96 --- /dev/null +++ b/wizards/com/sun/star/wizards/query/QueryWizard.java @@ -0,0 +1,470 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.query; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.sdb.CommandType; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.AnyConverter; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.db.DatabaseObjectWizard; +import com.sun.star.wizards.db.QueryMetaData; +import com.sun.star.wizards.ui.AggregateComponent; +import com.sun.star.wizards.ui.CommandFieldSelection; +import com.sun.star.wizards.ui.FieldSelection; +import com.sun.star.wizards.ui.FilterComponent; +import com.sun.star.wizards.ui.SortingComponent; +import com.sun.star.wizards.ui.TitlesComponent; + +public class QueryWizard extends DatabaseObjectWizard +{ + + private static final int SOFIELDSELECTION_PAGE = 1; + private static final int SOSORTING_PAGE = 2; + private static final int SOFILTER_PAGE = 3; + private static final int SOAGGREGATE_PAGE = 4; + private static final int SOGROUPSELECTION_PAGE = 5; + private static final int SOGROUPFILTER_PAGE = 6; + private static final int SOTITLES_PAGE = 7; + protected static final int SOSUMMARY_PAGE = 8; + private CommandFieldSelection m_DBCommandFieldSelectio; + private SortingComponent m_sortingComponent; + private FieldSelection m_groupFieldSelection; + private TitlesComponent m_titlesComponent; + private FilterComponent m_filterComponent; + private FilterComponent m_groupFilterComponent; + private AggregateComponent m_aggregateComponent; + private Finalizer m_finalizer; + private QuerySummary m_DBMetaData; + private String reslblFieldHeader; + private String reslblAliasHeader; + private String reslblFields; + private String reslblSelFields; + private String reslblTables; + private String reslblGroupBy; + private String resmsgNonNumericAsGroupBy; + private String m_createdQuery; + + public QueryWizard(XMultiServiceFactory xMSF, PropertyValue[] i_wizardContext) + { + super(xMSF, 40970, i_wizardContext); + addResourceHandler(); + m_DBMetaData = new QuerySummary(xMSF, m_oResource); + } + + public static void main(String i_args[]) + { + executeWizardFromCommandLine( i_args, new WizardFromCommandLineStarter() { + public void start(XMultiServiceFactory factory, PropertyValue[] curproperties) { + QueryWizard wizard = new QueryWizard(factory, curproperties); + wizard.start(); + } + }); + } + + public String start() + { + try + { + if (m_DBMetaData.getConnection(m_wizardContext)) + { + reslblFields = m_oResource.getResText("RID_QUERY_4"); + reslblFieldHeader = m_oResource.getResText("RID_QUERY_19"); //Fielnames in AliasComponent + reslblAliasHeader = m_oResource.getResText("RID_QUERY_20"); //Fieldtitles header in AliasComponent + reslblSelFields = m_oResource.getResText("RID_QUERY_50"); + reslblTables = m_oResource.getResText("RID_QUERY_3"); + reslblGroupBy = m_oResource.getResText("RID_QUERY_18"); + String resQueryWizard = m_oResource.getResText("RID_QUERY_2"); + resmsgNonNumericAsGroupBy = m_oResource.getResText("RID_QUERY_88"); + Helper.setUnoPropertyValues(xDialogModel, new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_MOVEABLE, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_TITLE, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 210, Boolean.TRUE, "DialogQuery", 102, 41, 1, Short.valueOf((short) 0), resQueryWizard, 310 + }); + drawNaviBar(); + setRightPaneHeaders(m_oResource, "RID_QUERY_", 70, 8); + this.setMaxStep(8); + buildSteps(); + this.m_DBCommandFieldSelectio.preselectCommand(m_wizardContext, false); + + XWindowPeer windowPeer = UnoRuntime.queryInterface(XWindowPeer.class, m_frame.getContainerWindow()); + createWindowPeer(windowPeer); + m_DBMetaData.setWindowPeer(this.xControl.getPeer()); + insertQueryRelatedSteps(); + executeDialog(m_frame.getContainerWindow().getPosSize()); + } + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + m_groupFilterComponent = null; + m_titlesComponent = null; + m_aggregateComponent = null; + m_DBCommandFieldSelectio = null; + xWindowPeer = null; + m_finalizer = null; + m_DBMetaData.finish(); + m_DBMetaData = null; + System.gc(); + + return m_createdQuery; + } + + private void enableRoadmapItems(boolean _bEnabled) + { + try + { + Object oRoadmapItem; + int CurStep = AnyConverter.toInt(Helper.getUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP)); + boolean bEnabled = false; + int CurItemID; + for (int i = 0; i < getRMItemCount(); i++) + { + oRoadmapItem = this.xIndexContRoadmap.getByIndex(i); + CurItemID = AnyConverter.toInt(Helper.getUnoPropertyValue(oRoadmapItem, "ID")); + switch (CurItemID) + { + case SOAGGREGATE_PAGE: + if (_bEnabled) + { + bEnabled = ((m_DBMetaData.hasNumericalFields()) && (m_DBMetaData.xDBMetaData.supportsCoreSQLGrammar())); + } + break; + case SOGROUPSELECTION_PAGE: + bEnabled = m_DBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY; + break; + case SOGROUPFILTER_PAGE: + bEnabled = false; + if (_bEnabled) + { + bEnabled = (m_DBMetaData.GroupByFilterConditions.length > 0); + } + + break; + default: + if (CurItemID > CurStep) + { + bEnabled = _bEnabled; + } + else + { + bEnabled = true; + } + break; + } + super.setStepEnabled(CurItemID, bEnabled); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void insertQueryRelatedSteps() + { + try + { + setRMItemLabels(m_oResource); + addRoadmap(); + int i = 0; + i = insertRoadmapItem(0, true, SOFIELDSELECTION_PAGE - 1, SOFIELDSELECTION_PAGE); + i = insertRoadmapItem(i, false, SOSORTING_PAGE - 1, SOSORTING_PAGE); // Orderby is always supported + i = insertRoadmapItem(i, false, SOFILTER_PAGE - 1, SOFILTER_PAGE); + if (m_DBMetaData.xDBMetaData.supportsCoreSQLGrammar()) + { + i = insertRoadmapItem(i, m_DBMetaData.hasNumericalFields(), SOAGGREGATE_PAGE - 1, SOAGGREGATE_PAGE); + } + if (m_DBMetaData.xDBMetaData.supportsGroupBy()) + { + i = insertRoadmapItem(i, false, SOGROUPSELECTION_PAGE - 1, SOGROUPSELECTION_PAGE); + i = insertRoadmapItem(i, false, SOGROUPFILTER_PAGE - 1, SOGROUPFILTER_PAGE); + } + i = insertRoadmapItem(i, false, SOTITLES_PAGE - 1, SOTITLES_PAGE); + i = insertRoadmapItem(i, false, SOSUMMARY_PAGE - 1, SOSUMMARY_PAGE); + setRoadmapInteractive(true); + setRoadmapComplete(true); + setCurrentRoadmapItemID((short) 1); + } + catch (com.sun.star.uno.Exception exception) + { + Resource.showCommonResourceError(xMSF); + } + } + + private void buildSteps() + { + try + { + m_DBCommandFieldSelectio = new CommandFieldSelection( + this, m_DBMetaData, 120, reslblFields, reslblSelFields, reslblTables, + m_DBMetaData.supportsQueriesInFrom(), 40850); + m_DBCommandFieldSelectio.setAppendMode(true); + m_DBCommandFieldSelectio.addFieldSelectionListener(new FieldSelectionListener()); + m_sortingComponent = new SortingComponent(this, SOSORTING_PAGE, 95, 27, 210, 40865); + m_filterComponent = new FilterComponent(this, SOFILTER_PAGE, 97, 27, 3, m_DBMetaData, 40878); + m_filterComponent.addNumberFormats(); + + if (m_DBMetaData.xDBMetaData.supportsCoreSQLGrammar()) + { + m_aggregateComponent = new AggregateComponent(this, m_DBMetaData, SOAGGREGATE_PAGE, 97, 69, 209, 5, 40895); + } + if (m_DBMetaData.xDBMetaData.supportsGroupBy()) + { + m_groupFieldSelection = new FieldSelection(this, SOGROUPSELECTION_PAGE, 95, 27, 210, 150, reslblFields, this.reslblGroupBy, 40915, false); + m_groupFieldSelection.addFieldSelectionListener(new FieldSelectionListener()); + m_groupFilterComponent = new FilterComponent(this, SOGROUPFILTER_PAGE, 97, 27, 3, m_DBMetaData, 40923); + } + m_titlesComponent = new TitlesComponent(this, SOTITLES_PAGE, 97, 37, 207, 7, reslblFieldHeader, reslblAliasHeader, 40940); + m_finalizer = new Finalizer(this, m_DBMetaData); + enableNavigationButtons(false, false, false); + } + catch (com.sun.star.uno.Exception exception) + { + Resource.showCommonResourceError(xMSF); + } + } + + @Override + public boolean finishWizard() + { + int ncurStep = getCurrentStep(); + if ((ncurStep == SOSUMMARY_PAGE) + || (switchToStep(ncurStep, SOSUMMARY_PAGE))) + { + m_createdQuery = m_finalizer.finish(); + if (m_createdQuery.length() > 0) + { + loadSubComponent(CommandType.QUERY, m_createdQuery, m_finalizer.displayQueryDesign()); + xDialog.endExecute(); + return true; + } + } + return false; + } + + @Override + protected void enterStep(int nOldStep, int nNewStep) + { + try + { + if (nOldStep <= SOGROUPSELECTION_PAGE && nNewStep > SOGROUPSELECTION_PAGE) + { + if (m_DBMetaData.xDBMetaData.supportsGroupBy()) + { + m_DBMetaData.setGroupFieldNames(m_groupFieldSelection.getSelectedFieldNames()); + m_DBMetaData.GroupFieldNames = JavaTools.removeOutdatedFields(m_DBMetaData.GroupFieldNames, m_DBMetaData.NonAggregateFieldNames); + m_DBMetaData.GroupByFilterConditions = JavaTools.removeOutdatedFields(m_DBMetaData.GroupByFilterConditions, m_DBMetaData.GroupFieldNames); + } + } + switch (nNewStep) + { + case SOFIELDSELECTION_PAGE: + break; + case SOSORTING_PAGE: + m_sortingComponent.initialize(m_DBMetaData.getDisplayFieldNames(), m_DBMetaData.getSortFieldNames()); + break; + case SOFILTER_PAGE: + m_filterComponent.initialize(m_DBMetaData.getFilterConditions(), m_DBMetaData.getDisplayFieldNames()); + break; + case SOAGGREGATE_PAGE: + m_aggregateComponent.initialize(); + break; + case SOGROUPSELECTION_PAGE: + break; + case SOGROUPFILTER_PAGE: + m_groupFilterComponent.initialize(m_DBMetaData.GroupByFilterConditions, m_DBMetaData.getGroupFieldNames()); + break; + case SOTITLES_PAGE: + m_titlesComponent.initialize(m_DBMetaData.getDisplayFieldNames(), m_DBMetaData.FieldTitleSet); + break; + case SOSUMMARY_PAGE: + m_finalizer.initialize(); + break; + default: + break; + } + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + } + + @Override + protected void leaveStep(int nOldStep, int nNewStep) + { + switch (nOldStep) + { + case SOFIELDSELECTION_PAGE: + m_DBMetaData.reorderFieldColumns(m_DBCommandFieldSelectio.getSelectedFieldNames()); + m_DBMetaData.initializeFieldTitleSet(); + m_DBMetaData.setNumericFields(); + searchForOutdatedFields(); + break; + case SOSORTING_PAGE: + m_DBMetaData.setSortFieldNames(m_sortingComponent.getSortFieldNames()); + break; + case SOFILTER_PAGE: + m_DBMetaData.setFilterConditions(m_filterComponent.getFilterConditions()); + break; + case SOAGGREGATE_PAGE: + m_DBMetaData.AggregateFieldNames = m_aggregateComponent.getAggregateFieldNames(); + break; + case SOGROUPSELECTION_PAGE: + break; + case SOGROUPFILTER_PAGE: + m_DBMetaData.setGroupByFilterConditions(this.m_groupFilterComponent.getFilterConditions()); + break; + case SOTITLES_PAGE: + m_DBMetaData.setFieldTitles(m_titlesComponent.getFieldTitles()); + break; + case SOSUMMARY_PAGE: + break; + default: + break; + } + if (nOldStep < SOGROUPSELECTION_PAGE && nNewStep >= SOGROUPSELECTION_PAGE) + { + try + { + if (m_DBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY) + { + if (m_DBMetaData.xDBMetaData.supportsGroupBy()) + { + m_DBMetaData.setNonAggregateFieldNames(); + m_groupFieldSelection.initialize(m_DBMetaData.getUniqueAggregateFieldNames(), false, m_DBMetaData.xDBMetaData.getMaxColumnsInGroupBy()); + m_groupFieldSelection.intializeSelectedFields(m_DBMetaData.NonAggregateFieldNames); + m_groupFieldSelection.setMultipleMode(false); + setStepEnabled(SOGROUPFILTER_PAGE, m_aggregateComponent.isGroupingpossible() && m_DBMetaData.NonAggregateFieldNames.length > 0); + } + } + } + catch (SQLException e) + { + e.printStackTrace( System.err ); + } + } + } + + private void searchForOutdatedFields() + { + String[] sFieldNames = m_DBMetaData.getFieldNames(); + String[][] sRemovedFields = JavaTools.removeOutdatedFields(m_DBMetaData.getSortFieldNames(), sFieldNames); + m_DBMetaData.setSortFieldNames(sRemovedFields); + m_DBMetaData.setFilterConditions(JavaTools.removeOutdatedFields(m_DBMetaData.getFilterConditions(), sFieldNames)); + m_DBMetaData.AggregateFieldNames = JavaTools.removeOutdatedFields(m_DBMetaData.AggregateFieldNames, sFieldNames); + } + + private void enableWizardSteps(String[] NewItems) + { + boolean bEnabled = NewItems.length > 0; + setControlProperty("btnWizardNext", PropertyNames.PROPERTY_ENABLED, bEnabled); + setControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED, bEnabled); + enableRoadmapItems(bEnabled); // Note: Performance wise this could be improved + } + + private class FieldSelectionListener implements com.sun.star.wizards.ui.XFieldSelectionListener + { + + private int ID; + + public void setID(String sIncSuffix) + { + ID = 1; + if (sIncSuffix != null) + { + if ((!sIncSuffix.equals(PropertyNames.EMPTY_STRING)) && (!sIncSuffix.equals("_"))) + { + String sID = JavaTools.ArrayoutofString(sIncSuffix, "_")[1]; + ID = Integer.parseInt(sID); + } + } + } + + public void shiftFromLeftToRight(String[] SelItems, String[] NewItems) + { + if (ID == 1) + { + m_DBMetaData.addSeveralFieldColumns(SelItems, m_DBCommandFieldSelectio.getSelectedCommandName()); + enableWizardSteps(NewItems); + m_DBCommandFieldSelectio.changeSelectedFieldNames(m_DBMetaData.getDisplayFieldNames()); + m_DBCommandFieldSelectio.toggleCommandListBox(NewItems); + } + else + { + boolean bEnabled = (m_groupFieldSelection.getSelectedFieldNames().length > 0); + Helper.setUnoPropertyValue(getRoadmapItemByID(SOGROUPFILTER_PAGE), PropertyNames.PROPERTY_ENABLED, bEnabled); + } + } + + public void shiftFromRightToLeft(String[] SelItems, String[] NewItems) + { + // TODO When the ListFieldbox is refilled only fields of the current Command may be merged into the Listbox + if (ID == 1) + { + enableWizardSteps(NewItems); + String[] sSelfieldNames = m_DBMetaData.getFieldNames(SelItems, m_DBCommandFieldSelectio.getSelectedCommandName()); + m_DBCommandFieldSelectio.addItemsToFieldsListbox(sSelfieldNames); + m_DBMetaData.removeSeveralFieldColumnsByDisplayFieldName(SelItems); + m_DBCommandFieldSelectio.toggleCommandListBox(NewItems); + + } + else + { + boolean bEnabled = (m_groupFieldSelection.getSelectedFieldNames().length > 0); + String CurDisplayFieldName = SelItems[0]; + if (JavaTools.FieldInList(m_DBMetaData.NonAggregateFieldNames, CurDisplayFieldName) > -1) + { + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, resmsgNonNumericAsGroupBy); + m_groupFieldSelection.xSelectedFieldsListBox.addItems(SelItems, m_groupFieldSelection.xSelectedFieldsListBox.getItemCount()); + String FieldList[] = m_groupFieldSelection.xFieldsListBox.getItems(); + int index = JavaTools.FieldInList(FieldList, CurDisplayFieldName); + if (index > -1) + { + m_groupFieldSelection.xFieldsListBox.removeItems((short) index, (short) 1); + } + } + else + { + Helper.setUnoPropertyValue(getRoadmapItemByID(SOGROUPFILTER_PAGE), PropertyNames.PROPERTY_ENABLED, bEnabled); + } + } + } + + public void moveItemDown(String item) + { + } + + public void moveItemUp(String item) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/query/query.component b/wizards/com/sun/star/wizards/query/query.component new file mode 100644 index 000000000..c349617d8 --- /dev/null +++ b/wizards/com/sun/star/wizards/query/query.component @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.Java2" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name= + "com.sun.star.wizards.query.CallQueryWizard$QueryWizardImplementation"> + <service name="com.sun.star.wizards.query.CallQueryWizard"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/report/CallReportWizard.java b/wizards/com/sun/star/wizards/report/CallReportWizard.java new file mode 100644 index 000000000..08ca4bf89 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/CallReportWizard.java @@ -0,0 +1,205 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.uno.Type; +import com.sun.star.text.XTextDocument; +import com.sun.star.wizards.common.Properties; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.wizards.common.NamedValueCollection; +import com.sun.star.wizards.common.PropertyNames; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** This class capsulates the class, that implements the minimal component, a + * factory for creating the service (<CODE>__getServiceFactory</CODE>). + */ +public class CallReportWizard +{ + + private static boolean bWizardstartedalready; + + /** Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return Returns a <code>XSingleServiceFactory</code> for creating the component. + * @see com.sun.star.comp.loader.JavaLoader + * @param stringImplementationName The implementation name of the component. + * @param xMSF The service manager, who gives access to every known service. + * @param xregistrykey Makes structural information (except regarding treestructures) of a single + * registry key accessible. + */ + public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory(String stringImplementationName, com.sun.star.lang.XMultiServiceFactory xMSF, com.sun.star.registry.XRegistryKey xregistrykey) + { + com.sun.star.lang.XSingleServiceFactory xsingleservicefactory = null; + if (stringImplementationName.equals( + ReportWizardImplementation.class.getName())) + { + xsingleservicefactory = com.sun.star.comp.loader.FactoryHelper.getServiceFactory( + ReportWizardImplementation.class, + ReportWizardImplementation.__serviceName, + xMSF, + xregistrykey); + } + return xsingleservicefactory; + } + + /** This class implements the component. At least the interfaces XServiceInfo, + * XTypeProvider, and XInitialization should be provided by the service. + */ + public static class ReportWizardImplementation extends com.sun.star.lib.uno.helper.PropertySet implements com.sun.star.lang.XInitialization, com.sun.star.lang.XServiceInfo, com.sun.star.task.XJobExecutor + { + + private PropertyValue[] m_wizardContext; + + /** The constructor of the inner class has a XMultiServiceFactory parameter. + * @param xmultiservicefactoryInitialization A special service factory + * could be introduced while initializing. + */ + public ReportWizardImplementation(com.sun.star.lang.XMultiServiceFactory xmultiservicefactoryInitialization) + { + super(); + xmultiservicefactory = xmultiservicefactoryInitialization; + } + + public void trigger(String sEvent) + { + try + { + if (sEvent.equals(PropertyNames.START)) + { + if (!bWizardstartedalready) + { + ReportWizard CurReportWizard = new ReportWizard( xmultiservicefactory, m_wizardContext ); + CurReportWizard.startReportWizard(); + } + bWizardstartedalready = false; + } + else if (sEvent.equals("fill")) + { + Dataimport CurDataimport = new Dataimport(xmultiservicefactory); + if (m_wizardContext != null) + { + NamedValueCollection context = new NamedValueCollection( m_wizardContext ); + XTextDocument textDocument = context.queryOrDefault( "TextDocument", null, XTextDocument.class ); + XDatabaseDocumentUI documentUI = context.queryOrDefault( "DocumentUI", null, XDatabaseDocumentUI.class ); + if ( textDocument != null ) + { + CurDataimport.createReport(xmultiservicefactory, documentUI, textDocument, m_wizardContext); + } + } + } + } + catch (Exception e) + { + Logger.getLogger(CallReportWizard.class.getName()).log(Level.SEVERE, null, e); + } + System.gc(); + } + /** The service name, that must be used to get an instance of this service. + */ + private static final String __serviceName = "com.sun.star.wizards.report.CallReportWizard"; + /** The service manager, that gives access to all registered services. + */ + private final com.sun.star.lang.XMultiServiceFactory xmultiservicefactory; + + /** This method is a member of the interface for initializing an object + * directly after its creation. + * @param object This array of arbitrary objects will be passed to the + * component after its creation. + * @throws com.sun.star.uno.Exception Every exception will not be handled, but will be + * passed to the caller. + */ + public void initialize(Object[] object) throws com.sun.star.uno.Exception + { + this.m_wizardContext = Properties.convertToPropertyValueArray(object); + + } + + /** This method returns an array of all supported service names. + * @return Array of supported service names. + */ + public java.lang.String[] getSupportedServiceNames() + { + String[] stringSupportedServiceNames = new String[] { __serviceName }; + + return stringSupportedServiceNames; + } + + /** This method returns true, if the given service will be + * supported by the component. + * @param stringService Service name. + * @return True, if the given service name will be supported. + */ + public boolean supportsService(String stringService) + { + boolean booleanSupportsService = false; + + if (stringService.equals(__serviceName)) + { + booleanSupportsService = true; + } + return booleanSupportsService; + } + + @Override + public byte[] getImplementationId() + { + return new byte[0]; + } + + /** Return the class name of the component. + * @return Class name of the component. + */ + public java.lang.String getImplementationName() + { + return ReportWizardImplementation.class.getName(); + } + + /** Provides a sequence of all types (usually interface types) + * provided by the object. + * @return Sequence of all types (usually interface types) provided by the + * service. + */ + @Override + public Type[] getTypes() + { + Type[] typeReturn = + { + }; + + try + { + typeReturn = new Type[] + { + new Type(com.sun.star.task.XJobExecutor.class), + new Type(com.sun.star.lang.XTypeProvider.class), + new Type(com.sun.star.lang.XServiceInfo.class), + new Type(com.sun.star.lang.XInitialization.class) + }; + } + catch (Exception e) + { + Logger.getLogger(CallReportWizard.class.getName()).log(Level.SEVERE, null, e); + } + + return typeReturn; + } + } +} diff --git a/wizards/com/sun/star/wizards/report/DBColumn.java b/wizards/com/sun/star/wizards/report/DBColumn.java new file mode 100644 index 000000000..5ca1f56a8 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/DBColumn.java @@ -0,0 +1,451 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.beans.PropertyState; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertyState; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNamed; +import com.sun.star.style.ParagraphAdjust; +import com.sun.star.table.XCell; +import com.sun.star.table.XCellRange; +import com.sun.star.table.XTableColumns; +import com.sun.star.table.XTableRows; +import com.sun.star.text.XDependentTextField; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextRange; +import com.sun.star.text.XTextTable; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.db.*; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.text.TextDocument; +import com.sun.star.wizards.text.TextTableHandler; +import com.sun.star.wizards.text.TextFieldHandler; + +public class DBColumn +{ + + private XCell xValCell; + private XTextRange xValTextCell; + private XTextCursor xValCellCursor; + public XCell xNameCell; + private XTextRange xNameTextCell; + private boolean bAlignLeft; + private String CharFontName; + private PropertyState PropertyState; + public int ValColumn = 1; + private int ValRow = 0; + public FieldColumn CurDBField; + private XTextTable xTextTable; + private XTableColumns xTableColumns; + private XCellRange xCellRange; + public XNamed xTableName; + private boolean bIsGroupColumn; + private RecordParser CurDBMetaData; + private RecordTable CurRecordTable; + private TextTableHandler oTextTableHandler; + + public DBColumn(RecordTable _CurRecordTable, TextTableHandler _oTextTableHandler, RecordParser _CurDBMetaData, int i, boolean _bforce) + { + initializeRecordTableMembers(_CurRecordTable, _oTextTableHandler, _CurDBMetaData, i, _bforce); + } + + public DBColumn(RecordTable _CurRecordTable, TextTableHandler _oTextTableHandler, RecordParser _CurDBMetaData, int i) + { + initializeRecordTableMembers(_CurRecordTable, _oTextTableHandler, _CurDBMetaData, i, false); + } + + private void initializeRecordTableMembers(RecordTable _CurRecordTable, TextTableHandler _oTextTableHandler, RecordParser _CurDBMetaData, int i, boolean _bForce) + { + this.oTextTableHandler = _oTextTableHandler; + this.CurDBMetaData = _CurDBMetaData; + this.CurRecordTable = _CurRecordTable; + bIsGroupColumn = false; + if (CurDBMetaData.RecordFieldColumns != null) + { + CurDBField = CurDBMetaData.getFieldColumnByFieldName(CurDBMetaData.RecordFieldColumns[i].getFieldName()); + } + else + { + CurDBField = CurDBMetaData.getFieldColumnByFieldName(CurDBMetaData.getRecordFieldName(i)); + } + if (_bForce) + { + assignCells(i, true); + } + else + { + for (int n = 0; n < CurRecordTable.xTableColumns.getCount(); n++) + { + assignCells(n, false); + } + } + } + + private boolean assignCells(int _nColumn, boolean _bforce) + { + try + { + XCell xCell = CurRecordTable.xCellRange.getCellByPosition(_nColumn, 0); + XTextRange xTextCell = UnoRuntime.queryInterface(XTextRange.class, xCell); + String CompString = "Column"; + XTextCursor xLocCellCursor = TextDocument.createTextCursor(xCell); + if (isNameCell(xLocCellCursor, CurDBField.getFieldName(), CompString) || (_bforce)) + { + xNameCell = xCell; + xNameTextCell = xTextCell; + xValCell = CurRecordTable.xCellRange.getCellByPosition(_nColumn, 1); + xValTextCell = UnoRuntime.queryInterface(XTextRange.class, xValCell); + xValCellCursor = TextDocument.createTextCursor(xValCell); + ValColumn = _nColumn; + return true; + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return false; + } + + public DBColumn(TextTableHandler _oTextTableHandler, RecordParser _CurDBMetaData, String _FieldName, String TableName, DBColumn OldDBColumn) { + this.oTextTableHandler = _oTextTableHandler; + this.CurDBMetaData = _CurDBMetaData; + CurDBField = CurDBMetaData.getFieldColumnByDisplayName(_FieldName); + bIsGroupColumn = true; + getTableColumns(TableName); + xNameCell = OldDBColumn.xNameCell; + xNameTextCell = OldDBColumn.xNameTextCell; + xValCell = OldDBColumn.xValCell; + xValTextCell = OldDBColumn.xValTextCell; + xValCellCursor = TextDocument.createTextCursor(xValCell); + ValColumn = OldDBColumn.ValColumn; + ValRow = OldDBColumn.ValRow; + initializeNumberFormat(); + } + + public DBColumn(TextTableHandler _oTextTableHandler, RecordParser _CurDBMetaData, String _FieldName, String TableName) throws Exception + { + this.oTextTableHandler = _oTextTableHandler; + this.CurDBMetaData = _CurDBMetaData; + CurDBField = CurDBMetaData.getFieldColumnByFieldName(_FieldName); + bIsGroupColumn = true; + XTextRange xTextCell; + XCell xCell; + getTableColumns(TableName); + + XTableRows xRows = null; + try + { + xRows = xTextTable.getRows(); + } + catch (java.lang.NullPointerException e) + { + e.printStackTrace(); +// TODO: handle the nullpointer right +// return; + } + for (int n = 0; n < xTableColumns.getCount(); n++) + { + for (int m = 0; m < xRows.getCount(); m++) + { + xCell = xCellRange.getCellByPosition(n, m); + xTextCell = UnoRuntime.queryInterface(XTextRange.class, xCell); + String CompString = TableName.substring(4); + XTextCursor xLocCellCursor = TextDocument.createTextCursor(xCell); + if (isNameCell(xLocCellCursor, CurDBField.getFieldName(), CompString)) + { + xNameCell = xCell; + xNameTextCell = xTextCell; + } + else + { //In Grouping Sections only two cells are allowed ' if (CellString.equals(CurFieldString)){ + xValCell = xCell; + xValTextCell = xTextCell; + xValCellCursor = xLocCellCursor; + ValColumn = n; + ValRow = m; + checkforLeftAlignment(); + } + } + } + } + + private void getTableColumns(String TableName) + { + try + { + XNameAccess xAllTextTables = oTextTableHandler.xTextTablesSupplier.getTextTables(); + if (xAllTextTables.hasByName(TableName)) + { + Object oTextTable = xAllTextTables.getByName(TableName); + xCellRange = UnoRuntime.queryInterface(XCellRange.class, oTextTable); + xTextTable = UnoRuntime.queryInterface(XTextTable.class, oTextTable); + xTableName = UnoRuntime.queryInterface(XNamed.class, oTextTable); + xTableColumns = xTextTable.getColumns(); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public void initializeNumberFormat() + { + if (CurDBField.isBoolean()) + { + NumberFormatter oNumberFormatter = oTextTableHandler.getNumberFormatter(); + int iLogicalFormatKey = oNumberFormatter.setBooleanReportDisplayNumberFormat(); + oNumberFormatter.setNumberFormat(xValCell, iLogicalFormatKey, oNumberFormatter); + } + else + { + oTextTableHandler.getNumberFormatter().setNumberFormat(xValCell, CurDBField.getDBFormatKey(), CurDBMetaData.getNumberFormatter()); + } + setCellFont(); + } + + public void insertColumnData(TextFieldHandler oTextFieldHandler, boolean _bIsLandscape) + { + insertUserFieldToTableCell(oTextFieldHandler); + replaceValueCellofTable(_bIsLandscape); + } + + private void insertUserFieldToTableCell(TextFieldHandler oTextFieldHandler) + { + XTextCursor xTextCursor = TextDocument.createTextCursor(xNameCell); + xTextCursor.gotoStart(false); + xTextCursor.gotoEnd(true); + xTextCursor.setString(PropertyNames.EMPTY_STRING); + oTextFieldHandler.insertUserField(xTextCursor, CurDBField.getFieldName(), CurDBField.getFieldTitle()); + } + + + + public void formatValueCell() + { + initializeNumberFormat(); + if (checkforLeftAlignment()) + { + bAlignLeft = true; + } + } + + private boolean checkforLeftAlignment() + { + bAlignLeft = ((CurDBField.isNumberFormat()) && (ValColumn == xTableColumns.getCount() - 1)); + return bAlignLeft; + } + + public void modifyCellContent(XCellRange xCellRange, Object CurGroupValue) + { + try + { + xValCell = xCellRange.getCellByPosition(ValColumn, ValRow); + xValTextCell = UnoRuntime.queryInterface(XTextRange.class, xValCell); + modifyCellContent(CurGroupValue); + if (bAlignLeft) + { + xValCellCursor = TextDocument.createTextCursor(xValCell); + Helper.setUnoPropertyValue(xValCellCursor, "ParaAdjust", Integer.valueOf(com.sun.star.style.ParagraphAdjust.LEFT_value)); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void modifyCellContent(Object CurGroupValue) + { + double dblValue = 0; + try + { + if (xValCell != null) + { + if (AnyConverter.isString(CurGroupValue)) + { + String sValue = AnyConverter.toString(CurGroupValue); + xValTextCell.setString(sValue); + } + else + { + if (AnyConverter.isBoolean(CurGroupValue)) + { + dblValue = AnyConverter.toInt(CurGroupValue); + } + if (AnyConverter.isByte(CurGroupValue)) + { + dblValue = AnyConverter.toByte(CurGroupValue); + } + else if (AnyConverter.isDouble(CurGroupValue)) + { + dblValue = AnyConverter.toDouble(CurGroupValue); + } + else if (AnyConverter.isFloat(CurGroupValue)) + { + dblValue = AnyConverter.toFloat(CurGroupValue); + } + else if (AnyConverter.isInt(CurGroupValue)) + { + dblValue = AnyConverter.toInt(CurGroupValue); + } + else if (AnyConverter.isLong(CurGroupValue)) + { + dblValue = AnyConverter.toLong(CurGroupValue); + } + else if (AnyConverter.isShort(CurGroupValue)) + { + dblValue = AnyConverter.toShort(CurGroupValue); + } + xValCell.setValue(dblValue); + } + } + } + catch (IllegalArgumentException exception) + { + System.err.println(exception); + } + } + // If the parameter CurGroupValue is null the placeholders are inserted + private void replaceValueCellofTable(boolean _bIsLandscape) + { + try + { + Object CurGroupValue; + if (!bIsGroupColumn && !CurDBField.isNumberFormat()) + { + CurGroupValue = BlindtextCreator.adjustBlindTextlength(CurDBField.getFieldTitle(), CurDBField.getFieldWidth(), _bIsLandscape, bIsGroupColumn, CurDBMetaData.getRecordFieldNames()); + } + else + { + CurGroupValue = CurDBField.getDefaultValue(); + } + modifyCellContent(CurGroupValue); + if (bAlignLeft) + { + Helper.setUnoPropertyValue(xValCellCursor, "ParaAdjust", Integer.valueOf(ParagraphAdjust.LEFT_value)); + } + + int nFieldType = CurDBField.getFieldType(); + if ((nFieldType == com.sun.star.sdbc.DataType.BIT) || + (nFieldType == com.sun.star.sdbc.DataType.BOOLEAN)) + { + CharFontName = "StarSymbol"; + Helper.setUnoPropertyValue(xValCellCursor, "CharFontName", CharFontName); + if (!bIsGroupColumn) + { + Helper.setUnoPropertyValue(xValCellCursor, "ParaAdjust", Integer.valueOf(ParagraphAdjust.CENTER_value)); + } + } + else + { + if (PropertyState == com.sun.star.beans.PropertyState.DEFAULT_VALUE) + { + XPropertyState xPropState = UnoRuntime.queryInterface(XPropertyState.class, xValCellCursor); + xPropState.setPropertyToDefault("CharFontName"); + } + else + { + if (PropertyState == com.sun.star.beans.PropertyState.DIRECT_VALUE) + { + Helper.setUnoPropertyValue(xValCellCursor, "CharFontName", CharFontName); + } + } + } + } + catch (com.sun.star.beans.UnknownPropertyException exception) + { + exception.printStackTrace(System.err); + } + } + + public void setCellFont() + { + try + { + XPropertyState xPropertyState; + int nFieldType = CurDBField.getFieldType(); + if ((nFieldType == com.sun.star.sdbc.DataType.BIT) || + (nFieldType == com.sun.star.sdbc.DataType.BOOLEAN)) + { + CharFontName = "StarSymbol"; + PropertyState = com.sun.star.beans.PropertyState.DIRECT_VALUE; + xValCellCursor.gotoStart(false); + xValCellCursor.gotoEnd(true); + Helper.setUnoPropertyValue(xValCellCursor, "CharFontName", CharFontName); + } + else + { + xPropertyState = UnoRuntime.queryInterface(XPropertyState.class, xValCellCursor); + PropertyState = xPropertyState.getPropertyState("CharFontName"); + CharFontName = AnyConverter.toString(Helper.getUnoPropertyValue(xValCellCursor, "CharFontName")); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private boolean isNameCell(XTextCursor xCellCursor, String CurFieldName, String CompString) + { + try + { + xCellCursor.gotoStart(false); + XTextRange xTextRange = xCellCursor.getEnd(); + Object oTextField = Helper.getUnoPropertyValue(xTextRange, "TextField"); + if (AnyConverter.isVoid(oTextField)) + { + return false; + } + else + { + XDependentTextField xDependent = UnoRuntime.queryInterface(XDependentTextField.class, oTextField); + XPropertySet xMaster = xDependent.getTextFieldMaster(); + String UserFieldName = (String) xMaster.getPropertyValue(PropertyNames.PROPERTY_NAME); + boolean bIsNameCell = false; + if ((UserFieldName.startsWith(CompString)) || (UserFieldName.equals(CurFieldName))) + { + bIsNameCell = true; + } + else + { + // stupid hack, 'Title' is not a real good Table-Cell-Name + // take a look at xmloff/source/text/txtvfldi.txt, there exists 2 '_renamed_' strings + String sLocalCurFieldName = CurFieldName + "_renamed_"; + if (UserFieldName.startsWith(sLocalCurFieldName)) + { + bIsNameCell = true; + } + } + return bIsNameCell; + } + } + // Todo: Insert a resource; Exception should be thrown to the calling routine + catch (Exception exception) + { + exception.printStackTrace(System.err); + return true; //most probably this is really the Namecell!!!! + } + } +} diff --git a/wizards/com/sun/star/wizards/report/Dataimport.java b/wizards/com/sun/star/wizards/report/Dataimport.java new file mode 100644 index 000000000..8e9d3e321 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/Dataimport.java @@ -0,0 +1,169 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.text.XTextDocument; +import com.sun.star.wizards.ui.*; +import com.sun.star.wizards.common.*; +import com.sun.star.uno.Exception; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Dataimport extends UnoDialog2 implements com.sun.star.awt.XActionListener +{ + + // ReportTextDocument CurReportDocument; + IReportDocument CurReportDocument; + + private String sProgressDBConnection; + private String sProgressDataImport; + private String sProgressTitle; + private String sStop; + + public Dataimport(XMultiServiceFactory _xMSF) + { + super(_xMSF); + super.addResourceHandler(); + sProgressDBConnection = m_oResource.getResText("RID_DB_COMMON_34"); + sProgressDataImport = m_oResource.getResText("RID_REPORT_67"); + sProgressTitle = m_oResource.getResText("RID_REPORT_62"); + m_oResource.getResText("RID_REPORT_63"); + sStop = m_oResource.getResText("RID_DB_COMMON_21"); + + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + // bStopProcess = true; + CurReportDocument.StopProcess(); + } + + private void showProgressDisplay(boolean bgetConnection) + { + try + { + Helper.setUnoPropertyValues(xDialogModel, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TITLE, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 84, 0, sProgressTitle, 180 + }); + com.sun.star.awt.FontDescriptor oFontDesc = new com.sun.star.awt.FontDescriptor(); + oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD; + if (bgetConnection) + { + insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDBConnection", + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDesc, 10, sProgressDBConnection, 6, 6, 0, 150 + }); + + insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDataImport", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, sProgressDataImport, 6, 24, 0, 120 + }); + } + else + { + insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblProgressDataImport", + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDesc, 10, sProgressDataImport, 6, 24, 0, 120 + }); + } + insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblCurProgress", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, PropertyNames.EMPTY_STRING, 12, 42, 0, 120 + }); + + insertButton("cmdCancel", 10000, this, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH, PropertyNames.PROPERTY_LABEL + }, + new Object[] + { + 14, HelpIds.getHelpIdString(34321), 74, 58, 0, Short.valueOf((short) 1), 40, sStop + }); + createWindowPeer(CurReportDocument.getWizardParent()); + calculateDialogPosition(CurReportDocument.getFrame().getComponentWindow().getPosSize()); + xWindow.setVisible(true); + super.xReschedule.reschedule(); + } + catch (Exception e) + { + Logger.getLogger(Dataimport.class.getName()).log(Level.SEVERE, null, e); + // return; + } + catch (java.lang.Exception e) + { + Logger.getLogger(Dataimport.class.getName()).log(Level.SEVERE, null, e); + // return; + } + } + + private void importReportData(final XMultiServiceFactory _xMSF, PropertyValue[] _properties) + { + if (CurReportDocument.reconnectToDatabase(_xMSF, _properties)) + { + // The following calls to remove the Sections must occur after the connection to the database + modifyFontWeight("lblProgressDBConnection", com.sun.star.awt.FontWeight.NORMAL); + modifyFontWeight("lblProgressDataImport", com.sun.star.awt.FontWeight.BOLD); + CurReportDocument.insertDatabaseDatatoReportDocument(_xMSF); + } + xComponent.dispose(); + CurReportDocument.getRecordParser().dispose(); + } + + public void createReport( XMultiServiceFactory xMSF, XDatabaseDocumentUI i_documentUI, XTextDocument _textDocument, + PropertyValue[] properties) + { + CurReportDocument = ReportTextImplementation.create( xMSF, i_documentUI, _textDocument, m_oResource ); + showProgressDisplay(true); + importReportData(xMSF, properties); + } +} diff --git a/wizards/com/sun/star/wizards/report/GroupFieldHandler.java b/wizards/com/sun/star/wizards/report/GroupFieldHandler.java new file mode 100644 index 000000000..26543bb46 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/GroupFieldHandler.java @@ -0,0 +1,185 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import java.util.ArrayList; + +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.CommandMetaData; +import com.sun.star.wizards.db.QueryMetaData; +import com.sun.star.wizards.ui.FieldSelection; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.WizardDialog; + +public class GroupFieldHandler extends FieldSelection +{ + + private IReportDocument CurReportDocument; + private final ArrayList<String> GroupFieldVector = new ArrayList<String>(); + private QueryMetaData CurDBMetaData; + private static final short MAXSELFIELDS = 4; + + public GroupFieldHandler(IReportDocument _CurReportDocument, WizardDialog _CurUnoDialog) + { + super(_CurUnoDialog, ReportWizard.SOGROUPPAGE, 95, 27, 210, 127, + _CurUnoDialog.m_oResource.getResText("RID_REPORT_19"), + _CurUnoDialog.m_oResource.getResText("RID_REPORT_50"), 34340, false); + + try + { + this.CurReportDocument = _CurReportDocument; + this.CurDBMetaData = CurReportDocument.getRecordParser(); + CurUnoDialog.setControlProperty("lstFields_2", "MultiSelection", Boolean.FALSE); + CurUnoDialog.setControlProperty("lstSelFields_2", "MultiSelection", Boolean.FALSE); + addFieldSelectionListener(new FieldSelectionListener()); + String sNote = ReportWizard.getBlindTextNote(_CurReportDocument, _CurUnoDialog.m_oResource); + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblBlindTextNote_1", + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 18, sNote, Boolean.TRUE, 95, 158, Integer.valueOf(ReportWizard.SOGROUPPAGE), 209 + }); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private boolean isGroupField(String _FieldName) + { + return (JavaTools.FieldInList(CurDBMetaData.GroupFieldNames, _FieldName) != -1); + } + + public void initialize() + { + try + { + ArrayList<String> NormalFieldsVector = new ArrayList<String>(); + ArrayList<String> SelFieldsVector = new ArrayList<String>(); + String[] sFieldNames = CurDBMetaData.getFieldNames(); + for (int i = 0; i < sFieldNames.length; i++) + { + String sfieldtitle = sFieldNames[i]; // CurDBMetaData.getFieldTitle(sFieldNames[i]); + if (isGroupField(sFieldNames[i])) + { + SelFieldsVector.add(sfieldtitle); + } + else + { + NormalFieldsVector.add(sfieldtitle); + } + } + String[] SelFields = new String[SelFieldsVector.size()]; + SelFieldsVector.toArray(SelFields); + String[] NormalFields = new String[NormalFieldsVector.size()]; + NormalFieldsVector.toArray(NormalFields); + super.initialize(NormalFields, SelFields, true); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void removeGroupFieldNames() + { + emptyFieldsListBoxes(); + GroupFieldVector.clear(); + CurUnoDialog.setControlProperty("lblBlindTextNote_1", PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + } + + public void getGroupFieldNames(CommandMetaData CurDBMetaData) + { + String[] GroupFieldNames = new String[GroupFieldVector.size()]; + GroupFieldVector.toArray(GroupFieldNames); + CurDBMetaData.GroupFieldNames = GroupFieldNames; + } + // @Override + @Override + protected void toggleListboxButtons(short iFieldsSelIndex, short iSelFieldsSelIndex) + { + super.toggleListboxButtons(iFieldsSelIndex, iSelFieldsSelIndex); + int iSelCount = xSelectedFieldsListBox.getItemCount(); + if (iSelCount >= MAXSELFIELDS) + { + CurUnoDialog.setControlProperty("cmdMoveSelected" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + } + } + + @Override + public void selectFields(boolean bMoveAll) + { + int iSelCount = xSelectedFieldsListBox.getItemCount(); + if (iSelCount < MAXSELFIELDS) + { + super.selectFields(bMoveAll); + } + + } + + /* protected */ private class FieldSelectionListener implements com.sun.star.wizards.ui.XFieldSelectionListener + { + + public void moveItemDown(String Selitem) + { + CurReportDocument.refreshGroupFields(xSelectedFieldsListBox.getItems()); + } + + public void moveItemUp(String item) + { + CurReportDocument.refreshGroupFields(xSelectedFieldsListBox.getItems()); + } + + public void shiftFromLeftToRight(String[] Selitems, String[] Newitems) + { + String CurGroupTitle = Selitems[0]; + int iSelCount = xSelectedFieldsListBox.getItemCount(); + String[] CurGroupNames = xFieldsListBox.getItems(); + CurReportDocument.liveupdate_addGroupNametoDocument(CurGroupNames, CurGroupTitle, GroupFieldVector, CurReportDocument.getReportPath(), iSelCount); + CurUnoDialog.setControlProperty("lblBlindTextNote_1", PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + if (iSelCount >= MAXSELFIELDS) + { + toggleMoveButtons(false, false); + } + } + + public void shiftFromRightToLeft(String[] OldSelitems, String[] Newitems) + { + int iSelPos = OldSelitems.length; + if (iSelPos > 0) + { + String OldGroupTitle = OldSelitems[0]; + String[] NewSelList = xSelectedFieldsListBox.getItems(); + CurReportDocument.liveupdate_removeGroupName(NewSelList, OldGroupTitle, GroupFieldVector); + String[] NewSelGroupNames = xSelectedFieldsListBox.getItems(); + CurUnoDialog.setControlProperty("lblBlindTextNote_1", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(NewSelGroupNames.length == 0)); + + // CurReportDocument.refreshGroupFields(xSelectedFieldsListBox.getItems()); + } + } + + public void setID(String sIncSuffix) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/report/IReportBuilderLayouter.java b/wizards/com/sun/star/wizards/report/IReportBuilderLayouter.java new file mode 100644 index 000000000..ad7993df0 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/IReportBuilderLayouter.java @@ -0,0 +1,106 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +/** + * This Interface separate the ReportBuilderImplementation from the layout. + * Only these less methods are allowed to access from the ReportBuilderImplementation. + */ +public interface IReportBuilderLayouter +{ + + /** + * Get the internal name of the current layout. + * This name identifies the layout in the internal access list. + * @return the internal layout name. + */ + String getName(); + + /** + * Get the localized name of the layout, which is shown in the layout page of the report wizard. + * This name comes out of the resource and will be translate in different languages. + * @return localized name of the layout. + */ + String getLocalizedName(); + + /** + * For Landscape give nOrientation == com.sun.star.wizards.report.ReportLayouter.SOOPTLANDSCAPE + * All other numbers are interpreted as portrait format. + */ + void setPageOrientation(int nOrientation); + + /** + * dispose the layouter + */ + void dispose(); + + /** + * Set the table name of the report + * This is the name to the database table. + * @param _nType something of com.sun.star.sdb.CommandType + */ + void setTableName(int _nType, String TableName); + + /** + * Insert the field names, these are the field names out of a given datebase table + */ + void insertFieldNames(final String[] FieldNames); + + /** + * Insert the field type (Varchar, int, ...) as internal an int representation. + */ + void insertFieldTypes(int[] FieldTypes); + + /** + * Insert the field width in count of chars as given in the database. + */ + void insertFieldWidths(int[] FieldWidths); + + /** + * Insert the titles of the field names. This names are free formed + */ + void insertFieldTitles(String[] _aFieldTitles); + + /** + * Insert the names of the groups, the group names are names out of the field names. + * + * If a group name is given here, it will not shown in the fields/titles, but must be in the field string list. + */ + void insertGroupNames(String[] _aGroupFieldNames); + + /** + * Insert the names of the groups which should be used as sorting, the group names are names out of the field names. + * + * If a group name is given here, it will not shown in the fields/titles, but must be in the field string list. + */ + void insertSortingNames(String[][] _aSortFieldNames); + + /** + * This method redraws the whole layout with all its content + */ + void layout(); + + /** + * Initialize the current Layouter with data's out of another Layouter. + * + * This Method copies the internal fields, groups and titles + */ + void initializeData(IReportBuilderLayouter aOtherLayouter); + + void loadAndSetBackgroundTemplate(String LayoutTemplatePath); +} diff --git a/wizards/com/sun/star/wizards/report/IReportDefinitionReadAccess.java b/wizards/com/sun/star/wizards/report/IReportDefinitionReadAccess.java new file mode 100644 index 000000000..3cdabfc23 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/IReportDefinitionReadAccess.java @@ -0,0 +1,48 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XReportDefinition; + +/** + * This interface contains only one function to give access to the ReportDefinition. + * The ReportDefinition will be initialized very late, late after the ReportLayouters. + * So we need this interface for the late access. + */ +public interface IReportDefinitionReadAccess +{ + + /** + * Gives access to a ReportDefinition, if initialized. + * @return a ReportDefinition or null. + */ + XReportDefinition getReportDefinition(); /* should throw NullPointerException but does not. */ + + + /** + * This ServiceFactory is the 'global' Service Factory, which knows all and everything in the program. + * @return the global service factory of the program + */ + XMultiServiceFactory getGlobalMSF(); + + /** + * Returns the file path to the default report definition, we need this name for early initialisation + */ + String getDefaultHeaderLayout(); +} diff --git a/wizards/com/sun/star/wizards/report/IReportDocument.java b/wizards/com/sun/star/wizards/report/IReportDocument.java new file mode 100644 index 000000000..ec04d6780 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/IReportDocument.java @@ -0,0 +1,219 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.wizards.common.Resource; +import java.util.ArrayList; + +/** + * New Interface which gives us the possibility to switch on the fly between the old + * Wizard and the new Report Builder Wizard, which use the same UI. + */ +public interface IReportDocument +{ + + // initialisation + + void initialize( + final XDatabaseDocumentUI i_documentUI, + final Resource i_resource + ); + + + // Access Helper + + /** + * Gives access to the DB Values + */ + com.sun.star.wizards.db.RecordParser getRecordParser(); + + /** + * Give access to the parent document + * It is a document in the old Wizard + * It is a Report Builder in the new Wizard + */ + com.sun.star.awt.XWindowPeer getWizardParent(); + + /** + * + * @return the Frame of the document Window or Report Builder Window + */ + com.sun.star.frame.XFrame getFrame(); + + XComponent getComponent(); + + + // First step: After entering the table name, select fields + + /** + * Is called after first step, set Tablename and the fields, which should occur in the Report. + */ + void initializeFieldColumns(final int _aType, final String TableName, final String[] FieldNames); + + /** + * Empties the report document + */ + void clearDocument(); + + /** + * Empties the report document, if we called back, don't remove Grouping/Sorting + */ + void removeTextTableAndTextSection(); + + + // Second step: Label field titles + + /** + * Set new names for the titles + */ + void setFieldTitles(final String[] sFieldTitles); + + /** + * Change the name of the 'title' of one field. + * It is possible to give all element names new names which are used as + * element title of a given element name. + * This is only used as a preview + */ + void liveupdate_changeUserFieldContent(final String FieldName, final String TitleName); + + // Third step: Grouping + + /* Grouping Page */ + // Document should not hold the grouping information! + /** + * Called by press ('greater than') add a group to the group list + */ + boolean liveupdate_addGroupNametoDocument(String[] GroupNames, String CurGroupTitle, ArrayList<String> GroupFieldVector, ArrayList<String> ReportPath, int iSelCount); + + void refreshGroupFields(String[] _sNewNames); + /** + * Called by press ('less than') Removes an already set Groupname out of the list + */ + void liveupdate_removeGroupName(String[] NewSelGroupNames, String CurGroupTitle, java.util.ArrayList<String> GroupFieldVector); + + /** + * set the list how to group + */ + void setGrouping(String[] aGroupList); + + // Fourth step: Sorting + + /** + * Set the list how to sort + */ + void setSorting(String[][] aSort); + + // Fivth step: Templates / Layout + + /* Template Page */ + void setPageOrientation(int nOrientation) throws com.sun.star.lang.IllegalArgumentException; + + int getDefaultPageOrientation(); + + ArrayList<String> getReportPath(); + + String getLayoutPath(); + + String getContentPath(); + + /** + * Called if a new Layout is selected + */ + void liveupdate_changeLayoutTemplate(String LayoutTemplatePath/*, String BitmapPath*/); + + /** + * Called if a new Template is selected + */ + void liveupdate_changeContentTemplate(String ContentTemplatePath); + + void layout_selectFirstPage(); + + void layout_setupRecordSection(String TemplateName); + + // finishing + + // preview (update titlenames) + // addTextListener + /** + * Set the Title into the document from the 'Create Report Page' + * BUG: The Title is empty after create Report. + */ + void liveupdate_updateReportTitle(String _sTitleName); + + /** + * Store the document by the given name + */ + void store(String Name, int OpenMode) throws com.sun.star.uno.Exception; + + /** + * The current report is added to the DB View under the given name + * + * TODO: add Name to this functionality + */ + void addReportToDBView(); + + void importReportData(ReportWizard aWizard); + + /** + * Create the final Report document + */ + void createAndOpenReportDocument( + final String Name, + final boolean _bAsTemplate, + final boolean _bOpenInDesign + ); + + void dispose(); + + // Garbage dump + + /* DataImport */ + // ??? + // ??? + boolean reconnectToDatabase(XMultiServiceFactory xMSF, PropertyValue[] Properties); + // ??? + void insertDatabaseDatatoReportDocument(XMultiServiceFactory xMSF); + // ??? + /** + * set an internal variable to stop a maybe longer DB access. + */ + void StopProcess(); // cancel + + /** + * Returns a string list of layouts. + */ + String[][] getDataLayout(); + + /** + * Returns a string list of header layouts + */ + String[][] getHeaderLayout(); + + void setCommandType(int CommandType); + + void setCommand(String Command); + + /** + * check internal invariants + */ + void checkInvariants() throws java.lang.Exception; +} diff --git a/wizards/com/sun/star/wizards/report/MANIFEST.MF b/wizards/com/sun/star/wizards/report/MANIFEST.MF new file mode 100644 index 000000000..1a4f8da6e --- /dev/null +++ b/wizards/com/sun/star/wizards/report/MANIFEST.MF @@ -0,0 +1,2 @@ +RegistrationClassName: com.sun.star.wizards.report.CallReportWizard +UNO-Type-Path: diff --git a/wizards/com/sun/star/wizards/report/RecordTable.java b/wizards/com/sun/star/wizards/report/RecordTable.java new file mode 100644 index 000000000..50e605dbc --- /dev/null +++ b/wizards/com/sun/star/wizards/report/RecordTable.java @@ -0,0 +1,85 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNamed; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.table.XCellRange; +import com.sun.star.table.XTableColumns; +import com.sun.star.text.XTextTable; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.text.TextTableHandler; +import com.sun.star.wizards.text.ViewHandler; + +public class RecordTable +{ + + XNamed xTableName; + XCellRange xCellRange; + public XTextTable xTextTable; + private TextTableHandler oTextTableHandler; + XTableColumns xTableColumns; + + public RecordTable(TextTableHandler _oTextTableHandler) + { + try + { + this.oTextTableHandler = _oTextTableHandler; + XNameAccess xAllTextTables = oTextTableHandler.xTextTablesSupplier.getTextTables(); + if ((xAllTextTables.hasByName(ReportTextDocument.TBLRECORDSECTION)) || (xAllTextTables.hasByName(ReportTextDocument.COPYOFTBLRECORDSECTION))) + { + Object oTable; + if (xAllTextTables.hasByName(ReportTextDocument.COPYOFTBLRECORDSECTION)) + { + oTable = xAllTextTables.getByName(ReportTextDocument.COPYOFTBLRECORDSECTION); + } + else + { + oTable = xAllTextTables.getByName(ReportTextDocument.TBLRECORDSECTION); + } + xTextTable = UnoRuntime.queryInterface(XTextTable.class, oTable); + xTableName = UnoRuntime.queryInterface(XNamed.class, xTextTable); + } + else + { + XIndexAccess xTableIndex = UnoRuntime.queryInterface(XIndexAccess.class, xAllTextTables); + int n = xTableIndex.getCount() - 1; + Object x = xTableIndex.getByIndex(n); + xTextTable = UnoRuntime.queryInterface(XTextTable.class, x); + xTableName = UnoRuntime.queryInterface(XNamed.class, xTextTable); + xTableName.setName(ReportTextDocument.TBLRECORDSECTION); + } + xTextTable.getRows(); + xTableColumns = xTextTable.getColumns(); + xCellRange = UnoRuntime.queryInterface(XCellRange.class, xTextTable); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void adjustOptimalTableWidths(XMultiServiceFactory _xMSF, ViewHandler oViewHandler) + { // setTableColumnSeparators(){ + oTextTableHandler.adjustOptimalTableWidths(_xMSF, xTextTable); + oViewHandler.collapseViewCursorToStart(); + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportFinalizer.java b/wizards/com/sun/star/wizards/report/ReportFinalizer.java new file mode 100644 index 000000000..048c2d3e9 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportFinalizer.java @@ -0,0 +1,259 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XTextComponent; +import com.sun.star.uno.Exception; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.RecordParser; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.WizardDialog; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; +import com.sun.star.wizards.ui.event.XTextListenerAdapter; + +public class ReportFinalizer +{ + + private WizardDialog CurUnoDialog; + private XTextComponent xTitleTextBox; + private String StoreName; + private String OldDefaultName; + private IReportDocument CurReportDocument; + public static final int SOCREATEDOCUMENT = 1; + public static final int SOCREATETEMPLATE = 2; + public static final int SOUSETEMPLATE = 3; + public ReportFinalizer(IReportDocument _CurReportDocument, WizardDialog _CurUnoDialog) + { + this.CurUnoDialog = _CurUnoDialog; + this.CurReportDocument = _CurReportDocument; + short curtabindex = (short) (ReportWizard.SOSTOREPAGE * 100); + + String sSaveAsTemplate = CurUnoDialog.m_oResource.getResText("RID_REPORT_40"); + String sUseTemplate = CurUnoDialog.m_oResource.getResText("RID_REPORT_41"); + String sEditTemplate = CurUnoDialog.m_oResource.getResText("RID_REPORT_42"); + String sSaveAsDocument = CurUnoDialog.m_oResource.getResText("RID_REPORT_43"); + String sReportTitle = CurUnoDialog.m_oResource.getResText("RID_REPORT_33"); + String slblHowProceed = CurUnoDialog.m_oResource.getResText("RID_REPORT_78"); + String slblChooseReportKind = CurUnoDialog.m_oResource.getResText("RID_REPORT_79"); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblTitle", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sReportTitle, 95, 27, Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 68 + }); + + xTitleTextBox = CurUnoDialog.insertTextField("txtTitle", new XTextListenerAdapter() { + @Override + public void textChanged(TextEvent arg0) { + changeReportTitle(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 12, "HID:WIZARDS_HID_DLGREPORT_4_TITLE", 95, 37, Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 209 + }); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblChooseReportKind", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblChooseReportKind, 95, 57, Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 209 + }); + + CurUnoDialog.insertRadioButton("optCreateDocument", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSubTemplateControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, "HID:WIZARDS_HID_DLGREPORT_5_OPTSTATDOCUMENT", sSaveAsDocument, 95, 69, Short.valueOf((short) 0), Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 138 + }); + + CurUnoDialog.insertRadioButton("optCreateReportTemplate", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSubTemplateControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, "HID:WIZARDS_HID_DLGREPORT_5_OPTDYNTEMPLATE", sSaveAsTemplate, 95, 81, Short.valueOf((short) 1), Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 209 + }); + + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblHowProceed", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblHowProceed, 105, 93, Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 209 + }); + + + CurUnoDialog.insertRadioButton("optEditTemplate", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSubTemplateControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, "HID:WIZARDS_HID_DLGREPORT_5_OPTEDITTEMPLATE", sEditTemplate, 111, 105, 6, Short.valueOf(curtabindex++), 138 + }); + + CurUnoDialog.insertRadioButton("optUseTemplate", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + toggleSubTemplateControls(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, "HID:WIZARDS_HID_DLGREPORT_5_OPTUSETEMPLATE", sUseTemplate, 111, 115, Short.valueOf((short) 1), Integer.valueOf(ReportWizard.SOSTOREPAGE), Short.valueOf(curtabindex++), 138 + }); + } + + + /** + * This function is called if one of the radio buttons is pressed + */ + private void toggleSubTemplateControls() + { + // String sStorePath = PropertyNames.EMPTY_STRING; + Short iState = (Short) CurUnoDialog.getControlProperty("optCreateReportTemplate", PropertyNames.PROPERTY_STATE); + boolean bDoTemplateEnable = iState.shortValue() == 1; + CurUnoDialog.setControlProperty("optEditTemplate", PropertyNames.PROPERTY_ENABLED, bDoTemplateEnable); + CurUnoDialog.setControlProperty("optUseTemplate", PropertyNames.PROPERTY_ENABLED, bDoTemplateEnable); + CurUnoDialog.setControlProperty("lblHowProceed", PropertyNames.PROPERTY_ENABLED, bDoTemplateEnable); + + String sTitle = xTitleTextBox.getText(); + boolean bDoEnable = sTitle.equals(PropertyNames.EMPTY_STRING); + CurUnoDialog.enableFinishButton(!bDoEnable); + } + public void initialize(RecordParser _CurDBMetaData) + { + String FirstCommandName = _CurDBMetaData.getIncludedCommandNames()[0]; + String DefaultName = Desktop.getUniqueName(_CurDBMetaData.getReportDocuments(), FirstCommandName); + if (!DefaultName.equals(OldDefaultName)) + { + OldDefaultName = DefaultName; + } + xTitleTextBox.setText(DefaultName); + } + + public String getStoreName() + { + if (CurUnoDialog != null) + { + String LocStoreName = xTitleTextBox.getText(); + if (!LocStoreName.equals(PropertyNames.EMPTY_STRING)) + { + StoreName = LocStoreName; + } + } + return StoreName; + } + + private void changeReportTitle() + { + final String TitleName = xTitleTextBox.getText(); + CurReportDocument.liveupdate_updateReportTitle(TitleName); + CurUnoDialog.enableFinishButton(!PropertyNames.EMPTY_STRING.equals(TitleName)); + } + + public int getReportOpenMode() + { + int ReportMode = SOCREATEDOCUMENT; + boolean bcreateTemplate = ((Short) CurUnoDialog.getControlProperty("optCreateReportTemplate", PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + if (bcreateTemplate) + { + ReportMode = SOCREATETEMPLATE; + } + boolean buseTemplate = ((Short) CurUnoDialog.getControlProperty("optUseTemplate", PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + if (buseTemplate) + { + ReportMode = SOUSETEMPLATE; + } + boolean buseDocument = ((Short) CurUnoDialog.getControlProperty("optCreateDocument", PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + if (buseDocument) + { + ReportMode = SOCREATEDOCUMENT; + } + return ReportMode; + } + + public boolean finish() + { + StoreName = getStoreName(); + if (!CurReportDocument.getRecordParser().getReportDocuments().hasByHierarchicalName(StoreName)) + { + try + { + CurReportDocument.store(StoreName, getReportOpenMode()); + ReportWizard.bCloseDocument = false; + return true; + } + catch(Exception e) + { + CurUnoDialog.showMessageBox("ErrorBox", VclWindowPeerAttribute.OK,e.getLocalizedMessage() ); + CurUnoDialog.enableFinishButton(false); + return false; + } + } + String sMsgReportDocumentNameDuplicate = CurUnoDialog.m_oResource.getResText("RID_REPORT_76"); + String sShowMsgReportNameisDuplicate = JavaTools.replaceSubString(sMsgReportDocumentNameDuplicate, StoreName, "%REPORTNAME"); + /* int iMsg = */ CurUnoDialog.showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sShowMsgReportNameisDuplicate); + CurUnoDialog.enableFinishButton(false); + return false; + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportImplementationHelper.java b/wizards/com/sun/star/wizards/report/ReportImplementationHelper.java new file mode 100644 index 000000000..54b0bac36 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportImplementationHelper.java @@ -0,0 +1,49 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.db.RecordParser; + +public class ReportImplementationHelper +{ + + private RecordParser m_aCurDBMetaData; + private final XMultiServiceFactory m_xMSF; + protected int m_nDefaultPageOrientation; + + public ReportImplementationHelper(XMultiServiceFactory _aMSF, int _nOrientation) + { + m_xMSF = _aMSF; + m_nDefaultPageOrientation = _nOrientation; + } + + public RecordParser getRecordParser() + { + if (m_aCurDBMetaData == null) + { + m_aCurDBMetaData = new RecordParser(getMSF()); + } + return m_aCurDBMetaData; + } + + public XMultiServiceFactory getMSF() + { + return m_xMSF; + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportLayouter.java b/wizards/com/sun/star/wizards/report/ReportLayouter.java new file mode 100644 index 000000000..f6397ce92 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportLayouter.java @@ -0,0 +1,425 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.awt.XListBox; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.ui.*; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XSearchable; +import com.sun.star.util.XSearchDescriptor; +import com.sun.star.container.XIndexAccess; +import com.sun.star.text.*; +import com.sun.star.wizards.common.TextElement; +import com.sun.star.wizards.common.PlaceholderTextElement; + +import java.util.List; +import java.util.ArrayList; + +public class ReportLayouter +{ + + private UnoDialog CurUnoDialog; + private static final int SOCONTENTLST = 29; + final public static int SOOPTLANDSCAPE = 30; + final public static int SOOPTPORTRAIT = 31; + private static final int SOLAYOUTLST = 32; + private XListBox xContentListBox; + private XListBox xLayoutListBox; + private int iOldContentPos; + private int iOldLayoutPos; + private IReportDocument CurReportDocument; + private String[][] LayoutFiles; + private String[][] ContentFiles; + private Object aOrientationImage; + private final XMultiServiceFactory m_xMSF; + private XTextRange trTitleconst, trAuthorconst, trDateconst, trPageconst; + private TextElement teTitleconst, teAuthorconst, teDateconst, tePageconst; + private List<XTextRange> constRangeList = new ArrayList<XTextRange>(); + private final boolean isBuilderInstalled; + + public ReportLayouter(XMultiServiceFactory _xMSF, IReportDocument _CurReportDocument, UnoDialog _CurUnoDialog, boolean _isBuilderInstalled) + { + m_xMSF = _xMSF; + isBuilderInstalled = _isBuilderInstalled; + try + { + short curtabindex = (short) (100 * ReportWizard.SOTEMPLATEPAGE); + this.CurUnoDialog = _CurUnoDialog; + this.CurReportDocument = _CurReportDocument; + //TODO the constructor for the OfficePathRetriever is redundant and should be instantiated elsewhere + String slblDataStructure = CurUnoDialog.m_oResource.getResText("RID_REPORT_15"); + String slblPageLayout = CurUnoDialog.m_oResource.getResText("RID_REPORT_16"); + + String sOrientationHeader = CurUnoDialog.m_oResource.getResText("RID_REPORT_22"); + String sOrientVertical = CurUnoDialog.m_oResource.getResText("RID_REPORT_23"); + String sOrientHorizontal = CurUnoDialog.m_oResource.getResText("RID_REPORT_24"); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblContent", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblDataStructure, 95, 27, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), Short.valueOf(curtabindex++), 99 + }); + + short iSelPos = 0; + ContentFiles = CurReportDocument.getDataLayout(); + iSelPos = (short) JavaTools.FieldInList(ContentFiles[1], CurReportDocument.getContentPath()); + if (iSelPos < 0) + { + iSelPos = 0; + } + iOldContentPos = iSelPos; + xContentListBox = CurUnoDialog.insertListBox("lstContent", SOCONTENTLST, new ActionListenerImpl(), new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.SELECTED_ITEMS, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 108, "HID:WIZARDS_HID_DLGREPORT_4_DATALAYOUT", 95, 37, new short[] + { + iSelPos + }, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), ContentFiles[0], Short.valueOf(curtabindex++), 99 + }); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblLayout", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblPageLayout, 205, 27, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), Short.valueOf(curtabindex++), 99 + }); + + short iSelLayoutPos = 0; + LayoutFiles = CurReportDocument.getHeaderLayout(); + iSelLayoutPos = (short) JavaTools.FieldInList(LayoutFiles[1], CurReportDocument.getLayoutPath()); + if (iSelLayoutPos < 0) + { + iSelLayoutPos = (short) JavaTools.FieldInList(LayoutFiles[0], CurReportDocument.getLayoutPath()); + if (iSelLayoutPos < 0) + { + iSelLayoutPos = 0; + } + } + xLayoutListBox = CurUnoDialog.insertListBox("lstLayout", SOLAYOUTLST, new ActionListenerImpl(), new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.SELECTED_ITEMS, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 108, "HID:WIZARDS_HID_DLGREPORT_4_PAGELAYOUT", 205, 37, new short[] + { + iSelLayoutPos + }, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), LayoutFiles[0], Short.valueOf(curtabindex++), 99 + }); + iOldLayoutPos = iSelPos; + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblOrientation", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sOrientationHeader, 95, 148, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), Short.valueOf(curtabindex++), 74 + }); + + short m_nLandscapeState = CurReportDocument.getDefaultPageOrientation() == SOOPTLANDSCAPE ? (short) 1 : 0; + CurUnoDialog.insertRadioButton("optLandscape", SOOPTLANDSCAPE, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, "HID:WIZARDS_HID_DLGREPORT_4_LANDSCAPE", sOrientHorizontal, 101, 158, Short.valueOf(m_nLandscapeState), Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), Short.valueOf(curtabindex++), 60 + }); + + short m_nPortraitState = CurReportDocument.getDefaultPageOrientation() == SOOPTPORTRAIT ? (short) 1 : (short) 0; + CurUnoDialog.insertRadioButton("optPortrait", SOOPTPORTRAIT, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 10, "HID:WIZARDS_HID_DLGREPORT_4_PORTRAIT", sOrientVertical, 101, 171, Short.valueOf(m_nPortraitState), Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), Short.valueOf(curtabindex++), 60 + }); + + aOrientationImage = CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlImageControlModel", "imgOrientation", + new String[] + { + PropertyNames.PROPERTY_BORDER, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "ScaleImage", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Short.valueOf("0"), 23, 164, 158, Boolean.FALSE, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), 30 + }); + + String sNote = ReportWizard.getBlindTextNote(CurReportDocument, CurUnoDialog.m_oResource); + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblBlindTextNote_2", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 34, sNote, Boolean.TRUE, 205, 148, Integer.valueOf(ReportWizard.SOTEMPLATEPAGE), 99 + }); + if (m_nLandscapeState == 1) + { + CurUnoDialog.getPeerConfiguration().setImageUrl(aOrientationImage, "private:graphicrepository/wizards/res/landscape_32.png"); + } + else + { + CurUnoDialog.getPeerConfiguration().setImageUrl(aOrientationImage, "private:graphicrepository/wizards/res/portrait_32.png"); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void initialize(String _defaultTemplatePath) + { + CurReportDocument.layout_setupRecordSection(_defaultTemplatePath); + if (CurUnoDialog.getControlProperty("txtTitle", "Text").equals(PropertyNames.EMPTY_STRING)) + { + String[] sCommandNames = CurReportDocument.getRecordParser().getIncludedCommandNames(); + CurUnoDialog.setControlProperty("txtTitle", "Text", sCommandNames[0]); + } + CurReportDocument.layout_selectFirstPage(); + CurUnoDialog.setFocus("lblContent"); + } + + class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(com.sun.star.awt.ItemEvent EventObject) + { + try + { + int iPos; + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + // LLA: should we lock controllers here? + // CurReportDocument.getDoc().xTextDocument.lockControllers(); + int iKey = CurUnoDialog.getControlKey(EventObject.Source, CurUnoDialog.ControlList); + switch (iKey) + { + case SOCONTENTLST: + iPos = xContentListBox.getSelectedItemPos(); + if (iPos != iOldContentPos) + { + iOldContentPos = iPos; + CurReportDocument.liveupdate_changeContentTemplate(ContentFiles[1][iPos]); + if(!isBuilderInstalled) + { + clearConstants(); + drawConstants(); + } + } + break; + + case SOLAYOUTLST: + iPos = xLayoutListBox.getSelectedItemPos(); + if (iPos != iOldLayoutPos) + { + iOldLayoutPos = iPos; + CurReportDocument.liveupdate_changeLayoutTemplate(LayoutFiles[1][iPos]/*, Desktop.getBitmapPath(m_xMSF)*/); + if(!isBuilderInstalled) + { + clearConstants(); + drawConstants(); + } + } + break; + + case SOOPTLANDSCAPE: + // CurReportDocument.getDoc().changePageOrientation(true); + try + { + CurReportDocument.setPageOrientation(SOOPTLANDSCAPE); + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + } + Helper.setUnoPropertyValue(aOrientationImage, PropertyNames.PROPERTY_IMAGEURL, "private:graphicrepository/wizards/res/landscape_32.png"); + + break; + + case SOOPTPORTRAIT: + // CurReportDocument.getDoc().changePageOrientation( false); + try + { + CurReportDocument.setPageOrientation(SOOPTPORTRAIT); + } + catch (com.sun.star.lang.IllegalArgumentException e) + { + } + + CurUnoDialog.setControlProperty("imgOrientation", PropertyNames.PROPERTY_IMAGEURL, Desktop.getBitmapPath(m_xMSF) + "/portrait.gif"); + Helper.setUnoPropertyValue(aOrientationImage, PropertyNames.PROPERTY_IMAGEURL, "private:graphicrepository/wizards/res/portrait_32.png"); + break; + + default: + break; + } + } + catch (RuntimeException e) + { + e.printStackTrace(); + } + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + } + + public void disposing(EventObject eventObject) + { + } + } + + class ActionListenerImpl implements com.sun.star.awt.XActionListener + { + + public void disposing(EventObject eventObject) + { + } + + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + try + { + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + boolean blandscape = (((Short) CurUnoDialog.getControlProperty("optLandscape", PropertyNames.PROPERTY_STATE)).shortValue() == 1); + CurReportDocument.setPageOrientation((blandscape) ? SOOPTLANDSCAPE : SOOPTPORTRAIT); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + } + } + + public void drawConstants() + { + constRangeList = searchFillInItems(1); + + XTextRange item = null; + + for (int i = 0; i < constRangeList.size(); i++) + { + item = constRangeList.get(i); + String text = item.getString().trim().toLowerCase(); + if (text.equals("#titleconst#")) + { + teTitleconst = new PlaceholderTextElement(item, CurUnoDialog.m_oResource.getResText("RID_REPORT_86"), PropertyNames.EMPTY_STRING, m_xMSF); + trTitleconst = item; + constRangeList.remove(i--); + writeTitle(teTitleconst, trTitleconst, CurUnoDialog.m_oResource.getResText("RID_REPORT_86")); + } + else if (text.equals("#authorconst#")) + { + teAuthorconst = new PlaceholderTextElement(item, CurUnoDialog.m_oResource.getResText("RID_REPORT_87"), PropertyNames.EMPTY_STRING, m_xMSF); + trAuthorconst = item; + constRangeList.remove(i--); + writeTitle(teAuthorconst, trAuthorconst, CurUnoDialog.m_oResource.getResText("RID_REPORT_87")); + } + else if (text.equals("#dateconst#")) + { + teDateconst = new PlaceholderTextElement(item, CurUnoDialog.m_oResource.getResText("RID_REPORT_88"), PropertyNames.EMPTY_STRING, m_xMSF); + trDateconst = item; + constRangeList.remove(i--); + writeTitle(teDateconst, trDateconst, CurUnoDialog.m_oResource.getResText("RID_REPORT_88")); + } + else if (text.equals("#pageconst#")) + { + tePageconst = new PlaceholderTextElement(item, CurUnoDialog.m_oResource.getResText("RID_REPORT_93"), PropertyNames.EMPTY_STRING, m_xMSF); + trPageconst = item; + constRangeList.remove(i--); + writeTitle(tePageconst, trPageconst, CurUnoDialog.m_oResource.getResText("RID_REPORT_93")); + } + } + } + + private void clearConstants() + { + constRangeList.clear(); + trTitleconst = null; + teTitleconst = null; + trAuthorconst = null; + teAuthorconst = null; + trDateconst = null; + teDateconst = null; + trPageconst = null; + tePageconst = null; + } + + private void writeTitle(TextElement te, XTextRange tr, String text) + { + te.setText(text == null ? PropertyNames.EMPTY_STRING : text); + te.write(tr); + } + + private List<XTextRange> searchFillInItems(int type) + { + try + { + XSearchable xSearchable = UnoRuntime.queryInterface(XSearchable.class, CurReportDocument.getComponent()); + XSearchDescriptor sd = xSearchable.createSearchDescriptor(); + + if(type == 0) + { + sd.setSearchString("<[^>]+>"); + } + else if(type == 1) + { + sd.setSearchString("#[^#]+#"); + } + sd.setPropertyValue("SearchRegularExpression", Boolean.TRUE); + sd.setPropertyValue("SearchWords", Boolean.TRUE); + + XIndexAccess ia = xSearchable.findAll(sd); + List<XTextRange> l = new ArrayList<XTextRange>(ia.getCount()); + for (int i = 0; i < ia.getCount(); i++) + { + try + { + l.add(UnoRuntime.queryInterface(XTextRange.class, ia.getByIndex(i))); + } + catch (Exception ex) + { + System.err.println("Nonfatal Error in finding fillins."); + } + } + return l; + } + catch (Exception ex) + { + throw new IllegalArgumentException("Fatal Error: Loading template failed: searching fillins failed", ex); + } + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportTextDocument.java b/wizards/com/sun/star/wizards/report/ReportTextDocument.java new file mode 100644 index 000000000..1c109c0b1 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportTextDocument.java @@ -0,0 +1,668 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.text.XRelativeTextContentRemove; +import com.sun.star.text.XTextContent; +import java.util.ArrayList; +import java.util.Comparator; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.db.*; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.ui.*; +import com.sun.star.sdb.CommandType; +import com.sun.star.text.XTextDocument; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.text.TextTableHandler; +import com.sun.star.wizards.text.TextSectionHandler; +import com.sun.star.wizards.text.TextStyleHandler; +import com.sun.star.wizards.text.TextFieldHandler; +import com.sun.star.wizards.text.ViewHandler; +import com.sun.star.wizards.document.FormHandler; +import java.util.logging.Level; +import java.util.logging.Logger; + +class ReportTextDocument extends com.sun.star.wizards.text.TextDocument implements Comparator<FieldColumn> +{ + + private static final String ISLANDSCAPE = "IsLandscape"; + private static final String ISVISIBLE = "IsVisible"; + private static final String QUERYNAME = "QueryName"; + private static final String SIZE = "Size"; + private Object ReportPageStyle; + private Object FirstPageStyle; + public ArrayList<DBColumn> DBColumnsVector; + private RecordTable CurRecordTable; + private String sMsgCommonReportError; + private String ContentTemplatePath; + private boolean bIsCurLandscape; + public TextTableHandler oTextTableHandler; + public TextSectionHandler oTextSectionHandler; + public FormHandler oFormHandler; + private TextStyleHandler oTextStyleHandler; + public TextFieldHandler oTextFieldHandler; + public ViewHandler oViewHandler; + public static final String TBLRECORDSECTION = "Tbl_RecordSection"; + public static final String TBLGROUPSECTION = "Tbl_GroupField"; + public static final String RECORDSECTION = "RecordSection"; + public static final String GROUPSECTION = "GroupField"; + public static final String COPYOFTBLRECORDSECTION = "CopyOf" + TBLRECORDSECTION; + public static final String COPYOFTBLGROUPSECTION = "CopyOf" + TBLGROUPSECTION; + public static final String COPYOFRECORDSECTION = "CopyOf" + RECORDSECTION; + public static final String COPYOFGROUPSECTION = "CopyOf" + GROUPSECTION; + private RecordParser CurDBMetaData; + + /** Creates new ReportDocument */ + public ReportTextDocument(XMultiServiceFactory xMSF, XTextDocument _textDocument, Resource oResource, RecordParser _aRP) + { + super(xMSF, _textDocument, false); + lateInit(oResource, _aRP); + } + + public ReportTextDocument(XMultiServiceFactory xMSF, String _sPreviewURL, Resource oResource, RecordParser _aRP) + { + super(xMSF, _sPreviewURL, true, null); + lateInit(oResource, _aRP); + } + + private void lateInit(Resource oResource, RecordParser _aRecordParser) + { + oTextTableHandler = new TextTableHandler(xTextDocument); + oTextSectionHandler = new TextSectionHandler(xMSFDoc, xTextDocument); + oFormHandler = new FormHandler(xMSFDoc, xTextDocument); + oTextStyleHandler = new TextStyleHandler(xTextDocument); + oViewHandler = new ViewHandler(xTextDocument); + oTextFieldHandler = new TextFieldHandler(xMSFDoc, xTextDocument); + DBColumnsVector = new java.util.ArrayList<DBColumn>(); + NumberFormatter oNumberFormatter = oTextTableHandler.getNumberFormatter(); + CurDBMetaData = _aRecordParser; + long lDateCorrection = oNumberFormatter.getNullDateCorrection(); + oNumberFormatter.setBooleanReportDisplayNumberFormat(); + oNumberFormatter.setNullDateCorrection(lDateCorrection); + sMsgCommonReportError = oResource.getResText("RID_REPORT_72"); + sMsgCommonReportError = JavaTools.replaceSubString(sMsgCommonReportError, String.valueOf((char) 13), "<BR>"); + bIsCurLandscape = true; + getReportPageStyles(); + } + + public void swapContentTemplate(String ContentTemplatePath) + { + this.ContentTemplatePath = ContentTemplatePath; + loadSectionsfromTemplate(ContentTemplatePath); + oTextStyleHandler.loadStyleTemplates(ContentTemplatePath, "LoadTextStyles"); + if (CurRecordTable != null) + { + CurRecordTable.adjustOptimalTableWidths(xMSF, oViewHandler); + } + oViewHandler.selectFirstPage(oTextTableHandler); + } + + public void swapLayoutTemplate(String LayoutTemplatePath/*, String BitmapPath*/) + { + try + { + boolean bOldIsCurLandscape = AnyConverter.toBoolean(Helper.getUnoPropertyValue(ReportPageStyle, ISLANDSCAPE)); + oTextStyleHandler.loadStyleTemplates(LayoutTemplatePath, "LoadPageStyles"); + changePageOrientation(bOldIsCurLandscape); + oViewHandler.selectFirstPage(oTextTableHandler); + } + catch (IllegalArgumentException e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + } + } + + public void createReportForm(String SOREPORTFORMNAME) + { + com.sun.star.container.XNameContainer xNamedForm = oFormHandler.insertFormbyName(SOREPORTFORMNAME); + XNameAccess xNameAccess = UnoRuntime.queryInterface(XNameAccess.class, xNamedForm); + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, PropertyNames.COMMAND_TYPE, Integer.toString(CurDBMetaData.getCommandType())); + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, QUERYNAME, CurDBMetaData.getCommandName()); + if (CurDBMetaData.getCommandType() == CommandType.QUERY) + { + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, PropertyNames.COMMAND, ""); + //DBMetaData.CommandObject oCommand = CurDBMetaData.getQueryByName(CurDBMetaData.getCommandName()); + //oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, COMMAND, CurDBMetaData.Command); + } + else + { + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, PropertyNames.COMMAND, CurDBMetaData.Command); + } + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, "GroupFieldNames", JavaTools.ArraytoString(CurDBMetaData.GroupFieldNames)); + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, "FieldNames", JavaTools.ArraytoString(CurDBMetaData.getFieldNames())); + String[][] sortFieldNames = CurDBMetaData.getSortFieldNames(); + if (sortFieldNames != null && sortFieldNames.length > 0) + { + final String space = ","; + final String colon = ";"; + StringBuilder orderBy = new StringBuilder(); + for (String[] sortPair : sortFieldNames) + { + orderBy.append(sortPair[0]).append(space).append(sortPair[1]).append(colon); + } + if (orderBy.length() != 0) + { + orderBy.delete(orderBy.lastIndexOf(colon), orderBy.length()); + } + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, "Sorting", orderBy.toString()); + } + else + { + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, "Sorting", ""); + } + oFormHandler.insertHiddenControl(xNameAccess, xNamedForm, "RecordFieldNames", JavaTools.ArraytoString(CurDBMetaData.getRecordFieldNames())); + } + + private void getReportPageStyles() + { + try + { + Object oPageStyleFamily = oTextStyleHandler.xStyleFamiliesSupplier.getStyleFamilies().getByName("PageStyles"); + ReportPageStyle = Helper.getUnoObjectbyName(oPageStyleFamily, "Standard"); + FirstPageStyle = Helper.getUnoObjectbyName(oPageStyleFamily, "First Page"); + } + catch (Exception e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + } + } + + public void changePageOrientation(boolean bNewLandscape) + { + try + { + com.sun.star.awt.Size oNewSize; + getReportPageStyles(); + com.sun.star.awt.Size oLocSize = (com.sun.star.awt.Size) Helper.getUnoStructValue(ReportPageStyle, SIZE); + bIsCurLandscape = AnyConverter.toBoolean(Helper.getUnoPropertyValue(ReportPageStyle, ISLANDSCAPE)); + if (bIsCurLandscape != bNewLandscape) + { + oNewSize = new com.sun.star.awt.Size(oLocSize.Height, oLocSize.Width); + Helper.setUnoPropertyValue(ReportPageStyle, ISLANDSCAPE, bNewLandscape); + Helper.setUnoPropertyValue(ReportPageStyle, SIZE, oNewSize); + Helper.setUnoPropertyValue(FirstPageStyle, ISLANDSCAPE, bNewLandscape); + Helper.setUnoPropertyValue(FirstPageStyle, SIZE, oNewSize); + AnyConverter.toInt(Helper.getUnoPropertyValue(ReportPageStyle, "LeftMargin")); + AnyConverter.toInt(Helper.getUnoPropertyValue(ReportPageStyle, "RightMargin")); + if (CurRecordTable != null) + { + CurRecordTable.adjustOptimalTableWidths(xMSF, oViewHandler); + } + } + } + catch (IllegalArgumentException e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + } + } + + private boolean loadSectionsfromTemplate(String sTemplateUrl) + { + try + { + int i; + DBColumn CurDBColumn; + int GroupCount = CurDBMetaData.GroupFieldNames.length; + CurRecordTable = null; + for (i = 0; i < GroupCount; i++) + { + String SectionName = GROUPSECTION + Integer.toString(i + 1); + oTextTableHandler.renameTextTable("Tbl_" + SectionName, "MyTextTable"); + oTextSectionHandler.linkSectiontoTemplate(sTemplateUrl, SectionName); + oTextTableHandler.renameTextTable("MyTextTable", "Tbl_" + SectionName); + } + if (oTextSectionHandler.xTextSectionsSupplier.getTextSections().getElementNames().length > CurDBMetaData.GroupFieldNames.length) + { + oTextSectionHandler.linkSectiontoTemplate(sTemplateUrl, RECORDSECTION); + CurRecordTable = new RecordTable(oTextTableHandler); + insertColumnstoRecordTable(); + } + for (i = 0; i < GroupCount; i++) + { + CurDBColumn = new DBColumn(oTextTableHandler, CurDBMetaData, CurDBMetaData.GroupFieldNames[i], TBLGROUPSECTION + (i + 1)); + CurDBColumn.formatValueCell(); + DBColumnsVector.set(i, CurDBColumn); + replaceFieldValueInGroupTable(CurDBColumn, i); + } + return true; + } + catch (Exception e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + return false; + } + } + + public void setupRecordSection(String TemplateName) + { + this.ContentTemplatePath = TemplateName; + if (CurDBMetaData.getRecordFieldNames().length > 0) + { + boolean bAddParagraph = true; + if (CurDBMetaData.GroupFieldNames != null) + { + bAddParagraph = (CurDBMetaData.GroupFieldNames.length == 0); + } + oTextSectionHandler.insertTextSection(RECORDSECTION, TemplateName, bAddParagraph); + CurRecordTable = new RecordTable(oTextTableHandler); + insertColumnstoRecordTable(); + if (CurRecordTable != null) + { + CurRecordTable.adjustOptimalTableWidths(xMSF, oViewHandler); + } + } + else + { + CurRecordTable = null; + } + } + + public void refreshGroupFields(String[] _sNewNames) + { + int nSize = DBColumnsVector.size(); + for (int i = 0; i < nSize; i++) + { + DBColumn CurDBColumn = DBColumnsVector.get(i); + String sFieldName = CurDBColumn.CurDBField.getFieldName(); + if (!sFieldName.equals(_sNewNames[i])) + { + CurDBColumn.CurDBField = CurDBMetaData.getFieldColumnByDisplayName(_sNewNames[i]); + CurDBColumn.insertColumnData(oTextFieldHandler, bIsCurLandscape); + } + } + } + + private void updateTextSections(String[] SelGroupNames) + { + String TableName; + DBColumn OldDBColumn; + DBColumn CurDBColumn; + // XNameAccess xTableNames = oTextTableHandler.xTextTablesSupplier.getTextTables(); + int GroupFieldCount = SelGroupNames.length; + for (int i = 0; i < GroupFieldCount; i++) + { + TableName = TBLGROUPSECTION + Integer.toString(i + 1); + OldDBColumn = DBColumnsVector.get(i); + CurDBColumn = new DBColumn(oTextTableHandler, CurDBMetaData, SelGroupNames[i], TableName, OldDBColumn); + CurDBColumn.formatValueCell(); + DBColumnsVector.set(i, CurDBColumn); + CurDBColumn.insertColumnData(oTextFieldHandler, this.bIsCurLandscape); + } + } + + private void replaceFieldValueInGroupTable(DBColumn CurDBColumn, int TableIndex) + { + String TableName = TBLGROUPSECTION + (TableIndex + 1); + // Note: for some reason the table might lose its name and has to be renamed therefore + String OldTableName = CurDBColumn.xTableName.getName(); + if (OldTableName.compareTo(TableName) != 0) + { + CurDBColumn.xTableName.setName(TableName); + } + CurDBColumn.insertColumnData(oTextFieldHandler, this.bIsCurLandscape); + CurDBColumn.setCellFont(); + } + + private void insertColumnstoRecordTable() + { + int GroupCount = CurDBMetaData.GroupFieldNames.length; + DBColumn CurDBColumn; + // Note for some reason the table might lose its name and has to be renamed therefore + String OldTableName = CurRecordTable.xTableName.getName(); + if (OldTableName.compareTo(TBLRECORDSECTION) != 0) + { + CurRecordTable = new RecordTable(oTextTableHandler); + } + com.sun.star.table.XTableColumns xColumns = CurRecordTable.xTextTable.getColumns(); + int ColCount = xColumns.getCount(); + int RecordCount = CurDBMetaData.getRecordFieldNames().length; + if (ColCount > RecordCount) + { + int RemoveCount = ColCount - RecordCount; + xColumns.removeByIndex(0, RemoveCount); + } + else if (ColCount < RecordCount) + { + int AddCount = RecordCount - ColCount; + CurRecordTable.xTextTable.getColumns().insertByIndex(ColCount, AddCount); + } + for (int i = 0; i < RecordCount; i++) + { + CurDBColumn = new DBColumn(CurRecordTable, oTextTableHandler, CurDBMetaData, i, true); + CurDBColumn.initializeNumberFormat(); + CurDBColumn.insertColumnData(oTextFieldHandler, this.bIsCurLandscape); + if (DBColumnsVector.size() <= (i + GroupCount)) + { + DBColumnsVector.add(CurDBColumn); + } + else + { + DBColumnsVector.set(i + GroupCount, CurDBColumn); + } + } + } + + public boolean addGroupNametoDocument(String CurGroupTitle, ArrayList<String> GroupFieldVector, ArrayList<String> ReportPath, int iSelCount) + { + DBColumn CurDBColumn = null; + int GroupCount = GroupFieldVector.size(); + if (GroupCount < 4) + { + removeGroupNamesofRecordTable(iSelCount); + FieldColumn CurFieldColumn = CurDBMetaData.getFieldColumnByTitle(CurGroupTitle); + GroupFieldVector.add(CurFieldColumn.getFieldName()); + GroupCount += 1; + try + { + String sPath = FileAccess.getPathFromList(xMSF, ReportPath, "cnt-default.ott"); + oTextSectionHandler.insertTextSection(GROUPSECTION + GroupCount, sPath, GroupCount == 1); + CurDBColumn = new DBColumn(oTextTableHandler, CurDBMetaData, CurFieldColumn.getFieldName(), TBLGROUPSECTION + (GroupCount)); + CurDBColumn.formatValueCell(); + DBColumnsVector.add(CurDBColumn); + replaceFieldValueInGroupTable(CurDBColumn, GroupCount - 1); + } + catch (Exception exception) + { + showCommonReportErrorBox(exception); + } + + } + + return (CurDBColumn != null); + } + + public void removeGroupName(String[] NewSelGroupNames, String CurGroupTitle, java.util.ArrayList<String> GroupFieldVector) + { + removeGroupNamesofRecordTable(NewSelGroupNames.length + 1); + FieldColumn CurFieldColumn = CurDBMetaData.getFieldColumnByTitle(CurGroupTitle); + GroupFieldVector.remove(CurFieldColumn.getFieldName()); + oTextSectionHandler.removeLastTextSection(); + oTextTableHandler.removeLastTextTable(); + // if the previously selected item is somewhere in the middle of the listbox (and not at the end) the + // Textsections have to be updated + if (JavaTools.FieldInList(NewSelGroupNames, CurGroupTitle) == -1) + { + updateTextSections(NewSelGroupNames); + } + int iSelItemCount = NewSelGroupNames.length; + DBColumnsVector.remove(iSelItemCount); + } + + private void removeGroupNamesofRecordTable(int GroupFieldCount) + { + int CurFieldCount = DBColumnsVector.size(); + if (CurFieldCount > GroupFieldCount) + { + for (int i = CurFieldCount - 1; i >= GroupFieldCount; i--) + { + DBColumnsVector.remove(i); + } + } + } + + private void showCommonReportErrorBox(Exception exception) + { + String SystemContentPath = JavaTools.convertfromURLNotation(ContentTemplatePath); + String sMsgCurCommonReportError = JavaTools.replaceSubString(sMsgCommonReportError, SystemContentPath, "%PATH"); + CurDBMetaData.showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sMsgCurCommonReportError); + exception.printStackTrace(System.err); + } + + public void getallDBColumns() + { + try + { + DBColumn CurDBColumn; + for (int i = 0; i < CurDBMetaData.FieldColumns.length; i++) + { + if (i < CurDBMetaData.GroupFieldNames.length) + { + CurDBColumn = new DBColumn(oTextTableHandler, CurDBMetaData, CurDBMetaData.GroupFieldNames[i], COPYOFTBLGROUPSECTION + (i + 1)); + } + else + { + if (CurRecordTable == null) + { + CurRecordTable = new RecordTable(oTextTableHandler); + } + CurDBColumn = new DBColumn(CurRecordTable, oTextTableHandler, CurDBMetaData, i - CurDBMetaData.GroupFieldNames.length); + } + if (CurDBColumn.xNameCell != null) + { + DBColumnsVector.add(CurDBColumn); + } + else + { + String DelFieldName; + if (i < CurDBMetaData.GroupFieldNames.length) + { + DelFieldName = CurDBMetaData.GroupFieldNames[i]; + CurDBMetaData.GroupFieldNames = JavaTools.removefromList(CurDBMetaData.GroupFieldNames, new String[] + { + DelFieldName + }); + CurDBMetaData.GroupFieldColumns = removeFieldColumnByFieldName(DelFieldName, CurDBMetaData.GroupFieldColumns); + } + else + { + DelFieldName = CurDBMetaData.getRecordFieldName(i - CurDBMetaData.GroupFieldNames.length); + String[] aNewList = JavaTools.removefromList(CurDBMetaData.getRecordFieldNames(), new String[] + { + DelFieldName + }); + CurDBMetaData.setRecordFieldNames(aNewList); + CurDBMetaData.RecordFieldColumns = removeFieldColumnByFieldName(DelFieldName, CurDBMetaData.RecordFieldColumns); + CurDBMetaData.FieldColumns = removeFieldColumnByFieldName(DelFieldName, CurDBMetaData.FieldColumns); + + } + i--; + } + } + java.util.Arrays.sort(CurDBMetaData.RecordFieldColumns, this); + } + catch (Exception exception) + { + showCommonReportErrorBox(exception); + } + } + + public int compare(FieldColumn oFieldColumn1, FieldColumn oFieldColumn2) + { + DBColumn oDBColumn1 = getDBColumnByName(oFieldColumn1.getFieldName()); + DBColumn oDBColumn2 = getDBColumnByName(oFieldColumn2.getFieldName()); + if (oDBColumn1.ValColumn < oDBColumn2.ValColumn) + { + return -1; + } + else if (oDBColumn1.ValColumn == oDBColumn2.ValColumn) + { + return 0; + } + else + { + return 1; + } + } + + private DBColumn getDBColumnByName(String _FieldName) + { + for (int i = 0; i < DBColumnsVector.size(); i++) + { + DBColumn oDBColumn = DBColumnsVector.get(i); + if (oDBColumn.CurDBField.getFieldName().equals(_FieldName)) + { + return oDBColumn; + } + } + throw new IllegalArgumentException("Searching for column " + _FieldName + " failed"); + } + + private static FieldColumn[] removeFieldColumnByFieldName(String _FieldName, FieldColumn[] _FieldColumns) + { + try + { + ArrayList<FieldColumn> aFieldColumns = new ArrayList<FieldColumn>(); + for (int i = 0; i < _FieldColumns.length; i++) + { + FieldColumn CurFieldColumn = _FieldColumns[i]; + if (!CurFieldColumn.getFieldName().equals(_FieldName)) + { + aFieldColumns.add(CurFieldColumn); + } + } + FieldColumn[] aRetList = new FieldColumn[aFieldColumns.size()]; + aFieldColumns.toArray(aRetList); + return aRetList; + } + catch (RuntimeException e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + return null; + } + } + + public void removeAllVisibleTextSections() + { + int GroupCount = CurDBMetaData.GroupFieldNames.length; + String[] sInvisibleSectionNames = new String[GroupCount + 1]; + sInvisibleSectionNames[0] = RECORDSECTION; + for (int i = 1; i <= GroupCount; i++) + { + sInvisibleSectionNames[i] = GROUPSECTION + i; + } + XNameAccess xNameAccessTextSections = UnoRuntime.queryInterface(XNameAccess.class, oTextSectionHandler.xTextSectionsSupplier.getTextSections()); + String[] sSectionNames = xNameAccessTextSections.getElementNames(); + for (int i = 0; i < sSectionNames.length; i++) + { + String sSectionName = sSectionNames[i]; + if (JavaTools.FieldInList(sInvisibleSectionNames, sSectionName) < 0) + { + oTextSectionHandler.removeTextSectionbyName(sSectionName); + } + } + } + + private String[] getLayoutTextTableNames() + { + int GroupCount = CurDBMetaData.GroupFieldNames.length; + String[] sLayoutTableNames = new String[GroupCount + 1]; + for (int i = 0; i < GroupCount; i++) + { + sLayoutTableNames[i] = TBLGROUPSECTION + (i + 1); + } + sLayoutTableNames[GroupCount] = TBLRECORDSECTION; + return sLayoutTableNames; + } + + public void removeNonLayoutTextTables() + { + String[] sLayoutTableNames = getLayoutTextTableNames(); + XNameAccess xNameAccessTextTables = UnoRuntime.queryInterface(XNameAccess.class, oTextTableHandler.xTextTablesSupplier.getTextTables()); + String[] sTableNames = xNameAccessTextTables.getElementNames(); + for (int i = 0; i < sTableNames.length; i++) + { + String sTableName = sTableNames[i]; + if (JavaTools.FieldInList(sLayoutTableNames, sTableName) < 0) + { + oTextTableHandler.removeTextTablebyName(sTableName); + } + } + } + + public void removeLayoutTextTables() + { + String[] sLayoutTableNames = getLayoutTextTableNames(); + XNameAccess xNameAccessTextTables = UnoRuntime.queryInterface(XNameAccess.class, oTextTableHandler.xTextTablesSupplier.getTextTables()); + XRelativeTextContentRemove xRelativeTextContentRemove = UnoRuntime.queryInterface(XRelativeTextContentRemove.class, xText); + String[] sTableNames = xNameAccessTextTables.getElementNames(); + for (int i = 0; i < sTableNames.length; i++) + { + String sTableName = sTableNames[i]; + if (JavaTools.FieldInList(sLayoutTableNames, sTableName) > -1) + { + if (!sTableName.equals(sLayoutTableNames[0])) + { + XTextContent xTextContent = UnoRuntime.queryInterface(XTextContent.class, oTextTableHandler.getByName(sTableName)); + boolean bleaveloop = false; + while (!bleaveloop) + { + try + { + xRelativeTextContentRemove.removeTextContentAfter(xTextContent); + // IllegalArgumentException may be thrown when no paragraphbreak is there + } + catch (IllegalArgumentException iexception) + { + bleaveloop = true; + } + } + } + oTextTableHandler.removeTextTablebyName(sTableName); + } + } + } + + public void setLayoutSectionsVisible(boolean _IsVisible) + { + try + { + XNameAccess xTextSections = oTextSectionHandler.xTextSectionsSupplier.getTextSections(); + Object oTextSection; + int GroupFieldCount = CurDBMetaData.GroupFieldNames.length; + for (int i = 0; i < GroupFieldCount; i++) + { + oTextSection = xTextSections.getByName(GROUPSECTION + String.valueOf(i + 1)); + Helper.setUnoPropertyValue(oTextSection, ISVISIBLE, _IsVisible); + } + if (xTextSections.hasByName(RECORDSECTION)) + { + oTextSection = xTextSections.getByName(RECORDSECTION); + Helper.setUnoPropertyValue(oTextSection, ISVISIBLE, _IsVisible); + } + } + catch (Exception e) + { + Logger.getLogger(ReportTextDocument.class.getName()).log(Level.SEVERE, null, e); + } + } + + public void removeCopiedTextSections() + { + int GroupCount = CurDBMetaData.GroupFieldNames.length; + String[] sCopyTextSections = new String[GroupCount + 1]; + String[] sCopyTextTables = new String[GroupCount + 1]; + sCopyTextSections[0] = COPYOFRECORDSECTION; + sCopyTextTables[0] = COPYOFTBLRECORDSECTION; + for (int i = 1; i <= GroupCount; i++) + { + sCopyTextSections[i] = COPYOFGROUPSECTION + (i); + sCopyTextTables[i] = COPYOFTBLGROUPSECTION + (i); + } + for (int i = 0; i <= GroupCount; i++) + { + oTextTableHandler.removeTextTablebyName(sCopyTextTables[i]); + oTextSectionHandler.removeTextSectionbyName(sCopyTextSections[i]); + } + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportTextImplementation.java b/wizards/com/sun/star/wizards/report/ReportTextImplementation.java new file mode 100644 index 000000000..590d54473 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportTextImplementation.java @@ -0,0 +1,831 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.container.XNamed; +import com.sun.star.frame.XFrame; +import com.sun.star.lang.XComponent; +import com.sun.star.sdb.CommandType; +import com.sun.star.table.XCellRange; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextTable; +import com.sun.star.uno.Any; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.InvalidQueryException; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.Resource; +import com.sun.star.lang.XMultiServiceFactory; + +import com.sun.star.sdb.application.DatabaseObject; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.SystemDialog; +import com.sun.star.wizards.db.DBMetaData; +import com.sun.star.wizards.document.OfficeDocument; +import com.sun.star.wizards.ui.UIConsts; +import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class ReportTextImplementation extends ReportImplementationHelper implements IReportDocument +{ + + private ReportTextDocument m_aDoc; + private Object m_aInitialDoc; + private Resource m_resource; + private XDatabaseDocumentUI m_documentUI; + + private void setInitialDocument(Object _aDoc) + { + m_aInitialDoc = _aDoc; + } + + /** + * This is a TEMPORARY function to give direct access to the old text document. + * We have to remove this!!! + * @return + */ + private ReportTextDocument getDoc() + { + if (m_aDoc == null) + { + if (m_aInitialDoc instanceof XTextDocument) + { + m_aDoc = new ReportTextDocument(getMSF(), (XTextDocument) m_aInitialDoc, m_resource, getRecordParser()); + } + else if (m_aInitialDoc instanceof String) + { + m_aDoc = new ReportTextDocument(getMSF(), (String) m_aInitialDoc, m_resource, getRecordParser()); + } + else + { + throw new RuntimeException("Unknown type for setInitialDocument() given."); + } + } + return m_aDoc; + } + + public void clearDocument() + { + getDoc().oTextSectionHandler.removeAllTextSections(); + getDoc().oTextTableHandler.removeAllTextTables(); + getDoc().DBColumnsVector = new ArrayList<DBColumn>(); + } + + protected ReportTextImplementation( XMultiServiceFactory i_serviceFactory ) + { + super( i_serviceFactory, ReportLayouter.SOOPTLANDSCAPE ); + } + + public void initialize( final XDatabaseDocumentUI i_documentUI, final Resource i_resource ) + { + m_documentUI = i_documentUI; + m_resource = i_resource; + + if ( m_aInitialDoc == null ) + setInitialDocument( getLayoutPath() ); + + initialResources(); + } + + static IReportDocument create( XMultiServiceFactory i_serviceFactory, XDatabaseDocumentUI i_documentUI, XTextDocument i_initialDocument, Resource i_resources ) + { + ReportTextImplementation a = new ReportTextImplementation( i_serviceFactory ); + a.setInitialDocument(i_initialDocument); + a.initialize( i_documentUI, i_resources ); + return a; + } + + public XWindowPeer getWizardParent() + { + return getDoc().xWindowPeer; + } + private static String sMsgQueryCreationImpossible; + private static String sReportFormNotExisting; + private static String sMsgEndAutopilot; + + private void initialResources() + { + sReportFormNotExisting = m_resource.getResText("RID_REPORT_64"); + sMsgQueryCreationImpossible = m_resource.getResText("RID_REPORT_65"); + m_resource.getResText("RID_REPORT_66"); + sMsgEndAutopilot = m_resource.getResText("RID_DB_COMMON_33"); + m_resource.getResText("RID_DB_COMMON_14"); + } + + private void addTextSectionCopies() + { + m_aDoc.setLayoutSectionsVisible(false); + XTextCursor xTextCursor = ReportTextDocument.createTextCursor(m_aDoc.xTextDocument.getText()); + xTextCursor.gotoStart(false); + for (int i = 0; i < getRecordParser().GroupFieldNames.length; i++) + { + XNamed xNamedTextSection = addLinkedTextSection(xTextCursor, ReportTextDocument.GROUPSECTION + Integer.toString(i + 1), null, null); + xNamedTextSection.setName(ReportTextDocument.COPYOFGROUPSECTION + (i + 1)); + renameTableofLastSection(ReportTextDocument.COPYOFTBLGROUPSECTION + (i + 1)); + } + if (getRecordParser().getRecordFieldNames().length > 0) + { + XNamed xNamedTextSection = addLinkedTextSection(xTextCursor, ReportTextDocument.RECORDSECTION, null, null); + xNamedTextSection.setName(ReportTextDocument.COPYOFRECORDSECTION); + renameTableofLastSection(ReportTextDocument.COPYOFTBLRECORDSECTION); + } + } + + private XNamed addLinkedTextSection(XTextCursor xTextCursor, String sLinkRegion, DBColumn CurDBColumn, Object CurGroupValue) + { + XNamed xNamedTextSection = null; + try + { + XInterface xTextSection = (XInterface) getDocumentServiceFactory().createInstance("com.sun.star.text.TextSection"); + XTextContent xTextSectionContent = UnoRuntime.queryInterface( XTextContent.class, xTextSection ); + xNamedTextSection = UnoRuntime.queryInterface( XNamed.class, xTextSection ); + xTextCursor.gotoEnd(false); + xTextCursor.getText().insertTextContent(xTextCursor, xTextSectionContent, true); + Helper.setUnoPropertyValue(xTextSection, "LinkRegion", sLinkRegion); + if (CurDBColumn != null) + { + boolean bIsGroupTable = (!sLinkRegion.equals(ReportTextDocument.RECORDSECTION)); + if (bIsGroupTable) + { + XTextTable xTextTable = getDoc().oTextTableHandler.getlastTextTable(); + XCellRange xCellRange = UnoRuntime.queryInterface( XCellRange.class, xTextTable ); + CurDBColumn.modifyCellContent(xCellRange, CurGroupValue); + } + } + } + catch (Exception ex) + { + Logger.getLogger( ReportTextImplementation.class.getName() ).log( Level.SEVERE, null, ex ); + } + return xNamedTextSection; + } + + private void renameTableofLastSection(String _snewname) + { + XTextTable xTextTable = getDoc().oTextTableHandler.getlastTextTable(); + XNamed xNamedTable = UnoRuntime.queryInterface( XNamed.class, xTextTable ); + xNamedTable.setName(_snewname); + } + + private int showMessageBox(String windowServiceName, int windowAttribute, String MessageText) + { + return SystemDialog.showMessageBox(getMSF(), getWizardParent(), windowServiceName, windowAttribute, MessageText); + } + + public boolean reconnectToDatabase(XMultiServiceFactory xMSF, PropertyValue[] _properties) + { + try + { + XNameContainer xNamedForms = getDoc().oFormHandler.getDocumentForms(); + Object oDBForm = Helper.getUnoObjectbyName(xNamedForms, ReportWizard.SOREPORTFORMNAME); + boolean bgetConnection; + if (oDBForm != null) + { + XNameAccess xNamedForm = UnoRuntime.queryInterface( XNameAccess.class, oDBForm ); + getRecordParser().Command = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, PropertyNames.COMMAND); + String sCommandType = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, PropertyNames.COMMAND_TYPE); + String sGroupFieldNames = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, "GroupFieldNames"); + String sFieldNames = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, "FieldNames"); + String sRecordFieldNames = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, "RecordFieldNames"); + + String sorting = PropertyNames.EMPTY_STRING; + if ( xNamedForm.hasByName( "Sorting" ) ) + sorting = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, "Sorting"); + + String sQueryName = PropertyNames.EMPTY_STRING; + if ( xNamedForm.hasByName( "QueryName" ) ) + sQueryName = getDoc().oFormHandler.getValueofHiddenControl(xNamedForm, "QueryName"); + + String[] sFieldNameList = JavaTools.ArrayoutofString(sFieldNames, PropertyNames.SEMI_COLON); + String[] sNewList = JavaTools.ArrayoutofString(sRecordFieldNames, PropertyNames.SEMI_COLON); + if ( sorting.length() > 0) + { + String[] sortList = JavaTools.ArrayoutofString(sorting, PropertyNames.SEMI_COLON); + ArrayList<String[]> aSortFields = new ArrayList<String[]>(); + for (String sortEntry : sortList) + { + aSortFields.add(JavaTools.ArrayoutofString(sortEntry, ",")); + } + String[][] sortFieldNames = new String[aSortFields.size()][2]; + aSortFields.toArray(sortFieldNames); + getRecordParser().setSortFieldNames(sortFieldNames); + } + getRecordParser().setRecordFieldNames(sNewList); + getRecordParser().GroupFieldNames = JavaTools.ArrayoutofString(sGroupFieldNames, PropertyNames.SEMI_COLON); + int nOrigCommandType = Integer.parseInt(sCommandType); + getRecordParser().setCommandType(nOrigCommandType); + + sMsgQueryCreationImpossible = JavaTools.replaceSubString(sMsgQueryCreationImpossible, getRecordParser().Command, "<STATEMENT>"); + bgetConnection = getRecordParser().getConnection(_properties); + int nCommandType = com.sun.star.sdb.CommandType.COMMAND; + boolean bexecute = false; + if (bgetConnection) + { + if ((getRecordParser().getCommandType() == CommandType.QUERY) && (getRecordParser().Command.equals(PropertyNames.EMPTY_STRING))) + { + DBMetaData.CommandObject oCommand = getRecordParser().getQueryByName(sQueryName); + if (getRecordParser().hasEscapeProcessing(oCommand.getPropertySet())) + { + getRecordParser().Command = (String) oCommand.getPropertySet().getPropertyValue(PropertyNames.COMMAND); + } + else + { + nCommandType = com.sun.star.sdb.CommandType.QUERY; + getRecordParser().Command = sQueryName; + } + } + + bexecute = getRecordParser().executeCommand(nCommandType); //sMsgQueryCreationImpossible + (char) 13 + sMsgEndAutopilot, sFieldNameList, true); + if (bexecute) + { + bexecute = getRecordParser().getFields(sFieldNameList, true); + + boolean addSort = true; + if ( (nOrigCommandType == CommandType.QUERY) && !sQueryName.equals(PropertyNames.EMPTY_STRING) ) + { + DBMetaData.CommandObject oCommand = getRecordParser().getQueryByName(sQueryName); + if (!getRecordParser().hasEscapeProcessing(oCommand.getPropertySet())) + addSort = false; + } + if ( !(addSort && bexecute) ) + { + return bexecute; + } + getRecordParser().getSQLQueryComposer().m_xQueryAnalyzer.setQuery(getRecordParser().Command); + getRecordParser().getSQLQueryComposer().prependSortingCriteria(); + getRecordParser().Command = getRecordParser().getSQLQueryComposer().getQuery(); + + bexecute = getRecordParser().executeCommand(nCommandType); + } + return bexecute; + } + else + { + return false; + } + } + else + { + sReportFormNotExisting = JavaTools.replaceSubString(sReportFormNotExisting, ReportWizard.SOREPORTFORMNAME, "<REPORTFORM>"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, sReportFormNotExisting + (char) 13 + sMsgEndAutopilot); + return false; + } + } + catch (InvalidQueryException queryexception) + { + return false; + } + catch (java.lang.Exception ex) + { + Logger.getLogger( ReportTextImplementation.class.getName() ).log( Level.SEVERE, null, ex ); + return false; + } + } + private boolean m_bStopProcess; + + public void StopProcess() + { + m_bStopProcess = true; + } + + public void insertDatabaseDatatoReportDocument(XMultiServiceFactory xMSF) + { + try + { + int ColIndex; + boolean breset; + Object oTable; + ArrayList<Object[]> DataVector = new ArrayList<Object[]>(); + DBColumn CurDBColumn; + Object CurGroupValue; + String CurGroupTableName; + getDoc().oTextFieldHandler.fixDateFields(true); + getDoc().removeAllVisibleTextSections(); + getDoc().removeNonLayoutTextTables(); + addTextSectionCopies(); + getDoc().getallDBColumns(); + int GroupFieldCount = getRecordParser().GroupFieldNames.length; + int FieldCount = getRecordParser().FieldColumns.length; + Object[] OldGroupFieldValues = new Object[GroupFieldCount]; + int RecordFieldCount = FieldCount - GroupFieldCount; + XTextDocument xTextDocument = getDoc().xTextDocument; + XTextCursor xTextCursor = ReportTextDocument.createTextCursor(getDoc().xTextDocument.getText()); + xTextDocument.lockControllers(); + + if (getRecordParser().ResultSet.next()) + { + replaceUserFields(); + Helper.setUnoPropertyValue(xTextCursor, "PageDescName", "First Page"); + for (ColIndex = 0; ColIndex < GroupFieldCount; ColIndex++) + { + CurGroupTableName = ReportTextDocument.TBLGROUPSECTION + Integer.toString(ColIndex + 1); + oTable = getDoc().oTextTableHandler.xTextTablesSupplier.getTextTables().getByName(CurGroupTableName); + CurGroupValue = getRecordParser().getGroupColumnValue(ColIndex); + OldGroupFieldValues[ColIndex] = CurGroupValue; + CurDBColumn = getDoc().DBColumnsVector.get(ColIndex); + addLinkedTextSection(xTextCursor, ReportTextDocument.GROUPSECTION + Integer.toString(ColIndex + 1), CurDBColumn, CurGroupValue); //COPYOF!!!! + } + if (getRecordParser().getcurrentRecordData(DataVector)) + { + m_bStopProcess = false; + while ((getRecordParser().ResultSet.next()) && (!m_bStopProcess)) + { + breset = false; + for (ColIndex = 0; ColIndex < GroupFieldCount; ColIndex++) + { + CurGroupValue = getRecordParser().getGroupColumnValue(ColIndex); + if ((!CurGroupValue.equals(OldGroupFieldValues[ColIndex])) || (breset)) + { + breset = true; + insertDataToRecordTable(xTextCursor, DataVector, RecordFieldCount); + CurDBColumn = getDoc().DBColumnsVector.get(ColIndex); + addLinkedTextSection(xTextCursor, ReportTextDocument.COPYOFGROUPSECTION + Integer.toString(ColIndex + 1), CurDBColumn, CurGroupValue); + OldGroupFieldValues[ColIndex] = CurGroupValue; + breset = ColIndex != GroupFieldCount - 1; + } + } + getRecordParser().getcurrentRecordData(DataVector); + } + insertDataToRecordTable(xTextCursor, DataVector, RecordFieldCount); + } + else + { + getDoc().unlockallControllers(); + return; + } + } + else + { + for (ColIndex = 0; ColIndex < GroupFieldCount; ColIndex++) + { + CurDBColumn = getDoc().DBColumnsVector.get(ColIndex); + Object oValue = PropertyNames.EMPTY_STRING; + addLinkedTextSection(xTextCursor, ReportTextDocument.COPYOFGROUPSECTION + Integer.toString(ColIndex + 1), CurDBColumn, oValue); + } + addLinkedTextSection(xTextCursor, ReportTextDocument.COPYOFRECORDSECTION, null, null); + Object[][] RecordArray = new Object[1][RecordFieldCount]; + for (int i = 0; i < RecordArray[0].length; i++) + { + RecordArray[0][i] = Any.VOID; + } + XTextTable xTextTable = getDoc().oTextTableHandler.getlastTextTable(); + OfficeDocument.ArraytoCellRange(RecordArray, xTextTable, 0, 1); + } + getDoc().oTextSectionHandler.breakLinkofTextSections(); + } + catch (Exception ex) + { + Logger.getLogger( ReportTextImplementation.class.getName() ).log( Level.SEVERE, null, ex ); + } + getDoc().unlockallControllers(); + getDoc().setLayoutSectionsVisible(false); + getDoc().removeCopiedTextSections(); + getDoc().oTextSectionHandler.removeInvisibleTextSections(); + getDoc().removeLayoutTextTables(); + } + + private void insertDataToRecordTable(XTextCursor xTextCursor, ArrayList<Object[]> DataVector, int FieldCount) + { + int DataLength = DataVector.size(); + if ((FieldCount > 0) && (DataLength > 0)) + { + addLinkedTextSection(xTextCursor, ReportTextDocument.COPYOFRECORDSECTION, null, null); + Object[][] RecordArray = new Object[DataLength][FieldCount]; + DataVector.toArray(RecordArray); + XTextTable xTextTable = getDoc().oTextTableHandler.getlastTextTable(); + if (DataLength > 1) + { + xTextTable.getRows().insertByIndex(xTextTable.getRows().getCount(), DataLength - 1); + } + OfficeDocument.ArraytoCellRange(RecordArray, xTextTable, 0, 1); + } + DataVector.clear(); + } + private void replaceUserFields() + { + DBColumn CurDBColumn; + XTextCursor xNameCellCursor; + String FieldContent; + int iCount = getDoc().DBColumnsVector.size(); + for (int i = 0; i < iCount; i++) + { + CurDBColumn = getDoc().DBColumnsVector.get(i); + xNameCellCursor = ReportTextDocument.createTextCursor(CurDBColumn.xNameCell); + xNameCellCursor.gotoStart(false); + FieldContent = getDoc().oTextFieldHandler.getUserFieldContent(xNameCellCursor); + if (!FieldContent.equals(PropertyNames.EMPTY_STRING)) + { + xNameCellCursor.goRight((short) 1, true); + xNameCellCursor.setString(FieldContent); + } + } + } + + public XFrame getFrame() + { + return m_aDoc.xFrame; + } + + private XMultiServiceFactory getDocumentServiceFactory() + { + return m_aDoc.xMSFDoc; + } + + public void store(String _sName, int _nOpenMode) throws com.sun.star.uno.Exception + { + getDoc().createReportForm(ReportWizard.SOREPORTFORMNAME); + getDoc().oTextFieldHandler.updateDateFields(); + getDoc().oTextFieldHandler.fixDateFields(false); + if ((_nOpenMode == ReportFinalizer.SOCREATETEMPLATE || _nOpenMode == ReportFinalizer.SOUSETEMPLATE)) + { + getDoc().oTextSectionHandler.breakLinkofTextSections(); + getRecordParser().storeDatabaseDocumentToTempPath(getComponent(), _sName); + } + } + + public boolean liveupdate_addGroupNametoDocument(String[] GroupNames, String CurGroupTitle, ArrayList<String> GroupFieldVector, ArrayList<String> ReportPath, int iSelCount) + { + return getDoc().addGroupNametoDocument(CurGroupTitle, GroupFieldVector, ReportPath, iSelCount); + } + + public void refreshGroupFields(String[] _sNewNames) + { + getDoc().refreshGroupFields(_sNewNames); + } + + public void liveupdate_removeGroupName(String[] NewSelGroupNames, String CurGroupTitle, ArrayList<String> GroupFieldVector) + { + getDoc().removeGroupName(NewSelGroupNames, CurGroupTitle, GroupFieldVector); + } + + public void setPageOrientation(int nOrientation) throws com.sun.star.lang.IllegalArgumentException + { + // LLA: should we lock controllers here? + // CurReportDocument.getDoc().xTextDocument.lockControllers(); + if (nOrientation == ReportLayouter.SOOPTLANDSCAPE) + { + getDoc().changePageOrientation(true); + } + else if (nOrientation == ReportLayouter.SOOPTPORTRAIT) + { + getDoc().changePageOrientation(false); + } + else + { + throw new com.sun.star.lang.IllegalArgumentException("Unknown Orientation."); + } + } + + public void liveupdate_changeLayoutTemplate(String LayoutTemplatePath/*, String BitmapPath*/) + { + getDoc().swapLayoutTemplate(LayoutTemplatePath/*, BitmapPath*/); + } + + public void liveupdate_changeContentTemplate(String ContentTemplatePath) + { + getDoc().swapContentTemplate(ContentTemplatePath); + } + + public void layout_setupRecordSection(String TemplateName) + { + getDoc().setupRecordSection(TemplateName); + } + + public void removeTextTableAndTextSection() + { + getDoc().oTextSectionHandler.removeTextSectionbyName("RecordSection"); + getDoc().oTextTableHandler.removeTextTablebyName("Tbl_RecordSection"); + } + + public void layout_selectFirstPage() + { + getDoc().oViewHandler.selectFirstPage(getDoc().oTextTableHandler); + } + + public void dispose() + { + OfficeDocument.dispose(getMSF(), getComponent()); + } + + public XComponent getComponent() + { + return getDoc().xComponent; + } + + public void liveupdate_changeUserFieldContent(String fieldname, String sfieldtitle) + { + getDoc().oTextFieldHandler.changeUserFieldContent(fieldname, sfieldtitle); + } + + public void liveupdate_updateReportTitle(String _sTitleName) + { + } + + public void addReportToDBView() + { + getRecordParser().addReportDocument(getComponent(), true); + } + + public void createAndOpenReportDocument( String sReportName, boolean _bAsTemplate, boolean _bOpenInDesign ) + { + try + { + m_documentUI.loadComponent( DatabaseObject.REPORT, sReportName, _bOpenInDesign ); + } + catch ( Exception ex ) + { + Logger.getLogger( ReportTextImplementation.class.getName() ).log( Level.SEVERE, null, ex ); + } + } + + public void initializeFieldColumns(final int _nType, final String TableName, final String[] FieldNames) + { + getRecordParser().initializeFieldColumns(FieldNames, TableName); + } + + public void setFieldTitles(String[] sFieldTitles) + { + getRecordParser().setFieldTitles(sFieldTitles); + } + + public void setSorting(String[][] aSortFieldNames) + { + getRecordParser().setSortFieldNames(aSortFieldNames); + } + + public void setGrouping(String[] aGroupFieldNames) + { + getRecordParser().prependSortFieldNames(aGroupFieldNames); + } + +// TODO: we have to change to String List!!!! + private ArrayList<String> m_aReportPath = null; + + public ArrayList<String> getReportPath() + { + if (m_aReportPath == null) + { + // Check general availability of office paths + try + { + m_aReportPath = FileAccess.getOfficePaths(getMSF(), "Template"); + FileAccess.combinePaths(getMSF(), m_aReportPath, "/wizard/report"); + } + catch (Exception e) + { + Logger.getLogger( ReportTextImplementation.class.getName() ).log( Level.SEVERE, null, e ); + } + } + return m_aReportPath; + } + + public String getContentPath() + { + ArrayList<String> aReportPath = getReportPath(); + for (int i = 0; i < aReportPath.size(); i++) + { + String sPath = aReportPath.get(i); + sPath += "/cnt-default.ott"; + if (FileAccess.isPathValid(getMSF(), sPath)) + { + return sPath; + } + } + return PropertyNames.EMPTY_STRING; + } + + public String getLayoutPath() + { + ArrayList<String> aReportPath = getReportPath(); + for (int i = 0; i < aReportPath.size(); i++) + { + String sPath = aReportPath.get(i); + sPath += "/stl-default.ott"; + if (FileAccess.isPathValid(getMSF(), sPath)) + { + return sPath; + } + } + return PropertyNames.EMPTY_STRING; + } + + public int getDefaultPageOrientation() + { + return m_nDefaultPageOrientation; + } + + public String[][] getDataLayout() + { + String[][] ContentFiles; + try + { + ContentFiles = FileAccess.getFolderTitles(getMSF(), "cnt", getReportPath()); + exchangeContentTitlesWithLocalisedOnes(ContentFiles); + } + catch (com.sun.star.wizards.common.NoValidPathException e) + { + ContentFiles = new String[2][]; + String[] a = new String[] { "DefaultLayoutOfData" }; + String[] b = new String[] { "default" }; + ContentFiles[1] = a; + ContentFiles[0] = b; + } + return ContentFiles; + } + + public String[][] getHeaderLayout() + { + String[][] LayoutFiles; + try + { + LayoutFiles = FileAccess.getFolderTitles(getMSF(), "stl", getReportPath()); + exchangeLayoutTitlesWithLocalisedOnes(LayoutFiles); + } + catch (com.sun.star.wizards.common.NoValidPathException e) + { + LayoutFiles = new String[2][]; + String[] a = new String[] { "DefaultLayoutOfHeaders" }; + String[] b = new String[] { "default" }; + LayoutFiles[1] = a; + LayoutFiles[0] = b; + } + return LayoutFiles; + } + + public void importReportData(ReportWizard _aWizard) + { + Dataimport CurDataimport = new Dataimport(_aWizard.xMSF); + CurDataimport.CurReportDocument = this; + _aWizard.importReportData(_aWizard.xMSF, CurDataimport); + } + + public void setCommandType(int _nCommand) + { + // already set somewhere else + } + + public void setCommand(String _sCommand) + { + getRecordParser().Command = _sCommand; + } + + public void checkInvariants() throws java.lang.Exception + { + } + + private void exchangeContentTitlesWithLocalisedOnes(String[][] ContentFiles) + { + for(int i = 0; i < ContentFiles[0].length; ++i) + { + if( ContentFiles[0][i].equals("Align Left - Border") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_94"); + } + else if( ContentFiles[0][i].equals("Align Left - Compact") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_95"); + } + else if( ContentFiles[0][i].equals("Align Left - Elegant") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_96"); + } + else if( ContentFiles[0][i].equals("Align Left - Highlighted") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_97"); + } + else if( ContentFiles[0][i].equals("Align Left - Modern") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_98"); + } + else if( ContentFiles[0][i].equals("Align Left - Red & Blue") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_99"); + } + else if( ContentFiles[0][i].equals("Default") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_100"); + } + else if( ContentFiles[0][i].equals("Outline - Borders") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_101"); + } + else if( ContentFiles[0][i].equals("Outline - Compact") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_102"); + } + else if( ContentFiles[0][i].equals("Outline - Elegant") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_103"); + } + else if( ContentFiles[0][i].equals("Outline - Highlighted") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_104"); + } + else if( ContentFiles[0][i].equals("Outline - Modern") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_105"); + } + else if( ContentFiles[0][i].equals("Outline - Red & Blue") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_106"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Borders") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_107"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Compact") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_108"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Elegant") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_109"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Highlighted") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_110"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Modern") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_111"); + } + else if( ContentFiles[0][i].equals("Outline, indented - Red & Blue") ) + { + ContentFiles[0][i] = m_resource.getResText("RID_REPORT_112"); + } + } + } + + private void exchangeLayoutTitlesWithLocalisedOnes(String[][] LayoutFiles) + { + for(int i = 0; i < LayoutFiles[0].length; ++i) + { + if( LayoutFiles[0][i].equals("Bubbles") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_113"); + } + else if( LayoutFiles[0][i].equals("Cinema") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_114"); + } + else if( LayoutFiles[0][i].equals("Controlling") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_115"); + } + else if( LayoutFiles[0][i].equals("Default") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_116"); + } + else if( LayoutFiles[0][i].equals("Drafting") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_117"); + } + else if( LayoutFiles[0][i].equals("Finances") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_118"); + } + else if( LayoutFiles[0][i].equals("Flipchart") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_119"); + } + else if( LayoutFiles[0][i].equals("Formal with Company Logo") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_120"); + } + else if( LayoutFiles[0][i].equals("Generic") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_121"); + } + else if( LayoutFiles[0][i].equals("Worldmap") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_122"); + } + } + } +} diff --git a/wizards/com/sun/star/wizards/report/ReportWizard.java b/wizards/com/sun/star/wizards/report/ReportWizard.java new file mode 100644 index 000000000..1b3eff175 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/ReportWizard.java @@ -0,0 +1,676 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.report; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XTextListener; +import com.sun.star.beans.PropertyValue; +import com.sun.star.container.XContentEnumerationAccess; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.logging.XLogger; +import com.sun.star.logging.XLoggerPool; +import com.sun.star.sdb.CommandType; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XComponentContext; +import com.sun.star.logging.LogLevel; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.common.SystemDialog; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.DBMetaData; +import com.sun.star.wizards.db.DatabaseObjectWizard; +import com.sun.star.wizards.db.RecordParser; +import com.sun.star.wizards.db.SQLQueryComposer; +import com.sun.star.wizards.ui.CommandFieldSelection; +import com.sun.star.wizards.ui.SortingComponent; +import com.sun.star.wizards.ui.TitlesComponent; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; + +import java.lang.reflect.Method; +import java.util.Map; + +public class ReportWizard extends DatabaseObjectWizard implements XTextListener +{ + private SortingComponent CurSortingComponent; + private TitlesComponent CurTitlesComponent; + private CommandFieldSelection CurDBCommandFieldSelection; + private GroupFieldHandler CurGroupFieldHandler; + private ReportLayouter CurReportLayouter; + private ReportFinalizer CurReportFinalizer; + private int nReportMode = ReportFinalizer.SOCREATEDOCUMENT; + private String m_sReportName = PropertyNames.EMPTY_STRING; + protected static final String SOREPORTFORMNAME = "ReportSource"; + private static final int SOMAINPAGE = 1; + private static final int SOTITLEPAGE = 2; + protected static final int SOGROUPPAGE = 3; + private static final int SOSORTPAGE = 4; + protected static final int SOTEMPLATEPAGE = 5; + protected static final int SOSTOREPAGE = 6; + private IReportDocument m_reportDocument; + private static String sMsgWizardName; + private static String slblFields; + private static String slblSelFields; + private static String sShowBinaryFields; + private String[] WizardHeaderText = new String[6]; + private static String slblColumnTitles; + private static String slblColumnNames; + private static String slblTables; + protected static boolean bCloseDocument; + private boolean bHasEscapeProcessing = true; + + public ReportWizard(XMultiServiceFactory i_serviceFactory, final PropertyValue[] i_wizardContext) + { + super(i_serviceFactory, 34320, i_wizardContext); + super.addResourceHandler(); + if (getReportResources(false)) + { + Helper.setUnoPropertyValues(xDialogModel, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_MOVEABLE, + PropertyNames.PROPERTY_NAME, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_TITLE, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(210), + Boolean.TRUE, + "DialogReport", + 102, + 41, + 1, + Short.valueOf((short) 0), + sMsgWizardName, + 310 + }); + drawNaviBar(); + setRightPaneHeaders(this.WizardHeaderText); + } + } + + @Override + protected void enterStep(int nOldStep, int nNewStep) + { + if ((nOldStep >= SOTEMPLATEPAGE) && (nNewStep < SOTEMPLATEPAGE)) + { + m_reportDocument.removeTextTableAndTextSection(); + } + switch (nNewStep) + { + case SOMAINPAGE: + CurDBCommandFieldSelection.setModified(false); + break; + + case SOTITLEPAGE: + String[] aFieldNames = m_reportDocument.getRecordParser().getFieldNames(); + Map<String, String> aFieldTitleSet = m_reportDocument.getRecordParser().getFieldTitleSet(); + CurTitlesComponent.initialize(aFieldNames, aFieldTitleSet); + break; + + case SOGROUPPAGE: + CurGroupFieldHandler.initialize(); + break; + + case SOSORTPAGE: + String[] aFieldNames2 = m_reportDocument.getRecordParser().getFieldNames(); + String[][] aSortFieldNames = m_reportDocument.getRecordParser().getSortFieldNames(); + CurSortingComponent.initialize(aFieldNames2, aSortFieldNames); + int nLength = m_reportDocument.getRecordParser().GroupFieldNames.length; + CurSortingComponent.setReadOnlyUntil(nLength); + break; + + case SOTEMPLATEPAGE: + break; + + case SOSTOREPAGE: + //TODO initialize with suitable PathName + CurReportFinalizer.initialize(m_reportDocument.getRecordParser()); + break; + + default: + break; + } + } + + @Override + protected void leaveStep(int nOldStep, int nNewStep) + { + + switch (nOldStep) + { + case SOMAINPAGE: + String[] aSelectedFieldNames = CurDBCommandFieldSelection.getSelectedFieldNames(); + String aTableName = CurDBCommandFieldSelection.getSelectedCommandName(); + int nType = CurDBCommandFieldSelection.getSelectedCommandType(); + m_reportDocument.initializeFieldColumns(nType, aTableName, aSelectedFieldNames); + if (CurDBCommandFieldSelection.isModified()) + { + // cleanup document + m_reportDocument.clearDocument(); + m_reportDocument.getRecordParser().setGroupFieldNames(new String[] + { + }); + CurGroupFieldHandler.removeGroupFieldNames(); + } + break; + + case SOTITLEPAGE: + String[] sFieldTitles = CurTitlesComponent.getFieldTitles(); + // set new field name titles + // CurReportDocument.getRecordParser().setFieldTitles(sFieldTitles); + m_reportDocument.setFieldTitles(sFieldTitles); + break; + + case SOGROUPPAGE: + // TODO: DESIGN!!! a getter should return a value!!! + CurGroupFieldHandler.getGroupFieldNames(m_reportDocument.getRecordParser()); + String[] aGroupFieldNames = m_reportDocument.getRecordParser().GroupFieldNames; + // CurReportDocument.getRecordParser().prependSortFieldNames(aGroupFieldNames); + m_reportDocument.setGrouping(aGroupFieldNames); + break; + + case SOSORTPAGE: + String[][] aSortFieldNames = CurSortingComponent.getSortFieldNames(); + // CurReportDocument.getRecordParser().SortFieldNames = aSortFieldNames; + m_reportDocument.setSorting(aSortFieldNames); + // TODO: why do we make a switch here + super.enablefromStep(SOTEMPLATEPAGE, true); + break; + + case SOTEMPLATEPAGE: + break; + + case SOSTOREPAGE: + break; + + default: + break; + } + + if ((nOldStep < SOTEMPLATEPAGE) && (super.getNewStep() >= SOTEMPLATEPAGE)) + { +// this is called before SOTEMPLATEPAGE, after SOGROUPPAGE + m_reportDocument.getRecordParser().createRecordFieldNames(); + CurReportLayouter.initialize(m_reportDocument.getContentPath()); + } + } + + private void dialogFinish() + { + this.xComponent.dispose(); + if (bCloseDocument) + { + m_reportDocument.dispose(); + return; + } + + if ((nReportMode == ReportFinalizer.SOCREATETEMPLATE) + || (nReportMode == ReportFinalizer.SOUSETEMPLATE)) + { + m_reportDocument.addReportToDBView(); + boolean bOpenInDesign = (nReportMode == ReportFinalizer.SOCREATETEMPLATE); + m_reportDocument.createAndOpenReportDocument(m_sReportName, true, bOpenInDesign); + } + else + { + m_reportDocument.importReportData(this); + m_reportDocument.createAndOpenReportDocument(m_sReportName, false, false); + } + } + + private boolean executeQuery() + { + boolean bQueryCreated = false; + final RecordParser recordParser = m_reportDocument.getRecordParser(); + final SQLQueryComposer sqlQueryComposer = recordParser.getSQLQueryComposer(); + if (this.CurDBCommandFieldSelection.getSelectedCommandType() == CommandType.TABLE) + { + if (m_reportDocument instanceof ReportTextImplementation) + { + bQueryCreated = sqlQueryComposer.setQueryCommand(this.xWindow, false, false); + m_reportDocument.setCommandType(CommandType.COMMAND); + String sQuery = sqlQueryComposer.getQuery(); + m_reportDocument.setCommand(sQuery); + } + else + { + bQueryCreated = true; + } + } + else + { + try + { + String sQueryName = CurDBCommandFieldSelection.getSelectedCommandName(); + DBMetaData.CommandObject oCommand = recordParser.getQueryByName(sQueryName); + bHasEscapeProcessing = recordParser.hasEscapeProcessing(oCommand.getPropertySet()); + String sCommand = (String) oCommand.getPropertySet().getPropertyValue(PropertyNames.COMMAND); + if (bHasEscapeProcessing) + { + if (m_reportDocument instanceof ReportTextImplementation) + { + sqlQueryComposer.m_xQueryAnalyzer.setQuery(sCommand); + sqlQueryComposer.prependSortingCriteria(); + m_reportDocument.setCommandType(CommandType.COMMAND); + m_reportDocument.setCommand(sqlQueryComposer.getQuery()); + } + } + else + { + m_reportDocument.setCommandType(CommandType.COMMAND); + m_reportDocument.setCommand(sCommand); + } + bQueryCreated = true; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + if (!bQueryCreated) + { + super.vetoableChange(null); + } + return bQueryCreated; + } + + private void buildSteps() + { + // CurReportDocument.getDoc().xProgressBar.setValue(30); + CurDBCommandFieldSelection = new CommandFieldSelection(this, m_reportDocument.getRecordParser(), 100, slblFields, slblSelFields, slblTables, true, 34330); + CurDBCommandFieldSelection.addFieldSelectionListener(new FieldSelectionListener()); + if (!isReportBuilderInstalled()) + { + insertLabel("lblBinaryFields", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 16, sShowBinaryFields, 95, 162, 1, 210 + }); + } + CurTitlesComponent = new TitlesComponent(this, SOTITLEPAGE, 97, 37, 210, 7, slblColumnNames, slblColumnTitles, 34381); + CurTitlesComponent.addTextListener(this); + CurGroupFieldHandler = new GroupFieldHandler(m_reportDocument, this); + CurSortingComponent = new SortingComponent(this, SOSORTPAGE, 95, 30, 210, 34348); + CurReportLayouter = new ReportLayouter(xMSF, m_reportDocument, this, isReportBuilderInstalled()); + CurReportFinalizer = new ReportFinalizer(m_reportDocument, this); + bCloseDocument = true; + enableNavigationButtons(false, false, false); + } + + @Override + public boolean finishWizard() + { + final int ncurStep = getCurrentStep(); + if ((switchToStep(ncurStep, SOSTOREPAGE)) || (ncurStep == SOSTOREPAGE)) + { + if (this.executeQuery()) + { + if (CurReportFinalizer.finish()) + { + nReportMode = CurReportFinalizer.getReportOpenMode(); + m_sReportName = CurReportFinalizer.getStoreName(); + xDialog.endExecute(); + return true; + } + } + } + return false; + } + + @Override + public void cancelWizard() + { + xDialog.endExecute(); + } + + private void insertQueryRelatedSteps() + { + setRMItemLabels(m_oResource); + addRoadmap(); + int i = 0; + i = insertRoadmapItem(0, true, m_oResource.getResText("RID_QUERY_80"), SOMAINPAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_REPORT_68"), SOTITLEPAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_REPORT_11"), SOGROUPPAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_REPORT_12"), SOSORTPAGE); // Orderby is always supported + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_REPORT_13"), SOTEMPLATEPAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_REPORT_14"), SOSTOREPAGE); + setRoadmapInteractive(true); + setRoadmapComplete(true); + setCurrentRoadmapItemID((short) 1); + } + + private boolean isReportBuilderInstalled() + { + //! Check if the new Report Builder Extension is available + XContentEnumerationAccess a = com.sun.star.uno.UnoRuntime.queryInterface(XContentEnumerationAccess.class, xMSF); + com.sun.star.container.XEnumeration e = a.createContentEnumeration("org.libreoffice.report.pentaho.SOReportJobFactory"); + if (e == null) + { + return false; + } + return e.hasMoreElements(); + } + + private static XLogger m_xLogger; + + private static void initializeLogger(XMultiServiceFactory _xMSF) + { + XComponentContext xContext = Helper.getComponentContext(_xMSF); + + final Object aLoggerPool = xContext.getValueByName("/singletons/com.sun.star.logging.LoggerPool"); + if (aLoggerPool == null) + { + System.out.println("Can't get singleton from logging"); + } + final XLoggerPool xLoggerPool = UnoRuntime.queryInterface(XLoggerPool.class, aLoggerPool); + m_xLogger = xLoggerPool.getNamedLogger("com.sun.star.wizards.ReportBuilder"); + } + + public static XLogger getLogger() + { + return m_xLogger; + } + + public void startReportWizard() + { + initializeLogger(xMSF); + getLogger().log(LogLevel.SEVERE, "Start Report Wizard"); + + if (isReportBuilderInstalled()) + { + Class<?> a = null; + try + { + a = Class.forName("com.sun.star.wizards.reportbuilder.ReportBuilderImplementation"); + } + catch (ClassNotFoundException e) + { + System.err.println("ReportBuilderImplementation is unavailable"); + } + if (a != null) + { + try + { + Method aMethod = a.getMethod("create", new Class[] + { + XMultiServiceFactory.class + }); + m_reportDocument = (IReportDocument) aMethod.invoke(a, xMSF + ); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + try + { + if (m_reportDocument == null) + { + // Fallback, if there is no reportbuilder wizard implementation, we use the old wizard + m_reportDocument = new ReportTextImplementation(xMSF); + } + + m_reportDocument.initialize(m_docUI, m_oResource); + + if (m_reportDocument.getRecordParser().getConnection(m_wizardContext)) + { + buildSteps(); + + if(!isReportBuilderInstalled()) CurReportLayouter.drawConstants(); + + m_reportDocument.checkInvariants(); + + this.CurDBCommandFieldSelection.preselectCommand(m_wizardContext, false); + + createWindowPeer(m_reportDocument.getWizardParent()); + + m_reportDocument.getRecordParser().setWindowPeer(this.xControl.getPeer()); + insertQueryRelatedSteps(); + short RetValue = executeDialog(m_reportDocument.getFrame().getComponentWindow().getPosSize()); + if (RetValue == 0) + { + dialogFinish(); + } + } + m_reportDocument.getRecordParser().dispose(); + } + catch (java.io.IOException e) + { + String sMessage = e.getMessage(); + if (sMessage.equals("default.otr")) + { + sMessage = m_oResource.getResText("RID_REPORT_92"); + } + // show a dialog with the error message + SystemDialog.showMessageBox(xMSF, "ErrorBox", VclWindowPeerAttribute.OK, sMessage); + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + } + + public void importReportData(final XMultiServiceFactory xMSF, final Dataimport CurDataimport) + { + boolean bDocisStored = false; + try + { + boolean bexecute = false; + if (!bHasEscapeProcessing) + { + bexecute = m_reportDocument.getRecordParser().executeCommand(com.sun.star.sdb.CommandType.QUERY); // sMsgQueryCreationImpossible + (char) 13 + sMsgEndAutopilot)) + } + else + { + bexecute = m_reportDocument.getRecordParser().executeCommand(com.sun.star.sdb.CommandType.COMMAND); // sMsgQueryCreationImpossible + (char) 13 + sMsgEndAutopilot)) + } + if (bexecute) + { + bexecute = m_reportDocument.getRecordParser().getFields(m_reportDocument.getRecordParser().getFieldNames(), false); + } + if (bexecute) + { + // CurDataimport.insertDatabaseDatatoReportDocument(xMSF); + m_reportDocument.insertDatabaseDatatoReportDocument(xMSF); + } + + if (CurReportFinalizer.getReportOpenMode() == ReportFinalizer.SOCREATEDOCUMENT) + { + bDocisStored = m_reportDocument.getRecordParser().storeDatabaseDocumentToTempPath(m_reportDocument.getComponent(), CurReportFinalizer.getStoreName()); + } + } + catch (com.sun.star.wizards.common.InvalidQueryException queryexception) + { + } + CurDataimport.xComponent.dispose(); + if (bDocisStored) + { + m_reportDocument.getRecordParser().addReportDocument(m_reportDocument.getComponent(), false); + } + m_reportDocument.getRecordParser().dispose(); + } + + private boolean getReportResources(boolean bgetProgressResourcesOnly) + { + sMsgWizardName = super.m_oResource.getResText("RID_REPORT_0"); + if (!bgetProgressResourcesOnly) + { + sShowBinaryFields = m_oResource.getResText("RID_REPORT_60"); + slblTables = m_oResource.getResText("RID_FORM_6"); + slblFields = m_oResource.getResText("RID_FORM_12"); + slblSelFields = m_oResource.getResText("RID_REPORT_9"); + WizardHeaderText[0] = m_oResource.getResText("RID_REPORT_28"); + WizardHeaderText[1] = m_oResource.getResText("RID_REPORT_69"); + WizardHeaderText[2] = m_oResource.getResText("RID_REPORT_29"); + WizardHeaderText[3] = m_oResource.getResText("RID_REPORT_30"); + WizardHeaderText[4] = m_oResource.getResText("RID_REPORT_31"); + WizardHeaderText[5] = m_oResource.getResText("RID_REPORT_32"); + } + slblColumnTitles = m_oResource.getResText("RID_REPORT_70"); + slblColumnNames = m_oResource.getResText("RID_REPORT_71"); + return true; + } + + public static String getBlindTextNote(Object _aDocument, Resource _oResource) + { + String sBlindTextNote = PropertyNames.EMPTY_STRING; + if (_aDocument instanceof ReportTextImplementation) + { + sBlindTextNote = _oResource.getResText("RID_REPORT_75"); + sBlindTextNote = JavaTools.replaceSubString(sBlindTextNote, String.valueOf((char) 13), "<BR>"); + } + return sBlindTextNote; + } + + private void enableRoadmapItems(boolean _bEnabled) + { + try + { + Object oRoadmapItem = null; + int CurStep = AnyConverter.toInt(Helper.getUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP)); + boolean bEnabled = false; + int CurItemID; + for (int i = 0; i < getRMItemCount(); i++) + { + oRoadmapItem = this.xIndexContRoadmap.getByIndex(i); + CurItemID = AnyConverter.toInt(Helper.getUnoPropertyValue(oRoadmapItem, "ID")); + if (CurItemID > CurStep) + { + bEnabled = _bEnabled; + } + else + { + bEnabled = true; + } + + Helper.setUnoPropertyValue(oRoadmapItem, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bEnabled)); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void enableWizardSteps(String[] NewItems) + { + boolean bEnabled = NewItems.length > 0; + setControlProperty("btnWizardNext", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bEnabled)); + setControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bEnabled)); + enableRoadmapItems(bEnabled); // Note: Performance wise this could be improved + } + + public void textChanged(TextEvent xTextEvent) + { + try + { + Object oModel = UnoDialog.getModel(xTextEvent.Source); + String sContent = (String) Helper.getUnoPropertyValue(oModel, "Text"); + String fieldname = this.CurTitlesComponent.getFieldNameByTitleControl(oModel); + // CurReportDocument.getDoc().oTextFieldHandler.changeUserFieldContent(fieldname, sfieldtitle); + m_reportDocument.liveupdate_changeUserFieldContent(fieldname, sContent); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + @Override + public void disposing(EventObject EventObject) + { + } + + private void toggleSortingPage() + { + int nlCommandType = this.CurDBCommandFieldSelection.getSelectedCommandType(); + boolean bdoenable = (nlCommandType == CommandType.TABLE); + if (!bdoenable) + { + String sQueryName = CurDBCommandFieldSelection.getSelectedCommandName(); + DBMetaData.CommandObject oCommand = m_reportDocument.getRecordParser().getQueryByName(sQueryName); + bdoenable = m_reportDocument.getRecordParser().hasEscapeProcessing(oCommand.getPropertySet()); + } + super.setStepEnabled(SOSORTPAGE, bdoenable); + } + + private class FieldSelectionListener implements com.sun.star.wizards.ui.XFieldSelectionListener + { + + private int m_nID; + + public void setID(String sIncSuffix) + { + m_nID = 1; + if (sIncSuffix != null) + { + if ((!sIncSuffix.equals(PropertyNames.EMPTY_STRING)) && (!sIncSuffix.equals("_"))) + { + String sID = JavaTools.ArrayoutofString(sIncSuffix, "_")[1]; + m_nID = Integer.parseInt(sID); + } + } + } + + public void shiftFromLeftToRight(String[] SelItems, String[] NewItems) + { + if (m_nID == 1) + { + CurDBCommandFieldSelection.setModified(true); + enableWizardSteps(NewItems); + toggleSortingPage(); + } + } + + public void shiftFromRightToLeft(String[] SelItems, String[] NewItems) + { + // TODO When the ListFieldbox is refilled only fields of the current Command may be merged into the Listbox + if (m_nID == 1) + { + enableWizardSteps(NewItems); + CurDBCommandFieldSelection.setModified(true); + } + } + + public void moveItemDown(String item) + { + } + + public void moveItemUp(String item) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/report/report.component b/wizards/com/sun/star/wizards/report/report.component new file mode 100644 index 000000000..68c8ce940 --- /dev/null +++ b/wizards/com/sun/star/wizards/report/report.component @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.Java2" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name= + "com.sun.star.wizards.report.CallReportWizard$ReportWizardImplementation"> + <service name="com.sun.star.wizards.report.CallReportWizard"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/reportbuilder/MANIFEST.MF b/wizards/com/sun/star/wizards/reportbuilder/MANIFEST.MF new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/MANIFEST.MF @@ -0,0 +1 @@ + diff --git a/wizards/com/sun/star/wizards/reportbuilder/ReportBuilderImplementation.java b/wizards/com/sun/star/wizards/reportbuilder/ReportBuilderImplementation.java new file mode 100644 index 000000000..d55178ce8 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/ReportBuilderImplementation.java @@ -0,0 +1,692 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XHierarchicalNameContainer; +import com.sun.star.frame.XController; +import com.sun.star.frame.XDispatch; +import com.sun.star.frame.XDispatchProvider; +import com.sun.star.frame.XFrame; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XReportDefinition; +import com.sun.star.sdb.XSubDocument; +import com.sun.star.sdb.application.DatabaseObject; +import com.sun.star.sdb.application.XDatabaseDocumentUI; +import com.sun.star.ucb.XCommandProcessor; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XModeSelector; +import com.sun.star.util.XModifiable; +import com.sun.star.util.XURLTransformer; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.NamedValueCollection; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.db.FieldColumn; +import com.sun.star.wizards.report.IReportBuilderLayouter; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.report.IReportDocument; +import com.sun.star.wizards.report.ReportImplementationHelper; +import com.sun.star.wizards.report.ReportLayouter; +import com.sun.star.wizards.report.ReportWizard; +import com.sun.star.wizards.ui.UIConsts; + +/** + * This class use the IReportDocument Interface to communicate between the UI + * and the ReportBuilderLayouter which communicates to the new Report Builder. + */ +@SuppressWarnings("ucd") +public class ReportBuilderImplementation extends ReportImplementationHelper + implements IReportDocument, IReportDefinitionReadAccess +{ + + private Resource m_resource; + private XDatabaseDocumentUI m_documentUI; + private static final int MAXIMUM_GROUPCOUNT = 4; + private String[] groupNames = null; + + private ReportBuilderImplementation(XMultiServiceFactory _serviceFactory) + { + // creates an access to the ReportBuilder Extension + super(_serviceFactory, ReportLayouter.SOOPTLANDSCAPE); + } + + public static IReportDocument create(XMultiServiceFactory i_serviceFactory) + { + return new ReportBuilderImplementation(i_serviceFactory); + } + + public void initialize(final XDatabaseDocumentUI i_documentUI, final Resource i_resource) + { + m_documentUI = i_documentUI; + m_resource = i_resource; + } + + public void clearDocument() + { + } + + public XWindowPeer getWizardParent() + { + return UnoRuntime.queryInterface(XWindowPeer.class, getFrame().getComponentWindow()); + } + private XFrame m_xFrame = null; + private String m_sReportBuilderLayoutName = PropertyNames.EMPTY_STRING; + + /** + * Get access to the current ReportLayouter, which depends on the name. + * To change the ReportBuilderLayouter use <code>setReportBuilderLayouterName(String Name)</code>. + * @return + */ + private IReportBuilderLayouter getReportBuilderLayouter() + { + return getLayoutMap().get(m_sReportBuilderLayoutName); + } + private Object m_aReportDocument; + private XPropertySet m_documentDefinition; + private XReportDefinition m_reportDocument; + + /** + * initialize the Report Builder and open it representation + * @param _aDoc + */ + private void initialize(Object _aDoc) + { + m_aReportDocument = _aDoc; + + try + { + NamedValueCollection creationArgs = new NamedValueCollection(); + creationArgs.put("DocumentServiceName", "com.sun.star.report.ReportDefinition"); + creationArgs.put("Mode", "remote"); + + XComponent[] docDefinition = new XComponent[] + { + null + }; + XComponent reportDefinitionComp = m_documentUI.createComponentWithArguments( + DatabaseObject.REPORT, creationArgs.getPropertyValues(), docDefinition); + + m_documentDefinition = UnoRuntime.queryInterface(XPropertySet.class, docDefinition[0]); + m_reportDocument = UnoRuntime.queryInterface(XReportDefinition.class, reportDefinitionComp); + } + catch (com.sun.star.uno.Exception e) + { + ReportWizard.getLogger().log(com.sun.star.logging.LogLevel.SEVERE, "Problems with initialize the ReportDefinition" + e.getMessage()); + + } + + switchOffPropertyBrowser(); + switchOffAddFieldWindow(); + + setPageOrientation(m_nDefaultPageOrientation, false /* NO_LAYOUT*/); + } + + private XModeSelector getModeSelector() + { + final XController xController = getReportDefinition().getCurrentController(); + return UnoRuntime.queryInterface(XModeSelector.class, xController); + } + + private void switchOffAddFieldWindow() + { + try + { + getModeSelector().setMode("remote"); + } + catch (com.sun.star.uno.Exception e) + { + } + } + + private void switchOnAddFieldWindow() + { + try + { + getModeSelector().setMode("normal"); + } + catch (com.sun.star.uno.Exception e) + { + } + } + + private void switchOffPropertyBrowser() + { + try + { + final XController xController = getReportDefinition().getCurrentController(); + final XDispatchProvider xDP = UnoRuntime.queryInterface(XDispatchProvider.class, xController); + + // Create special service for parsing of given URL. + final Object aURLTransformer = getMSF().createInstance("com.sun.star.util.URLTransformer"); + final XURLTransformer xURLTransformer = UnoRuntime.queryInterface(com.sun.star.util.XURLTransformer.class, aURLTransformer); + + com.sun.star.util.URL[] aURL = new com.sun.star.util.URL[1]; + aURL[0] = new com.sun.star.util.URL(); + aURL[0].Complete = ".uno:ControlProperties"; + xURLTransformer.parseStrict(aURL); + + final XDispatch xDispatch = xDP.queryDispatch(aURL[0], "_self", 0); + PropertyValue[] xEmpty = new PropertyValue[0]; + xDispatch.dispatch(aURL[0], xEmpty); + } + catch (com.sun.star.uno.Exception e) + { + } + } + + private void switchOnPropertyBrowser() + { + // This is implemented with a toggle algorithm. + switchOffPropertyBrowser(); + } + + /** + * Returns the Frame of the underlieing Document + * @return Returns the Frame of the parent (underlieing) Document + */ + public XFrame getFrame() + { + if (m_xFrame == null) + { + initialize(getRecordParser().getReportDocuments()); + m_xFrame = getReportDefinition().getCurrentController().getFrame(); + setPageOrientation(m_nDefaultPageOrientation, true /* NO_LAYOUT*/); + } + return m_xFrame; + } + + public boolean reconnectToDatabase(XMultiServiceFactory xMSF, PropertyValue[] Properties) + { + return false; + } + + public void insertDatabaseDatatoReportDocument(XMultiServiceFactory xMSF) + { + } + + public void StopProcess() + { + } + + public void store(String Name, int OpenMode) throws com.sun.star.uno.Exception + { + // store into the ZIP Storage + if (OpenMode == 1 /* static Report */) + { + // we will store later + return; + } + + final XCommandProcessor xProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, m_documentDefinition); + final com.sun.star.ucb.Command aCommand = new com.sun.star.ucb.Command(); + aCommand.Name = "store"; + + xProcessor.execute(aCommand, xProcessor.createCommandIdentifier(), null); + + final XHierarchicalNameContainer aNameContainer = UnoRuntime.queryInterface(XHierarchicalNameContainer.class, m_aReportDocument); + aNameContainer.insertByHierarchicalName(Name, m_documentDefinition); + } + + public boolean liveupdate_addGroupNametoDocument(String[] GroupNames, String CurGroupTitle, ArrayList<String> GroupFieldVector, ArrayList<String> ReportPath, int iSelCount) + { + final int GroupCount = GroupFieldVector.size(); + if (GroupCount < MAXIMUM_GROUPCOUNT) + { + final FieldColumn CurFieldColumn = getRecordParser().getFieldColumnByTitle(CurGroupTitle); + GroupFieldVector.add(CurFieldColumn.getFieldName()); + } + return true; + } + + public void refreshGroupFields(String[] _sNewNames) + { + } + + public void liveupdate_removeGroupName(String[] NewSelGroupNames, String CurGroupTitle, ArrayList<String> GroupFieldVector) + { + final FieldColumn CurFieldColumn = getRecordParser().getFieldColumnByTitle(CurGroupTitle); + GroupFieldVector.remove(CurFieldColumn.getFieldName()); + } + + private void setPageOrientation(int nOrientation, boolean bDoLayout) + { + getReportBuilderLayouter().setPageOrientation(nOrientation); + if (bDoLayout) + { + getReportBuilderLayouter().layout(); + } + } + + public void setPageOrientation(int nOrientation) + { + setPageOrientation(nOrientation, true); + } + + public void liveupdate_changeLayoutTemplate(String LayoutTemplatePath/*, String BitmapPath*/) + { + /* Right Listbox */ + final IReportBuilderLayouter aLayouter = getReportBuilderLayouter(); + aLayouter.loadAndSetBackgroundTemplate(LayoutTemplatePath); + aLayouter.layout(); + } + + /** + * Change the current Layouter by a new one with the given Name _sName. + * If there exist no other layouter with the given name, nothing happens, the layouter will not change to + * an illegal one. + * @param _sName Name of the other layouter. + */ + public void setReportBuilderLayouterName(String _sName) + { + final IReportBuilderLayouter aCurrentLayouter = getReportBuilderLayouter(); + final IReportBuilderLayouter aNewLayouter = m_aLayoutMap.get(_sName); + if (aNewLayouter != null) + { + m_sReportBuilderLayoutName = _sName; + aNewLayouter.initializeData(aCurrentLayouter); + aNewLayouter.layout(); + } + } + + public void liveupdate_changeContentTemplate(String ContentTemplatePath) + { + /* Left Listbox */ + setReportBuilderLayouterName(ContentTemplatePath); + } + + public void layout_setupRecordSection(String TemplateName) + { + } + + public void removeTextTableAndTextSection() + { + } + + public void layout_selectFirstPage() + { + } + + private void closeReportDefinition() + { + try + { + if (m_documentDefinition != null) + { + // set the document to "not modified", to ensure that it won't ask the user before closing + XModifiable documentModify = UnoRuntime.queryInterface(XModifiable.class, m_reportDocument); + documentModify.setModified(false); + // actually close + XSubDocument subComponent = UnoRuntime.queryInterface(XSubDocument.class, m_documentDefinition); + subComponent.close(); + } + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderImplementation.class.getName()).log(Level.SEVERE, null, ex); + } + m_documentDefinition = null; + m_reportDocument = null; + } + + public void dispose() + { + getReportBuilderLayouter().dispose(); + closeReportDefinition(); + } + + public XComponent getComponent() + { + return null; + } + + public void liveupdate_changeUserFieldContent(String fieldName, String titlename) + { + } + + public void liveupdate_updateReportTitle(String _sTitleName) + { + } + + public void addReportToDBView() + { + } + + private XComponent loadReport(final String i_reportName) + { + try + { + return m_documentUI.loadComponent(DatabaseObject.REPORT, i_reportName, false); + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderImplementation.class.getName()).log(Level.SEVERE, null, ex); + } + return null; + } + + private XComponent loadReportFromDocumentDefinition() + { + final XCommandProcessor commandProcessor = UnoRuntime.queryInterface(XCommandProcessor.class, m_documentDefinition); + + com.sun.star.ucb.Command aCommand = new com.sun.star.ucb.Command(); + aCommand.Name = "open"; + try + { + final Object result = commandProcessor.execute(aCommand, commandProcessor.createCommandIdentifier(), null); + return UnoRuntime.queryInterface(XComponent.class, result); + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderImplementation.class.getName()).log(Level.SEVERE, null, ex); + } + return null; + } + + public void createAndOpenReportDocument(String i_name, boolean i_asTemplate, boolean i_openForEditing) + { + if (i_openForEditing) + { + // we won't destroy the report builder window, also don't create a document + // Do we need to reopen the report builder with the known name? + switchOnAddFieldWindow(); + switchOnPropertyBrowser(); + return; + } + + if (i_asTemplate) + { + // don't need the report definition anymore - the document it represents has already been stored + closeReportDefinition(); + + // open the report, again, this time not in design, but containing data + loadReport(i_name); + } + else + { + // execute the report from the (yet unsaved) report definition + XComponent document = loadReportFromDocumentDefinition(); + + // don't need the report definition anymore + closeReportDefinition(); + + // store the generated report + if (getRecordParser().storeDatabaseDocumentToTempPath(document, i_name)) + { + getRecordParser().addReportDocument(document, false); + } + } + + dispose(); + } + + public void initializeFieldColumns(final int _nType, final String TableName, final String[] FieldNames) + { + getRecordParser().initializeFieldColumns(FieldNames, TableName); + + final com.sun.star.wizards.db.RecordParser a = getRecordParser(); + int[] FieldTypes = new int[FieldNames.length]; + int[] FieldWidths = new int[FieldNames.length]; + for (int i = 0; i < FieldNames.length; i++) + { + FieldTypes[i] = a.FieldColumns[i].getFieldType(); + FieldWidths[i] = a.FieldColumns[i].getFieldWidth(); + } + getReportBuilderLayouter().setTableName(_nType, TableName); + getReportBuilderLayouter().insertFieldNames(FieldNames); + getReportBuilderLayouter().insertFieldTypes(FieldTypes); + getReportBuilderLayouter().insertFieldWidths(FieldWidths); + + getReportBuilderLayouter().layout(); + } + + public void setFieldTitles(String[] _aFieldTitles) + { + getRecordParser().setFieldTitles(_aFieldTitles); + + getReportBuilderLayouter().insertFieldTitles(_aFieldTitles); + getReportBuilderLayouter().layout(); + } + + public void setSorting(String[][] _aSortFieldNames) + { + getRecordParser().setSortFieldNames(_aSortFieldNames); + if (groupNames != null) + { + getRecordParser().prependSortFieldNames(groupNames); + } + getReportBuilderLayouter().insertSortingNames(_aSortFieldNames); + getReportBuilderLayouter().layout(); + } + + public void setGrouping(String[] _aGroupFieldNames) + { + groupNames = _aGroupFieldNames; + getRecordParser().prependSortFieldNames(_aGroupFieldNames); + + getReportBuilderLayouter().insertGroupNames(_aGroupFieldNames); + getReportBuilderLayouter().layout(); + } + + public String getLayoutPath() + { + return "default"; + } + private ArrayList<String> m_aReportPath; + + public ArrayList<String> getReportPath() + { + if (m_aReportPath == null) + { + // Check general availability of office paths + m_aReportPath = FileAccess.getOfficePaths(getMSF(), "Template"); + FileAccess.combinePaths(getMSF(), m_aReportPath, "/wizard/report"); + } + return m_aReportPath; + } + + public String getContentPath() + { + return PropertyNames.EMPTY_STRING; + } + + public int getDefaultPageOrientation() + { + return m_nDefaultPageOrientation; + } + + private LinkedHashMap<String, IReportBuilderLayouter> m_aLayoutMap = null; + + private void insertIntoLayoutMap(IReportBuilderLayouter _aLayout) + { + insertIntoLayoutMap(_aLayout, false); + } + + private void insertIntoLayoutMap(IReportBuilderLayouter _aLayout, boolean _bDefault) + { + if (_aLayout != null) + { + final String sName = _aLayout.getName(); + if (_bDefault) + { + m_sReportBuilderLayoutName = sName; // here we set the default layout name! + } + m_aLayoutMap.put(sName, _aLayout); + } + } + + /** + * Initialize all well known com.sun.star.wizards.report.layout.ReportBuilderLayouter Objects and create exact one instance. + */ + private LinkedHashMap<String, IReportBuilderLayouter> getLayoutMap() + { + if (m_aLayoutMap == null) + { + // The LayoutMap is empty, so we create a new LinkedHashMap + m_aLayoutMap = new LinkedHashMap<String, IReportBuilderLayouter>(); + + // TODO: We must know the name of a layouts, There should be a way to say where to find, not the names. + IReportBuilderLayouter aLayout = new com.sun.star.wizards.reportbuilder.layout.Tabular(this, m_resource); + insertIntoLayoutMap(aLayout, true); + aLayout = new com.sun.star.wizards.reportbuilder.layout.ColumnarSingleColumn(this, m_resource); + insertIntoLayoutMap(aLayout); + aLayout = new com.sun.star.wizards.reportbuilder.layout.ColumnarTwoColumns(this, m_resource); + insertIntoLayoutMap(aLayout); + aLayout = new com.sun.star.wizards.reportbuilder.layout.ColumnarThreeColumns(this, m_resource); + insertIntoLayoutMap(aLayout); + aLayout = new com.sun.star.wizards.reportbuilder.layout.InBlocksLabelsAbove(this, m_resource); + insertIntoLayoutMap(aLayout); + aLayout = new com.sun.star.wizards.reportbuilder.layout.InBlocksLabelsLeft(this, m_resource); + insertIntoLayoutMap(aLayout); + + } + return m_aLayoutMap; + } + + /** + * Return a string array array with all found layouts + * At the moment these layout are hard coded + */ + public String[][] getDataLayout() + { + String[][] ContentFiles; + ContentFiles = new String[2][]; + String[] a = new String[getLayoutMap().size()]; + String[] b = new String[getLayoutMap().size()]; + + // run through the whole layoutmap and + final Set<String> aKeys = getLayoutMap().keySet(); + final Iterator<String> aKeyIterator = aKeys.iterator(); + int i = 0; + while (aKeyIterator.hasNext()) + { + final String sKey = aKeyIterator.next(); + a[i] = sKey; + final IReportBuilderLayouter aLayouter = m_aLayoutMap.get(sKey); + b[i++] = aLayouter.getLocalizedName(); + } + + ContentFiles[1] = a; + ContentFiles[0] = b; + return ContentFiles; + } + private String m_sDefaultHeaderLayoutPath; + + public String[][] getHeaderLayout() + { + String[][] LayoutFiles; + try + { + // TODO: check different languages in header layouts + ArrayList<String> aReportPath = FileAccess.getOfficePaths(getMSF(), "Template"); + FileAccess.combinePaths(getMSF(), aReportPath, "/wizard/report"); + + LayoutFiles = FileAccess.getFolderTitles(getMSF(), null, aReportPath, ".otr"); + } + catch (com.sun.star.wizards.common.NoValidPathException e) + { + // if there are problems, don't show anything is a little bit hard. + LayoutFiles = new String[2][]; + String[] a = new String[] { "DefaultLayoutOfHeaders" }; + String[] b = new String[] { "default" }; + LayoutFiles[1] = a; + LayoutFiles[0] = b; + } + for (int i = 0; i < LayoutFiles[0].length; i++) + { + if (LayoutFiles[0][i].equals("default")) + { + m_sDefaultHeaderLayoutPath = LayoutFiles[1][i]; + break; + } + } + exchangeLayoutTitlesWithLocalisedOnes(LayoutFiles); + return LayoutFiles; + } + + private void exchangeLayoutTitlesWithLocalisedOnes(String[][] LayoutFiles) + { + for(int i = 0; i < LayoutFiles[0].length; ++i) + { + if( LayoutFiles[0][i] == null) { break;} + if( LayoutFiles[0][i].equals("default") ) + { + LayoutFiles[0][i] = m_resource.getResText("RID_REPORT_100"); + } + } + } + + public XReportDefinition getReportDefinition() + { + if (m_reportDocument == null) + { + throw new NullPointerException("Report Definition is not already initialized, check if you too early access the report definition."); + } + return m_reportDocument; + } + + public XMultiServiceFactory getGlobalMSF() + { + return getMSF(); + } + + public void importReportData(ReportWizard aWizard) + { + } + + public String getDefaultHeaderLayout() + { + return m_sDefaultHeaderLayoutPath; + } + + public void setCommand(String _sCommand) + { + getRecordParser().Command = _sCommand; + getReportDefinition().setCommand(_sCommand); + } + + public void setCommandType(int _nCommand) + { + getReportDefinition().setCommandType(_nCommand); + } + + public void checkInvariants() throws java.lang.Exception + { + final String sDefaultHeaderLayoutPath = getDefaultHeaderLayout(); + if (sDefaultHeaderLayoutPath == null) + { + throw new java.io.IOException("default.otr"); + } + + FileAccess aAccess = new FileAccess(getGlobalMSF()); + if (!aAccess.exists(sDefaultHeaderLayoutPath, true)) + { + throw new java.io.IOException("default.otr"); + } + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java new file mode 100644 index 000000000..e31e6cc96 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarSingleColumn.java @@ -0,0 +1,91 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +public class ColumnarSingleColumn extends ReportBuilderLayouter +{ + + public ColumnarSingleColumn(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "ColumnarSingleColumnLayoutOfData"; + } + + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_81"); + } + + @Override + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + + final int nLabelWidth = getMaxLabelWidth(); + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + + final int nWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()) - nLabelWidth; + + for (int i = 0; i < aFieldNames.length; i++) + { + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + final String sLabel = aFieldTitleNames[i]; + aRect = insertLabel(xSection, sLabel, aRect, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSOTextField); + int nHeight = aRect.Height; + aRect.Y += Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight), nHeight); + } + aRect.Y += aSOLabel.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRect.Y); + doNotBreakInTable(xSection); + } + + @Override + protected void insertDetailFieldTitles(int lastGroupPosition) + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java new file mode 100644 index 000000000..81d4ad50a --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarThreeColumns.java @@ -0,0 +1,49 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +public class ColumnarThreeColumns extends ColumnarTwoColumns +{ + + public ColumnarThreeColumns(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + @Override + public String getName() + { + return "ColumnarThreeColumnsLayoutOfData"; + } + + @Override + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_83"); + } + + @Override + protected void insertDetailFields() + { + insertDetailFields(3); + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java new file mode 100644 index 000000000..6d21dce05 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ColumnarTwoColumns.java @@ -0,0 +1,123 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +public class ColumnarTwoColumns extends ReportBuilderLayouter +{ + + public ColumnarTwoColumns(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "ColumnarTwoColumnsLayoutOfData"; + } + + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_82"); + } + + @Override + protected void insertDetailFields() + { + insertDetailFields(2); + } + + protected void insertDetailFields(int _nColumns) + { + copyDetailProperties(); + + if (_nColumns < 1) + { + return; + } + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + + final int nLabelWidth = getMaxLabelWidth(); // 3000; + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + int i = 0; + int nRows = aFieldNames.length / _nColumns; + if ((aFieldNames.length % _nColumns) != 0) + { + ++nRows; + } + final int nWidth = (nUsablePageWidth - nLabelWidth * _nColumns) / _nColumns; + if (nWidth < 0) + { + // TODO: error message in logging + return; + } + + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + int nMaxHeight = 0; + for (int x = 0; x < _nColumns; x++) + { + aRect.Y = 0; + for (int y = 0; y < nRows; y++) + { + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()) + x * (nWidth + nLabelWidth); + if (i < aFieldNames.length) + { + final String sLabel = aFieldTitleNames[i]; + aRect = insertLabel(xSection, sLabel, aRect, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSOTextField); + + aRect.Y += Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight), aRect.Height); + ++i; + } + } + nMaxHeight = Math.max(aRect.Y, nMaxHeight); + } + aRect.Y = Math.max(aSOLabel.getHeight(LayoutConstants.LabelHeight) * nRows, nMaxHeight); + aRect.Y += aSOLabel.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRect.Y); + doNotBreakInTable(xSection); + } + + @Override + protected void insertDetailFieldTitles(int lastGroupPosition) + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java b/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java new file mode 100644 index 000000000..a7343d901 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/DesignTemplate.java @@ -0,0 +1,302 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XFixedText; +import com.sun.star.report.XFormattedField; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XReportDefinition; +import com.sun.star.report.XSection; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +public class DesignTemplate +{ + + private XReportDefinition m_xReportDefinition; + + private DesignTemplate() + { + } + + // All functions from XReportDefinition, we use + + XGroups getGroups() + { + return m_xReportDefinition.getGroups(); + } + + XSection getDetail() + { + return m_xReportDefinition.getDetail(); + } + + boolean getReportHeaderOn() + { + return m_xReportDefinition.getReportHeaderOn(); + } + + XSection getReportHeader() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getReportHeader(); + } + + boolean getReportFooterOn() + { + return m_xReportDefinition.getReportFooterOn(); + } + + XSection getReportFooter() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getReportFooter(); + } + + boolean getPageHeaderOn() + { + return m_xReportDefinition.getPageHeaderOn(); + } + + XSection getPageHeader() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getPageHeader(); + } + + boolean getPageFooterOn() + { + return m_xReportDefinition.getPageFooterOn(); + } + + XSection getPageFooter() throws com.sun.star.container.NoSuchElementException + { + return m_xReportDefinition.getPageFooter(); + } + private SectionObject m_aDetailLabel; + private SectionObject m_aDetailTextField; + private SectionObject[] m_aGroupLabel; + private SectionObject[] m_aGroupTextField; + + SectionObject getDetailLabel() + { + if (m_aDetailLabel == null) + { + return SectionEmptyObject.create(); + } + return m_aDetailLabel; + } + + SectionObject getDetailTextField() + { + if (m_aDetailTextField == null) + { + return SectionEmptyObject.create(); + } + return m_aDetailTextField; + } + + SectionObject getGroupTextField(int _nGroup) + { + return getGroupSectionObject(m_aGroupTextField, _nGroup); + } + + SectionObject getGroupLabel(int _nGroup) + { + return getGroupSectionObject(m_aGroupLabel, _nGroup); + } + + private SectionObject getGroupSectionObject(SectionObject _aGroupList[], int _nGroup) + { + SectionObject a = null; + if (_nGroup < _aGroupList.length) + { + a = _aGroupList[_nGroup]; + } + else + { + // if there are not enough groups, the last one will win + if (_aGroupList.length > 0) + { + a = _aGroupList[_aGroupList.length - 1]; + } + } + // we show if the group is null + if (a == null) + { + a = SectionEmptyObject.create(); + // an empty group has to use bold font + a.setPropertyValue("CharWeight", new Float(com.sun.star.awt.FontWeight.BOLD)); + } + return a; + } + + // we analyse the loaded ReportDefinition, we want to know the FontDescriptor of all XSections + private void analyseReportDefinition() + { + final XSection xDetailSection = m_xReportDefinition.getDetail(); + final int nDetailCount = xDetailSection.getCount(); + for (int i = 0; i < nDetailCount; i++) + { + try + { + Object aObj = xDetailSection.getByIndex(i); + // is aObj a label + // is aObj a textfield + // m_aDetailLabel_FD + // m_aDetailTextField_FD + XFixedText aFixedText = UnoRuntime.queryInterface(XFixedText.class, aObj); + if (aFixedText != null && + m_aDetailLabel == null) + { + m_aDetailLabel = SectionLabel.create(aFixedText); + } + else + { + XFormattedField aFormattedField = UnoRuntime.queryInterface(XFormattedField.class, aObj); + if (aFormattedField != null && + m_aDetailTextField == null) + { + m_aDetailTextField = SectionTextField.create(aFormattedField); + } + } + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + + final XGroups xGroups = m_xReportDefinition.getGroups(); + final int nGroupCount = xGroups.getCount(); + // create a m_aGroupLabel_FD[] + // create a m_aGroupTextField_FD[] + m_aGroupLabel = new SectionObject[nGroupCount]; + m_aGroupTextField = new SectionObject[nGroupCount]; + + for (int nGroup = 0; nGroup < nGroupCount; nGroup++) + { + try + { + Object aGroup = xGroups.getByIndex(nGroup); + XGroup xGroup = UnoRuntime.queryInterface(XGroup.class, aGroup); + XSection xGroupSection = xGroup.getHeader(); + + final int nCount = xGroupSection.getCount(); + for (int i = 0; i < nCount; i++) + { + try + { + Object aObj = xGroupSection.getByIndex(i); + XFixedText aFixedText = UnoRuntime.queryInterface(XFixedText.class, aObj); + // is aObj a label + // is aObj a textfield + if (aFixedText != null && + m_aGroupLabel[nGroup] == null) + { + m_aGroupLabel[nGroup] = SectionLabel.create(aFixedText); + } + else + { + XFormattedField aFormattedField = UnoRuntime.queryInterface(XFormattedField.class, aObj); + if (aFormattedField != null && + m_aGroupTextField[nGroup] == null) + { + m_aGroupTextField[nGroup] = SectionTextField.create(aFormattedField); + } + } + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + } + catch (com.sun.star.container.NoSuchElementException ex) + { + } + catch (com.sun.star.lang.IndexOutOfBoundsException ex) + { + } + catch (com.sun.star.lang.WrappedTargetException ex) + { + } + } + } + + /** + * close our current ReportDefinition + */ + void close() + { + try + { + m_xReportDefinition.close(true); + } + catch (com.sun.star.util.CloseVetoException e) + { + } + } + + /** + * create a new DesignTemplate by try to load an otr file from the given path. + * Internally we store the loaded ReportDefinition. + */ + public static DesignTemplate create(XMultiServiceFactory _xMSF, String _sPath) + { + DesignTemplate a = new DesignTemplate(); + try + { + a.load(_xMSF, _sPath); + } + catch (com.sun.star.lang.WrappedTargetRuntimeException e) + { + // this should not happen + a = null; + throw new java.lang.RuntimeException(e); + } + catch (com.sun.star.uno.Exception e) + { + a = null; + } + catch (Exception e) + { + a = null; + } + return a; + } + + private void load(XMultiServiceFactory _xMSF, String _sPath) throws com.sun.star.uno.Exception + { + final Object aObj = _xMSF.createInstance("com.sun.star.report.ReportDefinition"); + m_xReportDefinition = UnoRuntime.queryInterface(XReportDefinition.class, aObj); + + PropertyValue[] aLoadProps = new PropertyValue[2]; + aLoadProps[0] = Properties.createProperty(PropertyNames.URL, _sPath); + aLoadProps[1] = Properties.createProperty(PropertyNames.READ_ONLY, Boolean.TRUE); + + m_xReportDefinition.load(aLoadProps); + analyseReportDefinition(); + } + +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java new file mode 100644 index 000000000..08dbc2db5 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsAbove.java @@ -0,0 +1,148 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +public class InBlocksLabelsAbove extends ColumnarTwoColumns +{ + + public InBlocksLabelsAbove(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + @Override + public String getName() + { + return "InBlocksLabelsAboveLayoutOfData"; + } + + @Override + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_85"); + } + + @Override + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRectLabels = new Rectangle(); + Rectangle aRectFields = new Rectangle(); + + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + + int i = 0; + int nCount = aFieldTitleNames.length; + aRectLabels.Y = 0; + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + aRectFields.Y = LayoutConstants.LabelHeight; + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + // first run only calculates the width. + int nDelta = 0; + int nFieldWidth = 3000; + while (nCount > 0) + { + aRectFields.X += nFieldWidth; + + final int nNextX = aRectFields.X + nFieldWidth; + if (nNextX > (getPageWidth() - getRightPageIndent())) + { + // all other values are not from interest. + break; + } + + ++i; + --nCount; + } + final int nDeltaTotal = nUsablePageWidth - i * nFieldWidth; + nDelta = nDeltaTotal; + if (i > 0) + { + nDelta = nDeltaTotal / i; + } + + aRectLabels.Y = 0; + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + final SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + final SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + + aRectFields.Y = aSOLabel.getHeight(LayoutConstants.LabelHeight); + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + i = 0; + nCount = aFieldTitleNames.length; + int nLastHeight = 0; + while (nCount > 0) + { + final String sLabel = aFieldTitleNames[i]; + final int nLabelWidth = 3000 + nDelta; + aRectLabels = insertLabel(xSection, sLabel, aRectLabels, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + nFieldWidth = 3000 + nDelta; + aRectFields = insertFormattedField(xSection, sFieldName, aRectFields, nFieldWidth, aSOTextField); + nLastHeight = Math.max(nLastHeight, aRectFields.Height); + int nNextX = aRectFields.X + nFieldWidth; + if ((nNextX > (getPageWidth() - getRightPageIndent())) && nCount > 1) + { + int nHeight = (aSOLabel.getHeight(LayoutConstants.LabelHeight) + Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight)); + nLastHeight = 0; + aRectLabels.Y += nHeight; // 2 * label height + aRectLabels.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + aRectFields.Y += nHeight; + aRectFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + } + ++i; + --nCount; + } + aRectFields.Y += Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight); + aRectFields.Y += aSOTextField.getHeight(LayoutConstants.EmptyLineHeight); // one empty line + xSection.setHeight(aRectFields.Y); + doNotBreakInTable(xSection); + } + + @Override + protected void insertDetailFieldTitles(int lastGroupPosition) + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java new file mode 100644 index 000000000..cf88cb29a --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/InBlocksLabelsLeft.java @@ -0,0 +1,119 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XSection; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.*; + +public class InBlocksLabelsLeft extends ColumnarTwoColumns +{ + + public InBlocksLabelsLeft(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + @Override + public String getName() + { + return "InBlocksLabelsLeftLayoutOfData"; + } + + @Override + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_84"); + } + + @Override + protected void insertDetailFields() + { + copyDetailProperties(); + + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null) + { + return; + } + final String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRectLabelFields = new Rectangle(); + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + + final int nLabelWidth = getMaxLabelWidth(); // 3000; + int nFieldWidth = 3000; + + final int nFactor = nUsablePageWidth / (nLabelWidth + nFieldWidth); + int nDeltaTotal = 0; + int nDelta = 0; + if (nFactor > 0) + { + nDeltaTotal = nUsablePageWidth - (nFactor * (nLabelWidth + nFieldWidth)); + nDelta = nDeltaTotal / nFactor; + } + + int i = 0; + int nCount = aFieldTitleNames.length; + aRectLabelFields.Y = 0; + aRectLabelFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + SectionObject aSOLabel = getDesignTemplate().getDetailLabel(); + aSOLabel.setFontToBold(); + SectionObject aSOTextField = getDesignTemplate().getDetailTextField(); + int nLastHeight = 0; + while (nCount > 0) + { + final String sLabel = aFieldTitleNames[i]; + aRectLabelFields = insertLabel(xSection, sLabel, aRectLabelFields, nLabelWidth, aSOLabel); + final String sFieldName = convertToFieldName(aFieldNames[i]); + nFieldWidth = 3000 + nDelta; + aRectLabelFields = insertFormattedField(xSection, sFieldName, aRectLabelFields, nFieldWidth, aSOTextField); + nLastHeight = Math.max(aRectLabelFields.Height, nLastHeight); + final int nNextX = aRectLabelFields.X + nLabelWidth + nFieldWidth; + if (nNextX > (getPageWidth() - getRightPageIndent())) + { + // TODO: label height is fix + aRectLabelFields.Y += Math.max(aSOTextField.getHeight(LayoutConstants.FormattedFieldHeight), nLastHeight); + nLastHeight = 0; + aRectLabelFields.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + } + ++i; + --nCount; + } + aRectLabelFields.Y += Math.max(aSOLabel.getHeight(LayoutConstants.EmptyLineHeight), nLastHeight); // one empty line + xSection.setHeight(aRectLabelFields.Y); + doNotBreakInTable(xSection); + } + + @Override + protected void insertDetailFieldTitles(int lastGroupPosition) + { + // we won't extra field titles + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java b/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java new file mode 100644 index 000000000..9b294a12d --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/LayoutConstants.java @@ -0,0 +1,37 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.reportbuilder.layout; + +public class LayoutConstants +{ + public static final int LabelHeight = 500; + public static final int FormattedFieldHeight = 500; + public static final int EmptyLineHeight = 500; + + public static final int BinaryHeight = 4000; + public static final int MemoFieldHeight = 4000; + + public static final int LineHeight = 250; + + /** + * Groups will indent + * This is the factor (5mm) which will multiply with the current indent + */ + public static final int IndentFactorWidth = 500; +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java b/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java new file mode 100644 index 000000000..cfa2071a3 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/ReportBuilderLayouter.java @@ -0,0 +1,1582 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.Rectangle; +import com.sun.star.awt.Size; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XLayoutConstrains; +import com.sun.star.awt.XUnitConversion; +import com.sun.star.awt.XWindow; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.Property; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.XPropertySet; +import com.sun.star.beans.XPropertySetInfo; +import com.sun.star.container.XEnumeration; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.report.XFixedLine; +import com.sun.star.report.XFixedText; +import com.sun.star.report.XFormattedField; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XImageControl; +import com.sun.star.report.XReportComponent; +import com.sun.star.report.XReportControlModel; +import com.sun.star.report.XReportDefinition; +import com.sun.star.report.XSection; +import com.sun.star.drawing.XShape; +import com.sun.star.sdbc.DataType; +import com.sun.star.style.XStyle; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XNumberFormatTypes; +import com.sun.star.util.XNumberFormats; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.FileAccess; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.PropertySetHelper; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportBuilderLayouter; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +import java.util.HashMap; +import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * This class is abstract and more like a helper for create different layouts for Report Builder Wizard. + */// TODO: let a little bit place between 2 formatted fields +// TODO: move all sectionobjects which have a connect to the right max page width to left if there is a orientation change. +abstract public class ReportBuilderLayouter implements IReportBuilderLayouter +{ + + private IReportDefinitionReadAccess m_xReportDefinitionReadAccess; + private final Resource m_aResource; + private String[][] m_aSortNames; + + /** + * dispose the ReportBuilderLayouter + */ + public void dispose() + { + closeDesignTemplate(); + m_xReportDefinitionReadAccess = null; + } + + /** + * The Constructor is protected, this is an abstract class, use Tabular or other to create an instance. + * @param _xDefinitionAccess + * @param _aResource + */ + protected ReportBuilderLayouter(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + m_xReportDefinitionReadAccess = _xDefinitionAccess; + m_aResource = _aResource; + } + + /** + * Access to the current ReportDefinition + * @return the ReportDefinition + */ + public XReportDefinition getReportDefinition() + { + // we have to ask our parent for this value + return m_xReportDefinitionReadAccess.getReportDefinition(); + } + + /** + * Access to the global MultiServiceFactory + * @return the global Service Factory + */ + private XMultiServiceFactory getGlobalMSF() + { + return m_xReportDefinitionReadAccess.getGlobalMSF(); + } + + /** + * Layout the complete report new, by all information we know until this time. + * + * If there are some information less, it is no problem for this function, they will be leaved out. + * It is possible to call this function after every change, but be careful, could take a little bit longer. + */ + public synchronized void layout() + { + try + { + // we bring the clear and insert methods together, this should be a little bit smoother + clearReportHeader(); + insertReportHeader(); + + clearReportFooter(); + insertReportFooter(); + + clearPageHeader(); + insertPageHeader(); + + clearPageFooter(); + insertPageFooter(); + + clearGroups(); + int lastGroupPosition = insertGroups(); + + clearDetails(); + insertDetailFieldTitles(lastGroupPosition); + insertDetailFields(); + } + catch (java.lang.ArrayIndexOutOfBoundsException e) + { + // could happen, if you change the count of values + } + catch (java.lang.RuntimeException e) + { + throw e; + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + + + /** + * Remove all Groups + */ + private void clearGroups() + { + final XGroups xGroups = getReportDefinition().getGroups(); + while (xGroups.hasElements()) + { + try + { + xGroups.removeByIndex(0); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + + /** + * Remove all fields + * @param _xSectionToClear + */ + private void emptySection(XSection _xSectionToClear) + { + if (_xSectionToClear == null) + { + return; + } + while (_xSectionToClear.hasElements()) + { + try + { + final Object aObj = _xSectionToClear.getByIndex(0); + final XShape aShape = UnoRuntime.queryInterface(XShape.class, aObj); + _xSectionToClear.remove(aShape); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + + } + } + + private void clearDetails() + { + final XSection xSection = getReportDefinition().getDetail(); + emptySection(xSection); + } + + /** + * @param _nGroupCount + * @return the left indent in 1/100mm + */ + protected int getLeftGroupIndent(int _nGroupCount) + { +// TODO: Fix values for group indent (1/2cm) only the first 2 groups + int nIndent = 0; + final int MAX_INDENT = 2; + if (_nGroupCount <= MAX_INDENT) + { + nIndent = _nGroupCount * LayoutConstants.IndentFactorWidth; + } + else + { + nIndent = MAX_INDENT * LayoutConstants.IndentFactorWidth; + } + return nIndent; + } + + private int m_nLeftIndent = -1; + + /** + * Get left page indent. + * The left indent is the area on the left side which will no be printed. + * The default is 2000 1/100mm what is 2cm of DIN A4. + * @return the left indent in 1/100mm + */ + protected int getLeftPageIndent() + { + if (m_nLeftIndent < 0) + { + m_nLeftIndent = getFromPageStyles("LeftMargin", 2000); + } + return m_nLeftIndent; + } + + private int m_nRightIndent = -1; + + /** + * Get right page indent. + * The right indent is the area on the right side which will no be printed. + * The default is 2000 1/100mm what is 2cm of DIN A4. + * @return the right indent in 1/100mm + */ + protected int getRightPageIndent() + { + if (m_nRightIndent < 0) + { + m_nRightIndent = getFromPageStyles("RightMargin", 2000); + } + return m_nRightIndent; + } + + private XStyle getUsedStyle(String _sStyleName) + { + XStyle aUsedStyle = null; + final XNameAccess xNameAccess = getReportDefinition().getStyleFamilies(); + try + { + // get all Page Styles + final Object aPageStylesObj = xNameAccess.getByName(_sStyleName); + final XNameAccess xContainer = UnoRuntime.queryInterface(XNameAccess.class, aPageStylesObj); + + // step over all Page Styles, search the one which is in use + final String[] aElementNames = xContainer.getElementNames(); + for (int i = 0; i < aElementNames.length; i++) + { + final String sName = aElementNames[i]; + final Object aObj = xContainer.getByName(sName); + final XStyle xStyle = UnoRuntime.queryInterface(XStyle.class, aObj); + if (xStyle.isInUse()) + { + aUsedStyle = xStyle; + break; + } + } + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + return aUsedStyle; + } + + private int getFromPageStyles(String _sStyleName, int _nDefault) + { + int nValue = _nDefault; + final XStyle xStyle = getUsedStyle("PageStyles"); + if (xStyle != null) + { + // we found the page style which is in use + final PropertySetHelper aHelper = new PropertySetHelper(xStyle); + nValue = aHelper.getPropertyValueAsInteger(_sStyleName, nValue); + } + return nValue; + } + + private void setToPageStyles(String _sStyleName, Object _aObj) + { + final XStyle xStyle = getUsedStyle("PageStyles"); + if (xStyle != null) + { + final PropertySetHelper aHelper = new PropertySetHelper(xStyle); + aHelper.setPropertyValueDontThrow(_sStyleName, _aObj); + } + } + + private int m_nPageWidth = -1; + + /** + * Get page width. The default is 21000 1/100mm what is 21cm of DIN A4. + * @return the Width of the page in 1/100mm + */ + protected int getPageWidth() + { + if (m_nPageWidth < 0) + { + m_nPageWidth = getFromPageStyles(PropertyNames.PROPERTY_WIDTH, 21000); + } + return m_nPageWidth; + } + + + /** + * Stores the Group names. To insert/create a report with such group names, call layout() + */ + public void insertGroupNames(String[] _aGroupNames) + { + m_aGroupNames = _aGroupNames; + } + + public void insertSortingNames(String[][] _aSortFieldNames) + { + m_aSortNames = _aSortFieldNames; + } + + protected void copyGroupProperties(int _nGroup) + { + if (getDesignTemplate() != null) + { + try + { + final XGroups xForeignGroups = getDesignTemplate().getGroups(); + if (_nGroup < xForeignGroups.getCount()) + { + XGroup xForeignGroup = UnoRuntime.queryInterface(XGroup.class, xForeignGroups.getByIndex(_nGroup)); + XSection xForeignGroupSection = xForeignGroup.getHeader(); + + if (xForeignGroupSection != null) + { + final XGroups xGroups = getReportDefinition().getGroups(); + Object aGroup = xGroups.getByIndex(_nGroup); + XGroup xGroup = UnoRuntime.queryInterface(XGroup.class, aGroup); + XSection xGroupSection = xGroup.getHeader(); + + // copy Properties + copyProperties(xForeignGroupSection, xGroupSection); + } + } + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + + private int insertGroups() + { + final XGroups xGroups = getReportDefinition().getGroups(); + int lastGroupPosition = -1; + + if (m_aGroupNames != null) + { + final int nLeftPageIndent = getLeftPageIndent(); + final int nLabelWidth = getMaxLabelWidth(); // 3000; + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - getLeftGroupIndent(getCountOfGroups()); + final int nFieldWidth = nUsablePageWidth - nLabelWidth; + + XGroup aLastGroup = null; + // after done with all groups, we need access to the last group, for set property 'KeepTogether' so we remember it. + + for (int i = 0; i < m_aGroupNames.length; i++) + { + lastGroupPosition = i; + final XGroup xGroup = xGroups.createGroup(); + aLastGroup = xGroup; + + xGroup.setExpression(m_aGroupNames[i]); + xGroup.setHeaderOn(true); + + try + { + int nCount = xGroups.getCount(); + xGroups.insertByIndex(nCount, xGroup); + final XSection xGroupSection = xGroup.getHeader(); + copyGroupProperties(nCount); + + Rectangle aRect = new Rectangle(); + aRect.X = nLeftPageIndent + getLeftGroupIndent(i); + SectionObject aSO = getDesignTemplate().getGroupLabel(i); + aRect = insertLabel(xGroupSection, getTitleFromFieldName(m_aGroupNames[i]), aRect, nLabelWidth, aSO); + final String sGroupName = convertToFieldName(m_aGroupNames[i]); + aSO = getDesignTemplate().getGroupTextField(i); + aRect = insertFormattedField(xGroupSection, sGroupName, aRect, nFieldWidth, aSO); + int height = aRect.Height; + + // draw a line under the label/formattedfield + aRect.X = nLeftPageIndent + getLeftGroupIndent(i); + aRect.Y = aRect.Height; + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xGroupSection, aRect, nLineWidth, nLineHeight); + xGroupSection.setHeight(height + nLineHeight); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + + // hold the inner group together + if (aLastGroup != null) + { + doNotBreakInTable(aLastGroup); + } + } + if (m_aSortNames != null) + { + for (String[] sortFieldName : m_aSortNames) + { + try + { + final XGroup xGroup = xGroups.createGroup(); + xGroup.setExpression(sortFieldName[0]); + xGroup.setSortAscending(PropertyNames.ASC.equals(sortFieldName[1])); + xGroup.setHeaderOn(false); + int nCount = xGroups.getCount(); + xGroups.insertByIndex(nCount, xGroup); + } + catch (java.lang.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + return lastGroupPosition; + } + + + /** + * Give a list off all field title names to insert the field title names, call layout() + */ + public void insertFieldTitles(String[] _aFieldTitleNames) + { + m_aFieldTitleNames = _aFieldTitleNames; + } + + + private String getTitleFromFieldName(String _sField) + { + for (int i = 0; i < m_aFieldNames.length; i++) + { + if (m_aFieldNames[i].equals(_sField)) + { + return m_aFieldTitleNames[i]; + } + } + return PropertyNames.EMPTY_STRING; + } + + private int getTypeFromFieldName(String _sField) + { + for (int i = 0; i < m_aFieldNames.length; i++) + { + if (m_aFieldNames[i].equals(_sField)) + { + return m_aFieldTypes[i]; + } + } + return 0; + } + + private boolean listContains(String[] _aList, String _aValue) + { + for (int i = 0; i < _aList.length; i++) + { + if (_aList[i].equals(_aValue)) + { + return true; + } + } + return false; + } + + + /** + * Helper to get all field names without the names which are already in the group names + * @param _aList + * @param _aGetResultFrom + * @return + */ + private String[] getNamesWithoutGroupNames(String[] _aList, String[] _aGetResultFrom) + { + if (_aList == null) + { + return new String[] + { + }; /* empty list */ + } + if (getCountOfGroups() == 0) + { + if (_aGetResultFrom != null) + { + return _aGetResultFrom; + } + return _aList; + } + final int nNewLength = _aList.length - getCountOfGroups(); + String[] aNewList = new String[nNewLength]; + int j = 0; + for (int i = 0; i < _aList.length; i++) + { + final String sField = _aList[i]; + if (listContains(m_aGroupNames, sField)) + { + continue; + } + if (_aGetResultFrom != null) + { + aNewList[j++] = _aGetResultFrom[i]; + } + else + { + aNewList[j++] = sField; + } + if (j == nNewLength) + { + break; // Emergency break, we leave the result list. + } + } + return aNewList; + } + + + protected int calculateFieldWidth(int _nLeftIndent, int _nFieldCount) + { + int nWidth = 3000; + if (_nFieldCount > 0) + { + nWidth = (getPageWidth() - getLeftPageIndent() - getRightPageIndent() - _nLeftIndent) / _nFieldCount; + } + return nWidth; + } + + protected String[] getFieldTitleNames() + { + return getNamesWithoutGroupNames(m_aFieldNames, m_aFieldTitleNames); + } + + + abstract protected void insertDetailFieldTitles(int lastGroupPosition); + + + /** + * Give a list off all field names to insert the field names, call layout() + */ + public void insertFieldNames(String[] _aFieldNames) + { + m_aFieldNames = _aFieldNames; + } + + public void insertFieldTypes(int[] _aFieldTypes) + { + m_aFieldTypes = _aFieldTypes; + } + + public void insertFieldWidths(int[] _aFieldWidths) + { + m_aFieldWidths = _aFieldWidths; + } + + protected int getCountOfGroups() + { + return ((m_aGroupNames == null) ? 0 : m_aGroupNames.length); + } + + + protected String[] getFieldNames() + { + return getNamesWithoutGroupNames(m_aFieldNames, null); + } + + abstract protected void insertDetailFields(); + + protected void copyDetailProperties() + { + if (getDesignTemplate() != null) + { + try + { + XSection xForeignSection = getDesignTemplate().getDetail(); + if (xForeignSection != null) + { + XSection xSection = getReportDefinition().getDetail(); + + // copy Properties + copyProperties(xForeignSection, xSection); + } + } + catch (Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + } + + + protected Rectangle insertLabel(XSection _xSection, String _sLabel, Rectangle _aRect, int _nWidth, SectionObject _aSO) + { + if (_xSection != null) + { + try + { + final Object aFixedText = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedText"); + final XFixedText xFixedText = UnoRuntime.queryInterface(XFixedText.class, aFixedText); + + + int nHeight = LayoutConstants.LabelHeight; // default height of label is fixed. + if (_aSO != null) + { + if (_aSO instanceof SectionEmptyObject) + { + float fCharWeight = _aSO.getCharWeight(com.sun.star.awt.FontWeight.NORMAL); + if (fCharWeight > 0.1f) + { + xFixedText.setCharWeight(fCharWeight); + } + } + else + { +// TODO: there seems to be some problems with copy all properties from the design template to the current design + final FontDescriptor aFD = _aSO.getFontDescriptor(); + if (aFD != null) + { + xFixedText.setFontDescriptor(aFD); + copyProperties(_aSO.getParent(), xFixedText); + } + nHeight = _aSO.getHeight(LayoutConstants.LabelHeight); + } + } + xFixedText.setLabel(_sLabel); + + xFixedText.setPositionX(_aRect.X); + xFixedText.setPositionY(_aRect.Y); + + // Width will calculate from outside. + // We have to set, because there exist no right default (0) + xFixedText.setWidth(_nWidth); + _aRect.X += _nWidth; + xFixedText.setHeight(nHeight); + _xSection.add(xFixedText); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + return _aRect; + } + + + protected String convertToFieldName(String _sElementName) + { + final StringBuffer aDataField = new StringBuffer(32); + aDataField.append("field:[").append(_sElementName).append(']'); + return aDataField.toString(); + + } + + private String convertFromFieldName(String _sName) + { + if (_sName.startsWith("field:[")) + { + int nCloseBrace = _sName.lastIndexOf(']'); + return _sName.substring(7, nCloseBrace).trim(); + } + return _sName; + } + + + /** + * Insert an already formatted field name into a given section + * + * Use 'convertToFieldName(dbfield)' to convert a dbfield name in the right. + * + * @param _xSection in which section the formatted field will store + * @param _sFormattedfield as String a dbfield or another function + * @param _aRect .X, .Y are the absolute position (1/100mm) where the formatted field will set + * @param _nWidth the width of the field in 1/100mm + * @param _aSO + * @return a new Rectangle with the new Rect.X position, Rect.Y will not change. + */ + protected Rectangle insertFormattedField(XSection _xSection, String _sFormattedfield, Rectangle _aRect, int _nWidth, SectionObject _aSO) + { + return insertFormattedField(_xSection, _sFormattedfield, _aRect, _nWidth, _aSO, (short) com.sun.star.awt.TextAlign.LEFT); + } + + private Rectangle insertFormattedField(XSection _xSection, String _sFormattedfield, Rectangle _aRect, int _nWidth, SectionObject _aSO, short _nAlignment) + { + if (_xSection != null) + { + try + { + Object aField; + int nHeight = LayoutConstants.FormattedFieldHeight; + + int nType = getTypeFromFieldName(convertFromFieldName(_sFormattedfield)); + if (nType == DataType.BINARY + || nType == DataType.VARBINARY + || nType == DataType.LONGVARBINARY) + { + aField = getMSFofReportDefinition().createInstance("com.sun.star.report.ImageControl"); + nHeight = LayoutConstants.BinaryHeight; + } + else + { + aField = getMSFofReportDefinition().createInstance("com.sun.star.report.FormattedField"); + nHeight = LayoutConstants.FormattedFieldHeight; + if (nType == DataType.LONGVARCHAR) /* memo */ + + { + nHeight = LayoutConstants.MemoFieldHeight; // special case for memo + } + } + _aRect.Height = nHeight; + + final XReportControlModel xReportControlModel = UnoRuntime.queryInterface(XReportControlModel.class, aField); + if (xReportControlModel != null) + { + // #i86907# not documented right in idl description. + xReportControlModel.setDataField(_sFormattedfield); + if (_aSO != null) + { + // TODO: there seems to be some problems with copy all properties from the design template to the current design + final FontDescriptor aFD = _aSO.getFontDescriptor(); + if (aFD != null) + { + xReportControlModel.setFontDescriptor(aFD); + copyProperties(_aSO.getParent(), xReportControlModel); + } + nHeight = _aSO.getHeight(nHeight); + } + xReportControlModel.setPositionX(_aRect.X); + xReportControlModel.setPositionY(_aRect.Y); + xReportControlModel.setWidth(_nWidth); + _aRect.X += _nWidth; + xReportControlModel.setHeight(nHeight); + + if (nType == DataType.BINARY + || nType == DataType.VARBINARY + || nType == DataType.LONGVARBINARY) + { + final XImageControl xImageControl = UnoRuntime.queryInterface(XImageControl.class, xReportControlModel); + if (xImageControl != null) + { + xImageControl.setScaleMode(com.sun.star.awt.ImageScaleMode.ISOTROPIC); + } + } + else + { + try + { + xReportControlModel.setParaAdjust(_nAlignment); + } + catch (com.sun.star.beans.UnknownPropertyException ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + // spezial case rpt:now() (default date format) + if (_sFormattedfield.equals("rpt:now()")) + { + final XFormattedField xFormattedField = UnoRuntime.queryInterface(XFormattedField.class, xReportControlModel); + + XNumberFormatsSupplier x = xFormattedField.getFormatsSupplier(); + XNumberFormats xFormats = x.getNumberFormats(); + XNumberFormatTypes x3 = UnoRuntime.queryInterface(XNumberFormatTypes.class, xFormats); + com.sun.star.lang.Locale aLocale = new com.sun.star.lang.Locale(); + aLocale.Country = Locale.getDefault().getCountry(); + aLocale.Language = Locale.getDefault().getLanguage(); + + int nFormat = x3.getStandardFormat(com.sun.star.util.NumberFormat.DATE, aLocale); + xFormattedField.setFormatKey(nFormat); + } + _xSection.add(xReportControlModel); + } + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + return _aRect; + } + + +// TODO: check with Query, this code will not work with Queries + public void setTableName(int _aType, String _sTableName) + { + m_aCommandType = _aType; + m_sTableName = _sTableName; + + getReportDefinition().setCommandType(_aType); + getReportDefinition().setCommand(_sTableName); + } + private XMultiServiceFactory m_xMSF; + + private XMultiServiceFactory getMSFofReportDefinition() + { + if (m_xMSF == null) + { + m_xMSF = UnoRuntime.queryInterface(XMultiServiceFactory.class, getReportDefinition()); + } + return m_xMSF; + } + + + + + private Rectangle insertHorizontalLine(XSection _xSection, Rectangle _aRect, int _nWidth, int _nHeight) + { + return insertLine(_xSection, _aRect, _nWidth, _nHeight, 0); + } + + private Rectangle insertLine(XSection _xSection, Rectangle _aRect, int _nWidth, int _nHeight, int _nOrientation) + { + if (_xSection != null) + { + try + { + final Object aFixedLine = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedLine"); + final XFixedLine xFixedLine = UnoRuntime.queryInterface(XFixedLine.class, aFixedLine); + + xFixedLine.setOrientation(_nOrientation); + // TODO: line width is fixed + xFixedLine.setLineWidth(8); + + xFixedLine.setPositionX(_aRect.X); + xFixedLine.setPositionY(_aRect.Y); + + xFixedLine.setWidth(_nWidth); + _aRect.X += _nWidth; + xFixedLine.setHeight(_nHeight); + _xSection.add(xFixedLine); + } + catch (com.sun.star.uno.Exception ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + return _aRect; + } + + + private void clearReportHeader() + { + XSection xSection; + try + { + if (getReportDefinition().getReportHeaderOn()) + { + xSection = getReportDefinition().getReportHeader(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException ex) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, ex); + } + } + + private void insertReportHeader() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getReportHeaderOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getReportHeader(); + + if (xForeignSection != null) + { + getReportDefinition().setReportHeaderOn(true); + XSection xSection = getReportDefinition().getReportHeader(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + else + { + // we won't a page header + getReportDefinition().setReportHeaderOn(false); + } + } + } + + private void clearReportFooter() + { + XSection xSection; + try + { + if (getReportDefinition().getReportFooterOn()) + { + xSection = getReportDefinition().getReportFooter(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + + private void insertReportFooter() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getReportFooterOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getReportFooter(); + + if (xForeignSection != null) + { + getReportDefinition().setReportFooterOn(true); + XSection xSection = getReportDefinition().getReportFooter(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + else + { + // we won't a page header + getReportDefinition().setReportFooterOn(false); + } + } + } + + + private void clearPageHeader() + { + XSection xSection; + try + { + if (getReportDefinition().getPageHeaderOn()) + { + xSection = getReportDefinition().getPageHeader(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + + private void clearPageFooter() + { + XSection xSection; + try + { + if (getReportDefinition().getPageFooterOn()) + { + xSection = getReportDefinition().getPageFooter(); + emptySection(xSection); + } + } + catch (com.sun.star.container.NoSuchElementException e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + + public void setPageOrientation(int _nOrientation) + { + final int nWidth = getFromPageStyles(PropertyNames.PROPERTY_WIDTH, 0); + final int nHeight = getFromPageStyles(PropertyNames.PROPERTY_HEIGHT, 0); + + if (com.sun.star.wizards.report.ReportLayouter.SOOPTLANDSCAPE == _nOrientation) + { + setToPageStyles("IsLandscape", Boolean.TRUE); + if (nWidth < nHeight) + { + setToPageStyles(PropertyNames.PROPERTY_WIDTH, Integer.valueOf(nHeight)); + setToPageStyles(PropertyNames.PROPERTY_HEIGHT, Integer.valueOf(nWidth)); + } + } + else + { + setToPageStyles("IsLandscape", Boolean.FALSE); + if (nHeight < nWidth) + { + setToPageStyles(PropertyNames.PROPERTY_WIDTH, Integer.valueOf(nHeight)); + setToPageStyles(PropertyNames.PROPERTY_HEIGHT, Integer.valueOf(nWidth)); + } + } + // dirty the PageWidth + m_nPageWidth = -1; + } + + /** + * Returns the width and height of a given string (_sText) in 1/100mm drawn in the given font descriptor. + * TODO: This function is a performance leak, we could store already calculated values in a map, to build a cache. Access should be much faster then. + * + * @param _sText + * @param _aFont + * @return width of given text in 1/100mm + */ + private Size getPreferredSize(String _sText, FontDescriptor _aFont) + { + Size aSizeMM_100TH = new Size(0, 0); + try + { + + final Object aFixedTextModel = getGlobalMSF().createInstance("com.sun.star.awt.UnoControlFixedTextModel"); + final XControlModel xFixedTextModel = UnoRuntime.queryInterface(XControlModel.class, aFixedTextModel); + + final PropertySetHelper aPropertySetHelper = new PropertySetHelper(xFixedTextModel); + aPropertySetHelper.setPropertyValueDontThrow(PropertyNames.FONT_DESCRIPTOR, _aFont); + + final Object aUnoCtrlFixedText = getGlobalMSF().createInstance("com.sun.star.awt.UnoControlFixedText"); + + final XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, aUnoCtrlFixedText); + xWindow.setVisible(false); + + final XControl xControl = UnoRuntime.queryInterface(XControl.class, aUnoCtrlFixedText); + xControl.setModel(xFixedTextModel); + + final com.sun.star.awt.XFixedText xFixedText = UnoRuntime.queryInterface(com.sun.star.awt.XFixedText.class, aUnoCtrlFixedText); + xFixedText.setText(_sText); + + final XLayoutConstrains xLayoutConstraints = UnoRuntime.queryInterface(XLayoutConstrains.class, aUnoCtrlFixedText); + final Size aSizeInPixel = xLayoutConstraints.getPreferredSize(); + + final XWindowPeer xPeerOfReportDefinition = UnoRuntime.queryInterface(XWindowPeer.class, getReportDefinition().getCurrentController().getFrame().getComponentWindow()); + xControl.createPeer(null, xPeerOfReportDefinition); + + final XWindowPeer x = xControl.getPeer(); + + final XUnitConversion xConversion = UnoRuntime.queryInterface(XUnitConversion.class, x); + aSizeMM_100TH = xConversion.convertSizeToLogic(aSizeInPixel, com.sun.star.util.MeasureUnit.MM_100TH); + // we don't need the created objects any longer + final XComponent xFixedTextDeleter = UnoRuntime.queryInterface(XComponent.class, xFixedText); + xFixedTextDeleter.dispose(); + + final XComponent xFixedTextModelDeleter = UnoRuntime.queryInterface(XComponent.class, aFixedTextModel); + xFixedTextModelDeleter.dispose(); + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + return aSizeMM_100TH; + } + + private String getTableName() + { + if (m_sTableName != null) + { + return m_sTableName; + } + return PropertyNames.EMPTY_STRING; + } + + private String getUserNameFromConfiguration() + { + String sFirstName = PropertyNames.EMPTY_STRING; + String sLastName = PropertyNames.EMPTY_STRING; + try + { + Object oProdNameAccess = Configuration.getConfigurationRoot(getGlobalMSF(), "org.openoffice.UserProfile/Data", false); + sFirstName = (String) Helper.getUnoObjectbyName(oProdNameAccess, "givenname"); + sLastName = (String) Helper.getUnoObjectbyName(oProdNameAccess, "sn"); + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + return sFirstName + PropertyNames.SPACE + sLastName; + } + + /** + * Helper function, to copy all not read only properties of _xFromSection to _xToSection + * @param _aFrom + * @param _aTo + */ + private void copyProperties(Object _aFrom, Object _aTo) + { + XPropertySet xFrom = UnoRuntime.queryInterface(XPropertySet.class, _aFrom); + XPropertySet xTo = UnoRuntime.queryInterface(XPropertySet.class, _aTo); + + + XPropertySetInfo xForeignPropInfo = xFrom.getPropertySetInfo(); + XPropertySetInfo xSectionPropInfo = xTo.getPropertySetInfo(); + Property[] aAllProperties = xForeignPropInfo.getProperties(); + for (int i = 0; i < aAllProperties.length; i++) + { + String sPropertyName = aAllProperties[i].Name; + if (xSectionPropInfo.hasPropertyByName(sPropertyName)) + { + try + { + Property aDestProp = xForeignPropInfo.getPropertyByName(sPropertyName); + if ((aDestProp.Attributes & PropertyAttribute.READONLY) == 0) + { + xTo.setPropertyValue(sPropertyName, xFrom.getPropertyValue(sPropertyName)); + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + } + } + + /** + * Helper function to copy the whole content of _xFromSection to the _xToSection + * @param _xFromSection + * @param _xToSection + */ + private void copySection(XSection _xFromSection, XSection _xToSection) + { + copyProperties(_xFromSection, _xToSection); + + try + { + XEnumeration xEnum = _xFromSection.createEnumeration(); + while (xEnum.hasMoreElements()) + { + Object aEnumObj = xEnum.nextElement(); + XReportComponent aComponent = UnoRuntime.queryInterface(XReportComponent.class, aEnumObj); + + if (aComponent != null) + { + Object aClone = aComponent.createClone(); + if (aClone != null) + { + XShape aShape = UnoRuntime.queryInterface(XShape.class, aClone); + + // normally 'createClone' will create a real clone of the component, + // but there seems some problems, we have to control. + copyProperties(aComponent, aClone); + + // aShape.setPosition(aComponent.getPosition()); + // aShape.setSize(aComponent.getSize()); + _xToSection.add(aShape); + } + } + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + + private void insertPageHeader() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getPageHeaderOn()) + { + // copy all Section information from Page Header to our Header + try + { + XSection xForeignSection = getDesignTemplate().getPageHeader(); + + if (xForeignSection != null) + { + getReportDefinition().setPageHeaderOn(true); + XSection xSection = getReportDefinition().getPageHeader(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + else + { + // we won't a page header + // getReportDefinition().setPageHeaderOn(true); + getReportDefinition().setPageHeaderOn(false); + } + } + else + { + if (getReportDefinition() == null) + { + return; + } + // there is no foreign report definition + // TODO: #i86902# rpt:Title() out of the document + + // TODO: #i86902# rpt:Author() can't set with something like rpt:author() + // TODO: #i86902# more fieldnames need. + final String sTitleTitle = getResource().getResText("RID_REPORT_86"); // "Title:" + final String sTitle = getTableName(); // "Default title, this is a first draft report generated by the new report wizard."; + final String sAuthorTitle = getResource().getResText("RID_REPORT_87"); // "Author:" + final String sAuthor = getUserNameFromConfiguration(); // "You"; + final String sDateTitle = getResource().getResText("RID_REPORT_88"); // "Date:" + // TODO: #i86911# Date: we need to set the style of the date. + final String sDate = "rpt:now()"; + + try + { + getReportDefinition().setPageHeaderOn(true); + XSection xSection = null; + xSection = getReportDefinition().getPageHeader(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent(); + SectionObject aSOLabel = SectionEmptyObject.create(); + aSOLabel.setFontToBold(); + aRect.Y = aSOLabel.getHeight(LayoutConstants.LabelHeight); + + final int nWidth = 3000; + + aRect = insertLabel(xSection, sTitleTitle, aRect, nWidth, aSOLabel); + + final int nTitleWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent() - 3000; + aRect = insertLabel(xSection, sTitle, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.LabelHeight) + LayoutConstants.LineHeight; + + aRect.X = getLeftPageIndent(); + aRect = insertLabel(xSection, sAuthorTitle, aRect, nWidth, aSOLabel); + aRect = insertLabel(xSection, sAuthor, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.LabelHeight); + + aRect.X = getLeftPageIndent(); + aRect = insertLabel(xSection, sDateTitle, aRect, nWidth, aSOLabel); + aRect = insertFormattedField(xSection, sDate, aRect, nTitleWidth, aSOLabel); + + aRect.Y += aSOLabel.getHeight(LayoutConstants.FormattedFieldHeight) + LayoutConstants.LineHeight; + + // draw a line under the label/formattedfield + aRect.X = getLeftPageIndent(); + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xSection, aRect, nLineWidth, nLineHeight); + + aRect.Y += nLineHeight; + + xSection.setHeight(aRect.Y); + } + catch (com.sun.star.uno.Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + } + + private void insertPageFooter() + { + if (getDesignTemplate() != null) + { + if (getDesignTemplate().getPageFooterOn()) + { + try + { + XSection xForeignSection = getDesignTemplate().getPageFooter(); + + if (xForeignSection != null) + { + getReportDefinition().setPageFooterOn(true); + XSection xSection = getReportDefinition().getPageFooter(); + + // copy Sections + copySection(xForeignSection, xSection); + } + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + else + { + getReportDefinition().setPageFooterOn(false); + } + } + else + { + if (getReportDefinition() == null) + { + return; + } + + // TODO: how should we arrive this code (set page and pagecount in the middle of the page footer) + // If there exists a design template, don't use it. + + // we don't have a default report definition + final String sPageOf = getResource().getResText("RID_REPORT_89"); // 'Page #page# of #count#' + + // Convert + // 'Page #page# of #count#' + // to something like + // '\"Page \" & PageNumber() & \" of \" & PageCount()' + // due to the fact that it is not fixed, where #page# or #count# occurs, we make it + // a little bit trickier. + // we first surround the string with double quotes, + // second, replace the #...# + // last, we remove double 'double quotes'. + final String sSurroundDoubleQuotes = "\"" + sPageOf + "\""; + final String sPageNumber = sSurroundDoubleQuotes.replaceAll("#page#", "\" & PageNumber() & \""); + final String sPageCount = sPageNumber.replaceAll("#count#", "\" & PageCount() & \""); + final String sNoLastUnusedQuotes = sPageCount.replaceAll(" & \\\"\\\"", PropertyNames.EMPTY_STRING); + final String sNoFirstUnusedQuotes = sNoLastUnusedQuotes.replaceAll("\\\"\\\" & ", PropertyNames.EMPTY_STRING); + + final int nUsablePageWidth = getPageWidth() - getLeftPageIndent() - getRightPageIndent(); + + try + { + getReportDefinition().setPageFooterOn(true); + XSection xSection = null; + xSection = getReportDefinition().getPageFooter(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent(); + + // draw a line over the label/formattedfield + final int nLineWidth = getPageWidth() - getRightPageIndent() - aRect.X; + final int nLineHeight = LayoutConstants.LineHeight; + insertHorizontalLine(xSection, aRect, nLineWidth, nLineHeight); + + aRect.Y += nLineHeight; + aRect.Y += LayoutConstants.LabelHeight; + + aRect.X = getLeftPageIndent(); + + aRect = insertFormattedField(xSection, "rpt:" + sNoFirstUnusedQuotes, aRect, nUsablePageWidth, null, (short) com.sun.star.awt.TextAlign.CENTER); + + aRect.Y += LayoutConstants.FormattedFieldHeight + LayoutConstants.LineHeight; + xSection.setHeight(aRect.Y); + } + catch (Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + } + + protected Resource getResource() + { + return m_aResource; + } + private int m_aCommandType; // Table or Query + private String m_sTableName; + private String[] m_aGroupNames; + private String[] m_aFieldNames; + private String[] m_aFieldTitleNames; + private int[] m_aFieldWidths; + private int[] m_aFieldTypes; + private DesignTemplate m_xDesignTemplate = null; + + public void initializeData(IReportBuilderLayouter _aOther) + { + if (_aOther instanceof ReportBuilderLayouter) + { + final ReportBuilderLayouter aOther = (ReportBuilderLayouter) _aOther; + m_aCommandType = aOther.m_aCommandType; + m_sTableName = aOther.m_sTableName; + m_aGroupNames = aOther.m_aGroupNames; + m_aFieldNames = aOther.m_aFieldNames; + m_aFieldTitleNames = aOther.m_aFieldTitleNames; + m_aFieldWidths = aOther.m_aFieldWidths; + m_aFieldTypes = aOther.m_aFieldTypes; + m_xDesignTemplate = aOther.m_xDesignTemplate; + + // dirty PageWidth + m_nPageWidth = -1; + } + } + + /** + * Get the maximal label width of all labels + * @return the width in 1/100mm + */ + protected int getMaxLabelWidth() + { + int nWidth = 0; + final String[] aFieldTitles = m_aFieldTitleNames; // we want all Field Titles here // getFieldTitleNames(); + for (int i = 0; i < aFieldTitles.length; i++) + { + final String sLabel = aFieldTitles[i]; + nWidth = Math.max(nWidth, getLabelWidth(sLabel)); + } + for (int i = 0; i < m_aGroupNames.length; i++) + { + final String sGroupName = m_aGroupNames[i]; + final SectionObject a = getDesignTemplate().getGroupLabel(i); + final FontDescriptor aFD = a.getFontDescriptor(); + nWidth = Math.max(nWidth, getLabelWidth(sGroupName, aFD)); + } + + if (nWidth == 0) + { + nWidth = 3000; + } + else + { + nWidth += 500; + } + return nWidth; + } + + /** + * Get width of a given string (Label) in 1/100mm + * @param _sLabel + * @return the width in 1/100mm + */ + private int getLabelWidth(String _sLabel) + { + return getLabelWidth(_sLabel, 0.0f, 0.0f); + } + private XFixedText m_aFixedTextHelper = null; + private HashMap<String, Integer> m_aLabelWidthMap; + + private int getLabelWidth(String _sLabel, FontDescriptor _aFD) + { + float fCharWeight = 0.0f; + float fCharHeight = 0.0f; + if (_aFD != null) + { + fCharWeight = _aFD.Weight; + fCharHeight = _aFD.Height; + } + return getLabelWidth(_sLabel, fCharWeight, fCharHeight); + } + + private int getLabelWidth(String _sLabel, float _nCharWeight, float _nCharHeight) + { + int nWidth = 0; + + if (m_aLabelWidthMap == null) + { + m_aLabelWidthMap = new HashMap<String, Integer>(); + } + // At first, try to get the Width out of a HashMap (Cache) + StringBuffer aKey = new StringBuffer(40); + final String sKey = aKey.append(_sLabel).append(_nCharWeight).append(_nCharHeight).toString(); + if (m_aLabelWidthMap.containsKey(sKey)) + { + final Object aWidth = m_aLabelWidthMap.get(sKey); + final Integer aIntegerWidth = (Integer) aWidth; + nWidth = aIntegerWidth.intValue(); + } + else + { + try + { + if (m_aFixedTextHelper == null) + { + final Object aFixedText = getMSFofReportDefinition().createInstance("com.sun.star.report.FixedText"); + m_aFixedTextHelper = UnoRuntime.queryInterface(XFixedText.class, aFixedText); + } + + m_aFixedTextHelper.setLabel(_sLabel); + if (_nCharWeight > 0.1f) + { + m_aFixedTextHelper.setCharWeight(_nCharWeight); + } + if (_nCharHeight > 0.1f) + { + m_aFixedTextHelper.setCharHeight(_nCharHeight); + } + + final FontDescriptor xFont = m_aFixedTextHelper.getFontDescriptor(); + final Size aSize = getPreferredSize(_sLabel, xFont); + nWidth = aSize.Width; + // cache the found width + m_aLabelWidthMap.put(sKey, Integer.valueOf(nWidth)); + } + catch (com.sun.star.uno.Exception e) + { + Logger.getLogger(ReportBuilderLayouter.class.getName()).log(Level.SEVERE, null, e); + } + } + return nWidth; + } + + protected void doNotBreakInTable(Object _xSectionOrGroup) + { + final PropertySetHelper aHelper = new PropertySetHelper(_xSectionOrGroup); + aHelper.setPropertyValueDontThrow("KeepTogether", Boolean.TRUE); + } + + protected DesignTemplate getDesignTemplate() + { + if (m_xDesignTemplate == null) + { + // initialise the report definition. + String sDefaultHeaderLayout = m_xReportDefinitionReadAccess.getDefaultHeaderLayout(); + loadAndSetBackgroundTemplate(sDefaultHeaderLayout); + } + return m_xDesignTemplate; + } + + /** + * If there already exists a foreign report definition, which we use to get the layout from + * close it. + * Veto is not allowed here. + */ + private void closeDesignTemplate() + { + if (m_xDesignTemplate != null) + { + m_xDesignTemplate.close(); + m_xDesignTemplate = null; + } + } + + /** + * load the given string as a template and use its content to paint the other + */ + public void loadAndSetBackgroundTemplate(String LayoutTemplatePath) + { + closeDesignTemplate(); + + String sName = FileAccess.getFilename(LayoutTemplatePath); + if (sName.equalsIgnoreCase("default.otr_") + || LayoutTemplatePath.equals("DefaultLayoutOfHeaders")) + { + // this is the default layout, we don't want to have a layout for this. + } + else + { + XMultiServiceFactory xMSF = getGlobalMSF(); + m_xDesignTemplate = DesignTemplate.create(xMSF, LayoutTemplatePath); + } + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java new file mode 100644 index 000000000..f8f03c4c0 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionEmptyObject.java @@ -0,0 +1,40 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; + +public class SectionEmptyObject extends SectionObject +{ + + protected SectionEmptyObject() + { + m_aParentObject = null; + } + + public static SectionObject create() + { + return new SectionEmptyObject(); + } + + @Override + public FontDescriptor getFontDescriptor() + { + return null; + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java new file mode 100644 index 000000000..8a4027033 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionLabel.java @@ -0,0 +1,55 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.report.XFixedText; + +public class SectionLabel extends SectionObject +{ + + private SectionLabel(XFixedText _aFixedText) + { + m_aParentObject = _aFixedText; + } + + public static SectionObject create(XFixedText _aFixedText) + { + return new SectionLabel(_aFixedText); + } + + /** + * Return the current FontDescriptor + */ + @Override + public FontDescriptor getFontDescriptor() + { + FontDescriptor a = null; + try + { + final XFixedText aLabel = (XFixedText) getParent(); + a = aLabel.getFontDescriptor(); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + return a; + } +} + + diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java new file mode 100644 index 000000000..c6d3887cc --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionObject.java @@ -0,0 +1,70 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.PropertySetHelper; + +abstract public class SectionObject +{ + + Object m_aParentObject; // this could be FixedText or FormattedField or null + private PropertySetHelper m_aPropertySetHelper; + + public SectionObject() + { + m_aParentObject = null; + } + + protected Object getParent() + { + return m_aParentObject; + } + + abstract public FontDescriptor getFontDescriptor(); + + private PropertySetHelper getPropertySetHelper() + { + if (m_aPropertySetHelper == null) + { + m_aPropertySetHelper = new PropertySetHelper(getParent()); + } + return m_aPropertySetHelper; + } + + public int getHeight(int _nDefault) + { + return getPropertySetHelper().getPropertyValueAsInteger(PropertyNames.PROPERTY_HEIGHT, _nDefault); + } + + public float getCharWeight(float _nDefault) + { + return(float) getPropertySetHelper().getPropertyValueAsDouble("CharWeight", _nDefault); + } + + public void setFontToBold() + { + setPropertyValue("CharWeight", new Float(com.sun.star.awt.FontWeight.BOLD)); + } + + public void setPropertyValue(String _sKey, Object _nValue) + { + getPropertySetHelper().setPropertyValueDontThrow(_sKey, _nValue); + } +} diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java new file mode 100644 index 000000000..bc7be4e88 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/SectionTextField.java @@ -0,0 +1,52 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.report.XFormattedField; + +public class SectionTextField extends SectionObject +{ + + private SectionTextField(XFormattedField _aFormattedField) + { + m_aParentObject = _aFormattedField; + // We would like to know, what properties are in this object. + } + + public static SectionObject create(XFormattedField _aFormattedField) + { + return new SectionTextField(_aFormattedField); + } + + @Override + public FontDescriptor getFontDescriptor() + { + FontDescriptor a = null; + try + { + XFormattedField aField = (XFormattedField) getParent(); + a = aField.getFontDescriptor(); + } + catch (com.sun.star.beans.UnknownPropertyException e) + { + } + return a; + } +} + diff --git a/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java b/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java new file mode 100644 index 000000000..814de5a93 --- /dev/null +++ b/wizards/com/sun/star/wizards/reportbuilder/layout/Tabular.java @@ -0,0 +1,139 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.reportbuilder.layout; + +import com.sun.star.awt.Rectangle; +import com.sun.star.report.XGroup; +import com.sun.star.report.XGroups; +import com.sun.star.report.XSection; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.report.IReportDefinitionReadAccess; +import com.sun.star.wizards.ui.UIConsts; + +public class Tabular extends ReportBuilderLayouter +{ + + public Tabular(IReportDefinitionReadAccess _xDefinitionAccess, Resource _aResource) + { + super(_xDefinitionAccess, _aResource); + } + + public String getName() + { + return "DefaultLayoutOfData"; + } + + public String getLocalizedName() + { + return getResource().getResText("RID_REPORT_80"); + } + + @Override + protected void insertDetailFields() + { + copyDetailProperties(); + + String[] aFieldNames = getFieldNames(); + if (aFieldNames == null) + { + return; + } + if (aFieldNames.length == 0) + { + return; + } + + final XSection xSection = getReportDefinition().getDetail(); + + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + + final int nWidth = calculateFieldWidth(getLeftGroupIndent(getCountOfGroups()), aFieldNames.length); + final SectionObject aSO = getDesignTemplate().getDetailTextField(); + int nHeight = LayoutConstants.FormattedFieldHeight; + for (int i = 0; i < aFieldNames.length; i++) + { + final String sFieldName = convertToFieldName(aFieldNames[i]); + aRect = insertFormattedField(xSection, sFieldName, aRect, nWidth, aSO); + nHeight = Math.max(aRect.Height, nHeight); + } + nHeight = Math.max(aSO.getHeight(nHeight), nHeight); + xSection.setHeight(nHeight); + } + + @Override + protected void insertDetailFieldTitles(int lastGroupPosition) + { + final String[] aFieldTitleNames = getFieldTitleNames(); + if (aFieldTitleNames == null || aFieldTitleNames.length == 0) + { + return; + } + try + { + SectionObject aSO = null; + final XGroups xGroups = getReportDefinition().getGroups(); + final XGroup xGroup; + if (lastGroupPosition == -1) + { + // Spezial case, there is no Group. + xGroup = xGroups.createGroup(); + xGroup.setHeaderOn(true); + + xGroups.insertByIndex(xGroups.getCount(), xGroup); + copyGroupProperties(0); + aSO = getDesignTemplate().getDetailLabel(); + aSO.setFontToBold(); + } + else + { + // we insert the titles in the last group + xGroup = UnoRuntime.queryInterface(XGroup.class, xGroups.getByIndex(lastGroupPosition)); + + // We don't need to copy the GroupProperties, because this is done in the insertGroup() member function + // copyGroupProperties(0); + aSO = getDesignTemplate().getGroupLabel(lastGroupPosition); + } + + XSection xSection = xGroup.getHeader(); + Rectangle aRect = new Rectangle(); + aRect.X = getLeftPageIndent() + getLeftGroupIndent(getCountOfGroups()); + if (lastGroupPosition == -1) + { + xSection.setHeight(0); // group height + a little empty line) + aRect.Y = 0; + } + else + { + aRect.Y = xSection.getHeight() + LayoutConstants.LineHeight; + } + + final int nWidth = calculateFieldWidth(getLeftGroupIndent(getCountOfGroups()), aFieldTitleNames.length); + + for (int i = 0; i < aFieldTitleNames.length; i++) + { + aRect = insertLabel(xSection, aFieldTitleNames[i], aRect, nWidth, aSO); + } + xSection.setHeight(xSection.getHeight() + aSO.getHeight(LayoutConstants.LabelHeight)); + } + catch (com.sun.star.uno.Exception e) + { + } + } +} diff --git a/wizards/com/sun/star/wizards/table/CGCategory.java b/wizards/com/sun/star/wizards/table/CGCategory.java new file mode 100644 index 000000000..c0a1148f9 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/CGCategory.java @@ -0,0 +1,71 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Configuration; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class CGCategory +{ + + private static final String CGROOTPATH = "/org.openoffice.Office.TableWizard/TableWizard/"; + private XMultiServiceFactory xMSF; + XNameAccess xNameAccessTablesNode; + private XNameAccess xNameAccessCurBusinessNode; + + public CGCategory(XMultiServiceFactory _xMSF) + { + xMSF = _xMSF; + } + + public void initialize(String category) + { + try + { + Object oconfigView = Configuration.getConfigurationRoot(xMSF, CGROOTPATH, false); //business/Tables + xNameAccessCurBusinessNode = Configuration.getChildNodebyName( + UnoRuntime.queryInterface(XNameAccess.class, oconfigView), + category); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public String[] getTableNames() + { + try + { + xNameAccessTablesNode = UnoRuntime.queryInterface(XNameAccess.class, xNameAccessCurBusinessNode.getByName("Tables")); + return Configuration.getNodeDisplayNames(xNameAccessTablesNode); + } + catch (Exception e) + { + e.printStackTrace(System.err); + return null; + } + } +} diff --git a/wizards/com/sun/star/wizards/table/CGTable.java b/wizards/com/sun/star/wizards/table/CGTable.java new file mode 100644 index 000000000..1b6313b4b --- /dev/null +++ b/wizards/com/sun/star/wizards/table/CGTable.java @@ -0,0 +1,82 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.PropertyNames; + +public class CGTable +{ + + private XMultiServiceFactory xMSF; + XNameAccess xNameAccessFieldsNode; + + public CGTable(XMultiServiceFactory _xMSF) + { + xMSF = _xMSF; + } + + public void initialize(XNameAccess _xNameAccessParentNode, int _index) + { + try + { + XNameAccess xNameAccessTableNode = Configuration.getChildNodebyIndex(_xNameAccessParentNode, _index); + xNameAccessFieldsNode = Configuration.getChildNodebyName(xNameAccessTableNode, "Fields"); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public String[] getFieldNames(boolean _bgetbyShortName, int _imaxcolumnchars) + { + try + { + String[] fieldnames = null; + if (_bgetbyShortName) + { + fieldnames = Configuration.getNodeChildNames(xNameAccessFieldsNode, "ShortName"); + for (int i = 0; i < fieldnames.length; i++) + { + if (fieldnames[i].length() > _imaxcolumnchars) + { + fieldnames[i] = fieldnames[i].substring(0, _imaxcolumnchars); + } + } + } + else + { + fieldnames = Configuration.getNodeChildNames(xNameAccessFieldsNode, PropertyNames.PROPERTY_NAME); + } + for (int i = 0; i < fieldnames.length; i++) + { + fieldnames[i] = Desktop.removeSpecialCharacters(xMSF, Configuration.getLocale(xMSF), fieldnames[i]); + } + return fieldnames; + } + catch (Exception e) + { + e.printStackTrace(System.err); + return null; + } + } +} diff --git a/wizards/com/sun/star/wizards/table/CallTableWizard.java b/wizards/com/sun/star/wizards/table/CallTableWizard.java new file mode 100644 index 000000000..1a437b53e --- /dev/null +++ b/wizards/com/sun/star/wizards/table/CallTableWizard.java @@ -0,0 +1,175 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.PropertyValue; +import com.sun.star.uno.Type; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +/** This class capsulates the class, that implements the minimal component, a + * factory for creating the service (<CODE>__getServiceFactory</CODE>). + */ +public class CallTableWizard +{ + + /** Gives a factory for creating the service. + * This method is called by the <code>JavaLoader</code> + * <p> + * @return Returns a <code>XSingleServiceFactory</code> for creating the component. + * @see com.sun.star.comp.loader.JavaLoader + * @param stringImplementationName The implementation name of the component. + * @param xMSF The service manager, who gives access to every known service. + * @param xregistrykey Makes structural information (except regarding tree structures) of a single + * registry key accessible. + */ + public static com.sun.star.lang.XSingleServiceFactory __getServiceFactory(String stringImplementationName, com.sun.star.lang.XMultiServiceFactory xMSF, com.sun.star.registry.XRegistryKey xregistrykey) + { + com.sun.star.lang.XSingleServiceFactory xsingleservicefactory = null; + if (stringImplementationName.equals(TableWizardImplementation.class.getName())) + { + xsingleservicefactory = com.sun.star.comp.loader.FactoryHelper.getServiceFactory(TableWizardImplementation.class, TableWizardImplementation.__serviceName, xMSF, xregistrykey); + } + return xsingleservicefactory; + } + + /** This class implements the component. At least the interfaces XServiceInfo, + * XTypeProvider, and XInitialization should be provided by the service. + */ + public static class TableWizardImplementation extends com.sun.star.lib.uno.helper.PropertySet implements com.sun.star.lang.XInitialization, com.sun.star.lang.XServiceInfo, com.sun.star.task.XJobExecutor + { + + private PropertyValue[] m_wizardContext; + // the next two fields are accessed by reflection, do not delete! + public String Command; + public final Integer CommandType = com.sun.star.sdb.CommandType.TABLE; + + /** The constructor of the inner class has a XMultiServiceFactory parameter. + */ + public TableWizardImplementation(com.sun.star.lang.XMultiServiceFactory i_serviceFactory) + { + super(); + m_serviceFactory = i_serviceFactory; + registerProperty( PropertyNames.COMMAND, (short)( PropertyAttribute.READONLY | PropertyAttribute.MAYBEVOID ) ); + registerProperty( PropertyNames.COMMAND_TYPE, PropertyAttribute.READONLY ); + } + + public void trigger( String sEvent ) + { + try + { + if ( sEvent.equals(PropertyNames.START) ) + { + TableWizard CurTableWizard = new TableWizard( m_serviceFactory, m_wizardContext ); + CurTableWizard.startTableWizard(); + } + } + catch (Exception exception) + { + System.err.println(exception); + } + System.gc(); + } + /** The service name, that must be used to get an instance of this service. + */ + private static final String __serviceName = "com.sun.star.wizards.table.CallTableWizard"; + /** The service manager, that gives access to all registered services. + */ + private final com.sun.star.lang.XMultiServiceFactory m_serviceFactory; + + /** This method is a member of the interface for initializing an object + * directly after its creation. + * @param object This array of arbitrary objects will be passed to the + * component after its creation. + * @throws com.sun.star.uno.Exception Every exception will not be handled, but will be + * passed to the caller. + */ + public void initialize(Object[] object) throws com.sun.star.uno.Exception + { + m_wizardContext = Properties.convertToPropertyValueArray(object); + } + + /** This method returns an array of all supported service names. + * @return Array of supported service names. + */ + public java.lang.String[] getSupportedServiceNames() + { + String[] stringSupportedServiceNames = new String[] { __serviceName }; + + return stringSupportedServiceNames; + } + + /** This method returns true, if the given service will be + * supported by the component. + * @param stringService Service name. + * @return True, if the given service name will be supported. + */ + public boolean supportsService(String stringService) + { + boolean booleanSupportsService = false; + + if (stringService.equals(__serviceName)) + { + booleanSupportsService = true; + } + return booleanSupportsService; + } + + @Override + public byte[] getImplementationId() + { + return new byte[0]; + } + + /** Return the class name of the component. + * @return Class name of the component. + */ + public java.lang.String getImplementationName() + { + return TableWizardImplementation.class.getName(); + } + + /** Provides a sequence of all types (usually interface types) + * provided by the object. + * @return Sequence of all types (usually interface types) provided by the + * service. + */ + @Override + public Type[] getTypes() + { + Type[] typeReturn = + { + }; + + try + { + typeReturn = new Type[] + { + new Type(com.sun.star.task.XJobExecutor.class), new Type(com.sun.star.lang.XTypeProvider.class), new Type(com.sun.star.lang.XServiceInfo.class), new Type(com.sun.star.lang.XInitialization.class) + }; + } + catch (Exception exception) + { + System.err.println(exception); + } + + return typeReturn; + } + } +} diff --git a/wizards/com/sun/star/wizards/table/FieldDescription.java b/wizards/com/sun/star/wizards/table/FieldDescription.java new file mode 100644 index 000000000..95a847136 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/FieldDescription.java @@ -0,0 +1,152 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import java.util.ArrayList; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.Locale; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; + +public class FieldDescription +{ + private String tablename = PropertyNames.EMPTY_STRING; + private XPropertySet xPropertySet; + private final ArrayList<PropertyValue> aPropertyValues; + private String Name; + + public FieldDescription(XMultiServiceFactory _xMSF, Locale _aLocale, ScenarioSelector _curscenarioselector, String _fieldname, String keyname, int _nmaxcharCount) + { + tablename = _curscenarioselector.getTableName(); + Name = _fieldname; + aPropertyValues = new ArrayList<PropertyValue>(); + XNameAccess xNameAccessTableNode = _curscenarioselector.oCGTable.xNameAccessFieldsNode; + XNameAccess xNameAccessFieldNode; + if (_curscenarioselector.bcolumnnameislimited) + { + xNameAccessFieldNode = Configuration.getChildNodebyDisplayName(_xMSF, _aLocale, xNameAccessTableNode, keyname, "ShortName", _nmaxcharCount); + } + else + { + xNameAccessFieldNode = Configuration.getChildNodebyDisplayName(_xMSF, _aLocale, xNameAccessTableNode, keyname, PropertyNames.PROPERTY_NAME, _nmaxcharCount); + } + setFieldProperties(xNameAccessFieldNode); + } + + public FieldDescription(String _fieldname) + { + Name = _fieldname; + aPropertyValues = new ArrayList<PropertyValue>(); + Integer Type = Integer.valueOf(com.sun.star.sdbc.DataType.VARCHAR); + aPropertyValues.add(Properties.createProperty(PropertyNames.PROPERTY_NAME, _fieldname)); + aPropertyValues.add(Properties.createProperty("Type", Type)); + } + + public void setName(String _newfieldname) + { + for (int i = 0; i < aPropertyValues.size(); i++) + { + PropertyValue aPropertyValue = aPropertyValues.get(i); + if (aPropertyValue.Name.equals(PropertyNames.PROPERTY_NAME)) + { + aPropertyValue.Value = _newfieldname; + aPropertyValues.set(i, aPropertyValue); + Name = _newfieldname; + return; + } + } + } + + public String getName() + { + return Name; + } + + public String gettablename() + { + return tablename; + } + + private boolean propertyexists(String _propertyname) + { + boolean bexists = false; + try + { + if (xPropertySet.getPropertySetInfo().hasPropertyByName(_propertyname)) + { + Object oValue = xPropertySet.getPropertyValue(_propertyname); + bexists = (!com.sun.star.uno.AnyConverter.isVoid(oValue)); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return bexists; + } + + private void setFieldProperties(XNameAccess _xNameAccessFieldNode) + { + try + { + xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, _xNameAccessFieldNode); + if (propertyexists(PropertyNames.PROPERTY_NAME)) + { + aPropertyValues.add(Properties.createProperty(PropertyNames.PROPERTY_NAME, Name)); + } + if (propertyexists("Type")) + { + aPropertyValues.add(Properties.createProperty("Type", xPropertySet.getPropertyValue("Type"))); + } + if (propertyexists("Scale")) + { + aPropertyValues.add(Properties.createProperty("Scale", xPropertySet.getPropertyValue("Scale"))); + } + if (propertyexists("Precision")) + { + aPropertyValues.add(Properties.createProperty("Precision", xPropertySet.getPropertyValue("Precision"))); + } + if (propertyexists("DefaultValue")) + { + aPropertyValues.add(Properties.createProperty("DefaultValue", xPropertySet.getPropertyValue("DefaultValue")));// DefaultValue = (Boolean) xPropertySet.getPropertyValue("DefaultValue"); + //Type = 4; // TODO where is the error?(Integer) xPropertySet.getPropertyValue("Type"); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public PropertyValue[] getPropertyValues() + { + if (aPropertyValues != null) + { + PropertyValue[] aProperties = new PropertyValue[aPropertyValues.size()]; + aPropertyValues.toArray(aProperties); + return aProperties; + } + return null; + } +} diff --git a/wizards/com/sun/star/wizards/table/FieldFormatter.java b/wizards/com/sun/star/wizards/table/FieldFormatter.java new file mode 100644 index 000000000..75a1ade73 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/FieldFormatter.java @@ -0,0 +1,444 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.XButton; +import com.sun.star.awt.XItemListener; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XTextComponent; +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.EventObject; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.TableDescriptor; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.event.XActionListenerAdapter; +import com.sun.star.wizards.ui.event.XTextListenerAdapter; + +public class FieldFormatter implements XItemListener +{ + + private TableWizard CurUnoDialog; + private TableDescriptor curTableDescriptor; + private Object oColumnDescriptorModel; + private XTextComponent txtfieldname; + private XListBox xlstFieldNames; + private XButton btnminus; + private XButton btnShiftUp; + private XButton btnShiftDown; + private short curtabindex; + private String suntitled; + private Integer IFieldFormatStep; + + public FieldFormatter(TableWizard _CurUnoDialog) + { + this.CurUnoDialog = _CurUnoDialog; + curtabindex = (short) (TableWizard.SOFIELDSFORMATPAGE * 100); + IFieldFormatStep = Integer.valueOf(TableWizard.SOFIELDSFORMATPAGE); + String sFieldName = CurUnoDialog.m_oResource.getResText("RID_TABLE_23"); + String sFieldNames = CurUnoDialog.m_oResource.getResText("RID_TABLE_25"); + String sfieldinfo = CurUnoDialog.m_oResource.getResText("RID_TABLE_20"); + String sbtnplushelptext = CurUnoDialog.m_oResource.getResText("RID_TABLE_45"); + String sbtnminushelptext = CurUnoDialog.m_oResource.getResText("RID_TABLE_46"); + + suntitled = CurUnoDialog.m_oResource.getResText("RID_TABLE_43"); + + CurUnoDialog.insertLabel("lblFieldNames", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], sFieldNames, 91, 27, IFieldFormatStep, Short.valueOf(curtabindex++), 67 + }); + + try + { + xlstFieldNames = CurUnoDialog.insertListBox("lstfieldnames", 3, null, this, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 133, "HID:WIZARDS_HID_DLGTABLE_LB_SELFIELDNAMES", 92, 37, IFieldFormatStep, Short.valueOf(curtabindex++), 62 + }); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + + FontDescriptor oFontDesc = new FontDescriptor(); + oFontDesc.Name = "StarSymbol"; + + btnShiftUp = CurUnoDialog.insertButton("btnShiftUp", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + shiftFieldNameUp(); + } + }, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, oFontDesc, 14, "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDUP", String.valueOf((char) 8743), 158, 139, IFieldFormatStep, Short.valueOf(curtabindex++), 14 + }); + + btnShiftDown = CurUnoDialog.insertButton("btnShiftDown", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + shiftFieldNameDown(); + } + }, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, oFontDesc, 14, "HID:WIZARDS_HID_DLGTABLE_CMDMOVEFIELDDOWN", String.valueOf((char) 8744), 158, 156, IFieldFormatStep, Short.valueOf(curtabindex++), 14 + }); + oFontDesc = new FontDescriptor(); + oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD; + oFontDesc.Height = (short) 13; + btnminus = CurUnoDialog.insertButton("btnminus", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + removeFieldName(); + } + }, + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDesc, 14, "HID:WIZARDS_HID_DLGTABLE_CMDMINUS", "-", 118, 175, IFieldFormatStep, Short.valueOf(curtabindex++), 14 + }); + + XButton btnplus = CurUnoDialog.insertButton("btnplus", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + addFieldName(); + } + }, + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDesc, 14, "HID:WIZARDS_HID_DLGTABLE_CMDPLUS", "+", 137, 175, IFieldFormatStep, Short.valueOf(curtabindex++), 14 + }); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "ColDescriptorHeader", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sfieldinfo, 0, 158, 27, IFieldFormatStep, Short.valueOf(curtabindex++), 165 + }); + + + CurUnoDialog.insertLabel("lblFieldName", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], sFieldName, 158, 39, IFieldFormatStep, Short.valueOf(curtabindex++), 94 + }); + + txtfieldname = CurUnoDialog.insertTextField("txtfieldname", new XTextListenerAdapter() { + @Override + public void textChanged(TextEvent event) { + modifyFieldName(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Text", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGER_12, "HID:WIZARDS_HID_DLGTABLE_COLNAME", 274, 37, IFieldFormatStep, Short.valueOf(curtabindex++), PropertyNames.EMPTY_STRING, 50 + }); + txtfieldname.addTextListener(CurUnoDialog); + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnplus, sbtnplushelptext); + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnminus, sbtnminushelptext); + } + + public void initialize(TableDescriptor _curTableDescriptor, String[] _fieldnames) + { + if (oColumnDescriptorModel == null) + { + oColumnDescriptorModel = CurUnoDialog.insertControlModel("com.sun.star.sdb.ColumnDescriptorControlModel", "oColumnDescriptor", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH, "EditWidth" + }, // PropertyNames.PROPERTY_HELPURL + new Object[] + { + 82, 158, 52, IFieldFormatStep, Short.valueOf(curtabindex++), 166, 50 + }); //, "HID:WIZARDS_HID_DLGTABLE_COLMODIFIER" + curTableDescriptor = _curTableDescriptor; + Helper.setUnoPropertyValue(oColumnDescriptorModel, PropertyNames.ACTIVE_CONNECTION, _curTableDescriptor.DBConnection); + txtfieldname.setMaxTextLen((short) this.curTableDescriptor.getMaxColumnNameLength()); + } + else + { + int nStep = ((Integer) Helper.getUnoPropertyValue(oColumnDescriptorModel, PropertyNames.PROPERTY_STEP)).intValue(); + if (nStep > IFieldFormatStep.intValue()) + { + Helper.setUnoPropertyValue(oColumnDescriptorModel, PropertyNames.PROPERTY_STEP, IFieldFormatStep); + CurUnoDialog.repaintDialogStep(); + } + } + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST, _fieldnames); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + 0 + }); + updateColumnDescriptor(_fieldnames[0], curTableDescriptor.getByName(_fieldnames[0])); + toggleButtons(); + CurUnoDialog.setFocus("lstfieldnames"); + } + + private void toggleButtons() + { + boolean benableShiftUpButton = false; + boolean benableShiftDownButton = false; + boolean bfieldnameisselected = Helper.getUnoArrayPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS) != null; + int ilistcount = /* xlstFieldNames.getItemCount();*/ UnoDialog.getListBoxItemCount(xlstFieldNames); + boolean blistispopulated = (ilistcount > 0); + if (bfieldnameisselected) + { + int iselpos = xlstFieldNames.getSelectedItemPos(); + benableShiftUpButton = (iselpos != 0); + benableShiftDownButton = (iselpos != ilistcount - 1); + } + Helper.setUnoPropertyValue(UnoDialog.getModel(btnShiftUp), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benableShiftUpButton)); + Helper.setUnoPropertyValue(UnoDialog.getModel(btnShiftDown), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benableShiftDownButton)); + Helper.setUnoPropertyValue(UnoDialog.getModel(btnminus), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(blistispopulated)); + CurUnoDialog.setcompleted(TableWizard.SOFIELDSFORMATPAGE, blistispopulated); + } + + private void addFieldName() + { + String snewfieldname = Desktop.getUniqueName(xlstFieldNames.getItems(), suntitled, PropertyNames.EMPTY_STRING); + short icount = xlstFieldNames.getItemCount(); + if (CurUnoDialog.verifyfieldcount(icount)) + { + xlstFieldNames.addItem(snewfieldname, icount); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + icount + }); + toggleButtons(); + FieldDescription curfielddescription = new FieldDescription(snewfieldname); + CurUnoDialog.fielditems.put(snewfieldname, curfielddescription); + curTableDescriptor.addColumn(curfielddescription.getPropertyValues()); + updateColumnDescriptor(snewfieldname, curTableDescriptor.getByName(snewfieldname)); + CurUnoDialog.setControlVisible("oColumnDescriptor", true); + CurUnoDialog.repaintDialogStep(); + } + } + + private void removeFieldName() + { + String[] fieldnames = (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST); + short ipos = UnoDialog.getSelectedItemPos(xlstFieldNames); + String fieldname = fieldnames[ipos]; + xlstFieldNames.removeItems(ipos, (short) 1); + CurUnoDialog.fielditems.remove(fieldname); + int ilistcount = /* xlstFieldNames.getItemCount();*/ UnoDialog.getListBoxItemCount(xlstFieldNames); + if ((ipos) < ilistcount) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + ipos + }); + } + else + { + if (ilistcount > -1) + { + ipos = (short) ((short) ilistcount - (short) 1); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + ipos + }); + } + } + curTableDescriptor.dropColumnbyName(fieldname); + fieldnames = (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST); + boolean benable = ((ipos > -1) && (ipos < fieldnames.length)); + if (benable) + { + String snewfieldname = fieldnames[ipos]; + updateColumnDescriptor(snewfieldname, curTableDescriptor.getByName(snewfieldname)); + toggleButtons(); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(txtfieldname), "Text", PropertyNames.EMPTY_STRING); + Helper.setUnoPropertyValue(UnoDialog.getModel(btnminus), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benable)); + CurUnoDialog.setcompleted(TableWizard.SOFIELDSFORMATPAGE, benable); + } + Helper.setUnoPropertyValue(UnoDialog.getModel(btnminus), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benable)); + CurUnoDialog.setControlVisible("oColumnDescriptor", benable); + CurUnoDialog.repaintDialogStep(); + } + + private void modifyFieldName() + { + String newfieldname = txtfieldname.getText(); + String oldfieldname = xlstFieldNames.getSelectedItem(); + if (!newfieldname.equals(oldfieldname)) + { + if (curTableDescriptor.modifyColumnName(oldfieldname, newfieldname)) + { + Object oColumn = Helper.getUnoPropertyValue(oColumnDescriptorModel, "Column"); + Helper.setUnoPropertyValue(oColumn, PropertyNames.PROPERTY_NAME, newfieldname); + FieldDescription curfielddescription = CurUnoDialog.fielditems.get(oldfieldname); + CurUnoDialog.fielditems.remove(oldfieldname); + curfielddescription.setName(newfieldname); + CurUnoDialog.fielditems.put(newfieldname, curfielddescription); + String[] fieldnames = xlstFieldNames.getItems(); + short ipos = xlstFieldNames.getSelectedItemPos(); + fieldnames[ipos] = newfieldname; + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST, fieldnames); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + ipos + }); + } + } + } + + private void shiftFieldNameUp() + { + short ipos = xlstFieldNames.getSelectedItemPos(); + String[] snewlist = shiftArrayItem(xlstFieldNames.getItems(), ipos, -1); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST, snewlist); + if ((ipos - 1) > -1) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + (short) (ipos - 1) + }); + curTableDescriptor.moveColumn(ipos, ipos - 1); + } + toggleButtons(); + } + + private void shiftFieldNameDown() + { + short ipos = xlstFieldNames.getSelectedItemPos(); + String[] snewlist = shiftArrayItem(xlstFieldNames.getItems(), ipos, 1); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST, snewlist); + if ((ipos + 1) < xlstFieldNames.getItemCount()) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.SELECTED_ITEMS, new short[] + { + (short) (ipos + 1) + }); + curTableDescriptor.moveColumn(ipos, ipos + 1); + } + toggleButtons(); + } + + private String[] shiftArrayItem(String[] _slist, int _oldindex, int _shiftcount) + { + int newindex = _oldindex + _shiftcount; + if ((newindex >= 0) && (newindex < _slist.length)) + { + String buffer = _slist[newindex]; + _slist[newindex] = _slist[_oldindex]; + _slist[_oldindex] = buffer; + } + return _slist; + } + + public boolean updateColumnofColumnDescriptor() + { + Object oColumn = Helper.getUnoPropertyValue(oColumnDescriptorModel, "Column"); + XPropertySet xColPropertySet = UnoRuntime.queryInterface(XPropertySet.class, oColumn); + if (xColPropertySet != null) + { + curTableDescriptor.modifyColumn(txtfieldname.getText(), xColPropertySet); + return true; + } + return false; + } + + private void updateColumnDescriptor(String _ColumnName, XPropertySet _xColumn) + { + updateColumnofColumnDescriptor(); + XPropertySet xNewPropertySet = curTableDescriptor.clonePropertySet(_ColumnName, _xColumn); + if (xNewPropertySet != null) + { + Helper.setUnoPropertyValue(oColumnDescriptorModel, "Column", xNewPropertySet); + } + txtfieldname.setText(_ColumnName); + } + + + + public void itemStateChanged(ItemEvent arg0) + { + String fieldname = xlstFieldNames.getSelectedItem(); + XPropertySet xColumn = curTableDescriptor.getByName(fieldname); + updateColumnDescriptor(fieldname, xColumn); + toggleButtons(); + } + + public boolean iscompleted() + { + String[] sfieldnames = (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST); + return sfieldnames.length > 0; + } + + public String[] getFieldNames() + { + return (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xlstFieldNames), PropertyNames.STRING_ITEM_LIST); + } + + /* (non-Javadoc) + * @see com.sun.star.lang.XEventListener#disposing(com.sun.star.lang.EventObject) + */ + public void disposing(EventObject arg0) + { + // TODO Auto-generated method stub + } +} diff --git a/wizards/com/sun/star/wizards/table/Finalizer.java b/wizards/com/sun/star/wizards/table/Finalizer.java new file mode 100644 index 000000000..ce6c4bb31 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/Finalizer.java @@ -0,0 +1,349 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.awt.XTextComponent; +import com.sun.star.sdbc.SQLException; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.TableDescriptor; +import com.sun.star.wizards.ui.*; +import com.sun.star.wizards.ui.event.XTextListenerAdapter; + +public class Finalizer +{ + + private TableWizard CurUnoDialog; + private XRadioButton optModifyTable; + private XRadioButton optWorkWithTable; + private XTextComponent txtTableName; + private XListBox xCatalogListBox; + private XListBox xSchemaListBox; + private TableDescriptor curtabledescriptor; + private static int WORKWITHTABLEMODE = 0; + public static int MODIFYTABLEMODE = 1; + public static int STARTFORMWIZARDMODE = 2; + + public Finalizer(TableWizard _CurUnoDialog, TableDescriptor _curtabledescriptor) + { + try + { + this.CurUnoDialog = _CurUnoDialog; + this.curtabledescriptor = _curtabledescriptor; + short curtabindex = (short) (TableWizard.SOFINALPAGE * 100); + Integer IFINALSTEP = Integer.valueOf(TableWizard.SOFINALPAGE); + String slblTableName = CurUnoDialog.m_oResource.getResText("RID_TABLE_34"); + String slblProceed = CurUnoDialog.m_oResource.getResText("RID_TABLE_36"); + String sWorkWithTable = CurUnoDialog.m_oResource.getResText("RID_TABLE_38"); + String sStartFormWizard = CurUnoDialog.m_oResource.getResText("RID_TABLE_39"); + String sModifyTable = CurUnoDialog.m_oResource.getResText("RID_TABLE_37"); + String sCongratulations = CurUnoDialog.m_oResource.getResText("RID_TABLE_35"); + String slblCatalog = CurUnoDialog.m_oResource.getResText("RID_TABLE_49"); + String slblSchema = CurUnoDialog.m_oResource.getResText("RID_TABLE_50"); + String[] sCatalogNames = curtabledescriptor.getCatalogNames(); + String[] sSchemaNames = curtabledescriptor.getSchemaNames(); + int nListBoxPosX = 97; + int ndiffPosY = 0; + boolean bsupportsSchemata = false; + boolean bsupportsCatalogs = false; + + CurUnoDialog.insertLabel("lblTableName", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], slblTableName, 97, 25, IFINALSTEP, 220 + }); + txtTableName = CurUnoDialog.insertTextField("txtTableName", new XTextListenerAdapter() { + @Override + public void textChanged(TextEvent event) { + setCompletionFlag(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Text", PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGER_12, "HID:WIZARDS_HID_DLGTABLE_TXT_NAME", 97, 35, IFINALSTEP, Short.valueOf(curtabindex++), PropertyNames.EMPTY_STRING, 223 + }); + txtTableName.addTextListener(CurUnoDialog); + txtTableName.setMaxTextLen((short) this.curtabledescriptor.getMaxTableNameLength()); + if (this.curtabledescriptor.xDBMetaData.supportsCatalogsInTableDefinitions()) + { + if (sCatalogNames != null && sCatalogNames.length > 0) + { + bsupportsCatalogs = true; + String sCatalog = PropertyNames.EMPTY_STRING; + try + { + sCatalog = curtabledescriptor.DBConnection.getCatalog(); + } + catch (SQLException e1) + { + e1.printStackTrace(System.err); + } + CurUnoDialog.insertLabel("lblCatalog", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblCatalog, Integer.valueOf(nListBoxPosX), 52, IFINALSTEP, Short.valueOf(curtabindex++), 120 + }); + + try + { + xCatalogListBox = CurUnoDialog.insertListBox("lstCatalog", null, null, + new String[] + { + "Dropdown", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "LineCount", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, 12, "HID:WIZARDS_HID_DLGTABLE_LST_CATALOG", Short.valueOf(UnoDialog.getListBoxLineCount()), Integer.valueOf(nListBoxPosX), 62, IFINALSTEP, sCatalogNames, Short.valueOf(curtabindex++), 80 + }); + int isel = JavaTools.FieldInList(sCatalogNames, sCatalog); + if (isel < 0) + { + isel = 0; + } + CurUnoDialog.setControlProperty("lstCatalog", PropertyNames.SELECTED_ITEMS, new short[] + { + (short) isel + }); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + nListBoxPosX = 200; + } + } + if (this.curtabledescriptor.xDBMetaData.supportsSchemasInTableDefinitions()) + { + if (sSchemaNames != null && sSchemaNames.length > 0) + { + bsupportsSchemata = true; + String sSchema = PropertyNames.EMPTY_STRING; + try + { + sSchema = (String) curtabledescriptor.getDataSourcePropertySet().getPropertyValue("User"); + } + catch (Exception e1) + { + e1.printStackTrace(System.err); + } + CurUnoDialog.insertLabel("lblSchema", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblSchema, Integer.valueOf(nListBoxPosX), 52, IFINALSTEP, Short.valueOf(curtabindex++), 80 + }); + + try + { + xSchemaListBox = CurUnoDialog.insertListBox("lstSchema", null, null, + new String[] + { + "Dropdown", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "LineCount", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, 12, "HID:WIZARDS_HID_DLGTABLE_LST_SCHEMA", Short.valueOf(UnoDialog.getListBoxLineCount()), Integer.valueOf(nListBoxPosX), 62, IFINALSTEP, sSchemaNames, Short.valueOf(curtabindex++), 80 + }); + int isel = JavaTools.FieldInList(sSchemaNames, sSchema); + if (isel < 0) + { + isel = 0; + } + CurUnoDialog.setControlProperty("lstSchema", PropertyNames.SELECTED_ITEMS, new short[] + { + (short) isel + }); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + } + if ((!bsupportsCatalogs) && (!bsupportsSchemata)) + { + CurUnoDialog.insertLabel("lblcongratulations", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 16, sCongratulations, Boolean.TRUE, 97, 62, IFINALSTEP, Short.valueOf(curtabindex++), 226 + }); + } + else + { + ndiffPosY = 10; + } + CurUnoDialog.insertLabel("lblProceed", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], slblProceed, 97, Integer.valueOf(82 + ndiffPosY), IFINALSTEP, Short.valueOf(curtabindex++), 227 + }); + optWorkWithTable = CurUnoDialog.insertRadioButton("optWorkWithTable", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_WORKWITHTABLE", sWorkWithTable, 101, Integer.valueOf(97 + ndiffPosY), Short.valueOf((short) 1), IFINALSTEP, Short.valueOf(curtabindex++), 177 + }); + optModifyTable = CurUnoDialog.insertRadioButton("optModifyTable", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_MODIFYTABLE", sModifyTable, 101, Integer.valueOf(109 + ndiffPosY), IFINALSTEP, Short.valueOf(curtabindex++), 177 + }); + CurUnoDialog.insertRadioButton("optStartFormWizard", null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_STARTFORMWIZARD", sStartFormWizard, 101, Integer.valueOf(121 + ndiffPosY), IFINALSTEP, Short.valueOf(curtabindex++), 177 + }); + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + } + + public void initialize(String _firsttablename) + { + setTableName(_firsttablename); + } + + public int finish() + { + if (optWorkWithTable.getState()) + { + return WORKWITHTABLEMODE; + } + else if (optModifyTable.getState()) + { + return MODIFYTABLEMODE; + } + else + { + return STARTFORMWIZARDMODE; + } + } + + public String getComposedTableName(String _stablename) + { + String scatalogname = null; + String sschemaname = null; + if (xCatalogListBox != null) + { + scatalogname = xCatalogListBox.getSelectedItem(); + } + if (xSchemaListBox != null) + { + sschemaname = xSchemaListBox.getSelectedItem(); + } + return curtabledescriptor.getComposedTableName(scatalogname, sschemaname, _stablename); + } + + private void setTableName(String _tablename) + { + if (txtTableName.getText().equals(PropertyNames.EMPTY_STRING)) + { + String ssuffix = Desktop.getIncrementSuffix(curtabledescriptor.getTableNamesAsNameAccess(), getComposedTableName(_tablename)); + txtTableName.setText(_tablename + ssuffix); + setCompletionFlag(); + } + } + + public String getTableName(String _firsttablename) + { + if (txtTableName.getText().equals(PropertyNames.EMPTY_STRING)) + { + setTableName(_firsttablename); + } + return txtTableName.getText(); + } + + public String getSchemaName() + { + if (xSchemaListBox != null) + { + return this.xSchemaListBox.getSelectedItem(); + } + else + { + return PropertyNames.EMPTY_STRING; + } + } + + public String getCatalogName() + { + if (xCatalogListBox != null) + { + return this.xCatalogListBox.getSelectedItem(); + } + else + { + return PropertyNames.EMPTY_STRING; + } + } + + public boolean iscompleted() + { + return (txtTableName.getText().length() > 0); + } + + private void setCompletionFlag() + { + CurUnoDialog.setcompleted(TableWizard.SOFINALPAGE, iscompleted()); + } + + public void setFocusToTableNameControl() + { + CurUnoDialog.setFocus("txtTableName"); + } +} diff --git a/wizards/com/sun/star/wizards/table/MANIFEST.MF b/wizards/com/sun/star/wizards/table/MANIFEST.MF new file mode 100644 index 000000000..0fcfe1d3e --- /dev/null +++ b/wizards/com/sun/star/wizards/table/MANIFEST.MF @@ -0,0 +1,2 @@ +RegistrationClassName: com.sun.star.wizards.table.CallTableWizard +UNO-Type-Path: diff --git a/wizards/com/sun/star/wizards/table/PrimaryKeyHandler.java b/wizards/com/sun/star/wizards/table/PrimaryKeyHandler.java new file mode 100644 index 000000000..6bd2ae6e8 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/PrimaryKeyHandler.java @@ -0,0 +1,459 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XCheckBox; +import com.sun.star.awt.XFixedText; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.uno.AnyConverter; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.TableDescriptor; +import com.sun.star.wizards.ui.FieldSelection; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.XFieldSelectionListener; +import com.sun.star.wizards.ui.event.XActionListenerAdapter; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +public class PrimaryKeyHandler implements XFieldSelectionListener +{ + + private final TableWizard CurUnoDialog; + private final XRadioButton optAddAutomatically; + private final XRadioButton optUseExisting; + private final XRadioButton optUseSeveral; + private final XCheckBox chkcreatePrimaryKey; + private final XCheckBox chkApplyAutoValueExisting; + private final XCheckBox chkApplyAutoValueAutomatic; + private final XListBox lstSinglePrimeKey; + private final XFixedText lblPrimeFieldName; + private final FieldSelection curPrimaryKeySelection; + private String[] fieldnames; + private final TableDescriptor curTableDescriptor; + private final boolean bAutoPrimaryKeysupportsAutoIncrmentation; + private static final String SAUTOMATICKEYFIELDNAME = "ID"; + + public PrimaryKeyHandler(TableWizard _CurUnoDialog, TableDescriptor _curTableDescriptor) + { + this.CurUnoDialog = _CurUnoDialog; + curTableDescriptor = _curTableDescriptor; + bAutoPrimaryKeysupportsAutoIncrmentation = curTableDescriptor.oTypeInspector.isAutoIncrementationSupported(); + short curtabindex = (short) ((TableWizard.SOPRIMARYKEYPAGE * 100) - 20); + Integer IPRIMEKEYSTEP = Integer.valueOf(TableWizard.SOPRIMARYKEYPAGE); + final String sExplanations = CurUnoDialog.m_oResource.getResText("RID_TABLE_26"); + final String screatePrimaryKey = CurUnoDialog.m_oResource.getResText("RID_TABLE_27"); + final String slblPrimeFieldName = CurUnoDialog.m_oResource.getResText("RID_TABLE_31"); + final String sApplyAutoValue = CurUnoDialog.m_oResource.getResText("RID_TABLE_33"); + final String sAddAutomatically = CurUnoDialog.m_oResource.getResText("RID_TABLE_28"); + final String sUseExisting = CurUnoDialog.m_oResource.getResText("RID_TABLE_29"); + final String sUseSeveral = CurUnoDialog.m_oResource.getResText("RID_TABLE_30"); + final String slblAvailableFields = CurUnoDialog.m_oResource.getResText("RID_QUERY_4"); + final String slblSelPrimaryFields = CurUnoDialog.m_oResource.getResText("RID_TABLE_32"); + CurUnoDialog.insertLabel("lblExplanation", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 40, sExplanations, Boolean.TRUE, 91, 27, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 233 + }); + + chkcreatePrimaryKey = CurUnoDialog.insertCheckBox("chkcreatePrimaryKey", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_CHK_USEPRIMEKEY", screatePrimaryKey, 97, 70, Short.valueOf((short) 1), IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 160 + }); + + optAddAutomatically = CurUnoDialog.insertRadioButton("optAddAutomatically", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_PK_AUTOMATIC", sAddAutomatically, 106, 82, Short.valueOf((short) 1), IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 200 + }); + + optUseExisting = CurUnoDialog.insertRadioButton("optUseExisting", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, //94 + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SINGLE", sUseExisting, 106, 104, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 200 + }); + + optUseSeveral = CurUnoDialog.insertRadioButton("optUseSeveral", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPT_PK_SEVERAL", sUseSeveral, 106, 132, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 200 + }); + + chkApplyAutoValueAutomatic = CurUnoDialog.insertCheckBox("chkApplyAutoValueAutomatic", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, //107 + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE_AUTOMATIC", sApplyAutoValue, 116, 92, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 68 + }); + + lblPrimeFieldName = CurUnoDialog.insertLabel("lblPrimeFieldName", + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, UIConsts.INTEGERS[8], slblPrimeFieldName, 116, 117, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 46 + }); + + lstSinglePrimeKey = CurUnoDialog.insertListBox("lstSinglePrimeKey", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + onPrimeKeySelected(); + } + }, null, + new String[] + { + "Dropdown", + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + "LineCount", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, + Boolean.FALSE, + 12, + "HID:WIZARDS_HID_DLGTABLE_LB_PK_FIELDNAME", + Short.valueOf(UnoDialog.getListBoxLineCount()), + 162, + 115, + IPRIMEKEYSTEP, + Short.valueOf(curtabindex++), + 80 + }); + + chkApplyAutoValueExisting = CurUnoDialog.insertCheckBox("chkApplyAutoValueExisting", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + togglePrimeKeyFields(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, //107 + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_CK_PK_AUTOVALUE", sApplyAutoValue, 248, 117, IPRIMEKEYSTEP, Short.valueOf(curtabindex++), 66 + }); + curPrimaryKeySelection = new FieldSelection(CurUnoDialog, IPRIMEKEYSTEP.intValue(), 116, 142, 208, 47, slblAvailableFields, slblSelPrimaryFields, 41234, false); + curPrimaryKeySelection.addFieldSelectionListener(this); + + } + + public void initialize() + { + // boolean breselect; + fieldnames = curTableDescriptor.getNonBinaryFieldNames(); + String[] skeyfieldnames = curPrimaryKeySelection.getSelectedFieldNames(); + curPrimaryKeySelection.initialize(fieldnames, false); + if (skeyfieldnames != null && skeyfieldnames.length > 0) + { + String[] snewkeyfieldnames = JavaTools.removeOutdatedFields(skeyfieldnames, fieldnames); + curPrimaryKeySelection.setSelectedFieldNames(snewkeyfieldnames); + } + String selfield = lstSinglePrimeKey.getSelectedItem(); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSinglePrimeKey), PropertyNames.STRING_ITEM_LIST, fieldnames); + if (selfield != null) + { + if (JavaTools.FieldInList(fieldnames, selfield) > -1) + { + lstSinglePrimeKey.selectItem(selfield, true); + } + } + togglePrimeKeyFields(); + } + + public boolean iscompleted() + { + if (chkcreatePrimaryKey.getState() == 0) + { + return true; + } + if (this.optAddAutomatically.getState()) + { + return true; + } + if (optUseExisting.getState()) + { + fieldnames = curTableDescriptor.getNonBinaryFieldNames(); + String selfield = lstSinglePrimeKey.getSelectedItem(); + if (selfield != null) + { + return (JavaTools.FieldInList(fieldnames, selfield) > -1); + } + } + if (optUseSeveral.getState()) + { + fieldnames = curTableDescriptor.getNonBinaryFieldNames(); + String[] skeyfieldnames = curPrimaryKeySelection.getSelectedFieldNames(); + String[] snewkeyfieldnames = JavaTools.removeOutdatedFields(skeyfieldnames, fieldnames); + return (snewkeyfieldnames.length > 0); + } + return false; + } + + private void togglePrimeKeyFields() + { + boolean bdoEnable = (this.chkcreatePrimaryKey.getState() == 1); + Helper.setUnoPropertyValue(UnoDialog.getModel(optAddAutomatically), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueAutomatic), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bAutoPrimaryKeysupportsAutoIncrmentation && bdoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(optUseExisting), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoEnable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(optUseSeveral), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoEnable)); + //toggle subcontrols of the radiobuttons... + toggleAutomaticAutoValueCheckBox(); + boolean benableSinglePrimekeyControls = bdoEnable && optUseExisting.getState(); + toggleSinglePrimeKeyFields(benableSinglePrimekeyControls); + boolean benableSeveralPrimekeyControls = bdoEnable && optUseSeveral.getState(); + curPrimaryKeySelection.toggleListboxControls(Boolean.valueOf(benableSeveralPrimekeyControls)); + // toggle the following steps of the dialog... + if (!bdoEnable) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, true); + } + else + { + if (benableSeveralPrimekeyControls) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, (curPrimaryKeySelection.getSelectedFieldNames().length > 0)); + } + else if (benableSinglePrimekeyControls) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, UnoDialog.isListBoxSelected(lstSinglePrimeKey)); //.getSelectedItemPos() != -1); + } + else if (optAddAutomatically.getState()) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, true); + } + } + } + + private boolean isAutoIncrementatable(String _fieldname) + { + try + { + XPropertySet xColPropertySet = curTableDescriptor.getByName(_fieldname); + if (xColPropertySet != null && curTableDescriptor.getDBDataTypeInspector() != null) + { + return curTableDescriptor.getDBDataTypeInspector().isAutoIncrementable(xColPropertySet); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return false; + } + + public boolean isAutomaticMode() + { + boolean bisAutomaticMode = false; + if (chkcreatePrimaryKey.getState() == 1) + { + bisAutomaticMode = ((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(optAddAutomatically), PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + } + return bisAutomaticMode; + } + + public String getAutomaticFieldName() + { + return SAUTOMATICKEYFIELDNAME; + } + + public boolean isAutoIncremented() + { + boolean bischecked = false; + if (chkcreatePrimaryKey.getState() == 1) + { + boolean bisAutomaticMode = ((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(optAddAutomatically), PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + boolean bisExistingMode = ((Short) Helper.getUnoPropertyValue(UnoDialog.getModel(optUseExisting), PropertyNames.PROPERTY_STATE)).shortValue() == (short) 1; + if (bisAutomaticMode) + { + bischecked = chkApplyAutoValueAutomatic.getState() == (short) 1; + } + else if (bisExistingMode) + { + bischecked = chkApplyAutoValueExisting.getState() == (short) 1; + } + } + return bischecked; + } + + private void onPrimeKeySelected() + { + try + { + String selfieldname = lstSinglePrimeKey.getSelectedItem(); + boolean bdoenable = isAutoIncrementatable(selfieldname); + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, lstSinglePrimeKey.getSelectedItemPos() != -1); + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueExisting), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable)); + XPropertySet xColPropertySet = curTableDescriptor.getByName(selfieldname); + boolean bIsAutoIncremented = ((Boolean) xColPropertySet.getPropertyValue("IsAutoIncrement")).booleanValue(); + if (bIsAutoIncremented) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueExisting), PropertyNames.PROPERTY_STATE, Short.valueOf((short) 1)); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueExisting), PropertyNames.PROPERTY_STATE, Short.valueOf((short) 0)); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void toggleAutomaticAutoValueCheckBox() + { + try + { + boolean bisAutomaticMode = AnyConverter.toBoolean(Helper.getUnoPropertyValue(UnoDialog.getModel(optAddAutomatically), PropertyNames.PROPERTY_ENABLED)); + boolean bdoenable = bAutoPrimaryKeysupportsAutoIncrmentation && optAddAutomatically.getState() && bisAutomaticMode; + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueAutomatic), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable)); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + } + + private void toggleSinglePrimeKeyFields(boolean _bdoenable) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(lblPrimeFieldName), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(lstSinglePrimeKey), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueExisting), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + boolean bdoenableAutoValueCheckBox = (isAutoIncrementatable(lstSinglePrimeKey.getSelectedItem()) && _bdoenable); + Helper.setUnoPropertyValue(UnoDialog.getModel(chkApplyAutoValueExisting), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenableAutoValueCheckBox)); + } + + public String[] getPrimaryKeyFields() + { + if (chkcreatePrimaryKey.getState() == 0) + { + return null; + } + if (fieldnames == null) + { + initialize(); + } + if (optUseSeveral.getState()) + { + return curPrimaryKeySelection.getSelectedFieldNames(); + } + else if (optUseExisting.getState()) + { + return new String[] + { + lstSinglePrimeKey.getSelectedItem() + }; + } + else if (optAddAutomatically.getState()) + { + return new String[] + { + SAUTOMATICKEYFIELDNAME + }; + } + return null; + } + + public void moveItemDown(String Selitem) + { + } + + public void moveItemUp(String Selitem) + { + } + + public void setID(String sIncSuffix) + { + } + + public void shiftFromLeftToRight(String[] SelItems, String[] NewItems) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, (curPrimaryKeySelection.getSelectedFieldNames().length > 0)); + } + + public void shiftFromRightToLeft(String[] OldSelItems, String[] NewItems) + { + CurUnoDialog.setcompleted(TableWizard.SOPRIMARYKEYPAGE, (curPrimaryKeySelection.getSelectedFieldNames().length > 0)); + } +} diff --git a/wizards/com/sun/star/wizards/table/ScenarioSelector.java b/wizards/com/sun/star/wizards/table/ScenarioSelector.java new file mode 100644 index 000000000..720700589 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/ScenarioSelector.java @@ -0,0 +1,364 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import java.util.ArrayList; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XItemListener; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.Locale; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.wizards.common.Configuration; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.TableDescriptor; +import com.sun.star.wizards.ui.FieldSelection; +import com.sun.star.wizards.ui.UIConsts; +import com.sun.star.wizards.ui.UnoDialog; +import com.sun.star.wizards.ui.XFieldSelectionListener; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class ScenarioSelector extends FieldSelection implements XItemListener, XFieldSelectionListener +{ + private static final int PRIVATE = 0; + private static final int BUSINESS = 1; + + private final XRadioButton optBusiness; + private XListBox xTableListBox; + private final TableWizard CurTableWizardUnoDialog; + private final TableDescriptor curtabledescriptor; + private final CGCategory oCGCategory; + protected CGTable oCGTable; + protected boolean bcolumnnameislimited; + private final int imaxcolumnchars; + private final String smytable; + private final Locale aLocale; + private final XMultiServiceFactory xMSF; + + public ScenarioSelector(TableWizard _CurUnoDialog, TableDescriptor _curtabledescriptor, String _reslblFields, String _reslblSelFields) + { + super(_CurUnoDialog, TableWizard.SOMAINPAGE, 91, 108, 230, 80, _reslblFields, _reslblSelFields, 41209, true); + CurTableWizardUnoDialog = _CurUnoDialog; + xMSF = CurUnoDialog.xMSF; + aLocale = Configuration.getLocale(xMSF); + curtabledescriptor = _curtabledescriptor; + imaxcolumnchars = this.curtabledescriptor.getMaxColumnNameLength(); + bcolumnnameislimited = (imaxcolumnchars > 0) && (imaxcolumnchars < 16); + addFieldSelectionListener(this); + short pretabindex = (short) (50); + String sExplanation = CurUnoDialog.m_oResource.getResText("RID_TABLE_14"); + String sCategories = CurUnoDialog.m_oResource.getResText("RID_TABLE_15"); + String sBusiness = CurUnoDialog.m_oResource.getResText("RID_TABLE_16"); + String sPrivate = CurUnoDialog.m_oResource.getResText("RID_TABLE_17"); + String sTableNames = CurUnoDialog.m_oResource.getResText("RID_TABLE_18"); + smytable = CurUnoDialog.m_oResource.getResText("RID_TABLE_44"); + Integer IMAINSTEP = Integer.valueOf(TableWizard.SOMAINPAGE); + oCGCategory = new CGCategory(CurUnoDialog.xMSF); + oCGTable = new CGTable(CurUnoDialog.xMSF); + CurUnoDialog.insertLabel("lblScenarioExplanation", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 32, sExplanation, Boolean.TRUE, 91, 27, IMAINSTEP, Short.valueOf(pretabindex++), 233 + }); + + CurUnoDialog.insertLabel("lblCategories", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sCategories, 91, 60, IMAINSTEP, Short.valueOf(pretabindex++), 100 + }); + + optBusiness = CurTableWizardUnoDialog.insertRadioButton("optBusiness", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + selectCategory(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPTBUSINESS", sBusiness, 98, 70, Short.valueOf((short) 1), IMAINSTEP, Short.valueOf(pretabindex++), 78 + }); + + CurTableWizardUnoDialog.insertRadioButton("optPrivate", new XItemListenerAdapter() { + @Override + public void itemStateChanged(ItemEvent event) { + selectCategory(); + } + }, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + UIConsts.INTEGERS[8], "HID:WIZARDS_HID_DLGTABLE_OPTPRIVATE", sPrivate, 182, 70, IMAINSTEP, Short.valueOf(pretabindex++), 90 + }); + + CurUnoDialog.insertLabel("lblTableNames", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, sTableNames, 91, 82, IMAINSTEP, Short.valueOf(pretabindex++), 80 + }); + + try + { + xTableListBox = CurUnoDialog.insertListBox("lstTableNames", 3, null, this, + new String[] + { + "Dropdown", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "LineCount", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, 12, "HID:WIZARDS_HID_DLGTABLE_LBTABLES", Short.valueOf(UnoDialog.getListBoxLineCount()), 91, 92, IMAINSTEP, Short.valueOf(pretabindex++), getListboxWidth() + }); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + initializeCategory(BUSINESS); + } + + private void selectCategory() + { + if (optBusiness.getState()) + { + initializeCategory(BUSINESS); + } + else + { + initializeCategory(PRIVATE); + } + } + + private void initializeCategory(int _iCategory) + { + try + { + oCGCategory.initialize( + _iCategory == PRIVATE ? "private" : "business"); + xTableListBox.removeItems((short) 0, xTableListBox.getItemCount()); + xTableListBox.addItems(oCGCategory.getTableNames(), (short) _iCategory); + initializeTable(0); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void initializeTable(int _iTable) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, new short[] + { + (short) _iTable + }); + oCGTable.initialize(oCGCategory.xNameAccessTablesNode, _iTable); + super.initialize(oCGTable.getFieldNames(bcolumnnameislimited, imaxcolumnchars), true); + } + + @Override + public String[] getSelectedFieldNames() + { + String[] displayfieldnames = super.getSelectedFieldNames(); + ArrayList<String> afieldnameVector = new ArrayList<String>(); + for (int i = 0; i < displayfieldnames.length; i++) + { + try + { + FieldDescription ofielddescription = CurTableWizardUnoDialog.fielditems.get(displayfieldnames[i]); + if (ofielddescription != null) + { + afieldnameVector.add(ofielddescription.getName()); + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + } + String[] fieldnames = new String[afieldnameVector.size()]; + return afieldnameVector.toArray(fieldnames); + } + + public boolean iscompleted() + { + return getSelectedFieldNames().length > 0; + } + + public void addColumnsToDescriptor() + { + String[] fieldnames = getSelectedFieldNames(); + for (int i = 0; i < fieldnames.length; i++) + { + try + { + FieldDescription curfielddescription = CurTableWizardUnoDialog.fielditems.get(fieldnames[i]); + PropertyValue[] aProperties = curfielddescription.getPropertyValues(); + if (aProperties != null) { + this.curtabledescriptor.addColumn(aProperties); + } + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + } + } + + public String getTableName() + { + return xTableListBox.getSelectedItem(); + } + + public String getFirstTableName() + { + String[] fieldnames = super.getSelectedFieldNames(); + if ((fieldnames.length) > 0) + { + for (int i = 0; i < CurTableWizardUnoDialog.fielditems.size(); i++) + { + String stablename = PropertyNames.EMPTY_STRING; + try + { + FieldDescription ofielddescription = CurTableWizardUnoDialog.fielditems.get(fieldnames[i]); + stablename = ofielddescription.gettablename(); + } + catch (RuntimeException e) + { + e.printStackTrace(System.err); + } + if (!stablename.equals(PropertyNames.EMPTY_STRING)) + { + return stablename; + } + } + } + return smytable; + } + + + + + + + /* (non-Javadoc) + * @see com.sun.star.awt.XItemListener#itemStateChanged(com.sun.star.awt.ItemEvent) + */ + public void itemStateChanged(ItemEvent arg0) + { + initializeTable(xTableListBox.getSelectedItemPos()); + } + + /* (non-Javadoc) + * @see com.sun.star.lang.XEventListener#disposing(com.sun.star.lang.EventObject) + */ + public void disposing(EventObject arg0) + { + } + + public void setID(String sIncSuffix) + { + } + + public void shiftFromLeftToRight(String[] SelItems, String[] NewItems) + { + if (!CurTableWizardUnoDialog.verifyfieldcount(NewItems.length)) + { + for (int i = 0; i < SelItems.length; i++) + { + int selindex = JavaTools.FieldInList(NewItems, SelItems[i]); + super.xSelectedFieldsListBox.removeItems((short) selindex, (short) 1); + /**TODO In this context the items should be better placed at their original position. + * but how is this position retrieved? + */ + super.xFieldsListBox.addItem(SelItems[i], xFieldsListBox.getItemCount()); + } + } + else + { + for (int i = 0; i < NewItems.length; i++) + { + int iduplicate; + if (CurTableWizardUnoDialog.fielditems.containsKey(NewItems[i])) + { + iduplicate = JavaTools.getDuplicateFieldIndex(NewItems, NewItems[i]); + if (iduplicate != -1) + { + String sdisplayname = Desktop.getUniqueName(NewItems, NewItems[iduplicate], PropertyNames.EMPTY_STRING); + FieldDescription curfielddescription = new FieldDescription(xMSF, aLocale, this, sdisplayname, NewItems[iduplicate], imaxcolumnchars); + CurTableWizardUnoDialog.fielditems.put(sdisplayname, curfielddescription); + NewItems[iduplicate] = sdisplayname; + setSelectedFieldNames(NewItems); + } + } + else + { + CurTableWizardUnoDialog.fielditems.put(NewItems[i], new FieldDescription(xMSF, aLocale, this, NewItems[i], NewItems[i], imaxcolumnchars)); + } + } + } + CurTableWizardUnoDialog.setcompleted(TableWizard.SOMAINPAGE, NewItems.length > 0); + } + + public void shiftFromRightToLeft(String[] SelItems, String[] NewItems) + { + for (int i = 0; i < SelItems.length; i++) + { + if (CurTableWizardUnoDialog.fielditems.containsKey(SelItems[i])) + { + CurTableWizardUnoDialog.fielditems.remove(SelItems[i]); + this.curtabledescriptor.dropColumnbyName(SelItems[i]); + } + } + CurTableWizardUnoDialog.setcompleted(TableWizard.SOMAINPAGE, NewItems.length > 0); + } + + public void moveItemDown(String item) + { + } + + public void moveItemUp(String item) + { + } +} diff --git a/wizards/com/sun/star/wizards/table/TableWizard.java b/wizards/com/sun/star/wizards/table/TableWizard.java new file mode 100644 index 000000000..282796a3e --- /dev/null +++ b/wizards/com/sun/star/wizards/table/TableWizard.java @@ -0,0 +1,412 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.table; + +import java.util.HashMap; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XTextListener; +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.XInitialization; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.CommandType; +import com.sun.star.sdb.application.DatabaseObject; +import com.sun.star.sdbc.SQLException; +import com.sun.star.task.XJobExecutor; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.db.DatabaseObjectWizard; +import com.sun.star.wizards.db.TableDescriptor; +import com.sun.star.wizards.ui.*; + +public class TableWizard extends DatabaseObjectWizard implements XTextListener +{ + + private static String slblFields; + private static String slblSelFields; + private Finalizer curFinalizer; + private ScenarioSelector curScenarioSelector; + private FieldFormatter curFieldFormatter; + private PrimaryKeyHandler curPrimaryKeyHandler; + HashMap<String, FieldDescription> fielditems; + private int wizardmode; + private String tablename; + private String serrToManyFields; + private String serrTableNameexists; + private String scomposedtablename; + private TableDescriptor curTableDescriptor; + public static final int SOMAINPAGE = 1; + public static final int SOFIELDSFORMATPAGE = 2; + public static final int SOPRIMARYKEYPAGE = 3; + public static final int SOFINALPAGE = 4; + private String sMsgColumnAlreadyExists = PropertyNames.EMPTY_STRING; + + private String m_tableName; + + public TableWizard( XMultiServiceFactory xMSF, PropertyValue[] i_wizardContext ) + { + super( xMSF, 41200, i_wizardContext ); + super.addResourceHandler(); + String sTitle = m_oResource.getResText("RID_TABLE_1"); + Helper.setUnoPropertyValues(xDialogModel, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_MOVEABLE, PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_TITLE, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 218, Boolean.TRUE, "DialogTable", 102, 41, 1, Short.valueOf((short) 0), sTitle, 330 + }); + drawNaviBar(); + fielditems = new HashMap<String, FieldDescription>(); + //TODO if reportResources cannot be gotten dispose officedocument + if (getTableResources()) + { + setRightPaneHeaders(m_oResource, "RID_TABLE_", 8, 4); + } + } + + @Override + protected void leaveStep(int nOldStep, int nNewStep) + { + switch (nOldStep) + { + case SOMAINPAGE: + curScenarioSelector.addColumnsToDescriptor(); + break; + case SOFIELDSFORMATPAGE: + curFieldFormatter.updateColumnofColumnDescriptor(); + String[] sfieldnames = curFieldFormatter.getFieldNames(); + super.setStepEnabled(SOFIELDSFORMATPAGE, sfieldnames.length > 0); + curScenarioSelector.setSelectedFieldNames(sfieldnames); + break; + case SOPRIMARYKEYPAGE: + break; + case SOFINALPAGE: + break; + default: + break; + } + } + + @Override + protected void enterStep(int nOldStep, int nNewStep) + { + switch (nNewStep) + { + case SOMAINPAGE: + break; + case SOFIELDSFORMATPAGE: + curFieldFormatter.initialize(curTableDescriptor, this.curScenarioSelector.getSelectedFieldNames()); + break; + case SOPRIMARYKEYPAGE: + curPrimaryKeyHandler.initialize(); + break; + case SOFINALPAGE: + curFinalizer.initialize(curScenarioSelector.getFirstTableName()); + break; + default: + break; + } + } + + + private boolean iscompleted(int _ndialogpage) + { + switch (_ndialogpage) + { + case SOMAINPAGE: + return curScenarioSelector.iscompleted(); + case SOFIELDSFORMATPAGE: + return this.curFieldFormatter.iscompleted(); + case SOPRIMARYKEYPAGE: + if (curPrimaryKeyHandler != null) + { + return this.curPrimaryKeyHandler.iscompleted(); + } + case SOFINALPAGE: + return this.curFinalizer.iscompleted(); + default: + return false; + } + } + + + public void setcompleted(int _ndialogpage, boolean _biscompleted) + { + boolean bScenarioiscompleted = _biscompleted; + boolean bPrimaryKeysiscompleted = _biscompleted; + boolean bFinalPageiscompleted = _biscompleted; + if (_ndialogpage == SOMAINPAGE) + { + curFinalizer.initialize(curScenarioSelector.getFirstTableName()); + } + else + { + bScenarioiscompleted = iscompleted(SOMAINPAGE); + } + if (_ndialogpage != TableWizard.SOPRIMARYKEYPAGE && (this.curPrimaryKeyHandler != null)) + { + bPrimaryKeysiscompleted = iscompleted(SOPRIMARYKEYPAGE); + } + if (_ndialogpage != TableWizard.SOFINALPAGE) + { + bFinalPageiscompleted = iscompleted(SOFINALPAGE); // Basically the finalpage is always enabled + } + if (bScenarioiscompleted) + { + super.setStepEnabled(SOFIELDSFORMATPAGE, true); + super.setStepEnabled(SOPRIMARYKEYPAGE, true); + if (bPrimaryKeysiscompleted) + { + super.enablefromStep(SOFINALPAGE, true); + super.enableFinishButton(bFinalPageiscompleted); + } + else + { + super.enablefromStep(SOFINALPAGE, false); + enableNextButton(false); + } + } + else if (_ndialogpage == SOFIELDSFORMATPAGE) + { + super.enablefromStep(super.getCurrentStep() + 1, iscompleted(SOFIELDSFORMATPAGE)); + } + else + { + super.enablefromStep(super.getCurrentStep() + 1, false); + } + } + +/* + public static void main(String args[]) + { + String ConnectStr = "uno:socket,host=localhost,port=8100;urp,negotiate=0,forcesynchronous=1;StarOffice.NamingService"; + PropertyValue[] curproperties = null; + try + { + XMultiServiceFactory xLocMSF = com.sun.star.wizards.common.Desktop.connect(ConnectStr); + TableWizard CurTableWizard = new TableWizard(xLocMSF); + if (xLocMSF != null) + { + System.out.println("Connected to " + ConnectStr); + curproperties = new PropertyValue[1]; + curproperties[0] = Properties.createProperty("DataSourceName", "Bibliography"); + //curproperties[0] = Properties.createProperty("DatabaseLocation", "file:///path/to/database.odb"); + CurTableWizard.startTableWizard(xLocMSF, curproperties); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } +*/ + private void buildSteps() + { + curScenarioSelector = new ScenarioSelector(this, this.curTableDescriptor, slblFields, slblSelFields); + curFieldFormatter = new FieldFormatter(this); + if ( this.curTableDescriptor.supportsPrimaryKeys() ) + { + curPrimaryKeyHandler = new PrimaryKeyHandler(this, curTableDescriptor); + } + curFinalizer = new Finalizer(this, curTableDescriptor); + enableNavigationButtons(false, false, false); + } + + private boolean createTable() + { + boolean bIsSuccessfull = true; + boolean bTableCreated = false; + String schemaname = curFinalizer.getSchemaName(); + String catalogname = curFinalizer.getCatalogName(); + if (curTableDescriptor.supportsPrimaryKeys()) + { + String[] keyfieldnames = curPrimaryKeyHandler.getPrimaryKeyFields(); + if (keyfieldnames != null && keyfieldnames.length > 0) + { + boolean bIsAutoIncrement = curPrimaryKeyHandler.isAutoIncremented(); + bIsSuccessfull = curTableDescriptor.createTable(catalogname, schemaname, tablename, keyfieldnames, bIsAutoIncrement); + bTableCreated = true; + } + } + if (!bTableCreated) + { + bIsSuccessfull = curTableDescriptor.createTable(catalogname, schemaname, tablename); + } + if ((!bIsSuccessfull) && (curPrimaryKeyHandler.isAutomaticMode())) + { + curTableDescriptor.dropColumnbyName(curPrimaryKeyHandler.getAutomaticFieldName()); + } + return bIsSuccessfull; + } + + @Override + public boolean finishWizard() + { + super.switchToStep(super.getCurrentStep(), SOFINALPAGE); + tablename = curFinalizer.getTableName(curScenarioSelector.getFirstTableName()); + scomposedtablename = curFinalizer.getComposedTableName(tablename); + if (this.curTableDescriptor.isSQL92CheckEnabled()) + { + Desktop.removeSpecialCharacters(curTableDescriptor.xMSF, Configuration.getLocale(this.curTableDescriptor.xMSF), tablename); + } + if ( tablename.length() > 0 ) + { + if (!curTableDescriptor.hasTableByName(scomposedtablename)) + { + wizardmode = curFinalizer.finish(); + if (createTable()) + { + final boolean editTableDesign = (wizardmode == Finalizer.MODIFYTABLEMODE ); + loadSubComponent( DatabaseObject.TABLE, curTableDescriptor.getComposedTableName(), editTableDesign ); + m_tableName = curTableDescriptor.getComposedTableName(); + super.xDialog.endExecute(); + return true; + } + } + else + { + String smessage = JavaTools.replaceSubString(serrTableNameexists, tablename, "%TABLENAME"); + super.showMessageBox("WarningBox", com.sun.star.awt.VclWindowPeerAttribute.OK, smessage); + curFinalizer.setFocusToTableNameControl(); + } + } + return false; + } + + private void callFormWizard() + { + try + { + Object oFormWizard = this.xMSF.createInstance("com.sun.star.wizards.form.CallFormWizard"); + + NamedValueCollection wizardContext = new NamedValueCollection(); + wizardContext.put( PropertyNames.ACTIVE_CONNECTION, curTableDescriptor.DBConnection ); + wizardContext.put( "DataSource", curTableDescriptor.getDataSource() ); + wizardContext.put( PropertyNames.COMMAND_TYPE, CommandType.TABLE ); + wizardContext.put( PropertyNames.COMMAND, scomposedtablename ); + wizardContext.put( "DocumentUI", m_docUI ); + XInitialization xInitialization = UnoRuntime.queryInterface( XInitialization.class, oFormWizard ); + xInitialization.initialize( wizardContext.getPropertyValues() ); + XJobExecutor xJobExecutor = UnoRuntime.queryInterface( XJobExecutor.class, oFormWizard ); + xJobExecutor.trigger(PropertyNames.START); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + @Override + public void cancelWizard() + { + xDialog.endExecute(); + } + + private void insertFormRelatedSteps() + { + addRoadmap(); + int i = 0; + i = insertRoadmapItem(0, true, m_oResource.getResText("RID_TABLE_2"), SOMAINPAGE); + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_TABLE_3"), SOFIELDSFORMATPAGE); + if (this.curTableDescriptor.supportsPrimaryKeys()) + { + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_TABLE_4"), SOPRIMARYKEYPAGE); + } + i = insertRoadmapItem(i, false, m_oResource.getResText("RID_TABLE_5"), SOFINALPAGE); // Orderby is always supported + setRoadmapInteractive(true); + setRoadmapComplete(true); + setCurrentRoadmapItemID((short) 1); + } + + public String startTableWizard( ) + { + try + { + curTableDescriptor = new TableDescriptor(xMSF, super.xWindow, this.sMsgColumnAlreadyExists); + if ( curTableDescriptor.getConnection( m_wizardContext ) ) + { + buildSteps(); + createWindowPeer(); + curTableDescriptor.setWindowPeer(this.xControl.getPeer()); + insertFormRelatedSteps(); + short RetValue = executeDialog(); + xComponent.dispose(); + if ( RetValue == 0 ) + { + if ( wizardmode == Finalizer.STARTFORMWIZARDMODE ) + callFormWizard(); + return m_tableName; + } + } + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + return PropertyNames.EMPTY_STRING; + } + + private boolean getTableResources() + { + super.m_oResource.getResText("RID_TABLE_1"); + slblFields = m_oResource.getResText("RID_TABLE_19"); + slblSelFields = m_oResource.getResText("RID_TABLE_25"); + serrToManyFields = m_oResource.getResText("RID_TABLE_47"); + serrTableNameexists = m_oResource.getResText("RID_TABLE_48"); + sMsgColumnAlreadyExists = m_oResource.getResText("RID_TABLE_51"); + return true; + } + + public boolean verifyfieldcount(int _icount) + { + try + { + int maxfieldcount = curTableDescriptor.getMaxColumnsInTable(); + if (_icount >= (maxfieldcount - 1)) + { // keep one column as reserve for the automatically created key + String smessage = serrToManyFields; + smessage = JavaTools.replaceSubString(smessage, String.valueOf(maxfieldcount), "%COUNT"); + showMessageBox("ErrorBox", VclWindowPeerAttribute.OK, smessage); + return false; + } + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + return true; + } + + + /* (non-Javadoc) + * @see com.sun.star.awt.XTextListener#textChanged(com.sun.star.awt.TextEvent) + */ + public void textChanged(TextEvent aTextEvent) + { + if (this.curTableDescriptor.isSQL92CheckEnabled()) + { + Object otextcomponent = UnoDialog.getModel(aTextEvent.Source); + String sName = (String) Helper.getUnoPropertyValue(otextcomponent, "Text"); + sName = Desktop.removeSpecialCharacters(curTableDescriptor.xMSF, Configuration.getLocale(curTableDescriptor.xMSF), sName); + Helper.setUnoPropertyValue(otextcomponent, "Text", sName); + } + } +} diff --git a/wizards/com/sun/star/wizards/table/table.component b/wizards/com/sun/star/wizards/table/table.component new file mode 100644 index 000000000..a407c9723 --- /dev/null +++ b/wizards/com/sun/star/wizards/table/table.component @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + --> + +<component loader="com.sun.star.loader.Java2" + xmlns="http://openoffice.org/2010/uno-components"> + <implementation name= + "com.sun.star.wizards.table.CallTableWizard$TableWizardImplementation"> + <service name="com.sun.star.wizards.table.CallTableWizard"/> + </implementation> +</component> diff --git a/wizards/com/sun/star/wizards/text/TextDocument.java b/wizards/com/sun/star/wizards/text/TextDocument.java new file mode 100644 index 000000000..74a24eb7f --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextDocument.java @@ -0,0 +1,273 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import com.sun.star.document.XDocumentPropertiesSupplier; +import com.sun.star.frame.XComponentLoader; +import com.sun.star.frame.XDesktop; +import com.sun.star.frame.XLoadable; +import com.sun.star.frame.XModule; +import com.sun.star.frame.XTerminateListener; +import com.sun.star.frame.XStorable; +import com.sun.star.awt.Size; +import com.sun.star.awt.XWindowPeer; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.style.XStyle; +import com.sun.star.style.XStyleFamiliesSupplier; +import com.sun.star.task.XStatusIndicatorFactory; +import com.sun.star.text.XSimpleText; +import com.sun.star.text.XText; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XModifiable; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.document.OfficeDocument; + +public class TextDocument +{ + + public XComponent xComponent; + public com.sun.star.text.XTextDocument xTextDocument; + public com.sun.star.task.XStatusIndicator xProgressBar; + public com.sun.star.frame.XFrame xFrame; + public XText xText; + public XMultiServiceFactory xMSFDoc; + public XMultiServiceFactory xMSF; + public com.sun.star.awt.XWindowPeer xWindowPeer; + + // creates an instance of TextDocument by loading a given URL as preview + public TextDocument(XMultiServiceFactory xMSF, String _sPreviewURL, boolean bShowStatusIndicator, XTerminateListener listener) + { + this.xMSF = xMSF; + + xFrame = OfficeDocument.createNewFrame(xMSF, listener); + xTextDocument = loadAsPreview(_sPreviewURL, true); + xComponent = UnoRuntime.queryInterface(XComponent.class, xTextDocument); + + if (bShowStatusIndicator) + { + showStatusIndicator(); + } + init(); + } + + public static class ModuleIdentifier + { + + private final String m_identifier; + + private final String getIdentifier() + { + return m_identifier; + } + + public ModuleIdentifier(String _identifier) + { + m_identifier = _identifier; + } + } + + // creates an instance of TextDocument containing a blank text document + public TextDocument(XMultiServiceFactory xMSF, ModuleIdentifier _moduleIdentifier, boolean bShowStatusIndicator) + { + this.xMSF = xMSF; + + try + { + // create the empty document, and set its module identifier + xTextDocument = UnoRuntime.queryInterface(XTextDocument.class, + xMSF.createInstance("com.sun.star.text.TextDocument")); + + XLoadable xLoadable = UnoRuntime.queryInterface(XLoadable.class, xTextDocument); + xLoadable.initNew(); + + XModule xModule = UnoRuntime.queryInterface(XModule.class, + xTextDocument); + xModule.setIdentifier(_moduleIdentifier.getIdentifier()); + + // load the document into a blank frame + XDesktop xDesktop = Desktop.getDesktop(xMSF); + XComponentLoader xLoader = UnoRuntime.queryInterface(XComponentLoader.class, xDesktop); + PropertyValue[] loadArgs = new PropertyValue[] + { + new PropertyValue("Model", -1, xTextDocument, com.sun.star.beans.PropertyState.DIRECT_VALUE) + }; + xLoader.loadComponentFromURL("private:object", "_blank", 0, loadArgs); + + // remember some things for later usage + xFrame = xTextDocument.getCurrentController().getFrame(); + xComponent = UnoRuntime.queryInterface(XComponent.class, xTextDocument); + } + catch (Exception e) + { + // TODO: it seems the whole project does not really have an error handling. Other methods + // seem to generally silence errors, so we can't do anything else here... + e.printStackTrace(); + } + + if (bShowStatusIndicator) + { + showStatusIndicator(); + } + init(); + } + + //creates an instance of TextDocument from a given XTextDocument + public TextDocument(XMultiServiceFactory xMSF, XTextDocument _textDocument, boolean bshowStatusIndicator) + { + this.xMSF = xMSF; + xFrame = _textDocument.getCurrentController().getFrame(); + xComponent = UnoRuntime.queryInterface(XComponent.class, _textDocument); + xTextDocument = UnoRuntime.queryInterface(XTextDocument.class, xComponent); + //PosSize = xFrame.getComponentWindow().getPosSize(); + if (bshowStatusIndicator) + { + XStatusIndicatorFactory xStatusIndicatorFactory = UnoRuntime.queryInterface(XStatusIndicatorFactory.class, xFrame); + xProgressBar = xStatusIndicatorFactory.createStatusIndicator(); + xProgressBar.start(PropertyNames.EMPTY_STRING, 100); + xProgressBar.setValue(5); + } + xWindowPeer = UnoRuntime.queryInterface(XWindowPeer.class, xFrame.getComponentWindow()); + xMSFDoc = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument); + UnoRuntime.queryInterface(XNumberFormatsSupplier.class, xTextDocument); + + XDocumentPropertiesSupplier xDocPropsSuppl = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, xTextDocument); + xDocPropsSuppl.getDocumentProperties(); + Helper.getUnoStructValue(xComponent, "CharLocale"); + xText = xTextDocument.getText(); + } + + private void init() + { + xWindowPeer = UnoRuntime.queryInterface(XWindowPeer.class, xFrame.getComponentWindow()); + xMSFDoc = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument); + UnoRuntime.queryInterface(XNumberFormatsSupplier.class, xTextDocument); + XDocumentPropertiesSupplier xDocPropsSuppl = UnoRuntime.queryInterface(XDocumentPropertiesSupplier.class, xTextDocument); + xDocPropsSuppl.getDocumentProperties(); + Helper.getUnoStructValue(xComponent, "CharLocale"); + UnoRuntime.queryInterface(XStorable.class, xTextDocument); + xText = xTextDocument.getText(); + } + + private void showStatusIndicator() + { + XStatusIndicatorFactory xStatusIndicatorFactory = UnoRuntime.queryInterface(XStatusIndicatorFactory.class, xFrame); + xProgressBar = xStatusIndicatorFactory.createStatusIndicator(); + xProgressBar.start(PropertyNames.EMPTY_STRING, 100); + xProgressBar.setValue(5); + } + + private XTextDocument loadAsPreview(String sDefaultTemplate, boolean asTemplate) + { + PropertyValue loadValues[] = new PropertyValue[3]; + // open document in the Preview mode + loadValues[0] = new PropertyValue(); + loadValues[0].Name = PropertyNames.READ_ONLY; + loadValues[0].Value = Boolean.TRUE; + loadValues[1] = new PropertyValue(); + loadValues[1].Name = "AsTemplate"; + loadValues[1].Value = asTemplate ? Boolean.TRUE : Boolean.FALSE; + loadValues[2] = new PropertyValue(); + loadValues[2].Name = "Preview"; + loadValues[2].Value = Boolean.TRUE; + + //set the preview document to non-modified mode in order to avoid the 'do u want to save' box + if (xTextDocument != null) + { + try + { + XModifiable xModi = UnoRuntime.queryInterface(XModifiable.class, xTextDocument); + xModi.setModified(false); + } + catch (PropertyVetoException e1) + { + e1.printStackTrace(System.err); + } + } + Object oDoc = OfficeDocument.load(xFrame, sDefaultTemplate, "_self", loadValues); + xTextDocument = (com.sun.star.text.XTextDocument) oDoc; + getPageSize(); + xMSFDoc = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument); + + ViewHandler myViewHandler = new ViewHandler(xTextDocument); + try + { + myViewHandler.setViewSetting("ZoomType", Short.valueOf(com.sun.star.view.DocumentZoomType.ENTIRE_PAGE)); + } + catch (Exception e) + { + e.printStackTrace(); + } + + TextFieldHandler myFieldHandler = new TextFieldHandler(xMSF, xTextDocument); + myFieldHandler.updateDocInfoFields(); + + return xTextDocument; + + } + + private Size getPageSize() + { + try + { + XStyleFamiliesSupplier xStyleFamiliesSupplier = UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, xTextDocument); + com.sun.star.container.XNameAccess xNameAccess = null; + xNameAccess = xStyleFamiliesSupplier.getStyleFamilies(); + com.sun.star.container.XNameContainer xPageStyleCollection = null; + xPageStyleCollection = UnoRuntime.queryInterface(com.sun.star.container.XNameContainer.class, xNameAccess.getByName("PageStyles")); + XStyle xPageStyle = UnoRuntime.queryInterface(XStyle.class, xPageStyleCollection.getByName("First Page")); + return (Size) Helper.getUnoPropertyValue(xPageStyle, "Size"); + + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public static XTextCursor createTextCursor(Object oCursorContainer) + { + XSimpleText xText = UnoRuntime.queryInterface(XSimpleText.class, oCursorContainer); + return xText.createTextCursor(); + } + + // Todo: This method is unsecure because the last index is not necessarily the last section + + // Todo: This Routine should be modified, because I cannot rely on the last Table in the document to be the last in the TextTables sequence + // to make it really safe you must acquire the Tablenames before the insertion and after the insertion of the new Table. By comparing the + // two sequences of tablenames you can find out the tablename of the last inserted Table + + + + public void unlockallControllers() + { + while (xTextDocument.hasControllersLocked()) + { + xTextDocument.unlockControllers(); + } + } + +} diff --git a/wizards/com/sun/star/wizards/text/TextDocument.py b/wizards/com/sun/star/wizards/text/TextDocument.py new file mode 100644 index 000000000..f975dad57 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextDocument.py @@ -0,0 +1,258 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback +import time +from datetime import date as dateTimeObject +from .TextFieldHandler import TextFieldHandler +from ..document.OfficeDocument import OfficeDocument +from ..common.Desktop import Desktop +from ..common.Configuration import Configuration +from ..common.NumberFormatter import NumberFormatter + +from com.sun.star.i18n.NumberFormatIndex import DATE_SYS_DDMMYY +from com.sun.star.view.DocumentZoomType import ENTIRE_PAGE +from com.sun.star.beans.PropertyState import DIRECT_VALUE + +class TextDocument(object): + + def __init__(self, xMSF,listener=None,bShowStatusIndicator=None, + FrameName=None,_sPreviewURL=None,_moduleIdentifier=None, + _textDocument=None, xArgs=None): + + self.xMSF = xMSF + self.xTextDocument = None + + if listener is not None: + if FrameName is not None: + '''creates an instance of TextDocument + and creates a named frame. + No document is actually loaded into this frame.''' + self.xFrame = OfficeDocument.createNewFrame( + xMSF, listener, FrameName) + return + + elif _sPreviewURL is not None: + '''creates an instance of TextDocument by + loading a given URL as preview''' + self.xFrame = OfficeDocument.createNewFrame(xMSF, listener) + self.xTextDocument = self.loadAsPreview(_sPreviewURL, True) + + elif xArgs is not None: + '''creates an instance of TextDocument + and creates a frame and loads a document''' + self.xDesktop = Desktop.getDesktop(xMSF); + self.xFrame = OfficeDocument.createNewFrame(xMSF, listener) + self.xTextDocument = OfficeDocument.load( + self.xFrame, URL, "_self", xArgs); + self.xWindowPeer = self.xFrame.getComponentWindow() + self.m_xDocProps = self.xTextDocument.DocumentProperties + CharLocale = self.xTextDocument.CharLocale + return + + else: + '''creates an instance of TextDocument from + the desktop's current frame''' + self.xDesktop = Desktop.getDesktop(xMSF); + self.xFrame = self.xDesktop.getActiveFrame() + self.xTextDocument = self.xFrame.getController().Model + + elif _moduleIdentifier is not None: + try: + '''create the empty document, and set its module identifier''' + self.xTextDocument = xMSF.createInstance( + "com.sun.star.text.TextDocument") + self.xTextDocument.initNew() + self.xTextDocument.setIdentifier( + _moduleIdentifier.Identifier) + # load the document into a blank frame + xDesktop = Desktop.getDesktop(xMSF) + loadArgs = list(range(1)) + loadArgs[0] = "Model" + loadArgs[0] = -1 + loadArgs[0] = self.xTextDocument + loadArgs[0] = DIRECT_VALUE + xDesktop.loadComponentFromURL( + "private:object", "_blank", 0, loadArgs) + # remember some things for later usage + self.xFrame = self.xTextDocument.CurrentController.Frame + except Exception: + traceback.print_exc() + + elif _textDocument is not None: + '''creates an instance of TextDocument + from a given XTextDocument''' + self.xFrame = _textDocument.CurrentController.Frame + self.xTextDocument = _textDocument + if bShowStatusIndicator: + self.showStatusIndicator() + self.init() + + def init(self): + self.xWindowPeer = self.xFrame.getComponentWindow() + self.m_xDocProps = self.xTextDocument.DocumentProperties + self.CharLocale = self.xTextDocument.CharLocale + self.xText = self.xTextDocument.Text + + def showStatusIndicator(self): + self.xProgressBar = self.xFrame.createStatusIndicator() + self.xProgressBar.start("", 100) + self.xProgressBar.setValue(5) + + def loadAsPreview(self, sDefaultTemplate, asTemplate): + loadValues = list(range(3)) + # open document in the Preview mode + loadValues[0] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + loadValues[0].Name = "ReadOnly" + loadValues[0].Value = True + loadValues[1] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + loadValues[1].Name = "AsTemplate" + if asTemplate: + loadValues[1].Value = True + else: + loadValues[1].Value = False + + loadValues[2] = uno.createUnoStruct( + 'com.sun.star.beans.PropertyValue') + loadValues[2].Name = "Preview" + loadValues[2].Value = True + + self.xTextDocument = OfficeDocument.load( + self.xFrame, sDefaultTemplate, "_self", loadValues) + + self.DocSize = self.getPageSize() + + try: + self.xTextDocument.CurrentController.ViewSettings.ZoomType = ENTIRE_PAGE + except Exception: + traceback.print_exc() + myFieldHandler = TextFieldHandler(self.xMSF, self.xTextDocument) + myFieldHandler.updateDocInfoFields() + return self.xTextDocument + + def getPageSize(self): + try: + xNameAccess = self.xTextDocument.StyleFamilies + xPageStyleCollection = xNameAccess.getByName("PageStyles") + xPageStyle = xPageStyleCollection.getByName("First Page") + return xPageStyle.Size + except Exception: + traceback.print_exc() + return None + + '''creates an instance of TextDocument and creates a + frame and loads a document''' + + def createTextCursor(self, oCursorContainer): + xTextCursor = oCursorContainer.createTextCursor() + return xTextCursor + + def refresh(self): + self.xTextDocument.refresh() + + ''' + This method sets the Author of a Wizard-generated template correctly + and adds an explanatory sentence to the template description. + @param WizardName The name of the Wizard. + @param TemplateDescription The old Description which is being + appended with another sentence. + @return void. + ''' + + def setWizardTemplateDocInfo(self, WizardName, TemplateDescription): + try: + xNA = Configuration.getConfigurationRoot( + self.xMSF, "/org.openoffice.UserProfile/Data", False) + gn = xNA.getByName("givenname") + sn = xNA.getByName("sn") + fullname = str(gn) + " " + str(sn) + now = time.localtime(time.time()) + year = time.strftime("%Y", now) + month = time.strftime("%m", now) + day = time.strftime("%d", now) + + dateObject = dateTimeObject(int(year), int(month), int(day)) + du = self.DateUtils(self.xMSF, self.xTextDocument) + ff = du.getFormat(DATE_SYS_DDMMYY) + myDate = du.format(ff, dateObject) + xDocProps2 = self.xTextDocument.DocumentProperties + xDocProps2.Author = fullname + xDocProps2.ModifiedBy = fullname + description = xDocProps2.Description + description = description + " " + TemplateDescription + description = description.replace("<wizard_name>", WizardName) + description = description.replace("<current_date>", myDate) + xDocProps2.Description = description + except Exception: + traceback.print_exc() + + @classmethod + def getFrameByName(self, sFrameName, xTD): + if xTD.TextFrames.hasByName(sFrameName): + return xTD.TextFrames.getByName(sFrameName) + + return None + + def searchFillInItems(self, typeSearch): + sd = self.xTextDocument.createSearchDescriptor() + + if typeSearch == 0: + sd.setSearchString("<[^>]+>") + elif typeSearch == 1: + sd.setSearchString("#[^#]+#") + + sd.setPropertyValue("SearchRegularExpression", True) + sd.setPropertyValue("SearchWords", True) + + auxList = [] + allItems = self.xTextDocument.findAll(sd) + for i in list(range(allItems.Count)): + auxList.append(allItems.getByIndex(i)) + + return auxList + + class DateUtils(object): + + def __init__(self, xmsf, document): + self.formatSupplier = document + formatSettings = self.formatSupplier.getNumberFormatSettings() + date = formatSettings.NullDate + self.calendar = dateTimeObject(date.Year, date.Month, date.Day) + self.formatter = NumberFormatter.createNumberFormatter(xmsf, + self.formatSupplier) + + ''' + @param format a constant of the enumeration NumberFormatIndex + @return + ''' + + def getFormat(self, format): + return NumberFormatter.getNumberFormatterKey( + self.formatSupplier, format) + + ''' + @param date a VCL date in form of 20041231 + @return a document relative date + ''' + + def format(self, formatIndex, date): + difference = date - self.calendar + return self.formatter.convertNumberToString(formatIndex, + difference.days) diff --git a/wizards/com/sun/star/wizards/text/TextElement.py b/wizards/com/sun/star/wizards/text/TextElement.py new file mode 100644 index 000000000..57aa4ea26 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextElement.py @@ -0,0 +1,27 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +class TextElement(object): + + def __init__(self, item, placeHolderText): + self.item = item + self.placeHolderText = placeHolderText + + def write(self): + if self.item is not None: + self.item.String = self.placeHolderText diff --git a/wizards/com/sun/star/wizards/text/TextFieldHandler.java b/wizards/com/sun/star/wizards/text/TextFieldHandler.java new file mode 100644 index 000000000..da43b3d88 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextFieldHandler.java @@ -0,0 +1,287 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XEnumeration; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XServiceInfo; +import com.sun.star.text.XDependentTextField; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextFieldsSupplier; +import com.sun.star.text.XTextRange; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.util.DateTime; +import com.sun.star.util.XRefreshable; +import com.sun.star.util.XUpdatable; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; + +public class TextFieldHandler +{ + + private XTextFieldsSupplier xTextFieldsSupplier; + private final XMultiServiceFactory xMSFDoc; + + /** + * Creates a new instance of TextFieldHandler + */ + public TextFieldHandler(XMultiServiceFactory xMSF, XTextDocument xTextDocument) + { + this.xMSFDoc = xMSF; + xTextFieldsSupplier = UnoRuntime.queryInterface(XTextFieldsSupplier.class, xTextDocument); + } + + private void refreshTextFields() + { + XRefreshable xUp = UnoRuntime.queryInterface(XRefreshable.class, xTextFieldsSupplier.getTextFields()); + xUp.refresh(); + } + + public String getUserFieldContent(XTextCursor xTextCursor) + { + try + { + XTextRange xTextRange = xTextCursor.getEnd(); + Object oTextField = Helper.getUnoPropertyValue(xTextRange, "TextField"); + if (com.sun.star.uno.AnyConverter.isVoid(oTextField)) + { + return PropertyNames.EMPTY_STRING; + } + else + { + XDependentTextField xDependent = UnoRuntime.queryInterface(XDependentTextField.class, oTextField); + XPropertySet xMaster = xDependent.getTextFieldMaster(); + return (String) xMaster.getPropertyValue("Content"); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + return PropertyNames.EMPTY_STRING; + } + + public void insertUserField(XTextCursor xTextCursor, String FieldName, String FieldTitle) + { + try + { + XInterface xField = (XInterface) xMSFDoc.createInstance("com.sun.star.text.TextField.User"); + XDependentTextField xDepField = UnoRuntime.queryInterface(XDependentTextField.class, xField); + XTextContent xFieldContent = UnoRuntime.queryInterface(XTextContent.class, xField); + if (xTextFieldsSupplier.getTextFieldMasters().hasByName("com.sun.star.text.FieldMaster.User." + FieldName)) + { + Object oMaster = xTextFieldsSupplier.getTextFieldMasters().getByName("com.sun.star.text.FieldMaster.User." + FieldName); + XComponent xComponent = UnoRuntime.queryInterface(XComponent.class, oMaster); + xComponent.dispose(); + } + XPropertySet xPSet = createUserField(FieldName, FieldTitle); + xDepField.attachTextFieldMaster(xPSet); + xTextCursor.getText().insertTextContent(xTextCursor, xFieldContent, false); + + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private XPropertySet createUserField(String FieldName, String FieldTitle) throws com.sun.star.uno.Exception + { + Object oMaster = xMSFDoc.createInstance("com.sun.star.text.FieldMaster.User"); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oMaster); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, FieldName); + xPSet.setPropertyValue("Content", FieldTitle); + + return xPSet; + } + + private XDependentTextField[] getTextFieldsByProperty(String _PropertyName, Object _aPropertyValue, String _TypeName) + { + try + { + XDependentTextField[] xDependentFields; + ArrayList<XDependentTextField> xDependentVector = new ArrayList<XDependentTextField>(); + if (xTextFieldsSupplier.getTextFields().hasElements()) + { + XEnumeration xEnum = xTextFieldsSupplier.getTextFields().createEnumeration(); + while (xEnum.hasMoreElements()) + { + Object oTextField = xEnum.nextElement(); + XDependentTextField xDependent = UnoRuntime.queryInterface(XDependentTextField.class, oTextField); + XPropertySet xPropertySet = xDependent.getTextFieldMaster(); + if (xPropertySet.getPropertySetInfo().hasPropertyByName(_PropertyName)) + { + Object oValue = xPropertySet.getPropertyValue(_PropertyName); + // TODO replace the following comparison via com.sun.star.uno.Any.Type + if (AnyConverter.isString(oValue)) + { + if (_TypeName.equals("String")) + { + String sValue = AnyConverter.toString(oValue); + if (sValue.equals(_aPropertyValue)) + { + xDependentVector.add(xDependent); + } + } + } + else if (AnyConverter.isShort(oValue)) + { + if (_TypeName.equals("Short")) + { + short iShortParam = ((Short) _aPropertyValue).shortValue(); + short ishortValue = AnyConverter.toShort(oValue); + if (ishortValue == iShortParam) + { + xDependentVector.add(xDependent); + } + } + } + } + } + } + if (xDependentVector.size() > 0) + { + xDependentFields = new XDependentTextField[xDependentVector.size()]; + xDependentVector.toArray(xDependentFields); + return xDependentFields; + } + } + catch (Exception e) + { + // TODO Auto-generated catch block + e.printStackTrace(System.err); + } + return null; + } + + public void changeUserFieldContent(String _FieldName, String _FieldContent) + { + try + { + XDependentTextField[] xDependentTextFields = getTextFieldsByProperty(PropertyNames.PROPERTY_NAME, _FieldName, "String"); + if (xDependentTextFields != null) + { + for (int i = 0; i < xDependentTextFields.length; i++) + { + xDependentTextFields[i].getTextFieldMaster().setPropertyValue("Content", _FieldContent); + } + refreshTextFields(); + } + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + public void updateDocInfoFields() + { + try + { + XEnumeration xEnum = xTextFieldsSupplier.getTextFields().createEnumeration(); + while (xEnum.hasMoreElements()) + { + Object oTextField = xEnum.nextElement(); + XServiceInfo xSI = UnoRuntime.queryInterface(XServiceInfo.class, oTextField); + + if (xSI.supportsService("com.sun.star.text.TextField.ExtendedUser")) + { + XUpdatable xUp = UnoRuntime.queryInterface(XUpdatable.class, oTextField); + xUp.update(); + } + if (xSI.supportsService("com.sun.star.text.TextField.User")) + { + XUpdatable xUp = UnoRuntime.queryInterface(XUpdatable.class, oTextField); + xUp.update(); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public void updateDateFields() + { + try + { + XEnumeration xEnum = xTextFieldsSupplier.getTextFields().createEnumeration(); + Calendar cal = new GregorianCalendar(); + DateTime dt = new DateTime(); + dt.Day = (short) cal.get(Calendar.DAY_OF_MONTH); + dt.Year = (short) cal.get(Calendar.YEAR); + dt.Month = (short) cal.get(Calendar.MONTH); + dt.Month++; + + while (xEnum.hasMoreElements()) + { + Object oTextField = xEnum.nextElement(); + XServiceInfo xSI = UnoRuntime.queryInterface(XServiceInfo.class, oTextField); + + if (xSI.supportsService("com.sun.star.text.TextField.DateTime")) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oTextField); + xPSet.setPropertyValue("IsFixed", Boolean.FALSE); + xPSet.setPropertyValue("DateTimeValue", dt); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + public void fixDateFields(boolean _bSetFixed) + { + try + { + XEnumeration xEnum = xTextFieldsSupplier.getTextFields().createEnumeration(); + while (xEnum.hasMoreElements()) + { + Object oTextField = xEnum.nextElement(); + XServiceInfo xSI = UnoRuntime.queryInterface(XServiceInfo.class, oTextField); + if (xSI.supportsService("com.sun.star.text.TextField.DateTime")) + { + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oTextField); + xPSet.setPropertyValue("IsFixed", Boolean.valueOf(_bSetFixed)); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + + + +} diff --git a/wizards/com/sun/star/wizards/text/TextFieldHandler.py b/wizards/com/sun/star/wizards/text/TextFieldHandler.py new file mode 100644 index 000000000..c250e091e --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextFieldHandler.py @@ -0,0 +1,115 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +import time + +from com.sun.star.util import DateTime +from com.sun.star.uno import RuntimeException +from com.sun.star.beans import UnknownPropertyException + +class TextFieldHandler(object): + + xTextFieldsSupplierAux = None + arrayTextFields = [] + dictTextFields = {} + + def __init__(self, xMSF, xTextDocument): + self.xMSFDoc = xMSF + self.xTextFieldsSupplier = xTextDocument + if TextFieldHandler.xTextFieldsSupplierAux is not \ + self.xTextFieldsSupplier: + self.__getTextFields() + TextFieldHandler.xTextFieldsSupplierAux = self.xTextFieldsSupplier + + def refreshTextFields(self): + xUp = self.xTextFieldsSupplier.TextFields + xUp.refresh() + + def __getTextFields(self): + try: + if self.xTextFieldsSupplier.TextFields.hasElements(): + xEnum = \ + self.xTextFieldsSupplier.TextFields.createEnumeration() + while xEnum.hasMoreElements(): + oTextField = xEnum.nextElement() + TextFieldHandler.arrayTextFields.append(oTextField) + xPropertySet = oTextField.TextFieldMaster + if xPropertySet.Name: + TextFieldHandler.dictTextFields[xPropertySet.Name] = \ + oTextField + except Exception: + traceback.print_exc() + + def changeUserFieldContent(self, _FieldName, _FieldContent): + try: + DependentTextFields = \ + TextFieldHandler.dictTextFields[_FieldName] + except KeyError: + return None + try: + if hasattr(DependentTextFields, "TextFieldMaster"): + DependentTextFields.TextFieldMaster.Content = _FieldContent + self.refreshTextFields() + except UnknownPropertyException: + pass + + def updateDocInfoFields(self): + try: + for i in TextFieldHandler.arrayTextFields: + if i.supportsService( + "com.sun.star.text.TextField.ExtendedUser"): + i.update() + + if i.supportsService( + "com.sun.star.text.TextField.User"): + i.update() + + except Exception: + traceback.print_exc() + + def updateDateFields(self): + try: + now = time.localtime(time.time()) + dt = DateTime() + dt.Day = time.strftime("%d", now) + dt.Year = time.strftime("%Y", now) + dt.Month = time.strftime("%m", now) + dt.Month += 1 + for i in TextFieldHandler.arrayTextFields: + if i.supportsService( + "com.sun.star.text.TextField.DateTime"): + try: + i.IsFixed = False + i.DateTimeValue = dt + except RuntimeException: + pass + + except Exception: + traceback.print_exc() + + def removeUserFieldByContent(self): + #Remove userfield when its text is empty + xDependentTextFields = TextFieldHandler.arrayTextFields + for i in xDependentTextFields: + try: + if not i.TextFieldMaster.Content: + i.dispose() + except Exception: + #TextField doesn't even have the attribute Content, + #so it's empty + i.dispose() diff --git a/wizards/com/sun/star/wizards/text/TextSectionHandler.java b/wizards/com/sun/star/wizards/text/TextSectionHandler.java new file mode 100644 index 000000000..14348b455 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextSectionHandler.java @@ -0,0 +1,245 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNamed; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.text.ControlCharacter; +import com.sun.star.text.SectionFileLink; +import com.sun.star.text.XText; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextSectionsSupplier; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; + +public class TextSectionHandler +{ + + public XTextSectionsSupplier xTextSectionsSupplier; + private final XMultiServiceFactory xMSFDoc; + private final XText xText; + + /** Creates a new instance of TextSectionHandler */ + public TextSectionHandler(XMultiServiceFactory xMSF, XTextDocument xTextDocument) + { + this.xMSFDoc = xMSF; + xText = xTextDocument.getText(); + xTextSectionsSupplier = UnoRuntime.queryInterface(XTextSectionsSupplier.class, xTextDocument); + } + + public void removeTextSectionbyName(String SectionName) + { + try + { + XNameAccess xAllTextSections = xTextSectionsSupplier.getTextSections(); + if (xAllTextSections.hasByName(SectionName)) + { + Object oTextSection = xTextSectionsSupplier.getTextSections().getByName(SectionName); + removeTextSection(oTextSection); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + + + public void removeLastTextSection() + { + try + { + XIndexAccess xAllTextSections = UnoRuntime.queryInterface(XIndexAccess.class, xTextSectionsSupplier.getTextSections()); + Object oTextSection = xAllTextSections.getByIndex(xAllTextSections.getCount() - 1); + removeTextSection(oTextSection); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void removeTextSection(Object _oTextSection) + { + try + { + XTextContent xTextContentTextSection = UnoRuntime.queryInterface(XTextContent.class, _oTextSection); + xText.removeTextContent(xTextContentTextSection); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void removeInvisibleTextSections() + { + try + { + XIndexAccess xAllTextSections = UnoRuntime.queryInterface(XIndexAccess.class, xTextSectionsSupplier.getTextSections()); + int TextSectionCount = xAllTextSections.getCount(); + for (int i = TextSectionCount - 1; i >= 0; i--) + { + XTextContent xTextContentTextSection = UnoRuntime.queryInterface(XTextContent.class, xAllTextSections.getByIndex(i)); + XPropertySet xTextSectionPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xTextContentTextSection); + boolean bRemoveTextSection = (!AnyConverter.toBoolean(xTextSectionPropertySet.getPropertyValue("IsVisible"))); + if (bRemoveTextSection) + { + xText.removeTextContent(xTextContentTextSection); + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void removeAllTextSections() + { + try + { + XIndexAccess xAllTextSections = UnoRuntime.queryInterface(XIndexAccess.class, xTextSectionsSupplier.getTextSections()); + int TextSectionCount = xAllTextSections.getCount(); + for (int i = TextSectionCount - 1; i >= 0; i--) + { + XTextContent xTextContentTextSection = UnoRuntime.queryInterface(XTextContent.class, xAllTextSections.getByIndex(i)); + xText.removeTextContent(xTextContentTextSection); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void breakLinkofTextSections() + { + try + { + Object oTextSection; + XIndexAccess xAllTextSections = UnoRuntime.queryInterface(XIndexAccess.class, xTextSectionsSupplier.getTextSections()); + int iSectionCount = xAllTextSections.getCount(); + SectionFileLink oSectionLink = new SectionFileLink(); + oSectionLink.FileURL = PropertyNames.EMPTY_STRING; + for (int i = 0; i < iSectionCount; i++) + { + oTextSection = xAllTextSections.getByIndex(i); + Helper.setUnoPropertyValues(oTextSection, new String[] + { + "FileLink", "LinkRegion" + }, new Object[] + { + oSectionLink, PropertyNames.EMPTY_STRING + }); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + + + public void linkSectiontoTemplate(String TemplateName, String SectionName) + { + try + { + Object oTextSection = xTextSectionsSupplier.getTextSections().getByName(SectionName); + linkSectiontoTemplate(oTextSection, TemplateName, SectionName); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + } + + private void linkSectiontoTemplate(Object oTextSection, String TemplateName, String SectionName) + { + SectionFileLink oSectionLink = new SectionFileLink(); + oSectionLink.FileURL = TemplateName; + Helper.setUnoPropertyValues(oTextSection, new String[] + { + "FileLink", "LinkRegion" + }, new Object[] + { + oSectionLink, SectionName + }); + XNamed xSectionName = UnoRuntime.queryInterface(XNamed.class, oTextSection); + String NewSectionName = xSectionName.getName(); + if (NewSectionName.compareTo(SectionName) != 0) + { + xSectionName.setName(SectionName); + } + } + + public void insertTextSection(String GroupName, String TemplateName, boolean _bAddParagraph) + { + try + { + if (_bAddParagraph) + { + XTextCursor xTextCursor = xText.createTextCursor(); + xText.insertControlCharacter(xTextCursor, ControlCharacter.PARAGRAPH_BREAK, false); + // Helper.setUnoPropertyValue(xTextCursor, "PageDescName", "First Page"); + xTextCursor.collapseToEnd(); + } + XTextCursor xSecondTextCursor = xText.createTextCursor(); + xSecondTextCursor.gotoEnd(false); + insertTextSection(GroupName, TemplateName, xSecondTextCursor); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + } + + private void insertTextSection(String sectionName, String templateName, XTextCursor position) + { + try + { + Object xTextSection; + if (xTextSectionsSupplier.getTextSections().hasByName(sectionName)) + { + xTextSection = xTextSectionsSupplier.getTextSections().getByName(sectionName); + } + else + { + xTextSection = xMSFDoc.createInstance("com.sun.star.text.TextSection"); + XTextContent xTextContentSection = UnoRuntime.queryInterface(XTextContent.class, xTextSection); + position.getText().insertTextContent(position, xTextContentSection, false); + } + linkSectiontoTemplate(xTextSection, templateName, sectionName); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/text/TextSectionHandler.py b/wizards/com/sun/star/wizards/text/TextSectionHandler.py new file mode 100644 index 000000000..e8d649a31 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextSectionHandler.py @@ -0,0 +1,116 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback + +class TextSectionHandler(object): + '''Creates a new instance of TextSectionHandler''' + def __init__(self, xMSF, xTextDocument): + self.xMSFDoc = xMSF + self.xTextDocument = xTextDocument + self.xText = xTextDocument.Text + + def removeTextSectionbyName(self, SectionName): + try: + xAllTextSections = self.xTextDocument.TextSections + if xAllTextSections.hasByName(SectionName): + oTextSection = self.xTextDocument.TextSections.getByName( + SectionName) + self.removeTextSection(oTextSection) + + + except Exception: + traceback.print_exc() + + def hasTextSectionByName(self, SectionName): + xAllTextSections = self.xTextDocument.TextSections + return xAllTextSections.hasByName(SectionName) + + def removeTextSection(self, _oTextSection): + try: + self.xText.removeTextContent(_oTextSection) + except Exception: + traceback.print_exc() + + def removeAllTextSections(self): + try: + TextSectionCount = self.xTextDocument.TextSections.Count + xAllTextSections = self.xTextDocument.TextSections + for i in range(TextSectionCount - 1, -1, -1): + xTextContentTextSection = xAllTextSections.getByIndex(i) + self.xText.removeTextContent(xTextContentTextSection) + except Exception: + traceback.print_exc() + + def breakLinkOfTextSection(self, oTextSection): + try: + oSectionLink = \ + uno.createUnoStruct('com.sun.star.text.SectionFileLink') + oSectionLink.FileURL = "" + uno.invoke(oTextSection, "setPropertyValues", + (("FileLink", "LinkRegion"), (oSectionLink, ""))) + except Exception: + traceback.print_exc() + + def linkSectiontoTemplate( + self, TemplateName, SectionName, oTextSection=None): + try: + if not oTextSection: + oTextSection = self.xTextDocument.TextSections.getByName( + SectionName) + oSectionLink = \ + uno.createUnoStruct('com.sun.star.text.SectionFileLink') + oSectionLink.FileURL = TemplateName + uno.invoke(oTextSection, "setPropertyValues", + (("FileLink", "LinkRegion"), (oSectionLink, SectionName))) + + NewSectionName = oTextSection.Name + if NewSectionName is not SectionName: + oTextSection.Name = SectionName + except Exception: + traceback.print_exc() + + def insertTextSection(self, GroupName, TemplateName, _bAddParagraph): + try: + if _bAddParagraph: + xTextCursor = self.xText.createTextCursor() + self.xText.insertControlCharacter( + xTextCursor, ControlCharacter.PARAGRAPH_BREAK, False) + xTextCursor.collapseToEnd() + + xSecondTextCursor = self.xText.createTextCursor() + xSecondTextCursor.gotoEnd(False) + insertTextSection(GroupName, TemplateName, xSecondTextCursor) + except Exception: + traceback.print_exc() + + def insertTextSection(self, sectionName, templateName, position): + try: + if self.xTextDocument.TextSections.hasByName(sectionName): + xTextSection = \ + self.xTextDocument.TextSections.getByName(sectionName) + else: + xTextSection = self.xMSFDoc.createInstance( + "com.sun.star.text.TextSection") + position.getText().insertTextContent( + position, xTextSection, False) + + linkSectiontoTemplate(xTextSection, templateName, sectionName) + except Exception: + traceback.print_exc() + diff --git a/wizards/com/sun/star/wizards/text/TextStyleHandler.java b/wizards/com/sun/star/wizards/text/TextStyleHandler.java new file mode 100644 index 000000000..c36bdc670 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextStyleHandler.java @@ -0,0 +1,101 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import com.sun.star.awt.Size; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.style.XStyleFamiliesSupplier; +import com.sun.star.style.XStyleLoader; +import com.sun.star.text.XTextDocument; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.PropertyNames; + +public class TextStyleHandler +{ + + public XStyleFamiliesSupplier xStyleFamiliesSupplier; + + /** Creates a new instance of TextStyleHandler */ + public TextStyleHandler(XTextDocument xTextDocument) + { + xStyleFamiliesSupplier = UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, xTextDocument); + } + + public void loadStyleTemplates(String sTemplateUrl, String OptionString) + { + try + { + XStyleLoader xStyleLoader = UnoRuntime.queryInterface(XStyleLoader.class, xStyleFamiliesSupplier.getStyleFamilies()); + com.sun.star.beans.PropertyValue[] StyleOptions = xStyleLoader.getStyleLoaderOptions(); + String CurOptionName = PropertyNames.EMPTY_STRING; + int PropCount = StyleOptions.length; + for (int i = 0; i < PropCount; i++) + { + CurOptionName = StyleOptions[i].Name; + StyleOptions[i].Value = Boolean.valueOf(CurOptionName.equals(OptionString) || CurOptionName.equals("OverwriteStyles")); + } + xStyleLoader.loadStylesFromURL(sTemplateUrl, StyleOptions); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public XPropertySet getStyleByName(String sStyleFamily, String sStyleName) + { + try + { + XPropertySet xPropertySet = null; + Object oStyleFamily = xStyleFamiliesSupplier.getStyleFamilies().getByName(sStyleFamily); + XNameAccess xNameAccess = UnoRuntime.queryInterface(XNameAccess.class, oStyleFamily); + if (xNameAccess.hasByName(sStyleName)) + { + xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, xNameAccess.getByName(sStyleName)); + } + return xPropertySet; + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return null; + } + + public Size changePageAlignment(XPropertySet _xPropPageStyle, boolean _bIsLandscape) + { + try + { + _xPropPageStyle.setPropertyValue("IsLandscape", Boolean.valueOf(_bIsLandscape)); + Size aPageSize = (Size) AnyConverter.toObject(Size.class, _xPropPageStyle.getPropertyValue("Size")); + int nPageWidth = aPageSize.Width; + int nPageHeight = aPageSize.Height; + Size aSize = new Size(nPageHeight, nPageWidth); + _xPropPageStyle.setPropertyValue("Size", aSize); + return (Size) AnyConverter.toObject(Size.class, _xPropPageStyle.getPropertyValue("Size")); + } + catch (Exception e) + { + e.printStackTrace(System.err); + return null; + } + } +} diff --git a/wizards/com/sun/star/wizards/text/TextTableHandler.java b/wizards/com/sun/star/wizards/text/TextTableHandler.java new file mode 100644 index 000000000..74e896639 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/TextTableHandler.java @@ -0,0 +1,206 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNamed; +import com.sun.star.frame.XFrame; +import com.sun.star.lang.Locale; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.table.XCellRange; +import com.sun.star.text.XSimpleText; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextTable; +import com.sun.star.text.XTextTablesSupplier; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.XNumberFormatsSupplier; +import com.sun.star.view.XSelectionSupplier; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.NumberFormatter; + +public class TextTableHandler +{ + + public XTextTablesSupplier xTextTablesSupplier; + private XTextDocument xTextDocument; + private NumberFormatter oNumberFormatter; + + /** Creates a new instance of TextTableHandler */ + public TextTableHandler(XTextDocument xTextDocument) + { + try + { + this.xTextDocument = xTextDocument; + xTextTablesSupplier = UnoRuntime.queryInterface(XTextTablesSupplier.class, xTextDocument); + UnoRuntime.queryInterface(XSimpleText.class, xTextDocument.getText()); + XNumberFormatsSupplier xNumberFormatsSupplier = UnoRuntime.queryInterface(XNumberFormatsSupplier.class, xTextDocument); + Locale aCharLocale = (Locale) Helper.getUnoStructValue(xTextDocument, "CharLocale"); + oNumberFormatter = new NumberFormatter(xNumberFormatsSupplier, aCharLocale); + } + catch (java.lang.Exception e) + { + e.printStackTrace(System.err); + } + } + + public NumberFormatter getNumberFormatter() + { + return oNumberFormatter; + } + + public XTextTable getByName(String _sTableName) + { + XTextTable xTextTable = null; + try + { + XNameAccess xAllTextTables = xTextTablesSupplier.getTextTables(); + if (xAllTextTables.hasByName(_sTableName)) + { + Object oTable = xAllTextTables.getByName(_sTableName); + xTextTable = UnoRuntime.queryInterface(XTextTable.class, oTable); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + return xTextTable; + } + + public com.sun.star.text.XTextTable getlastTextTable() + { + try + { + XIndexAccess xAllTextTables = UnoRuntime.queryInterface(XIndexAccess.class, xTextTablesSupplier.getTextTables()); + int MaxIndex = xAllTextTables.getCount() - 1; + Object oTable = xAllTextTables.getByIndex(MaxIndex); + return UnoRuntime.queryInterface(XTextTable.class, oTable); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + + + public void removeAllTextTables() + { + try + { + XIndexAccess xAllTextTables = UnoRuntime.queryInterface(XIndexAccess.class, xTextTablesSupplier.getTextTables()); + int TextTableCount = xAllTextTables.getCount(); + for (int i = TextTableCount - 1; i >= 0; i--) + { + removeTextTable(xAllTextTables.getByIndex(i)); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void removeLastTextTable() + { + try + { + XIndexAccess xAllTextTables = UnoRuntime.queryInterface(XIndexAccess.class, xTextTablesSupplier.getTextTables()); + Object oTextTable = xAllTextTables.getByIndex(xAllTextTables.getCount() - 1); + removeTextTable(oTextTable); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void removeTextTable(Object oTextTable) + { + try + { + XTextContent xTextContentTable = UnoRuntime.queryInterface(XTextContent.class, oTextTable); + xTextDocument.getText().removeTextContent(xTextContentTable); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void removeTextTablebyName(String TableName) + { + try + { + XNameAccess xAllTextTables = xTextTablesSupplier.getTextTables(); + if (xAllTextTables.hasByName(TableName)) + { + removeTextTable(xAllTextTables.getByName(TableName)); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void renameTextTable(String OldTableName, String NewTableName) + { + try + { + XNameAccess xTextTableNames = xTextTablesSupplier.getTextTables(); + if (xTextTableNames.hasByName(OldTableName)) + { + Object oTextTable = xTextTableNames.getByName(OldTableName); + XNamed xTextTableName = UnoRuntime.queryInterface(XNamed.class, oTextTable); + xTextTableName.setName(NewTableName); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void adjustOptimalTableWidths(XMultiServiceFactory _xMSF, XTextTable xTextTable) + { + try + { + XFrame xFrame = this.xTextDocument.getCurrentController().getFrame(); + int ColCount = xTextTable.getColumns().getCount(); + XCellRange xCellRange = UnoRuntime.queryInterface(XCellRange.class, xTextTable); + XCellRange xLocCellRange = xCellRange.getCellRangeByPosition(0, 0, ColCount - 1, 1); + short iHoriOrient = AnyConverter.toShort(Helper.getUnoPropertyValue(xTextTable, "HoriOrient")); + XSelectionSupplier xSelection = UnoRuntime.queryInterface(XSelectionSupplier.class, xTextDocument.getCurrentController()); + xSelection.select(xLocCellRange); + Desktop.dispatchURL(_xMSF, ".Uno:DistributeColumns", xFrame); + Desktop.dispatchURL(_xMSF, ".Uno:SetOptimalColumnWidth", xFrame); + Helper.setUnoPropertyValue(xTextTable, "HoriOrient", Short.valueOf(iHoriOrient)); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/text/ViewHandler.java b/wizards/com/sun/star/wizards/text/ViewHandler.java new file mode 100644 index 000000000..fc7842996 --- /dev/null +++ b/wizards/com/sun/star/wizards/text/ViewHandler.java @@ -0,0 +1,96 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.text; + +import com.sun.star.beans.PropertyVetoException; +import com.sun.star.beans.UnknownPropertyException; +import com.sun.star.container.XIndexAccess; +import com.sun.star.container.XNameAccess; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.WrappedTargetException; +import com.sun.star.style.XStyleFamiliesSupplier; +import com.sun.star.text.XPageCursor; +import com.sun.star.text.XTextContent; +import com.sun.star.text.XTextCursor; +import com.sun.star.text.XTextDocument; +import com.sun.star.text.XTextRange; +import com.sun.star.text.XTextViewCursor; +import com.sun.star.text.XTextViewCursorSupplier; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.view.XViewSettingsSupplier; +import com.sun.star.wizards.common.Helper; + +public class ViewHandler +{ + + private final XTextViewCursorSupplier xTextViewCursorSupplier; + private final XStyleFamiliesSupplier xStyleFamiliesSupplier; + private final XViewSettingsSupplier xViewSettingsSupplier; + + /** Creates a new instance of View */ + public ViewHandler(XTextDocument xTextDocument) + { + xTextViewCursorSupplier = UnoRuntime.queryInterface(XTextViewCursorSupplier.class, xTextDocument.getCurrentController()); + xViewSettingsSupplier = UnoRuntime.queryInterface(XViewSettingsSupplier.class, xTextDocument.getCurrentController()); + xStyleFamiliesSupplier = UnoRuntime.queryInterface(XStyleFamiliesSupplier.class, xTextDocument); + } + + public void selectFirstPage(TextTableHandler oTextTableHandler) + { + try + { + XPageCursor xPageCursor = UnoRuntime.queryInterface(XPageCursor.class, xTextViewCursorSupplier.getViewCursor()); + XTextCursor xViewTextCursor = UnoRuntime.queryInterface(XTextCursor.class, xPageCursor); + xPageCursor.jumpToFirstPage(); + xPageCursor.jumpToStartOfPage(); + Helper.setUnoPropertyValue(xPageCursor, "PageDescName", "First Page"); + Object oPageStyles = xStyleFamiliesSupplier.getStyleFamilies().getByName("PageStyles"); + XNameAccess xName = UnoRuntime.queryInterface(XNameAccess.class, oPageStyles); + Object oPageStyle = xName.getByName("First Page"); + XIndexAccess xAllTextTables = UnoRuntime.queryInterface(XIndexAccess.class, oTextTableHandler.xTextTablesSupplier.getTextTables()); + XTextContent xTextTable = UnoRuntime.queryInterface(XTextContent.class, xAllTextTables.getByIndex(0)); + XTextRange xRange = UnoRuntime.queryInterface(XTextRange.class, xTextTable.getAnchor().getText()); + xViewTextCursor.gotoRange(xRange, false); + XTextRange xHeaderRange = (XTextRange) Helper.getUnoPropertyValue(oPageStyle, "HeaderText", XTextRange.class); + if (!com.sun.star.uno.AnyConverter.isVoid(xHeaderRange)) + { + xViewTextCursor.gotoRange(xHeaderRange, false); + xViewTextCursor.collapseToStart(); + } + else + { + System.out.println("No Headertext available"); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void setViewSetting(String Setting, Object Value) throws UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException + { + xViewSettingsSupplier.getViewSettings().setPropertyValue(Setting, Value); + } + + public void collapseViewCursorToStart() + { + XTextViewCursor xTextViewCursor = xTextViewCursorSupplier.getViewCursor(); + xTextViewCursor.collapseToStart(); + } +} diff --git a/wizards/com/sun/star/wizards/text/__init__.py b/wizards/com/sun/star/wizards/text/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/text/__init__.py diff --git a/wizards/com/sun/star/wizards/ui/AggregateComponent.java b/wizards/com/sun/star/wizards/ui/AggregateComponent.java new file mode 100644 index 000000000..c9f0659f3 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/AggregateComponent.java @@ -0,0 +1,575 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import java.util.ArrayList; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XListBox; +import com.sun.star.beans.PropertyValue; +import com.sun.star.lang.EventObject; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.AnyConverter; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.db.QueryMetaData; + +public class AggregateComponent extends ControlScroller +{ + + private String[] sFunctions; + private String[] sFunctionOperators = new String[] + { + "SUM", "AVG", "MIN", "MAX", "COUNT" + }; + private QueryMetaData CurDBMetaData; + private String soptDetailQuery; + private String soptSummaryQuery; + private String slblAggregate; + private String slblFieldNames; + private String sDuplicateAggregateFunction; + private static final int SOADDROW = 1; + private static final int SOREMOVEROW = 2; + private ArrayList<ControlRow> ControlRowVector; + private int lastHelpIndex; + + /** Creates a new instance of AggregateComponent */ + public AggregateComponent(WizardDialog _CurUnoDialog, QueryMetaData _CurDBMetaData, int _iStep, int _iPosX, int _iPosY, int _iWidth, int _uitextfieldcount, int _firstHelpID) + { + super(_CurUnoDialog, _iStep, _iPosX + 10, _iPosY, _iWidth - 12, _uitextfieldcount, 18, _firstHelpID + 2); + try + { + this.CurDBMetaData = _CurDBMetaData; + CurUnoDialog.insertRadioButton("optDetailQuery", 0, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, HelpIds.getHelpIdString(_firstHelpID), soptDetailQuery, Integer.valueOf(_iPosX), Integer.valueOf(iCompPosY - 42), Short.valueOf((short) 1), IStep, Short.valueOf(curtabindex++), Integer.valueOf(iCompWidth) + }); + + CurUnoDialog.insertRadioButton("optSummaryQuery", 0, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 16, HelpIds.getHelpIdString(_firstHelpID + 1), soptSummaryQuery, Boolean.TRUE, Integer.valueOf(_iPosX), Integer.valueOf(iCompPosY - 32), IStep, Short.valueOf(curtabindex++), Integer.valueOf(iCompWidth) + }); + CurUnoDialog.insertLabel("lblAggregate", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblAggregate, Integer.valueOf(iCompPosX + 5), Integer.valueOf(iCompPosY - 10), IStep, Short.valueOf(curtabindex++), 90 + }); + CurUnoDialog.insertLabel("lblFieldnames", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblFieldNames, Integer.valueOf(iCompPosX + 101), Integer.valueOf(iCompPosY - 10), IStep, Short.valueOf(curtabindex++), 90 + }); + this.setTotalFieldCount(1); + FontDescriptor oFontDescriptor = new FontDescriptor(); + oFontDescriptor.Weight = com.sun.star.awt.FontWeight.BOLD; + oFontDescriptor.Height = (short) 14; + + int iButtonPosY = iCompPosY + iCompHeight + 3; + CurUnoDialog.insertButton("btnplus", SOADDROW, new ActionListenerImpl(), + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDescriptor, 14, HelpIds.getHelpIdString(lastHelpIndex + 1), "+", Integer.valueOf(_iPosX + iCompWidth - 36), Integer.valueOf(iButtonPosY), IStep, Short.valueOf((curtabindex++)), 16 + }); + CurUnoDialog.insertButton("btnminus", SOREMOVEROW, new ActionListenerImpl(), + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDescriptor, 14, HelpIds.getHelpIdString(lastHelpIndex + 2), "-", Integer.valueOf(_iPosX + iCompWidth - 16), Integer.valueOf(iButtonPosY), IStep, Short.valueOf(curtabindex++), 16 + }); + CurDBMetaData.Type = getQueryType(); + } + catch (com.sun.star.uno.Exception exception) + { + Resource.showCommonResourceError(CurDBMetaData.xMSF); + } + } + + private int getQueryType() + { + if (((Short) CurUnoDialog.getControlProperty("optDetailQuery", PropertyNames.PROPERTY_STATE)).intValue() == 1) + { + return QueryMetaData.QueryType.SODETAILQUERY; + } + else + { + return QueryMetaData.QueryType.SOSUMMARYQUERY; + } + } + + private class ActionListenerImpl implements com.sun.star.awt.XActionListener + { + + public void disposing(EventObject eventObject) + { + } + + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + try + { + int iKey = CurUnoDialog.getControlKey(actionEvent.Source, CurUnoDialog.ControlList); + switch (iKey) + { + case SOADDROW: + addRow(); + break; + + case SOREMOVEROW: + removeRow(); + break; + + default: + toggleComponent(); + break; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + } + + @Override + protected void insertControlGroup(int i, int ypos) + { + if (i == 0) + { + soptDetailQuery = CurUnoDialog.m_oResource.getResText("RID_QUERY_11"); + soptSummaryQuery = CurUnoDialog.m_oResource.getResText("RID_QUERY_12"); + slblAggregate = CurUnoDialog.m_oResource.getResText("RID_QUERY_16"); + slblFieldNames = CurUnoDialog.m_oResource.getResText("RID_QUERY_17"); + sFunctions = new String[5]; + sFunctions[0] = CurUnoDialog.m_oResource.getResText("RID_QUERY_40"); + sFunctions[1] = CurUnoDialog.m_oResource.getResText("RID_QUERY_41"); + sFunctions[2] = CurUnoDialog.m_oResource.getResText("RID_QUERY_42"); + sFunctions[3] = CurUnoDialog.m_oResource.getResText("RID_QUERY_43"); + sFunctions[4] = CurUnoDialog.m_oResource.getResText("RID_QUERY_44"); + + sDuplicateAggregateFunction = CurUnoDialog.m_oResource.getResText("RID_QUERY_90"); + } + if (ControlRowVector == null) + { + ControlRowVector = new ArrayList<ControlRow>(); + } + int locHelpID = curHelpIndex + (i * 2); + ControlRow oControlRow = new ControlRow(i, ypos, locHelpID); + ControlRowVector.add(oControlRow); + } + + @Override + protected void setControlGroupVisible(int _index, boolean _bIsVisible) + { + ControlRow oControlRow = ControlRowVector.get(_index); + oControlRow.setVisible(_bIsVisible); + if (_index >= (this.CurDBMetaData.AggregateFieldNames.length)) + { + oControlRow.settovoid(); + } + } + + private void addRow() + { + int fieldcount = super.getTotalFieldCount(); + registerControlGroupAtIndex(fieldcount); + if (fieldcount < super.getBlockIncrementation()) + { + ControlRow oControlRow = ControlRowVector.get(fieldcount); + oControlRow.setVisible(true); + oControlRow.settovoid(); + } + else + { + ControlRow oControlRow = ControlRowVector.get(super.getBlockIncrementation() - 1); + super.setScrollValue(getScrollValue() + 1, (fieldcount + 1)); + oControlRow.settovoid(); + } + fieldcount++; + super.setTotalFieldCount(fieldcount); + toggleButtons(); + CurUnoDialog.repaintDialogStep(); + } + + private void removeRow() + { + int fieldcount = super.getTotalFieldCount(); + if (fieldcount > 0) + { + ControlRow oControlRow; + fieldcount--; + if ((fieldcount + 1) <= super.getBlockIncrementation()) + { + oControlRow = ControlRowVector.get(fieldcount); + oControlRow.setVisible(false); + } + super.setScrollValue(getScrollValue() - 1, fieldcount); + super.unregisterControlGroup(fieldcount); + + } + toggleButtons(); + CurUnoDialog.repaintDialogStep(); + } + + private void toggleButtons() + { + ControlRow curcontrolrow = null; + boolean biscomplete = true; + CurDBMetaData.Type = getQueryType(); + CurUnoDialog.setControlProperty("btnminus", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf((super.getTotalFieldCount() > 0) && (CurDBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY))); + int fieldcount = super.getCurFieldCount(); + if (fieldcount > 0) + { + curcontrolrow = ControlRowVector.get(super.getCurFieldCount() - 1); + biscomplete = curcontrolrow.isComplete(); + } + CurUnoDialog.setControlProperty("btnplus", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(biscomplete && (CurDBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY))); + togglefollowingDialogSteps(); + } + + private void toggleComponent() + { + CurDBMetaData.Type = getQueryType(); + boolean benableComponent = isAggregateComponentEnabled(); + CurUnoDialog.setControlProperty("lblAggregate", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benableComponent)); + CurUnoDialog.setControlProperty("lblFieldnames", PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(benableComponent)); + toggleButtons(); + super.toggleComponent(benableComponent); + super.toggleControls(benableComponent); + togglefollowingDialogSteps(); + } + + private boolean isAggregateComponentEnabled() + { + return (CurDBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY); + } + + public boolean isGroupingpossible() + { + try + { + boolean benableGroupPage = isAggregateComponentEnabled() && CurDBMetaData.xDBMetaData.supportsGroupBy() && hasonlycompletefunctions(); + String[][] sAggregateFieldNames = this.getAggregateFieldNames(); + if (benableGroupPage) + { + for (int i = 0; i < CurDBMetaData.NumericFieldNames.length; i++) + { + boolean bisthere = (JavaTools.FieldInTable(sAggregateFieldNames, CurDBMetaData.NumericFieldNames[i]) > -1); + if (!bisthere) + { + return true; + } + } + } + } + catch (SQLException e) + { + e.printStackTrace(System.err); + } + return false; + } + + private void togglefollowingDialogSteps() + { + boolean benabletherest = true; + boolean benableGroupPage = isGroupingpossible(); + CurUnoDialog.setStepEnabled(UIConsts.SOGROUPSELECTIONPAGE, benableGroupPage); + CurUnoDialog.setStepEnabled(UIConsts.SOGROUPFILTERPAGE, benableGroupPage && CurDBMetaData.GroupFieldNames.length > 0); + if (isAggregateComponentEnabled()) + { + benabletherest = hasonlycompletefunctions(); + } + CurUnoDialog.enablefromStep(UIConsts.SOTITLESPAGE, benabletherest); + CurUnoDialog.enableNextButton(benabletherest); + } + + private void hideControlRowsfromindex(int _index) + { + if (_index < this.ControlRowVector.size()) + { + for (int i = _index; i < ControlRowVector.size(); i++) + { + ControlRow oControlRow = ControlRowVector.get(i); + oControlRow.setVisible(false); + } + } + + } + + public String[][] getAggregateFieldNames() + { + try + { + CurDBMetaData.Type = getQueryType(); + if (CurDBMetaData.Type == QueryMetaData.QueryType.SOSUMMARYQUERY) + { + ArrayList<String[]> aggregatevector = new ArrayList<String[]>(); + PropertyValue[][] aggregatelist = this.getScrollFieldValues(); + PropertyValue[] currowproperties; + if (CurDBMetaData.AggregateFieldNames != null) + { + for (int i = 0; i < aggregatelist.length; i++) + { + currowproperties = aggregatelist[i]; + if ((currowproperties[0].Value != null) && (currowproperties[1].Value != null)) + { + short[] iselfield = (short[]) AnyConverter.toArray(currowproperties[1].Value); + short[] iselfunction = (short[]) AnyConverter.toArray(currowproperties[0].Value); + if ((iselfield.length > 0) && (iselfunction.length > 0)) + { + String[] curaggregatename = new String[] { + CurDBMetaData.NumericFieldNames[iselfield[0]], + this.sFunctionOperators[iselfunction[0]] }; + aggregatevector.add(curaggregatename); + } + } + } + } + CurDBMetaData.AggregateFieldNames = new String[aggregatevector.size()][2]; + aggregatevector.toArray(CurDBMetaData.AggregateFieldNames); + } + + int iduplicate = JavaTools.getDuplicateFieldIndex(CurDBMetaData.AggregateFieldNames); + if (iduplicate != -1) + { + sDuplicateAggregateFunction = JavaTools.replaceSubString(sDuplicateAggregateFunction, CurDBMetaData.AggregateFieldNames[iduplicate][0], "<NUMERICFIELD>"); + int index = JavaTools.FieldInList(sFunctionOperators, CurDBMetaData.AggregateFieldNames[iduplicate][1]); + String sDisplayFunction = sFunctions[index]; + sDuplicateAggregateFunction = JavaTools.replaceSubString(sDuplicateAggregateFunction, sDisplayFunction, "<FUNCTION>"); + CurUnoDialog.showMessageBox("WarningBox", VclWindowPeerAttribute.OK, sDuplicateAggregateFunction); + CurUnoDialog.vetoableChange(new java.beans.PropertyChangeEvent(CurUnoDialog, "Steps", 1, 2)); + return new String[][] + { + }; + } + else + { + return CurDBMetaData.AggregateFieldNames; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public void initialize() + { + CurDBMetaData.setNumericFields(); + initializeScrollFields(); + int icount = CurDBMetaData.AggregateFieldNames.length; + if (icount == 0) + { + super.initialize(1); + hideControlRowsfromindex(1); + } + else + { + super.initialize(icount); + hideControlRowsfromindex(icount); + } + toggleComponent(); + CurUnoDialog.repaintDialogStep(); + } + + @Override + protected void initializeScrollFields() + { + ControlRow curControlRow; + if (CurDBMetaData.AggregateFieldNames != null) + { + for (int i = 0; i < this.getBlockIncrementation(); i++) + { + curControlRow = ControlRowVector.get(i); + curControlRow.insertFieldNames(); + } + for (int i = 0; i <= CurDBMetaData.AggregateFieldNames.length; i++) + { + registerControlGroupAtIndex(i); + } + } + } + + private void registerControlGroupAtIndex(int _index) + { + short[] iselfunctionlist = new short[] + { + }; + short[] iselfieldslist = new short[] + { + }; + PropertyValue[] currowproperties = new PropertyValue[2]; + if (_index < CurDBMetaData.AggregateFieldNames.length) + { + short iselfieldsindex = (short) JavaTools.FieldInList(CurDBMetaData.NumericFieldNames, CurDBMetaData.AggregateFieldNames[_index][0]); + iselfieldslist = new short[] + { + iselfieldsindex + }; + short iselfunctionindex = (short) JavaTools.FieldInList(sFunctionOperators, CurDBMetaData.AggregateFieldNames[_index][1]); + iselfunctionlist = new short[] + { + iselfunctionindex + }; + } + currowproperties[0] = Properties.createProperty(getFunctionControlName(_index), iselfunctionlist, _index); + currowproperties[1] = Properties.createProperty(getFieldsControlName(_index), iselfieldslist, _index); //getTitleName(i) + super.registerControlGroup(currowproperties, _index); + } + + private String getFunctionControlName(int _index) + { + String namesuffix = "_" + (_index + 1); + return "lstfunctions" + namesuffix; + } + + private String getFieldsControlName(int _index) + { + String namesuffix = "_" + (_index + 1); + return "lstFieldnames" + namesuffix; + } + + private boolean hasonlycompletefunctions() + { + int maxfieldcount = super.getCurFieldCount(); + if (maxfieldcount > 0) + { + ControlRow curcontrolrow = this.ControlRowVector.get(maxfieldcount - 1); + return curcontrolrow.isComplete(); + } + else + { + return false; + } + } + + private class ControlRow + { + + private XListBox xFieldListBox; + private XListBox xFunctionListBox; + private int index; + + private ControlRow(int _index, int ypos, int _curHelpID) + { + try + { + this.index = _index; + xFunctionListBox = CurUnoDialog.insertListBox(getFunctionControlName(index), 1, null, new ItemListenerImpl(), + new String[] + { + "Dropdown", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.STRING_ITEM_LIST, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, 12, HelpIds.getHelpIdString(_curHelpID++), Integer.valueOf(iCompPosX + 4), Integer.valueOf(ypos), UIConsts.INVISIBLESTEP, sFunctions, Short.valueOf(curtabindex++), 88 + }); + + xFieldListBox = CurUnoDialog.insertListBox(getFieldsControlName(index), 1, null, new ItemListenerImpl(), + new String[] + { + "Dropdown", PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, 12, HelpIds.getHelpIdString(_curHelpID++), Integer.valueOf(iCompPosX + 98), Integer.valueOf(ypos), UIConsts.INVISIBLESTEP, Short.valueOf(curtabindex++), 86 + }); + lastHelpIndex = _curHelpID - 1; + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private void setVisible(boolean _bvisible) + { + CurUnoDialog.setControlVisible(getFunctionControlName(index), _bvisible); + CurUnoDialog.setControlVisible(getFieldsControlName(index), _bvisible); + } + + private void insertFieldNames() + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xFieldListBox), PropertyNames.STRING_ITEM_LIST, CurDBMetaData.NumericFieldNames); + } + + private boolean isComplete() + { + boolean bfieldnameisselected = (Helper.getUnoArrayPropertyValue(UnoDialog.getModel(xFieldListBox), PropertyNames.SELECTED_ITEMS) != null); + boolean bfunctionisselected = (Helper.getUnoArrayPropertyValue(UnoDialog.getModel(xFunctionListBox), PropertyNames.SELECTED_ITEMS) != null); + return (bfieldnameisselected && bfunctionisselected); + } + + private void settovoid() + { + UnoDialog.deselectListBox(xFieldListBox); + UnoDialog.deselectListBox(xFunctionListBox); + } + + private class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(com.sun.star.awt.ItemEvent EventObject) + { + try + { + toggleButtons(); + togglefollowingDialogSteps(); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } + } +} diff --git a/wizards/com/sun/star/wizards/ui/ButtonList.java b/wizards/com/sun/star/wizards/ui/ButtonList.java new file mode 100644 index 000000000..522768bf8 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/ButtonList.java @@ -0,0 +1,626 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import javax.swing.ListModel; +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.Size; +import com.sun.star.awt.XActionListener; +import com.sun.star.awt.XButton; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XControlModel; +import com.sun.star.awt.XFixedText; +import com.sun.star.awt.XItemEventBroadcaster; +import com.sun.star.awt.XItemListener; +import com.sun.star.awt.XWindow; +import com.sun.star.lang.EventObject; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.IRenderer; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.PropertySetHelper; +import com.sun.star.wizards.ui.event.XActionListenerAdapter; + +public class ButtonList implements XItemEventBroadcaster, XActionListener +{ + + private XFixedText lblImageText; + private XButton btnBack; + private XButton btnNext; + private XFixedText lblCounter; + private XControl m_aButtons[]; + private boolean benabled = true; + private UnoDialog2 oUnoDialog; + private Size gap = new Size(4, 4); + private int cols = 4; + private int rows = 3; + private Size m_aButtonSize = new Size(20, 20); + private Size pos; + private boolean showButtons = true; + private Short step; + private static final boolean refreshOverNull = true; + private static final int imageTextLines = 1; + private boolean rowSelect = false; + public int tabIndex; + private String m_aControlName = "il"; + private int m_nCurrentSelection = -1; + private int pageStart = 0; + public int helpURL = 0; + private IRenderer renderer; + private ListModel listModel; + private IRenderer counterRenderer = new SimpleCounterRenderer(); + private static final int LINE_HEIGHT = 8; + + public void setName(String _sName) + { + m_aControlName = _sName; + } + + /** Setter for property m_aButtonSize. + * @param imageSize New value of property m_aButtonSize. + */ + public void setButtonSize(Size imageSize) + { + this.m_aButtonSize = imageSize; + } + + public void disposing(EventObject arg0) + { + } + + public void create(UnoDialog2 dialog) + { + oUnoDialog = dialog; + + int imageTextHeight = imageTextLines * LINE_HEIGHT; + + int nXPos = pos.Width + 1; + int nYPos = pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height; + int nWidth = cols * (m_aButtonSize.Width + gap.Width) + gap.Width - 2; + + lblImageText = dialog.insertLabel(m_aControlName + "_imageText", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Tabstop", + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(imageTextHeight), + PropertyNames.EMPTY_STRING, + "(1)", + Integer.valueOf(nXPos), + Integer.valueOf(nYPos), + step, + Short.valueOf((short) 0), + Boolean.FALSE, + Integer.valueOf(nWidth) + }); + + + if (showButtons) + { + final String[] pNames1 = new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Tabstop", + PropertyNames.PROPERTY_WIDTH + }; + + final Integer btnSize = Integer.valueOf(14); + +// TODO: if list of strings not the same length of list object, office will die. + btnBack = dialog.insertButton(m_aControlName + "_btnBack", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + prevPage(); + } + }, pNames1, new Object[] + { + btnSize, + HelpIds.getHelpIdString(helpURL++), + Integer.valueOf(pos.Width), + Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1), + step, + Short.valueOf((short) (tabIndex + 1)), + Boolean.TRUE, + btnSize + }); + + btnNext = dialog.insertButton(m_aControlName + "_btnNext", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + nextPage(); + } + }, pNames1, new Object[] + { + btnSize, + HelpIds.getHelpIdString(helpURL++), + Integer.valueOf(pos.Width + (m_aButtonSize.Width + gap.Width) * cols + gap.Width - btnSize.intValue() + 1), + Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1), + step, + Short.valueOf((short) (tabIndex + 2)), + Boolean.TRUE, + btnSize + }); + + lblCounter = dialog.insertLabel(m_aControlName + "_lblCounter", pNames1, new Object[] + { + Integer.valueOf(LINE_HEIGHT), + PropertyNames.EMPTY_STRING, + Integer.valueOf(pos.Width + btnSize.intValue() + 1), + Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + ((btnSize.intValue() - LINE_HEIGHT) / 2)), + step, + Short.valueOf((short) 0), + Boolean.FALSE, + Integer.valueOf(cols * (m_aButtonSize.Width + gap.Width) + gap.Width - 2 * btnSize.intValue() - 1) + }); + + Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_ALIGN, Short.valueOf((short) 1)); + Helper.setUnoPropertyValue(getModel(btnBack), PropertyNames.PROPERTY_LABEL, "<"); + Helper.setUnoPropertyValue(getModel(btnNext), PropertyNames.PROPERTY_LABEL, ">"); + + + } + + m_tabIndex = Short.valueOf((short) tabIndex); + + m_aButtons = new XControl[rows * cols]; + + m_aButtonHeight = Integer.valueOf(m_aButtonSize.Height); + m_aButtonWidth = Integer.valueOf(m_aButtonSize.Width); + + for (int r = 0; r < rows; r++) + { + for (int c = 0; c < cols; c++) + { + XButton aButton = createButton(dialog, r, c); + XControl aControl = UnoRuntime.queryInterface(XControl.class, aButton); + m_aButtons[r * cols + c] = aControl; + } + } + refreshImages(); + } + + private Integer m_aButtonHeight; + private Integer m_aButtonWidth; + private Short m_tabIndex; + + private XButton createButton(UnoDialog2 dialog, int _row, int _col) + { + String sButtonName = m_aControlName + "_button" + (_row * cols + _col); + int nButtonX = getButtonPosX(_col); + int nButtonY = getButtonPosY(_row); + XButton aButton = dialog.insertImageButton(sButtonName, this, + new String[] + { + /* PropertyNames.PROPERTY_BORDER, */ + /* "BackgroundColor", */ + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + /* PropertyNames.PROPERTY_LABEL, */ + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + /* "ScaleImage", */ + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Tabstop", + "Toggle", + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + /* Short.valueOf((short) 1), */ /* NO_BORDER, */ + /* BACKGROUND_COLOR, */ + m_aButtonHeight, + HelpIds.getHelpIdString(helpURL++), + /* "Test", */ + Integer.valueOf(nButtonX), + Integer.valueOf(nButtonY), + /* scaleImages, */ + step, + m_tabIndex, + Boolean.TRUE, + Boolean.TRUE, /* Toggle */ + m_aButtonWidth + }); + + XWindow win = UnoRuntime.queryInterface(XWindow.class, aButton); + win.setEnable(true); + win.setVisible(true); + return aButton; + } + + private int getButtonPosX(int _col) + { + return pos.Width + _col * (m_aButtonSize.Width + gap.Width) + gap.Width; + } + + private int getButtonPosY(int _row) + { + return pos.Height + _row * (m_aButtonSize.Height + gap.Height) + gap.Height; + } + + private void refreshImages() + { + if (showButtons) + { + refreshCounterText(); + } + if (refreshOverNull) + { + for (int i = 0; i < m_aButtons.length; i++) + { + setVisible(m_aButtons[i], false); + } + } + for (int i = 0; i < m_aButtons.length; i++) + { + String oResource = getObjectFor(i); + if (oResource == null) + continue; + oUnoDialog.getPeerConfiguration().setImageUrl(m_aButtons[i].getModel(), oResource); + boolean bTabStop = Boolean.TRUE; // focusable ? Boolean.TRUE : Boolean.FALSE; + Helper.setUnoPropertyValue(m_aButtons[i].getModel(), "Tabstop", bTabStop); + if (refreshOverNull) + { + setVisible(m_aButtons[i], true); + } + } + } + + private void refreshCounterText() + { + Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_LABEL, counterRenderer.render(new Counter(pageStart + 1, pageEnd(), listModel.getSize()))); + } + + private int pageEnd() + { + int i = pageStart + cols * rows; + if (i > listModel.getSize() - 1) + { + return listModel.getSize(); + } + else + { + return i; + } + } + + /** Utility field holding list of ItemListeners. */ + private transient java.util.ArrayList<XItemListener> m_aItemListenerList; + private void setVisible(Object control, boolean visible) + { + final XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, control); + xWindow.setVisible(visible); + } + + /** + * @param i + * @return the String in the list model corresponding to the given image url + */ + private String getObjectFor(int i) + { + int ii = getIndexFor(i); + if (listModel.getSize() <= ii) + { + return null; + } + else + { + return (String)listModel.getElementAt(ii); + } + } + + /** + * @param i + * @return the index in the listModel for the given image index. + */ + private int getIndexFor(int i) + { + return pageStart + i; + } + + /** Registers ItemListener to receive events. + * @param listener The listener to register. + */ + public synchronized void addItemListener(XItemListener listener) + { + if (m_aItemListenerList == null) + { + m_aItemListenerList = new java.util.ArrayList<XItemListener>(); + } + m_aItemListenerList.add(listener); + } + + /** Removes ItemListener from the list of listeners. + * @param listener The listener to remove. + */ + public synchronized void removeItemListener(XItemListener listener) + { + if (m_aItemListenerList != null) + { + m_aItemListenerList.remove(listener); + } + } + + /** Notifies all registered listeners about the event. + * + */ + private void fireItemSelected() + { + java.util.ArrayList<XItemListener> list; + synchronized(this) + { + if (m_aItemListenerList == null) + { + return; + } + list = (java.util.ArrayList<XItemListener>) m_aItemListenerList.clone(); + } + for (int i = 0; i < list.size(); i++) + { + list.get(i).itemStateChanged(null); + } + } + + private ListModel getListModel() + { + return listModel; + } + + public int getSelected() + { + return m_nCurrentSelection; + } + + public void setCols(int i) + { + cols = i; + } + + public void setGap(Size size) + { + gap = size; + } + + public void setListModel(ListModel model) + { + listModel = model; + } + + public void setStep(Short short1) + { + step = short1; + } + + private void setPageStart(int i) + { + if (i == pageStart) + { + return; + } + pageStart = i; + enableButtons(); + refreshImages(); + } + + public void setPos(Size _size) + { + pos = _size; + } + + public void setRenderer(IRenderer _renderer) + { + this.renderer = _renderer; + } + + public void setRows(int i) + { + rows = i; + } + + public void setSelected(int i) + { + if (rowSelect && (i >= 0)) + { + i = (i / cols) * cols; + } + if (m_nCurrentSelection == i) + { + return; + } + m_nCurrentSelection = i; + refreshImageText(); + refreshSelection(); + fireItemSelected(); + } + + /** + * set the text under the button list + */ + private void refreshImageText() + { + String sText; + Object item = m_nCurrentSelection >= 0 ? getListModel().getElementAt(m_nCurrentSelection) : null; + if (item != null) { + sText = PropertyNames.SPACE + renderer.render(item); + } + else { + sText = ""; + } + Helper.setUnoPropertyValue(getModel(lblImageText), PropertyNames.PROPERTY_LABEL, sText); + } + + public void setShowButtons(boolean b) + { + showButtons = b; + } + + private void nextPage() + { + if (pageStart < getListModel().getSize() - rows * cols) + { + setPageStart(pageStart + rows * cols); + } + } + + private void prevPage() + { + if (pageStart == 0) + { + return; + } + int i = pageStart - rows * cols; + if (i < 0) + { + i = 0; + } + setPageStart(i); + } + + private void enableButtons() + { + enable(btnNext, Boolean.valueOf(pageStart + rows * cols < listModel.getSize())); + enable(btnBack, Boolean.valueOf(pageStart > 0)); + } + + private void enable(Object control, Boolean enable) + { + Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enable); + } + + private Object getModel(Object control) + { + return UnoRuntime.queryInterface(XControl.class, control).getModel(); + } + + private static class SimpleCounterRenderer implements IRenderer + { + + public String render(Object counter) + { + return PropertyNames.EMPTY_STRING + ((Counter) counter).start + ".." + ((Counter) counter).end + "/" + ((Counter) counter).max; + } + } + + private static class Counter + { + + private int start, end, max; + + private Counter(int start_, int end_, int max_) + { + start = start_; + end = end_; + max = max_; + } + } + + public boolean isenabled() + { + return benabled; + } + + public void setenabled(boolean b) + { + + for (int i = 0; i < m_aButtons.length; i++) + { + UnoDialog2.setEnabled(m_aButtons[i], b); + } + UnoDialog2.setEnabled(lblImageText, b); + if (showButtons) + { + UnoDialog2.setEnabled(btnBack, b); + UnoDialog2.setEnabled(btnNext, b); + UnoDialog2.setEnabled(lblCounter, b); + } + benabled = b; + } + + /** + * refresh on all buttons, the selected button will get state pressed + */ + private void refreshSelection() + { + // reset all buttons to not set + for (int i = 0; i < m_aButtons.length; i++) + { + if (m_aButtons[i] != null) + { + XControlModel xModel = (XControlModel)UnoDialog2.getModel(m_aButtons[i]); + PropertySetHelper aHelper = new PropertySetHelper(xModel); + if (i == m_nCurrentSelection) + { + final short one = 1; + aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf(one)); + } + else + { + final short zero = 0; + aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf(zero)); + } + } + } + } + + /** + * implementation of XActionListener + * will call if a button from the m_aButtonList is pressed. + */ + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + XControlModel xModel = (XControlModel)UnoDialog2.getModel(actionEvent.Source); + PropertySetHelper aHelper = new PropertySetHelper(xModel); + + int nState = aHelper.getPropertyValueAsInteger(PropertyNames.PROPERTY_STATE, -1); + if (nState == 0) + { + // this will avoid a wrong state, if already pressed. + aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf((short)1)); + } + + // check which Button is pressed. + String sControlName = aHelper.getPropertyValueAsString(PropertyNames.PROPERTY_NAME, PropertyNames.EMPTY_STRING); + final String sButton = sControlName.substring(7 + m_aControlName.length()); + int nButton = Integer.parseInt(sButton); + + int index = getIndexFor(nButton); + if (index < listModel.getSize()) + { + setSelected(index); + } + + } + + +} diff --git a/wizards/com/sun/star/wizards/ui/CommandFieldSelection.java b/wizards/com/sun/star/wizards/ui/CommandFieldSelection.java new file mode 100644 index 000000000..8cd37ee0a --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/CommandFieldSelection.java @@ -0,0 +1,428 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.db.*; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.sdb.CommandType; +import com.sun.star.uno.AnyConverter; +import com.sun.star.awt.*; +import com.sun.star.beans.PropertyValue; + +import java.text.Collator; +import java.util.Comparator; + +public class CommandFieldSelection extends FieldSelection implements Comparator<String> +{ + + private CommandMetaData CurDBMetaData; + private XListBox xTableListBox; + private XFixedText xlblTable; + private String sTableListBoxName; + private String sQueryPrefix; + private String sTablePrefix; + private short m_iSelPos = -1; + private short iOldSelPos = -1; + private boolean bgetQueries; + private final WizardDialog oWizardDialog; + private Collator aCollator = null; + + private class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(com.sun.star.awt.ItemEvent EventObject) + { + short[] SelItems = (short[]) CurUnoDialog.getControlProperty(sTableListBoxName, PropertyNames.SELECTED_ITEMS); + if (SelItems.length > 0) + { + iOldSelPos = m_iSelPos; + m_iSelPos = SelItems[0]; + if ((m_iSelPos > -1) && (m_iSelPos != iOldSelPos)) + { + if (!AppendMode) + { + oWizardDialog.enablefromStep(IStep.intValue() + 1, false); + } + fillUpFieldsListbox(); + } + } + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } + + /** + * instantiates a CommandFieldSelection with a preselected command + */ + public CommandFieldSelection(WizardDialog _CurUnoDialog, CommandMetaData _CurDBMetaData, int iStep, int _iHeight, String _reslblFields, String _reslblSelFields, String _reslblTables, boolean _bgetQueries, int _ifirstHID) + { + super(_CurUnoDialog, iStep, 95, 57, 210, _iHeight, _reslblFields, _reslblSelFields, (_ifirstHID + 1), true); + insertControls(_CurDBMetaData, _bgetQueries, _reslblTables); + oWizardDialog = (WizardDialog) CurUnoDialog; + } + + /** + * instantiates a CommandFieldSelection with a preselected command + */ + public CommandFieldSelection(UnoDialog _CurUnoDialog, CommandMetaData _CurDBMetaData, int _iHeight, String _reslblFields, String _reslblSelFields, String _reslblTables, boolean _bgetQueries, int _ifirstHID) + { + super(_CurUnoDialog, 1, 95, 57, 210, _iHeight, _reslblFields, _reslblSelFields, (_ifirstHID + 1), true); + insertControls(_CurDBMetaData, _bgetQueries, _reslblTables); + oWizardDialog = (WizardDialog) CurUnoDialog; + } + + private void insertControls(CommandMetaData _CurDBMetaData, boolean _bgetQueries, String _reslblTables) + { + try + { + this.AppendMode = !_bgetQueries; + this.bgetQueries = _bgetQueries; + this.CurDBMetaData = _CurDBMetaData; + toggleListboxControls(Boolean.FALSE); + String sTableLabelName = "lblTables_" + super.sIncSuffix; + sTableListBoxName = "lstTables_" + super.sIncSuffix; + sTablePrefix = getTablePrefix(); + sQueryPrefix = getQueryPrefix(); + Integer LabelWidth = Integer.valueOf(getListboxWidth().intValue() + 6); + // Label 'Tables or Queries' + xlblTable = CurUnoDialog.insertLabel(sTableLabelName, + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 8, _reslblTables, 95, 27, IStep, Short.valueOf((short) 3), LabelWidth + }); + // DropDown Listbox TableNames + xTableListBox = CurUnoDialog.insertListBox(sTableListBoxName, 0, null, new ItemListenerImpl(), + new String[] + { + "Dropdown", PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "LineCount", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.TRUE, Boolean.FALSE, 12, HelpIds.getHelpIdString(super.FirstHelpIndex - 1), Short.valueOf(UnoDialog.getListBoxLineCount()), 95, 37, IStep, Short.valueOf((short) 4), getListboxWidth() + }); + fillupCommandListBox(); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + /** + * @return Returns the sQueryPrefix. + */ + private String getQueryPrefix() + { + if (sQueryPrefix == null) + { + sQueryPrefix = CurUnoDialog.m_oResource.getResText("RID_QUERY_22"); + } + return sQueryPrefix; + } + + private String getCommandPrefix(int _nCommandType) + { + if (_nCommandType == CommandType.TABLE) + { + return getTablePrefix(); + } + else if (_nCommandType == CommandType.QUERY) + { + return getQueryPrefix(); + } + else + { + return PropertyNames.EMPTY_STRING; + } + } + + /** + * @return Returns the sTablePrefix. + */ + private String getTablePrefix() + { + if (sTablePrefix == null) + { + sTablePrefix = CurUnoDialog.m_oResource.getResText("RID_QUERY_21"); + } + return sTablePrefix; + } + + private short getselectedItemPos() + { + short[] iSelPoses = ((short[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS)); + if (iSelPoses.length > 0) + { + return iSelPoses[0]; + } + else + { + String[] sItemList = ((String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.STRING_ITEM_LIST)); + if (sItemList.length > 0) + { + return (short) 0; + } + return (short) -1; + } + } + + private void fillUpFieldsListbox() + { + try + { + boolean binitialize = false; + String curCommandName = PropertyNames.EMPTY_STRING; + //As the peer of the control might not yet exist we have to query the model for the SelectedItems + short iSelPos = getselectedItemPos(); + final String sSelectedTableName = xTableListBox.getItem(iSelPos); + if (!bgetQueries) + { + curCommandName = sSelectedTableName; // sLocList[iSelPos]; + CurDBMetaData.setTableByName(curCommandName); + binitialize = CurDBMetaData.getFieldNamesOfCommand(curCommandName, CommandType.TABLE); + } + else + { + if (sSelectedTableName.startsWith(sTablePrefix)) + { + CurDBMetaData.setCommandType(CommandType.TABLE); + curCommandName = JavaTools.replaceSubString(sSelectedTableName, PropertyNames.EMPTY_STRING, sTablePrefix); + CurDBMetaData.setTableByName(curCommandName); + binitialize = CurDBMetaData.getFieldNamesOfCommand(curCommandName, CommandType.TABLE); + } + else + { + CurDBMetaData.setCommandType(CommandType.QUERY); + curCommandName = JavaTools.replaceSubString(sSelectedTableName, PropertyNames.EMPTY_STRING, sQueryPrefix); + CurDBMetaData.setQueryByName(curCommandName); + binitialize = CurDBMetaData.getFieldNamesOfCommand(curCommandName, CommandType.QUERY); + } + } + if (binitialize) + { + CurDBMetaData.setCommandName(curCommandName); + if (CurDBMetaData.m_aAllFieldNames != null) + { + if (CurDBMetaData.m_aAllFieldNames.length > 0) + { + initialize(CurDBMetaData.m_aAllFieldNames, AppendMode, CurDBMetaData.getMaxColumnsInSelect()); + return; + } + } + } + emptyFieldsListBoxes(); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + /** returns the selected entry index in the commandListbox + * + * @return + * @throws com.sun.star.wizards.common.TerminateWizardException + */ + private short fillupCommandListBox() + { + short[] iSelArray = new short[0]; + boolean bgetFields = false; + String[] ContentList = new String[0]; + if (bgetQueries) + { + ContentList = new String[CurDBMetaData.getTableNames().length + CurDBMetaData.getQueryNames().length]; + System.arraycopy(CurDBMetaData.getQueryNames(), 0, ContentList, CurDBMetaData.getTableNames().length, CurDBMetaData.getQueryNames().length); + ContentList = setPrefixinArray(ContentList, sQueryPrefix, CurDBMetaData.getTableNames().length, CurDBMetaData.getQueryNames().length); + } + else + { + ContentList = new String[CurDBMetaData.getTableNames().length]; + } + System.arraycopy(CurDBMetaData.getTableNames(), 0, ContentList, 0, CurDBMetaData.getTableNames().length); + if (bgetQueries) + { + ContentList = setPrefixinArray(ContentList, sTablePrefix, 0, CurDBMetaData.getTableNames().length); + } + java.util.Arrays.sort(ContentList, this); + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.STRING_ITEM_LIST, ContentList); + short iSelPos = getselectedItemPos(); + if (iSelPos > -1) + { + bgetFields = true; + iSelArray = new short[] + { + iSelPos + }; + } + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, iSelArray); + toggleCommandListBox(true); + if (bgetFields) + { + fillUpFieldsListbox(); + } + return iSelPos; + } + + private Collator getCollator() + { + if (this.aCollator == null) + { + com.sun.star.lang.Locale aOfficeLocale = Configuration.getLocale(this.CurDBMetaData.xMSF); + java.util.Locale aJavaLocale = new java.util.Locale(aOfficeLocale.Language, aOfficeLocale.Country, aOfficeLocale.Variant); + //Get the Collator for US English and set its strength to PRIMARY + this.aCollator = Collator.getInstance(aJavaLocale); + aCollator.setStrength(Collator.TERTIARY); + } + return aCollator; + } + + public int compare(String _oObject1, String _oObject2) + { + return this.getCollator().compare(_oObject1, _oObject2); + } + + private String[] setPrefixinArray(String[] _ContentList, String _sprefix, int _startindex, int _nlen) + { + for (int i = _startindex; i < _startindex + _nlen; i++) + { + _ContentList[i] = _sprefix + _ContentList[i]; + } + return _ContentList; + } + + public void toggleCommandListBox(String[] _NewItems) + { + boolean bdoenable = QueryMetaData.getIncludedCommandNames(_NewItems).length < CurDBMetaData.getMaxTablesInSelect(); + toggleCommandListBox(bdoenable); + } + + private void toggleCommandListBox(boolean _bdoenable) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + Helper.setUnoPropertyValue(UnoDialog.getModel(xlblTable), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + } + + public String getSelectedCommandName() + { + String sCommandname = xTableListBox.getSelectedItem(); + if (sCommandname.startsWith(this.sTablePrefix)) + { + return sCommandname.substring(sTablePrefix.length()); + } + else if (sCommandname.startsWith(this.sQueryPrefix)) + { + return sCommandname.substring(sQueryPrefix.length()); + } + else + { + return sCommandname; + } + } + + public int getSelectedCommandType() + { + String sCommandname = xTableListBox.getSelectedItem(); + if (sCommandname.startsWith(this.sTablePrefix)) + { + return CommandType.TABLE; + } + else + { + return CommandType.QUERY; + } + } + + public void preselectCommand(PropertyValue[] _aPropertyValue, boolean _bReadOnly) + { + try + { + if (Properties.hasPropertyValue(_aPropertyValue, PropertyNames.COMMAND_TYPE)) + { + int nCommandType = AnyConverter.toInt(Properties.getPropertyValue(_aPropertyValue, PropertyNames.COMMAND_TYPE)); + String sCommand = AnyConverter.toString(Properties.getPropertyValue(_aPropertyValue, PropertyNames.COMMAND)); + if (sCommand != null) + { + preselectCommand(sCommand, nCommandType, _bReadOnly); + } + } + } + catch (IllegalArgumentException e) + { + e.printStackTrace(); + } + } + + private void preselectCommand(String _selitem, int _nCommandType, boolean _bReadOnly) + { + if (_selitem.length() > 0) + { + String[] sitems = (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.STRING_ITEM_LIST); + String sPrefix = getCommandPrefix(_nCommandType); + short iselpos = (short) JavaTools.FieldInList(sitems, sPrefix + _selitem); + if (iselpos > -1) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, new short[] + { + iselpos + }); + } + this.fillUpFieldsListbox(); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, new short[] + { + }); + } + if (_bReadOnly) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.READ_ONLY, Boolean.valueOf(_selitem.length() > 0)); + } + } + + public void preselectCommand(String _selitem, boolean _bReadOnly) + { + if (_selitem.length() > 0) + { + String[] sitems = (String[]) Helper.getUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.STRING_ITEM_LIST); + short iselpos = (short) JavaTools.FieldInList(sitems, getTablePrefix() + _selitem); + if (iselpos > -1) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, new short[] { iselpos }); + } + this.fillUpFieldsListbox(); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.SELECTED_ITEMS, new short[] {} ); + this.fillUpFieldsListbox(); + } + if (_bReadOnly) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xTableListBox), PropertyNames.READ_ONLY, Boolean.valueOf(_selitem.length() > 0)); + } + toggleListboxButtons((short)-1,(short)-1); + } +} diff --git a/wizards/com/sun/star/wizards/ui/ControlScroller.java b/wizards/com/sun/star/wizards/ui/ControlScroller.java new file mode 100644 index 000000000..df5131f7b --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/ControlScroller.java @@ -0,0 +1,425 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.beans.*; +import com.sun.star.awt.*; +import com.sun.star.wizards.common.*; + +import java.util.*; + +public abstract class ControlScroller +{ + + protected WizardDialog CurUnoDialog; + protected int ncurfieldcount; + private int nblockincrement; + private int nlineincrement; + private int nscrollvalue = 0; + private int ntotfieldcount; + private XScrollBar xScrollBar; + private ArrayList<PropertyValue[]> scrollfields; + protected int iCompPosX; + protected int iCompPosY; + protected int iCompWidth; + protected int iCompHeight; + protected short curtabindex; + protected Integer IStep; + int iScrollBarWidth = 10; + private int SORELFIRSTPOSY = 3; + protected int curHelpIndex; + private String sIncSuffix; + protected ArrayList<Object> ControlGroupVector = new ArrayList<Object>(); + + private class AdjustmentListenerImpl implements com.sun.star.awt.XAdjustmentListener + { + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + + public void adjustmentValueChanged(AdjustmentEvent AdjustEvent) + { + scrollControls(); + } + } + + /** + * + * @param _CurUnoDialog + * @param _iStep + * @param _iCompPosX + * @param _iCompPosY + * @param _iCompWidth + * @param _nblockincrement + * @param _firsthelpindex + */ + // TODO add parameters for tabindices and helpindex + protected ControlScroller(WizardDialog _CurUnoDialog, int _iStep, int _iCompPosX, int _iCompPosY, int _iCompWidth, int _nblockincrement, int _nlinedistance, int _firsthelpindex) + { + this.nblockincrement = _nblockincrement; + this.CurUnoDialog = _CurUnoDialog; + this.curHelpIndex = _firsthelpindex; + curtabindex = UnoDialog.setInitialTabindex(_iStep); + IStep = Integer.valueOf(_iStep); + this.iCompPosX = _iCompPosX; + this.iCompPosY = _iCompPosY; + this.iCompWidth = _iCompWidth; + this.iCompHeight = 2 * SORELFIRSTPOSY + nblockincrement * _nlinedistance; + int iStartPosY = iCompPosY + SORELFIRSTPOSY; + int ScrollHeight = iCompHeight - 2; + nlineincrement = 1; + sIncSuffix = com.sun.star.wizards.common.Desktop.getIncrementSuffix(CurUnoDialog.getDlgNameAccess(), "TitleScrollBar"); + xScrollBar = CurUnoDialog.insertScrollBar("TitleScrollBar" + sIncSuffix, 0, + new AdjustmentListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_BORDER, PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Short.valueOf((short) 0), Boolean.TRUE, Integer.valueOf(ScrollHeight), HelpIds.getHelpIdString(curHelpIndex), Integer.valueOf(ScrollBarOrientation.VERTICAL), Integer.valueOf(iCompPosX + iCompWidth - iScrollBarWidth - 1), Integer.valueOf(iCompPosY + 1), IStep, Integer.valueOf(iScrollBarWidth) + }); + scrollfields = new ArrayList<PropertyValue[]>(); + int ypos = iStartPosY + SORELFIRSTPOSY; + for (int i = 0; i < nblockincrement; i++) + { + insertControlGroup(i, ypos); + ypos += _nlinedistance; + } + } + + + + /** + * @param _ntotfieldcount The number of fields that are to be administered by the ControlScroller + */ + protected void initialize(int _ntotfieldcount) + { + try + { + ntotfieldcount = _ntotfieldcount; + setCurFieldCount(); + nscrollvalue = 0; + Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue", Integer.valueOf(nscrollvalue)); + if (ntotfieldcount > nblockincrement) + { + Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[] + { + PropertyNames.PROPERTY_ENABLED, "BlockIncrement", "LineIncrement", "ScrollValue", "ScrollValueMax" + }, new Object[] + { + Boolean.TRUE, Integer.valueOf(nblockincrement), Integer.valueOf(nlineincrement), Integer.valueOf(nscrollvalue), Integer.valueOf(ntotfieldcount - nblockincrement) + }); + } + else + { + Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[] + { + PropertyNames.PROPERTY_ENABLED, "ScrollValue" + }, new Object[] + { + Boolean.FALSE, Integer.valueOf(nscrollvalue) + }); + } + fillupControls(true); + } + catch (java.lang.Exception ex) + { + ex.printStackTrace(); + } + } + + private void fillupControls(boolean binitialize) + { + for (int a = 0; a < this.nblockincrement; a++) + { + if (a < ncurfieldcount) + { + fillupControls(a); + } + if (binitialize) + { + setControlGroupVisible(a, (a < this.ncurfieldcount)); + } + } + if (binitialize) + { + CurUnoDialog.repaintDialogStep(); + } + } + + private void fillupControls(int guiRow) + { + PropertyValue[] nameProps = scrollfields.get(guiRow); + PropertyValue[] valueProps = scrollfields.get(guiRow + nscrollvalue); + for (int n = 0; n < nameProps.length; n++) + { + if (CurUnoDialog.getDlgNameAccess().hasByName(nameProps[n].Name)) + { + setControlData(nameProps[n].Name, valueProps[n].Value); + } + else + { + throw new IllegalArgumentException("No such control !"); + } + } + } + + private void setScrollValue(int _nscrollvalue) + { + if (_nscrollvalue >= 0) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue", Integer.valueOf(_nscrollvalue)); + scrollControls(); + } + } + + protected void setScrollValue(int _nscrollvalue, int _ntotfieldcount) + { + setTotalFieldCount(_ntotfieldcount); + setScrollValue(_nscrollvalue); + } + + protected int getTotalFieldCount() + { + return ntotfieldcount; + } + + protected int getCurFieldCount() + { + return ncurfieldcount; + } + + private void setCurFieldCount() + { + if (ntotfieldcount > nblockincrement) + { + ncurfieldcount = nblockincrement; + } + else + { + ncurfieldcount = ntotfieldcount; + } + } + + protected void setTotalFieldCount(int _ntotfieldcount) + { + this.ntotfieldcount = _ntotfieldcount; + setCurFieldCount(); + if (ntotfieldcount > nblockincrement) + { + Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[] + { + PropertyNames.PROPERTY_ENABLED, "ScrollValueMax" + }, new Object[] + { + Boolean.TRUE, Integer.valueOf(ntotfieldcount - nblockincrement) + }); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + } + } + + protected void toggleComponent(boolean _bdoenable) + { + boolean bdoenable = _bdoenable && (ntotfieldcount > nblockincrement); + CurUnoDialog.setControlProperty("TitleScrollBar" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable)); + } + + protected void toggleControls(boolean _bdoenable) + { + for (int n = 0; n < scrollfields.size(); n++) + { + PropertyValue[] curproperties = scrollfields.get(n); + for (int m = 0; m < curproperties.length; m++) + { + PropertyValue curproperty = curproperties[m]; + CurUnoDialog.setControlProperty(curproperty.Name, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable)); + } + } + + } + + protected int getScrollValue() + { + return nscrollvalue; + } + + + + + + + + protected int getBlockIncrementation() + { + return nblockincrement; + } + + private void scrollControls() + { + try + { + scrollRowsInfo(); + nscrollvalue = ((Integer) Helper.getUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue")).intValue(); + if (nscrollvalue + nblockincrement >= ntotfieldcount) + { + nscrollvalue = (ntotfieldcount) - nblockincrement; + } + fillupControls(false); + } + catch (java.lang.Exception ex) + { + ex.printStackTrace(); + } + } + + private void scrollRowsInfo() + { + int cols = + scrollfields.size() > 0 + ? scrollfields.get(0).length + : 0; + for (int a = 0; a < ncurfieldcount; a++) + { + for (int n = 0; n < cols; n++) + { + fieldInfo(a, n); + } + } + } + + /** + * updates the corresponding data to + * the control in guiRow and column + * @param guiRow 0 based row index + * @param column 0 based column index + * @return the propertyValue object corresponding to + * this control. + */ + private PropertyValue fieldInfo(int guiRow, int column) + { + if (guiRow + nscrollvalue < scrollfields.size()) + { + return fieldInfo( + scrollfields.get(guiRow + nscrollvalue)[column], + scrollfields.get(guiRow)[column]); + } + else + { + return null; + } + } + + private PropertyValue fieldInfo(PropertyValue valueProp, PropertyValue nameProp) + { + if (CurUnoDialog.getDlgNameAccess().hasByName(nameProp.Name)) + { + valueProp.Value = getControlData(nameProp.Name); + } + else + { + valueProp.Value = nameProp.Value; + } + return valueProp; + } + + protected void unregisterControlGroup(int _index) + { + scrollfields.remove(_index); + } + + protected void registerControlGroup(PropertyValue[] _currowproperties, int _i) + { + if (_i == 0) + { + scrollfields.clear(); + } + if (_i >= scrollfields.size()) + { + scrollfields.add(_currowproperties); + } + else + { + scrollfields.set(_i, _currowproperties); + } + } + + + + private void setControlData(String controlname, Object newvalue) + { + Object oControlModel = UnoDialog.getModel(CurUnoDialog.xDlgContainer.getControl(controlname)); + String propertyname = UnoDialog.getDisplayProperty(oControlModel); + if (!propertyname.equals(PropertyNames.EMPTY_STRING)) + { + CurUnoDialog.setControlProperty(controlname, propertyname, newvalue); + } + } + + private Object getControlData(String controlname) + { + Object oControlModel = UnoDialog.getModel(CurUnoDialog.xDlgContainer.getControl(controlname)); + String propertyname = UnoDialog.getDisplayProperty(oControlModel); + if (!propertyname.equals(PropertyNames.EMPTY_STRING)) + { + return CurUnoDialog.getControlProperty(controlname, propertyname); + } + else + { + return null; + } + } + + protected PropertyValue[][] getScrollFieldValues() + { + scrollRowsInfo(); + PropertyValue[] curproperties; + PropertyValue[][] retproperties; + retproperties = new PropertyValue[scrollfields.size()][]; + try + { + for (int i = 0; i < scrollfields.size(); i++) + { + curproperties = scrollfields.get(i); + retproperties[i] = curproperties; + } + return retproperties; + } + catch (java.lang.Exception ex) + { + ex.printStackTrace(System.err); + return null; + } + } + + protected abstract void initializeScrollFields(); + + /** inserts a group of controls into the component. The group may either be a row or a column of controls + * The controls should be put on Step 99 (means made invisible at first). All the controlrows that are needed are than + * made visible automatically when calling "initialize(_fieldcount)" + * @param _index The index of the control group + * @param npos Can be an x coordinate or an y coordinate which depends on the orientation of the scrollbar + */ + protected abstract void insertControlGroup(int _index, int npos); + + protected abstract void setControlGroupVisible(int _index, boolean _bIsVisible); +} diff --git a/wizards/com/sun/star/wizards/ui/ControlScroller.py b/wizards/com/sun/star/wizards/ui/ControlScroller.py new file mode 100644 index 000000000..02eb86500 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/ControlScroller.py @@ -0,0 +1,176 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from .UnoDialog import UnoDialog +from ..common.Desktop import Desktop +from ..common.PropertyNames import PropertyNames +from ..common.HelpIds import HelpIds + +from com.sun.star.awt.ScrollBarOrientation import VERTICAL + +class ControlScroller(object): + + SORELFIRSTPOSY = 3 + iScrollBarWidth = 10 + + # TODO add parameters for tabindices and helpindex + def __init__(self, _CurUnoDialog, _xMSF, _iStep, _iCompPosX, _iCompPosY, + _iCompWidth, _nblockincrement, _nlinedistance, _firsthelpindex): + self.xMSF = _xMSF + self.scrollfields = [] + self.ControlGroupVector = [] + ControlScroller.nblockincrement = _nblockincrement + self.CurUnoDialog = _CurUnoDialog + self.iStep = _iStep + self.curHelpIndex = _firsthelpindex + self.curtabindex = self.iStep * 100 + self.linedistance = _nlinedistance + self.iCompPosX = _iCompPosX + self.iCompPosY = _iCompPosY + self.iCompWidth = _iCompWidth + self.iCompHeight = 2 * ControlScroller.SORELFIRSTPOSY + \ + ControlScroller.nblockincrement * self.linedistance + self.iStartPosY = self.iCompPosY + ControlScroller.SORELFIRSTPOSY + ScrollHeight = self.iCompHeight - 2 + self.nlineincrement = 1 + self.sincSuffix = Desktop.getIncrementSuffix( + self.CurUnoDialog.xDialogModel, "imgBackground") + + self.xScrollBar = self.CurUnoDialog.insertScrollBar( + "TitleScrollBar" + self.sincSuffix, + ("Border", PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, "Orientation", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH), + (0, True, ScrollHeight, + HelpIds.getHelpIdString(self.curHelpIndex), + VERTICAL, self.iCompPosX + self.iCompWidth - \ + ControlScroller.iScrollBarWidth - 1, + self.iCompPosY + 1, self.iStep, + ControlScroller.iScrollBarWidth), 0, self) + self.nscrollvalue = 0 + ypos = self.iStartPosY + ControlScroller.SORELFIRSTPOSY + for i in range(ControlScroller.nblockincrement): + self.insertControlGroup(i, ypos) + ypos += self.linedistance + + def fillupControls(self, binitialize): + for i in range(ControlScroller.nblockincrement): + if i < self.ncurfieldcount: + self.fillupControl(i) + + if binitialize: + self.CurUnoDialog.repaintDialogStep() + + + def fillupControl(self, guiRow): + nameProps = self.scrollfields[guiRow] + valueProps = self.scrollfields[guiRow + self.nscrollvalue] + for index, item in enumerate(nameProps): + if self.CurUnoDialog.xDialogModel.hasByName(item.Name): + self.setControlData(item.Name, valueProps[index].Value) + else: + raise AttributeError("No such control !") + self.ControlGroupVector[guiRow].setEnabled(True) + + def setScrollValue(self, _nscrollvalue, _ntotfieldcount=None): + if _ntotfieldcount is not None: + self.setTotalFieldCount(_ntotfieldcount) + if _nscrollvalue >= 0: + self.xScrollBar.Model.ScrollValue = _nscrollvalue + self.scrollControls() + + def setCurFieldCount(self): + if self.ntotfieldcount > ControlScroller.nblockincrement: + self.ncurfieldcount = ControlScroller.nblockincrement + else: + self.ncurfieldcount = self.ntotfieldcount + + def setTotalFieldCount(self, _ntotfieldcount): + self.ntotfieldcount = _ntotfieldcount + self.setCurFieldCount() + if self.ntotfieldcount > ControlScroller.nblockincrement: + self.xScrollBar.Model.Enabled = True + self.xScrollBar.Model.ScrollValueMax = \ + self.ntotfieldcount - ControlScroller.nblockincrement + else: + self.xScrollBar.Model.Enabled = False + + def scrollControls(self): + try: + self.nscrollvalue = \ + int(self.xScrollBar.Model.ScrollValue) + if self.nscrollvalue + ControlScroller.nblockincrement \ + >= self.ntotfieldcount: + self.nscrollvalue = \ + self.ntotfieldcount - ControlScroller.nblockincrement + self.fillupControls(False) + except Exception: + traceback.print_exc() + + ''' + updates the corresponding data to + the control in guiRow and column + @param guiRow 0 based row index + @param column 0 based column index + @return the propertyValue object corresponding to + this control. + ''' + + def fieldInfo(self, guiRow, column): + if guiRow + self.nscrollvalue < len(self.scrollfields): + valueProp = (self.scrollfields[guiRow + self.nscrollvalue])[column] + nameProp = (self.scrollfields[guiRow])[column] + if self.CurUnoDialog.xDialogModel.hasByName(nameProp.Name): + valueProp.Value = self.getControlData(nameProp.Name) + else: + valueProp.Value = nameProp.Value + return valueProp + else: + return None + + def unregisterControlGroup(self, _index): + del self.scrollfields[_index] + + def registerControlGroup(self, _currowproperties, _i): + if _i == 0: + del self.scrollfields[:] + + if _i >= len(self.scrollfields): + self.scrollfields.append(_currowproperties) + else: + self.scrollfields.insert(_currowproperties, _i) + + def setControlData(self, controlname, newvalue): + oControlModel = self.CurUnoDialog.xUnoDialog.getControl( + controlname).Model + propertyname = UnoDialog.getDisplayProperty(oControlModel) + if propertyname: + setattr(oControlModel, propertyname, newvalue) + + def getControlData(self, controlname): + oControlModel = self.CurUnoDialog.xUnoDialog.getControl( + controlname).Model + propertyname = UnoDialog.getDisplayProperty(oControlModel) + if propertyname: + return getattr(oControlModel, propertyname) + else: + return None diff --git a/wizards/com/sun/star/wizards/ui/DBLimitedFieldSelection.java b/wizards/com/sun/star/wizards/ui/DBLimitedFieldSelection.java new file mode 100644 index 000000000..f7c8e942e --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/DBLimitedFieldSelection.java @@ -0,0 +1,120 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.awt.XListBox; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; + +/** + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public abstract class DBLimitedFieldSelection +{ + + protected WizardDialog CurUnoDialog; + private String sNoField; + protected Integer IStep; + protected static final int rowcount = 4; + private static final int MAXSELINDEX = rowcount - 1; + protected short curtabindex; + protected int iCurPosY; + protected int FirstHelpIndex; + + public DBLimitedFieldSelection(WizardDialog _CurUnoDialog, int iStep, int iCompPosY, int _FirstHelpIndex) + { + this.CurUnoDialog = _CurUnoDialog; + FirstHelpIndex = _FirstHelpIndex; + curtabindex = (short) (iStep * 100); + sNoField = CurUnoDialog.m_oResource.getResText("RID_REPORT_8"); + IStep = Integer.valueOf(iStep); + iCurPosY = iCompPosY; + for (int i = 0; i < rowcount; i++) + { + insertControlGroup(i); + } + } + + protected abstract void insertControlGroup(int index); + + protected abstract void toggleControlRow(int CurIndex, boolean bDoEnable); + + protected abstract void enableNextControlRow(int CurIndex); + + protected abstract void updateFromNextControlRow(int CurIndex); + + + protected abstract int getMaxSelIndex(); + + protected void moveupSelectedItems(int CurIndex, boolean bDoEnable) + { + if ((!bDoEnable) && (MAXSELINDEX > CurIndex)) + { + for (int i = CurIndex; i < MAXSELINDEX; i++) + { + updateFromNextControlRow(i); + } + if (getMaxSelIndex() < rowcount - 2) + { + toggleControlRow(getMaxSelIndex() + 2, false); + } + } + else + { + toggleControlRow(CurIndex + 1, bDoEnable); + } + } + + protected String[] addNoneFieldItemToList(String[] _FieldNames) + { + int FieldCount = _FieldNames.length; + String[] ViewFieldNames = new String[FieldCount + 1]; + ViewFieldNames[0] = sNoField; + System.arraycopy(_FieldNames, 0, ViewFieldNames, 1, FieldCount); + return ViewFieldNames; + } + + protected void initializeListBox(XListBox xListBox, String[] _AllFieldNames, String[] _SelFieldNames, int curindex) + { + short[] SelList = null; + Helper.setUnoPropertyValue(UnoDialog.getModel(xListBox), PropertyNames.STRING_ITEM_LIST, _AllFieldNames); + if (_SelFieldNames != null && curindex < _SelFieldNames.length) + { + int index = JavaTools.FieldInList(_AllFieldNames, _SelFieldNames[curindex]); + if (index > -1) + { + SelList = new short[] { (short) (index) }; + } + else + { + SelList = new short[] { (short) (0) }; + } + Helper.setUnoPropertyValue(UnoDialog.getModel(xListBox), PropertyNames.SELECTED_ITEMS, SelList); + return; + } + SelList = new short[] { (short) (0) }; + Helper.setUnoPropertyValue(UnoDialog.getModel(xListBox), PropertyNames.SELECTED_ITEMS, SelList); + + } + + +} + + diff --git a/wizards/com/sun/star/wizards/ui/DocumentPreview.py b/wizards/com/sun/star/wizards/ui/DocumentPreview.py new file mode 100644 index 000000000..280fac6df --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/DocumentPreview.py @@ -0,0 +1,96 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from ..common.Properties import Properties + +from com.sun.star.awt import WindowDescriptor +from com.sun.star.awt import Rectangle +from com.sun.star.awt.WindowClass import SIMPLE +from com.sun.star.awt.VclWindowPeerAttribute import CLIPCHILDREN +from com.sun.star.awt.WindowAttribute import SHOW + +''' +To change the template for this generated type comment go to +Window>Preferences>Java>Code Generation>Code and Comments +''' + +class DocumentPreview(object): + PREVIEW_MODE = 1 + + ''' + create new frame with window inside + load a component as preview into this frame + ''' + + def __init__(self, xmsf, control): + self.xControl = control + self.createPreviewFrame(xmsf, self.xControl) + + def setDocument(self, url_, propNames, propValues=None): + if propValues is None: + if propNames == DocumentPreview.PREVIEW_MODE: + self.setDocument(url_, ("Preview", "ReadOnly"), (True, True)) + else: + self.loadArgs = propNames + self.xFrame.activate() + self.xComponent = self.xFrame.loadComponentFromURL(url_, "_self", 0, tuple(self.loadArgs)) + return self.xComponent + else: + self.url = url_ + ps = Properties() + for index,item in enumerate(propNames): + ps[item] = propValues[index] + return self.setDocument(self.url, ps.getProperties1()) + + def closeFrame(self): + if self.xFrame is not None: + self.xFrame.close(False) + + ''' + create a new frame with a new container window inside, + which is not part of the global frame tree. + + Attention: + a) This frame won't be destroyed by the office. It must be closed by you! + Do so - please call XCloseable::close(). + b) The container window is part of the frame. Don't hold it alive - nor try to kill it. + It will be destroyed inside close(). + ''' + + def createPreviewFrame(self, xmsf, xControl): + controlPeer = xControl.Peer + r = xControl.PosSize + toolkit = xmsf.createInstance("com.sun.star.awt.Toolkit") + aDescriptor = WindowDescriptor() + aDescriptor.Type = SIMPLE + aDescriptor.WindowServiceName = "window" + aDescriptor.ParentIndex = -1 + aDescriptor.Parent = controlPeer + #xWindowPeer; #argument ! + aDescriptor.Bounds = Rectangle(0, 0, r.Width, r.Height) + aDescriptor.WindowAttributes = CLIPCHILDREN | SHOW + self.xWindow = toolkit.createWindow(aDescriptor) + self.xFrame = xmsf.createInstance("com.sun.star.frame.Frame") + self.xFrame.initialize(self.xWindow) + self.xWindow.setVisible(True) + + def dispose(self): + try: + self.closeFrame() + except Exception: + traceback.print_exc() diff --git a/wizards/com/sun/star/wizards/ui/FieldSelection.java b/wizards/com/sun/star/wizards/ui/FieldSelection.java new file mode 100644 index 000000000..1f2179f08 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/FieldSelection.java @@ -0,0 +1,640 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.XListBox; +import com.sun.star.wizards.common.*; + +import java.util.*; + +public class FieldSelection +{ + public XListBox xFieldsListBox; // Left ListBox + public XListBox xSelectedFieldsListBox; // right (selected) ListBox + + protected UnoDialog CurUnoDialog; + protected String sIncSuffix; + protected int FirstHelpIndex; + protected boolean AppendMode = false; + protected Integer IStep; + + private int CompPosY; + private int CompHeight; + + private XFieldSelectionListener xFieldSelection; + private int maxfieldcount = 10000000; + private String[] AllFieldNames; + private Integer ListBoxWidth; + + private boolean bisModified = false; + + private static final int SOCMDMOVESEL = 1; + private static final int SOCMDMOVEALL = 2; + private static final int SOCMDREMOVESEL = 3; + private static final int SOCMDREMOVEALL = 4; + private static final int SOCMDMOVEUP = 5; + private static final int SOCMDMOVEDOWN = 6; + private static final int SOFLDSLST = 7; + private static final int SOSELFLDSLST = 8; + + + private class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(com.sun.star.awt.ItemEvent EventObject) + { + com.sun.star.wizards.common.Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + int iKey = CurUnoDialog.getControlKey(EventObject.Source, CurUnoDialog.ControlList); + switch (iKey) + { + case SOFLDSLST: + case SOSELFLDSLST: + toggleListboxButtons((short) - 1, (short) - 1); + break; + + default: + break; + } + com.sun.star.wizards.common.Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } + + private class ActionListenerImpl implements com.sun.star.awt.XActionListener + { + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + + public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent) + { + try + { + int iKey = CurUnoDialog.getControlKey(actionEvent.Source, CurUnoDialog.ControlList); + switch (iKey) + { + case SOCMDMOVESEL: + case SOFLDSLST: + selectFields(false); + break; + + case SOCMDMOVEALL: + selectFields(true); + break; + + case SOCMDREMOVESEL: + case SOSELFLDSLST: + deselectFields(false); + break; + + case SOCMDREMOVEALL: + deselectFields(true); + break; + + case SOCMDMOVEUP: + changeSelectionOrder(-1); + break; + + case SOCMDMOVEDOWN: + changeSelectionOrder(1); + break; + + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + } + + public void addFieldSelectionListener(XFieldSelectionListener xFieldSelection) + { + this.xFieldSelection = xFieldSelection; + this.xFieldSelection.setID(sIncSuffix); + } + + public void setAppendMode(boolean _AppendMode) + { + AppendMode = _AppendMode; + } + + public FieldSelection(UnoDialog CurUnoDialog, int _iStep, int CompPosX, int CompPosY, int CompWidth, int CompHeight, String slblFields, String slblSelFields, int _FirstHelpIndex, boolean bshowFourButtons) + { + try + { + final String AccessTextMoveSelected = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_39"); + final String AccessTextRemoveSelected = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_40"); + final String AccessTextMoveAll = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_41"); + final String AccessTextRemoveAll = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_42"); + final String AccessMoveFieldUp = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_43"); + final String AccessMoveFieldDown = CurUnoDialog.m_oResource.getResText("RID_DB_COMMON_44"); + + FirstHelpIndex = _FirstHelpIndex; + short curtabindex = UnoDialog.setInitialTabindex(_iStep); + int ShiftButtonCount = 2; + int a = 0; + this.CurUnoDialog = CurUnoDialog; + this.CompPosY = CompPosY; + this.CompHeight = CompHeight; + Object btnmoveall = null; + Object btnremoveall = null; + + final int cmdButtonWidth = 16; + final int cmdButtonHoriDist = 4; + final int lblHeight = 8; + final int lblVertiDist = 2; + + ListBoxWidth = Integer.valueOf(((CompWidth - 3 * cmdButtonHoriDist - 2 * cmdButtonWidth) / 2)); + Integer cmdShiftButtonPosX = Integer.valueOf((CompPosX + ListBoxWidth.intValue() + cmdButtonHoriDist)); + Integer ListBoxPosY = Integer.valueOf(CompPosY + lblVertiDist + lblHeight); + Integer ListBoxHeight = Integer.valueOf(CompHeight - 8 - 2); + Integer SelListBoxPosX = Integer.valueOf(cmdShiftButtonPosX.intValue() + cmdButtonWidth + cmdButtonHoriDist); + + IStep = Integer.valueOf(_iStep); + if (bshowFourButtons) + { + ShiftButtonCount = 4; + } + Integer[] ShiftButtonPosY = getYButtonPositions(ShiftButtonCount); + Integer[] MoveButtonPosY = getYButtonPositions(2); + Integer cmdMoveButtonPosX = Integer.valueOf(SelListBoxPosX.intValue() + ListBoxWidth.intValue() + cmdButtonHoriDist); + + Integer CmdButtonWidth = Integer.valueOf(cmdButtonWidth); + + sIncSuffix = "_" + com.sun.star.wizards.common.Desktop.getIncrementSuffix(CurUnoDialog.getDlgNameAccess(), "lblFields_"); + + // Label + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblFields" + sIncSuffix, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblFields, Integer.valueOf(CompPosX), Integer.valueOf(CompPosY), IStep, Short.valueOf(curtabindex), 109 + }); + + // Listbox 'Available fields' + xFieldsListBox = CurUnoDialog.insertListBox("lstFields" + sIncSuffix, SOFLDSLST, new ActionListenerImpl(), new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "MultiSelection", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + ListBoxHeight, HelpIds.getHelpIdString(_FirstHelpIndex), Boolean.TRUE, Integer.valueOf(CompPosX), ListBoxPosY, IStep, Short.valueOf((curtabindex++)), ListBoxWidth + }); + + Object btnmoveselected = CurUnoDialog.insertButton("cmdMoveSelected" + sIncSuffix, SOCMDMOVESEL, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 14, HelpIds.getHelpIdString(_FirstHelpIndex + 1), ">", cmdShiftButtonPosX, ShiftButtonPosY[a++], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + + if (bshowFourButtons) + { + btnmoveall = CurUnoDialog.insertButton("cmdMoveAll" + sIncSuffix, SOCMDMOVEALL, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 14, HelpIds.getHelpIdString(_FirstHelpIndex + 2), ">>", cmdShiftButtonPosX, ShiftButtonPosY[a++], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + } + Object btnremoveselected = CurUnoDialog.insertButton("cmdRemoveSelected" + sIncSuffix, SOCMDREMOVESEL, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, 14, HelpIds.getHelpIdString(_FirstHelpIndex + 3), "<", cmdShiftButtonPosX, ShiftButtonPosY[a++], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + + if (bshowFourButtons) + { + btnremoveall = CurUnoDialog.insertButton("cmdRemoveAll" + sIncSuffix, SOCMDREMOVEALL, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 14, HelpIds.getHelpIdString(_FirstHelpIndex + 4), "<<", cmdShiftButtonPosX, ShiftButtonPosY[a++], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + } + + FontDescriptor oFontDesc = new FontDescriptor(); + oFontDesc.Name = "StarSymbol"; + + // Label 'Fields in the form' + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblSelFields" + sIncSuffix, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 8, slblSelFields, SelListBoxPosX, Integer.valueOf(CompPosY), IStep, Short.valueOf(curtabindex++), ListBoxWidth + }); + + // ListBox 'Fields in the form' + xSelectedFieldsListBox = CurUnoDialog.insertListBox("lstSelFields" + sIncSuffix, SOSELFLDSLST, new ActionListenerImpl(), new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "MultiSelection", PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + ListBoxHeight, HelpIds.getHelpIdString(_FirstHelpIndex + 5), Boolean.TRUE, SelListBoxPosX, ListBoxPosY, IStep, Short.valueOf(curtabindex++), ListBoxWidth + }); + + Object btnmoveup = CurUnoDialog.insertButton("cmdMoveUp" + sIncSuffix, SOCMDMOVEUP, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, oFontDesc, 14, HelpIds.getHelpIdString(_FirstHelpIndex + 6), String.valueOf((char) 8743), cmdMoveButtonPosX, MoveButtonPosY[0], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + + Object btnmovedown = CurUnoDialog.insertButton("cmdMoveDown" + sIncSuffix, SOCMDMOVEDOWN, new ActionListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.FALSE, oFontDesc, 14, HelpIds.getHelpIdString(_FirstHelpIndex + 7), String.valueOf((char) 8744), cmdMoveButtonPosX, MoveButtonPosY[1], IStep, Short.valueOf(curtabindex++), CmdButtonWidth + }); + + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnmoveselected, AccessTextMoveSelected); + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnremoveselected, AccessTextRemoveSelected); + CurUnoDialog.getPeerConfiguration().setAccessibleName(xFieldsListBox, JavaTools.replaceSubString(slblFields, PropertyNames.EMPTY_STRING, "~")); + CurUnoDialog.getPeerConfiguration().setAccessibleName(xSelectedFieldsListBox, JavaTools.replaceSubString(slblSelFields, PropertyNames.EMPTY_STRING, "~")); + if (btnmoveall != null) + { + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnmoveall, AccessTextMoveAll); + } + if (btnremoveall != null) + { + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnremoveall, AccessTextRemoveAll); + } + if (btnmoveup != null) + { + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnmoveup, AccessMoveFieldUp); + } + if (btnmovedown != null) + { + CurUnoDialog.getPeerConfiguration().setAccessibleName(btnmovedown, AccessMoveFieldDown); + } + + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + // TODO: If Value is getting smaller than zero -> throw exception + private Integer[] getYButtonPositions(int ButtonCount) + { + Integer[] YPosArray; + if (ButtonCount > 0) + { + YPosArray = new Integer[ButtonCount]; + final int cmdButtonHeight = 14; + final int cmdButtonVertiDist = 2; + + YPosArray[0] = Integer.valueOf( (CompPosY + 10 + (((CompHeight - 10) - (ButtonCount * cmdButtonHeight) - ((ButtonCount - 1) * cmdButtonVertiDist)) / 2))); + if (ButtonCount > 1) + { + for (int i = 1; i < ButtonCount; i++) + { + YPosArray[i] = Integer.valueOf(YPosArray[i - 1].intValue() + cmdButtonHeight + cmdButtonVertiDist); + } + } + return YPosArray; + } + return null; + } + + public Integer getListboxWidth() + { + return this.ListBoxWidth; + } + + private void changeSelectionOrder(int iNeighbor) + { + short[] iSelIndices = xSelectedFieldsListBox.getSelectedItemsPos(); + // TODO: we are assuming that the array starts with the lowest index. Verify this assumption!!!!! + if (iSelIndices.length == 1) + { + short iSelIndex = iSelIndices[0]; + String[] NewItemList = xSelectedFieldsListBox.getItems(); + String CurItem = NewItemList[iSelIndex]; + String NeighborItem = NewItemList[iSelIndex + iNeighbor]; + NewItemList[iSelIndex + iNeighbor] = CurItem; + NewItemList[iSelIndex] = NeighborItem; + CurUnoDialog.setControlProperty("lstSelFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, NewItemList); + xSelectedFieldsListBox.selectItem(CurItem, true); + if (xFieldSelection != null) + { + if (iNeighbor < 0) + { + xFieldSelection.moveItemUp(CurItem); + } + else + { + xFieldSelection.moveItemDown(CurItem); + } + } + } + } + + public void toggleListboxControls(Boolean BDoEnable) + { + try + { + CurUnoDialog.setControlProperty("lblFields" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + CurUnoDialog.setControlProperty("lblSelFields" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + CurUnoDialog.setControlProperty("lstFields" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + CurUnoDialog.setControlProperty("lstSelFields" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + + if (BDoEnable.booleanValue()) + { + toggleListboxButtons((short) - 1, (short) - 1); + } + else + { + CurUnoDialog.setControlProperty("cmdRemoveAll" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + CurUnoDialog.setControlProperty("cmdRemoveSelected" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, BDoEnable); + toggleMoveButtons(BDoEnable.booleanValue(), BDoEnable.booleanValue()); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + // Enable or disable the buttons used for moving the available + // fields between the two list boxes. + protected void toggleListboxButtons(short iFieldsSelIndex, short iSelFieldsSelIndex) + { + try + { + boolean bmoveUpenabled = false; + boolean bmoveDownenabled = false; + CurUnoDialog.selectListBoxItem(xFieldsListBox, iFieldsSelIndex); + CurUnoDialog.selectListBoxItem(xSelectedFieldsListBox, iSelFieldsSelIndex); + int SelListBoxSelLength = xSelectedFieldsListBox.getSelectedItems().length; + int ListBoxSelLength = xFieldsListBox.getSelectedItems().length; + boolean bIsFieldSelected = (ListBoxSelLength > 0); + int FieldCount = xFieldsListBox.getItemCount(); + boolean bSelectSelected = (SelListBoxSelLength > 0); + int SelectCount = xSelectedFieldsListBox.getItemCount(); + if (bSelectSelected) + { + short[] iSelIndices = xSelectedFieldsListBox.getSelectedItemsPos(); + bmoveUpenabled = ((iSelIndices[0] > 0) && (iSelIndices.length == 1)); + bmoveDownenabled = (((iSelIndices[SelListBoxSelLength - 1]) < (short) (SelectCount - 1)) && (iSelIndices.length == 1)); + } + CurUnoDialog.setControlProperty("cmdRemoveAll" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(SelectCount >= 1)); + CurUnoDialog.setControlProperty("cmdRemoveSelected" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bSelectSelected)); + toggleMoveButtons((FieldCount >= 1), bIsFieldSelected); + CurUnoDialog.setControlProperty("cmdMoveUp" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bmoveUpenabled)); + CurUnoDialog.setControlProperty("cmdMoveDown" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bmoveDownenabled)); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + protected void toggleMoveButtons(boolean _btoggleMoveAll, boolean _btoggleMoveSelected) + { + boolean btoggleMoveAll = (((xFieldsListBox.getItemCount() + xSelectedFieldsListBox.getItemCount()) < maxfieldcount) && (_btoggleMoveAll)); + boolean btoggleMoveSelected = (((xFieldsListBox.getSelectedItems().length + xSelectedFieldsListBox.getItemCount()) < maxfieldcount) && (_btoggleMoveSelected)); + CurUnoDialog.setControlProperty("cmdMoveAll" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(btoggleMoveAll)); + CurUnoDialog.setControlProperty("cmdMoveSelected" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(btoggleMoveSelected)); + } + + public void setMultipleMode(boolean _bisMultiple) + { + xFieldsListBox.setMultipleMode(_bisMultiple); + xSelectedFieldsListBox.setMultipleMode(_bisMultiple); + } + + public void emptyFieldsListBoxes() + { + try + { + toggleListboxControls(Boolean.FALSE); + CurUnoDialog.setControlProperty("lstSelFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, new String[] + { + }); + CurUnoDialog.setControlProperty("lstFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, new String[] + { + }); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + + + public void intializeSelectedFields(String[] _SelectedFieldNames) + { + xSelectedFieldsListBox.addItems(_SelectedFieldNames, xSelectedFieldsListBox.getItemCount()); + } + + private void removeAllItems(XListBox _xListBox) + { + _xListBox.removeItems((short) 0, _xListBox.getItemCount()); + } + + // Note Boolean Parameter + public void initialize(String[] _AllFieldNames, boolean _AppendMode) + { + AppendMode = _AppendMode; + removeAllItems(xFieldsListBox); + xFieldsListBox.addItems(_AllFieldNames, (short) 0); + AllFieldNames = xFieldsListBox.getItems(); + if ((xSelectedFieldsListBox.getItemCount() > 0) && (!AppendMode)) + { + removeAllItems(xSelectedFieldsListBox); + } + toggleListboxControls(Boolean.TRUE); + } + + + + public void initialize(String[] _AllFieldNames, boolean _AppendMode, int _maxfieldcount) + { + maxfieldcount = _maxfieldcount; + initialize(_AllFieldNames, _AppendMode); + } + + public void initialize(String[] _AllFieldNames, String[] _SelFieldNames, boolean _AppendMode) + { + removeAllItems(xSelectedFieldsListBox); + xSelectedFieldsListBox.addItems(_SelFieldNames, (short) 0); + initialize(_AllFieldNames, _AppendMode); + } + + public void selectFields(boolean bMoveAll) + { + short iFieldSelected = (short) - 1; + short iSelFieldSelected = (short) - 1; + String[] SelFieldItems; + if (bMoveAll) + { + SelFieldItems = xFieldsListBox.getItems(); + removeAllItems(xFieldsListBox); + if (!AppendMode) + { + removeAllItems(xSelectedFieldsListBox); + xSelectedFieldsListBox.addItems(AllFieldNames, (short) 0); + } + else + { + xSelectedFieldsListBox.addItems(SelFieldItems, xSelectedFieldsListBox.getItemCount()); + } + } + else + { + SelFieldItems = xFieldsListBox.getSelectedItems(); + int MaxSourceSelected = SelFieldItems.length; + if (MaxSourceSelected > 0) + { + iFieldSelected = xFieldsListBox.getSelectedItemPos(); + iSelFieldSelected = xSelectedFieldsListBox.getSelectedItemPos(); + xSelectedFieldsListBox.addItems(SelFieldItems, xSelectedFieldsListBox.getItemCount()); + CurUnoDialog.removeSelectedItems(xFieldsListBox); + xSelectedFieldsListBox.selectItemPos((short) 0, xSelectedFieldsListBox.getSelectedItems().length > 0); + } + } + toggleListboxButtons(iFieldSelected, iSelFieldSelected); + if (xFieldSelection != null) + { + xFieldSelection.shiftFromLeftToRight(SelFieldItems, xSelectedFieldsListBox.getItems()); + } + } + + private void deselectFields(boolean bMoveAll) + { + String SearchString; + short iOldFieldSelected = xFieldsListBox.getSelectedItemPos(); + short iOldSelFieldSelected = xSelectedFieldsListBox.getSelectedItemPos(); + String[] OldSelFieldItems = xSelectedFieldsListBox.getSelectedItems(); + if (bMoveAll) + { + OldSelFieldItems = xSelectedFieldsListBox.getItems(); + removeAllItems(xFieldsListBox); + xFieldsListBox.addItems(AllFieldNames, (short) 0); + removeAllItems(xSelectedFieldsListBox); + } + else + { + int MaxOriginalCount = AllFieldNames.length; + String[] SelList = xFieldsListBox.getItems(); + ArrayList<String> NewSourceVector = new ArrayList<String>(); + for (int i = 0; i < MaxOriginalCount; i++) + { + SearchString = AllFieldNames[i]; + if (JavaTools.FieldInList(SelList, SearchString) != -1) + { + NewSourceVector.add(SearchString); + } + else if (JavaTools.FieldInList(OldSelFieldItems, SearchString) != -1) + { + NewSourceVector.add(SearchString); + } + } + xFieldsListBox.removeItems((short) 0, xFieldsListBox.getItemCount()); + if (NewSourceVector.size() > 0) + { + String[] NewSourceList = new String[NewSourceVector.size()]; + NewSourceVector.toArray(NewSourceList); + xFieldsListBox.addItems(NewSourceList, (short) 0); + } + CurUnoDialog.removeSelectedItems(xSelectedFieldsListBox); + } + toggleListboxButtons(iOldFieldSelected, iOldSelFieldSelected); + String[] NewSelFieldItems = xSelectedFieldsListBox.getItems(); + if (xFieldSelection != null) + { + xFieldSelection.shiftFromRightToLeft(OldSelFieldItems, NewSelFieldItems); + } + } + + public void addItemsToFieldsListbox(String[] _sItems) + { + String[] sOldList = xFieldsListBox.getItems(); + for (int i = 0; i < _sItems.length; i++) + { + if (JavaTools.FieldInList(sOldList, _sItems[i]) < 0) + { + xFieldsListBox.addItem(_sItems[i], xFieldsListBox.getItemCount()); + } + } + } + + public String[] getSelectedFieldNames() + { + return (String[]) CurUnoDialog.getControlProperty("lstSelFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST); + } + + public void setSelectedFieldNames(String[] _sfieldnames) + { + CurUnoDialog.setControlProperty("lstSelFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, _sfieldnames); + String[] sleftboxfieldnames = JavaTools.removefromList(xFieldsListBox.getItems(), _sfieldnames); + CurUnoDialog.setControlProperty("lstFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, sleftboxfieldnames); + } + + public void setModified(boolean _bModified) + { + bisModified = _bModified; + } + + public boolean isModified() + { + return bisModified; + } + + public void changeSelectedFieldNames(String[] _sfieldnames) + { + CurUnoDialog.setControlProperty("lstSelFields" + sIncSuffix, PropertyNames.STRING_ITEM_LIST, _sfieldnames); + } +} diff --git a/wizards/com/sun/star/wizards/ui/FilterComponent.java b/wizards/com/sun/star/wizards/ui/FilterComponent.java new file mode 100644 index 000000000..f70714a31 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/FilterComponent.java @@ -0,0 +1,938 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.VclWindowPeerAttribute; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.beans.PropertyAttribute; +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertyContainer; +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.sdb.SQLFilterOperator; +import com.sun.star.sdbc.DataType; +import com.sun.star.uno.Any; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.Exception; +import com.sun.star.uno.Type; +import com.sun.star.uno.TypeClass; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.wizards.common.NumberFormatter; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.JavaTools; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.db.FieldColumn; +import com.sun.star.wizards.db.QueryMetaData; +import com.sun.star.wizards.db.SQLQueryComposer; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class FilterComponent +{ + + private final Integer IStep; + private final int RowCount; + private static String[] sLogicOperators; + private final XRadioButton optMatchAny; + private final String slblFieldNames; + private final String slblOperators; + private final String slblValue; + private WizardDialog CurUnoDialog; + private final String sIncSuffix; + private final ControlRow[] oControlRows; + private final String sDuplicateCondition; + private static final int SOOPTORMODE = 100; + private static final int SOOPTANDMODE = 101; + private QueryMetaData oQueryMetaData; + private int iDateFormat; + private int iTimeFormat; + private PropertyValue[][] filterconditions; + private short curtabindex; + private static final int SO_FIRSTFIELDNAME = 1; + private static final int SO_SECONDFIELDNAME = 2; + private static final int SO_THIRDFIELDNAME = 3; + private static final int SO_FOURTHFIELDNAME = 4; + private int[] SO_FIELDNAMELIST = new int[] + { + SO_FIRSTFIELDNAME, SO_SECONDFIELDNAME, SO_THIRDFIELDNAME, SO_FOURTHFIELDNAME + }; + private static final int SO_FIRSTCONDITION = 5; + private static final int SO_SECONDCONDITION = 6; + private static final int SO_THIRDCONDITION = 7; + private static final int SO_FOURTHCONDITION = 8; + private int[] SO_CONDITIONLIST = new int[] + { + SO_FIRSTCONDITION, SO_SECONDCONDITION, SO_THIRDCONDITION, SO_FOURTHCONDITION + }; + private static final int SO_FIRSTTEXTFIELD = 1; + private static final int SO_SECONDTEXTFIELD = 2; + private static final int SO_THIRDTEXTFIELD = 3; + private static final int SO_FOURTHTEXTFIELD = 4; + private int[] SO_TEXTFIELDLIST = new int[] + { + SO_FIRSTTEXTFIELD, SO_SECONDTEXTFIELD, SO_THIRDTEXTFIELD, SO_FOURTHTEXTFIELD + }; + private static final int SO_FIRSTBOOLFIELDNAME = 256 + 1; + private static final int SO_SECONDBOOLFIELDNAME = 256 + 2; + private static final int SO_THIRDBOOLFIELDNAME = 256 + 3; + private static final int SO_FOURTHBOOLFIELDNAME = 256 + 4; + private int SOI_MATCHALL = 0; + private int SOI_MATCHANY = 1; + + class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(com.sun.star.awt.ItemEvent EventObject) + { + if (EventObject == null) { + return; + } + + int iKey = CurUnoDialog.getControlKey(EventObject.Source, CurUnoDialog.ControlList); + String sControlName = PropertyNames.EMPTY_STRING; + switch (iKey) + { + case SO_FIRSTFIELDNAME: + case SO_SECONDFIELDNAME: + case SO_THIRDFIELDNAME: + case SO_FOURTHFIELDNAME: + sControlName = getControlName(EventObject.Source); + String sControlNameSuffix = sIncSuffix + "_" + getIndexNumber(sControlName); + XListBox xCurFieldListBox = UnoRuntime.queryInterface(XListBox.class, CurUnoDialog.xDlgContainer.getControl(sControlName)); + String CurDisplayFieldName = xCurFieldListBox.getSelectedItem(); + FieldColumn CurFieldColumn = oQueryMetaData.getFieldColumnByDisplayName(CurDisplayFieldName); + + String sControlNameTextValue = "txtValue" + sControlNameSuffix; + XControl xValueControl = CurUnoDialog.xDlgContainer.getControl(sControlNameTextValue); + XInterface xValueModel = (XInterface) UnoDialog.getModel(xValueControl); + Helper.setUnoPropertyValue(xValueModel, "TreatAsNumber", Boolean.valueOf(CurFieldColumn.isNumberFormat())); + final NumberFormatter aNumberFormatter = oQueryMetaData.getNumberFormatter(); + aNumberFormatter.setNumberFormat(xValueModel, CurFieldColumn.getDBFormatKey(), aNumberFormatter); + + break; + + case SO_FIRSTCONDITION: + case SO_SECONDCONDITION: + case SO_THIRDCONDITION: + case SO_FOURTHCONDITION: + case SO_FIRSTBOOLFIELDNAME: + case SO_SECONDBOOLFIELDNAME: + case SO_THIRDBOOLFIELDNAME: + case SO_FOURTHBOOLFIELDNAME: + sControlName = getControlName(EventObject.Source); + break; + + case SOOPTORMODE: + case SOOPTANDMODE: + return; + + default: + break; + } + togglefollowingControlRow(sControlName); + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } + + class TextListenerImpl implements com.sun.star.awt.XTextListener + { + + public void textChanged(TextEvent EventObject) + { + String sName = getControlName(EventObject.Source); + togglefollowingControlRow(sName); + } + + public void disposing(EventObject eventObject) + { + } + + + } + + private static String getIndexNumber(String _sStr) + { + return _sStr.substring(_sStr.length() - 1, _sStr.length()); + } + + /** + * Enable the next ControlRow if the Condition is complete in the current line + * + * @param _scurName every control name ends with something like _1, _2, _3 this is the index number + * we try to interpret to check which line we currently use. (number - 1) + */ + private void togglefollowingControlRow(String _scurName) + { + int Index = Integer.parseInt(getIndexNumber(_scurName)); + if (Index < oControlRows.length) + { + boolean bValue = oControlRows[Index - 1].isConditionComplete(); + oControlRows[Index].setEnabled(bValue); + } + } + + private String getControlName(Object _oSourceevent) + { + try + { + XControl xControl = UnoRuntime.queryInterface(XControl.class, _oSourceevent); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xControl.getModel()); + return AnyConverter.toString(xPSet.getPropertyValue(PropertyNames.PROPERTY_NAME)); + } + catch (Exception e) + { + e.printStackTrace(System.err); + } + return PropertyNames.EMPTY_STRING; + } + + public PropertyValue[][] getFilterConditions() + { + int nFilterCount = getFilterCount(); + if (nFilterCount > 0) + { + final SQLQueryComposer composer = oQueryMetaData.getSQLQueryComposer(); + try + { + final String serviceName = "com.sun.star.beans.PropertyBag"; + final XPropertyContainer column = UnoRuntime.queryInterface(XPropertyContainer.class, oQueryMetaData.xMSF.createInstance(serviceName)); + + column.addProperty("Type", PropertyAttribute.BOUND, DataType.VARCHAR); + column.addProperty(PropertyNames.PROPERTY_NAME, PropertyAttribute.BOUND, PropertyNames.EMPTY_STRING); + column.addProperty("Value", (short) (PropertyAttribute.MAYBEVOID | PropertyAttribute.REMOVABLE), null); + final XPropertySet columnSet = UnoRuntime.queryInterface(XPropertySet.class, column); + + if (composer.getQuery().length() == 0) + { + StringBuilder sql = new StringBuilder(); + sql.append(composer.getSelectClause(true)); + sql.append(' '); + sql.append(composer.getFromClause()); + composer.getQueryComposer().setElementaryQuery(sql.toString()); + } + composer.getQueryComposer().setStructuredFilter(new PropertyValue[][] + { + }); + for (int i = 0; i < RowCount; i++) + { + ControlRow currentControlRow = oControlRows[i]; + if (currentControlRow.isEnabled() && currentControlRow.isConditionComplete()) + { + String sFieldName = currentControlRow.getSelectedFieldName(); + int nOperator = currentControlRow.getSelectedOperator(); + FieldColumn aFieldColumn = oQueryMetaData.getFieldColumnByDisplayName(sFieldName); + columnSet.setPropertyValue(PropertyNames.PROPERTY_NAME, aFieldColumn.getFieldName()); + columnSet.setPropertyValue("Type", aFieldColumn.getXColumnPropertySet().getPropertyValue("Type")); + Object value = currentControlRow.getValue(); + switch (aFieldColumn.getFieldType()) + { + case DataType.TIMESTAMP: + case DataType.DATE: + value = ((Double) value) - oQueryMetaData.getNullDateCorrection(); + break; + // TODO: TIME case? + } + column.removeProperty("Value"); + final short operator = currentControlRow.getSelectedOperator(); + if ((operator == SQLFilterOperator.SQLNULL) + || (operator == SQLFilterOperator.NOT_SQLNULL) + || AnyConverter.isVoid(value)) + { + column.addProperty("Value", (short) (PropertyAttribute.MAYBEVOID | PropertyAttribute.REMOVABLE), ""); + value = new Any(new Type(TypeClass.VOID), null); + } + else + { + column.addProperty("Value", (short) (PropertyAttribute.MAYBEVOID | PropertyAttribute.REMOVABLE), value); + } + columnSet.setPropertyValue("Value", value); + composer.getQueryComposer().appendFilterByColumn(columnSet, getfilterstate() == this.SOI_MATCHALL, nOperator); + } + } + filterconditions = composer.getQueryComposer().getStructuredFilter(); + int[] iduplicate = JavaTools.getDuplicateFieldIndex(filterconditions); + if (iduplicate[0] != -1) + { + PropertyValue aduplicatecondition = filterconditions[iduplicate[0]][iduplicate[1]]; + String smsgDuplicateCondition = getDisplayCondition(sDuplicateCondition, aduplicatecondition, null); + CurUnoDialog.showMessageBox("WarningBox", VclWindowPeerAttribute.OK, smsgDuplicateCondition); + CurUnoDialog.vetoableChange(new java.beans.PropertyChangeEvent(CurUnoDialog, "Steps", Integer.valueOf(1), Integer.valueOf(2))); + return new PropertyValue[][] + { + }; + } + } + catch (Exception ex) + { + Logger.getLogger(FilterComponent.class.getName()).log(Level.SEVERE, null, ex); + } + } + else + { + filterconditions = new PropertyValue[0][0]; + } + return filterconditions; + } + + public static String getDisplayCondition(String _BaseString, PropertyValue _filtercondition, QueryMetaData _CurDBMetaData) + { + try + { + String FieldName; + if (_CurDBMetaData != null) + { + FieldColumn CurDBFieldColumn = _CurDBMetaData.getFieldColumnByFieldName(_filtercondition.Name); + FieldName = CurDBFieldColumn.getFieldTitle(); + } + else + { + FieldName = _filtercondition.Name; + } + String sreturn = JavaTools.replaceSubString(_BaseString, FieldName, "<FIELDNAME>"); + String soperator = sLogicOperators[_filtercondition.Handle - 1]; + sreturn = JavaTools.replaceSubString(sreturn, soperator, "<LOGICOPERATOR>"); + String sDisplayValue = PropertyNames.EMPTY_STRING; + if ((_filtercondition.Handle != SQLFilterOperator.SQLNULL) + && (_filtercondition.Handle != SQLFilterOperator.NOT_SQLNULL) + && !AnyConverter.isVoid(_filtercondition.Value)) + { + sDisplayValue = AnyConverter.toString(_filtercondition.Value); + } + sreturn = JavaTools.replaceSubString(sreturn, sDisplayValue, "<VALUE>"); + return sreturn; + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + return PropertyNames.EMPTY_STRING; + } + + private int getfilterstate() + { + boolean bisany = true; + int ifilterstate = SOI_MATCHALL; + bisany = this.optMatchAny.getState(); + if (bisany) + { + ifilterstate = SOI_MATCHANY; + } + else + { + ifilterstate = SOI_MATCHALL; + } + return ifilterstate; + } + + private int getFilterCount() + { + int a = 0; + for (int i = 0; i < RowCount; i++) + { + if (oControlRows[i].isEnabled() && oControlRows[i].isConditionComplete()) + { + a++; + } + } + return a; + } + + /** Creates a new instance of FilterComponent + */ + public FilterComponent(WizardDialog CurUnoDialog, int iStep, int iPosX, int iPosY, int FilterCount, QueryMetaData _oQueryMetaData, int _firstHelpID) + { + int curHelpID = _firstHelpID; + this.IStep = Integer.valueOf(iStep); + + curtabindex = UnoDialog.setInitialTabindex(iStep); + this.CurUnoDialog = CurUnoDialog; + this.RowCount = FilterCount; + this.oQueryMetaData = _oQueryMetaData; + boolean bEnabled; + sIncSuffix = com.sun.star.wizards.common.Desktop.getIncrementSuffix(CurUnoDialog.getDlgNameAccess(), "optMatchAll"); + + String soptMatchAll = CurUnoDialog.m_oResource.getResText("RID_QUERY_9"); + String soptMatchAny = CurUnoDialog.m_oResource.getResText("RID_QUERY_10"); + slblFieldNames = CurUnoDialog.m_oResource.getResText("RID_QUERY_17"); + slblOperators = CurUnoDialog.m_oResource.getResText("RID_QUERY_24"); + slblValue = CurUnoDialog.m_oResource.getResText("RID_QUERY_25"); + sLogicOperators = new String[10]; // =, <>, <, >, <=, >=, like, !like, is null, !is null + sLogicOperators[0] = CurUnoDialog.m_oResource.getResText("RID_QUERY_26"); + sLogicOperators[1] = CurUnoDialog.m_oResource.getResText("RID_QUERY_27"); + sLogicOperators[2] = CurUnoDialog.m_oResource.getResText("RID_QUERY_28"); + sLogicOperators[3] = CurUnoDialog.m_oResource.getResText("RID_QUERY_29"); + sLogicOperators[4] = CurUnoDialog.m_oResource.getResText("RID_QUERY_30"); + sLogicOperators[5] = CurUnoDialog.m_oResource.getResText("RID_QUERY_31"); + sLogicOperators[6] = CurUnoDialog.m_oResource.getResText("RID_QUERY_32"); + sLogicOperators[7] = CurUnoDialog.m_oResource.getResText("RID_QUERY_33"); + sLogicOperators[8] = CurUnoDialog.m_oResource.getResText("RID_QUERY_34"); + sLogicOperators[9] = CurUnoDialog.m_oResource.getResText("RID_QUERY_35"); + sDuplicateCondition = CurUnoDialog.m_oResource.getResText("RID_QUERY_89"); + + // create Radiobuttons + // * match all + // * match one + CurUnoDialog.insertRadioButton("optMatchAll" + sIncSuffix, SOOPTANDMODE, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STATE, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(9), + HelpIds.getHelpIdString(curHelpID++), + soptMatchAll, + Integer.valueOf(iPosX), + Integer.valueOf(iPosY), + Short.valueOf((short) 1), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(203) + }); + optMatchAny = CurUnoDialog.insertRadioButton("optMatchAny" + sIncSuffix, SOOPTORMODE, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(9), + HelpIds.getHelpIdString(curHelpID++), + soptMatchAny, + Integer.valueOf(iPosX), + Integer.valueOf(iPosY + 12), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(203) + }); + getfilterstate(); + + oControlRows = new ControlRow[FilterCount]; + for (int i = 0; i < FilterCount; i++) + { + bEnabled = (i == 0); + oControlRows[i] = new ControlRow(iPosX, iPosY + 20, i, bEnabled, (curHelpID + (i * 3))); + iPosY += 43; + } + } + + public void initialize(PropertyValue[][] _filterconditions, String[] _fieldnames) + { + int i; + for (i = 0; i < RowCount; i++) + { + oControlRows[i].setFieldNames(_fieldnames); + // oControlRows[i].setFieldNames(aFieldNamesWithAdditionalEmpty); + } + this.filterconditions = _filterconditions; + PropertyValue[] curfilterconditions; + // int a; + if (_filterconditions.length == 1) + { + curfilterconditions = filterconditions[0]; + for (i = 0; i < curfilterconditions.length; i++) + { + oControlRows[i].setCondition(filterconditions[0][i]); + } + } + else + { + for (i = 0; i < filterconditions.length; i++) + { + oControlRows[i].setCondition(filterconditions[i][0]); + } + } + while (i < oControlRows.length) + { + oControlRows[i].settovoid(); + boolean bdoenable; + if (i > 0) + { + bdoenable = oControlRows[i - 1].isConditionComplete(); + } + else + { + bdoenable = true; + } + oControlRows[i].setEnabled(bdoenable); + i++; + } + } + + public void addNumberFormats() + { + iDateFormat = oQueryMetaData.getNumberFormatter().defineNumberFormat("YYYY-MM-DD"); + iTimeFormat = oQueryMetaData.getNumberFormatter().defineNumberFormat("HH:MM:SS"); + oQueryMetaData.getNumberFormatter().defineNumberFormat("YYYY-MM-DD HH:MM:SS"); + } + + + + + + private final class ControlRow + { + + private static final int SOLSTFIELDNAME = 3; + private static final int SOLSTOPERATOR = 4; + private static final int SOTXTVALUE = 5; + private XInterface[] ControlElements = new XInterface[6]; + private boolean m_bEnabled; + private String[] FieldNames; + + private ControlRow(int iCompPosX, int iCompPosY, int Index, boolean _bEnabled, int _firstRowHelpID) + { + int nFieldWidth = 71; + int nOperatorWidth = 70; + int nValueWidth = 44; + + int nPosX1 = iCompPosX + 10; + int nPosX2 = iCompPosX + 10 + nFieldWidth + 6; // 87 + int nPosX3 = iCompPosX + 10 + nFieldWidth + 6 + nOperatorWidth + 6; + + + try + { + String sCompSuffix = sIncSuffix + "_" + (Index + 1); + m_bEnabled = _bEnabled; + + // Label Field + ControlElements[0] = CurUnoDialog.insertLabel("lblFieldNames" + sCompSuffix, + new String[] + { + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Integer.valueOf(9), + slblFieldNames, + Integer.valueOf(nPosX1), + Integer.valueOf(iCompPosY + 13), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(nFieldWidth) + }); + + // Label Operator + ControlElements[1] = CurUnoDialog.insertLabel("lblOperators" + sCompSuffix, + new String[] + { + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Integer.valueOf(9), + slblOperators, + Integer.valueOf(nPosX2), + Integer.valueOf(iCompPosY + 13), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(nOperatorWidth) + }); + + // Label Value + ControlElements[2] = CurUnoDialog.insertLabel("lblValue" + sCompSuffix, + new String[] + { + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Integer.valueOf(9), + slblValue, + Integer.valueOf(nPosX3), + Integer.valueOf(iCompPosY + 13), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(nValueWidth) + }); + + // Listbox Fields + ControlElements[SOLSTFIELDNAME] = CurUnoDialog.insertListBox("lstFieldName" + sCompSuffix, SO_FIELDNAMELIST[Index], null, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, + "Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + "LineCount", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Boolean.TRUE, + Integer.valueOf(13), + HelpIds.getHelpIdString(_firstRowHelpID++), + Short.valueOf(UnoDialog.getListBoxLineCount() /* 7 */), + Integer.valueOf(nPosX1), + Integer.valueOf(iCompPosY + 23), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(nFieldWidth) + }); + + // Listbox Operators + ControlElements[SOLSTOPERATOR] = CurUnoDialog.insertListBox("lstOperator" + sCompSuffix, SO_CONDITIONLIST[Index], null, new ItemListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, + "Dropdown", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + "LineCount", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.STRING_ITEM_LIST, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Boolean.TRUE, + Integer.valueOf(13), + HelpIds.getHelpIdString(_firstRowHelpID++), + Short.valueOf((short) sLogicOperators.length /* 7 */), + Integer.valueOf(nPosX2), + Integer.valueOf(iCompPosY + 23), + IStep, + sLogicOperators, + Short.valueOf(curtabindex++), + Integer.valueOf(nOperatorWidth) + }); + ControlElements[SOTXTVALUE] = CurUnoDialog.insertFormattedField("txtValue" + sCompSuffix, SO_TEXTFIELDLIST[Index], new TextListenerImpl(), + new String[] + { + PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Boolean.valueOf(isEnabled()), + Integer.valueOf(13), + HelpIds.getHelpIdString(_firstRowHelpID++), + Integer.valueOf(nPosX3), + Integer.valueOf(iCompPosY + 23), + IStep, + Short.valueOf(curtabindex++), + Integer.valueOf(nValueWidth) + }); + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + /** + * @return true if the current condition is complete, all needed fields are filled with values. + * So we can enable the next. + */ + private boolean isConditionComplete() + { + try + { + short[] SelFields = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTFIELDNAME]), PropertyNames.SELECTED_ITEMS)); + if (SelFields.length > 0) + { + int nSelOperator = getSelectedOperator(); + // short[] SelOperator = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTOPERATOR]), PropertyNames.SELECTED_ITEMS)); + if (nSelOperator == com.sun.star.sdb.SQLFilterOperator.SQLNULL + || /* is null */ nSelOperator == com.sun.star.sdb.SQLFilterOperator.NOT_SQLNULL) /* is not null */ + + { + // disable value field + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[2]), PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + + return true; + } + else + { + // enable value field + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[2]), PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + } + if (nSelOperator != -1) + { + Object oValue = Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue"); + if (!AnyConverter.isVoid(oValue)) + { + String sValue = String.valueOf(oValue); + return !sValue.equals(PropertyNames.EMPTY_STRING); + } + } + } + return false; + } + catch (IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return false; + } + } + + private void setCondition(PropertyValue _filtercondition) + { + try + { + XListBox xFieldsListBox = UnoRuntime.queryInterface(XListBox.class, ControlElements[SOLSTFIELDNAME]); + xFieldsListBox.selectItem(_filtercondition.Name, true); + XListBox xOperatorListBox = UnoRuntime.queryInterface(XListBox.class, ControlElements[SOLSTOPERATOR]); + xOperatorListBox.selectItemPos((short) (_filtercondition.Handle - 1), true); + + if (AnyConverter.isString(_filtercondition.Value)) + { + String sValue = AnyConverter.toString(_filtercondition.Value); + if (sValue.indexOf("{D '") > -1) + { + // TODO: this seems to never happen? + sValue = JavaTools.replaceSubString(sValue, PropertyNames.EMPTY_STRING, "{D '"); + sValue = JavaTools.replaceSubString(sValue, PropertyNames.EMPTY_STRING, "' }"); + try + { + //Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", ); + oQueryMetaData.getNumberFormatter().convertStringToNumber(iDateFormat, sValue); + } + catch (java.lang.Exception ex) + { + Logger.getLogger(FilterComponent.class.getName()).log(Level.SEVERE, null, ex); + } + } + else if (sValue.indexOf("{T '") > -1) + { + // TODO: this seems to never happen? + sValue = JavaTools.replaceSubString(sValue, PropertyNames.EMPTY_STRING, "{T '"); + sValue = JavaTools.replaceSubString(sValue, PropertyNames.EMPTY_STRING, "' }"); + try + { + //Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", ); + oQueryMetaData.getNumberFormatter().convertStringToNumber(iTimeFormat, sValue); + } + catch (java.lang.Exception ex) + { + Logger.getLogger(FilterComponent.class.getName()).log(Level.SEVERE, null, ex); + } + } + // TODO: TS case? + //TODO: other datetime formats? + else + { + //Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", sValue); + } + } + else if (AnyConverter.isBoolean(_filtercondition.Value)) + { + boolean b = AnyConverter.toBoolean(_filtercondition.Value); + double nValue = 0.0; + if (b) + { + nValue = 1.0; + } + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", nValue); + } + else + { + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", _filtercondition.Value); + } + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + } + + private void setFieldNames(String[] _FieldNames) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTFIELDNAME]), PropertyNames.STRING_ITEM_LIST, _FieldNames); + FieldNames = _FieldNames; + } + + private boolean isEnabled() + { + return m_bEnabled; + } + + private void settovoid() + { + WizardDialog.deselectListBox(ControlElements[SOLSTFIELDNAME]); + WizardDialog.deselectListBox(ControlElements[SOLSTOPERATOR]); + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue", com.sun.star.uno.Any.VOID); + } + + private void setEnabled(boolean _bEnabled) + { + // enable all Controls Fieldname, operator, value + for (int i = 0; i < ControlElements.length; i++) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[i]), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnabled)); + } + m_bEnabled = _bEnabled; + if (isEnabled()) + { + short[] iselected = new short[] + { + }; + try + { + iselected = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTOPERATOR]), PropertyNames.SELECTED_ITEMS)); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + } + if ((iselected.length) == 0) + { + Helper.setUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTOPERATOR]), PropertyNames.SELECTED_ITEMS, new short[] + { + 0 + }); + } + } + else if (!isConditionComplete()) + { + WizardDialog.deselectListBox(ControlElements[SOLSTOPERATOR]); + } + } + + private String getSelectedFieldName() + { + try + { + short[] SelFields = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTFIELDNAME]), PropertyNames.SELECTED_ITEMS)); + return FieldNames[SelFields[0]]; + } + catch (IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + } + return null; + } + + // TODO: check if it is really useful to match the indices of the listbox the API constants + // =, <>, <, >, <=, >=, like, !like, is null, !is null + private short getSelectedOperator() + { + try + { + short[] SelFields = (short[]) AnyConverter.toArray(Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOLSTOPERATOR]), PropertyNames.SELECTED_ITEMS)); + switch (SelFields[0]) + { + case 0: + return com.sun.star.sdb.SQLFilterOperator.EQUAL; + case 1: + return com.sun.star.sdb.SQLFilterOperator.NOT_EQUAL; + case 2: + return com.sun.star.sdb.SQLFilterOperator.LESS; + case 3: + return com.sun.star.sdb.SQLFilterOperator.GREATER; + case 4: + return com.sun.star.sdb.SQLFilterOperator.LESS_EQUAL; + case 5: + return com.sun.star.sdb.SQLFilterOperator.GREATER_EQUAL; + case 6: + return com.sun.star.sdb.SQLFilterOperator.LIKE; + case 7: + return com.sun.star.sdb.SQLFilterOperator.NOT_LIKE; + case 8: + return com.sun.star.sdb.SQLFilterOperator.SQLNULL; + case 9: + return com.sun.star.sdb.SQLFilterOperator.NOT_SQLNULL; + default: + return -1; + } + } + catch (IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + } + return -1; + } + + // TODO make a difference between Text and Numbers + private Object getValue() + { + return Helper.getUnoPropertyValue(UnoDialog.getModel(ControlElements[SOTXTVALUE]), "EffectiveValue"); + } + + + + + } +} diff --git a/wizards/com/sun/star/wizards/ui/PathSelection.py b/wizards/com/sun/star/wizards/ui/PathSelection.py new file mode 100644 index 000000000..1467085f9 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/PathSelection.py @@ -0,0 +1,137 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +from ..common.PropertyNames import PropertyNames +from ..common.FileAccess import FileAccess +from ..common.SystemDialog import SystemDialog + +class PathSelection(object): + + class DialogTypes(object): + FOLDER = 0 + FILE = 1 + + class TransferMode(object): + SAVE = 0 + LOAD = 1 + + def __init__(self, xMSF, CurUnoDialog, TransferMode, DialogType): + self.CurUnoDialog = CurUnoDialog + self.xMSF = xMSF + self.iDialogType = DialogType + self.iTransferMode = TransferMode + self.sDefaultDirectory = "" + self.sDefaultName = "" + self.sDefaultFilter = "" + self.usedPathPicker = False + self.CMDSELECTPATH = 1 + self.TXTSAVEPATH = 1 + + def insert( + self, DialogStep, XPos, YPos, Width, + CurTabIndex, LabelText, Enabled, TxtHelpURL, BtnHelpURL): + + self.CurUnoDialog.insertControlModel( + "com.sun.star.awt.UnoControlFixedTextModel", "lblSaveAs", + (PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (Enabled, 8, LabelText, XPos, YPos, DialogStep, + CurTabIndex, Width)) + self.xSaveTextBox = self.CurUnoDialog.insertTextField( + "txtSavePath", "callXPathSelectionListener", + (PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (Enabled, 12, TxtHelpURL, XPos, YPos + 10, DialogStep, + (CurTabIndex + 1), Width - 26), self) + + self.CurUnoDialog.xDialogModel.txtSavePath.Enabled = False + self.CurUnoDialog.insertButton("cmdSelectPath", "triggerPathPicker", + (PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (Enabled, 14, BtnHelpURL, "...",XPos + Width - 16, YPos + 9, + DialogStep, (CurTabIndex + 2), 16), self) + + def addSelectionListener(self, xAction): + self.xAction = xAction + + def getSelectedPath(self): + return self.xSaveTextBox.Text + + def initializePath(self): + try: + myFA = FileAccess(self.xMSF) + self.xSaveTextBox.setText( + myFA.getPath(self.sDefaultDirectory + \ + "/" + \ + self.sDefaultName, None)) + except Exception: + traceback.print_exc() + + def triggerPathPicker(self): + try: + if self.iTransferMode == self.TransferMode.SAVE: + if self.iDialogType == self.DialogTypes.FOLDER: + #TODO: write code for picking a folder for saving + return + elif self.iDialogType == self.DialogTypes.FILE: + self.usedPathPicker = True + myFilePickerDialog = \ + SystemDialog.createStoreDialog(self.xMSF) + myFilePickerDialog.callStoreDialog( + self.sDefaultDirectory, + self.sDefaultName, self.sDefaultFilter) + sStorePath = myFilePickerDialog.sStorePath + if sStorePath is not None: + myFA = FileAccess(self.xMSF) + self.xSaveTextBox.Text = myFA.getPath(sStorePath, None) + self.sDefaultDirectory = \ + FileAccess.getParentDir(sStorePath) + self.sDefaultName = myFA.getFilename(sStorePath) + return + elif self.iTransferMode == self.TransferMode.LOAD: + if self.iDialogType == self.DialogTypes.FOLDER: + #TODO: write code for picking a folder for loading + return + elif self.iDialogType == self.DialogTypes.FILE: + #TODO: write code for picking a file for loading + return + except Exception: + traceback.print_exc() + + def callXPathSelectionListener(self): + if self.xAction is not None: + self.xAction.validatePath() diff --git a/wizards/com/sun/star/wizards/ui/PeerConfig.java b/wizards/com/sun/star/wizards/ui/PeerConfig.java new file mode 100644 index 000000000..8f0e2680a --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/PeerConfig.java @@ -0,0 +1,151 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import java.util.ArrayList; + +import com.sun.star.awt.WindowEvent; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XVclWindowPeer; +import com.sun.star.awt.XWindowListener; +import com.sun.star.lang.EventObject; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; + +public class PeerConfig implements XWindowListener +{ + + private final ArrayList<PeerTask> m_aPeerTasks = new ArrayList<PeerTask>(); + private ArrayList<ImageUrlTask> aImageUrlTasks = new ArrayList<ImageUrlTask>(); + private UnoDialog oUnoDialog = null; + + public PeerConfig(UnoDialog _oUnoDialog) + { + oUnoDialog = _oUnoDialog; + oUnoDialog.xWindow.addWindowListener(this); + } + + private static class PeerTask + { + + private XControl xControl; + private String[] propnames; + private Object[] propvalues; + + public PeerTask(XControl _xControl, String[] propNames_, Object[] propValues_) + { + propnames = propNames_; + propvalues = propValues_; + xControl = _xControl; + } + } + + private static class ImageUrlTask + { + Object oModel; + String oResource; + + public ImageUrlTask(Object _oModel, String _oResource) + { + oResource = _oResource; + oModel = _oModel; + } + } + + public void windowResized(WindowEvent arg0) + { + } + + public void windowMoved(WindowEvent arg0) + { + } + + public void windowShown(EventObject arg0) + { + try + { + for (int i = 0; i < this.m_aPeerTasks.size(); i++) + { + PeerTask aPeerTask = m_aPeerTasks.get(i); + XVclWindowPeer xVclWindowPeer = UnoRuntime.queryInterface(XVclWindowPeer.class, aPeerTask.xControl.getPeer()); + for (int n = 0; n < aPeerTask.propnames.length; n++) + { + xVclWindowPeer.setProperty(aPeerTask.propnames[n], aPeerTask.propvalues[n]); + } + } + for (int i = 0; i < this.aImageUrlTasks.size(); i++) + { + ImageUrlTask aImageUrlTask = aImageUrlTasks.get(i); + String sImageUrl = aImageUrlTask.oResource; + if (!sImageUrl.equals(PropertyNames.EMPTY_STRING)) + { + Helper.setUnoPropertyValue(aImageUrlTask.oModel, PropertyNames.PROPERTY_IMAGEURL, sImageUrl); + } + } + + } + catch (RuntimeException re) + { + re.printStackTrace(System.err); + throw re; + } + } + + public void windowHidden(EventObject arg0) + { + } + + public void disposing(EventObject arg0) + { + } + + /** + * @param oAPIControl an API control that the interface XControl can be derived from + */ + public void setAccessibleName(Object oAPIControl, String _saccessname) + { + XControl xControl = UnoRuntime.queryInterface(XControl.class, oAPIControl); + setPeerProperties(xControl, new String[] + { + "AccessibleName" + }, new String[] + { + _saccessname + }); + } + + + + private void setPeerProperties(XControl _xControl, String[] propnames, Object[] propvalues) + { + PeerTask oPeerTask = new PeerTask(_xControl, propnames, propvalues); + this.m_aPeerTasks.add(oPeerTask); + } + + /** + * Assigns an image to the property 'ImageUrl' of a dialog control. The image ids that the Resource urls point to + * may be assigned in a Resource file outside the wizards project + */ + public void setImageUrl(Object _ocontrolmodel, String _sResourceUrl) + { + ImageUrlTask oImageUrlTask = new ImageUrlTask(_ocontrolmodel, _sResourceUrl); + this.aImageUrlTasks.add(oImageUrlTask); + } +} diff --git a/wizards/com/sun/star/wizards/ui/PeerConfig.py b/wizards/com/sun/star/wizards/ui/PeerConfig.py new file mode 100644 index 000000000..1383b283a --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/PeerConfig.py @@ -0,0 +1,61 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback + +from .event.CommonListener import WindowListenerProcAdapter + +''' +To change the template for this generated type comment go to +Window>Preferences>Java>Code Generation>Code and Comments +''' + +class PeerConfig(object): + + def __init__(self, _oUnoDialog): + self.oUnoDialog = _oUnoDialog + self.oUnoDialog.xUnoDialog.addWindowListener( + WindowListenerProcAdapter(self.windowShown)) + self.m_aPeerTasks = [] + self.aImageUrlTasks = [] + + class PeerTask(object): + + def __init__(self, _xControl, _propNames, _propValues): + self.propnames = _propNames + self.propvalues = _propValues + self.xControl = _xControl + + class ImageUrlTask(object): + + def __init__(self, _oModel, _oResource): + self.oModel = _oModel + self.oResource = _oResource + + def windowShown(self): + try: + for i in self.m_aPeerTasks: + xVclWindowPeer = i.xControl.Peer + xVclWindowPeer.setProperty(i.propnames, i.propvalues) + + for aImageUrlTask in self.aImageUrlTasks: + sImageUrl = aImageUrlTask.oResource + if sImageUrl != "": + aImageUrlTask.oModel.ImageURL = sImageUrl + + except Exception: + traceback.print_exc() diff --git a/wizards/com/sun/star/wizards/ui/SortingComponent.java b/wizards/com/sun/star/wizards/ui/SortingComponent.java new file mode 100644 index 000000000..a08729fd9 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/SortingComponent.java @@ -0,0 +1,336 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import java.beans.PropertyChangeEvent; + +import com.sun.star.wizards.common.*; +import com.sun.star.awt.*; + +import java.util.ArrayList; + +public class SortingComponent +{ + + private WizardDialog CurUnoDialog; + private int MaxSortIndex = -1; + private static String sNoSorting; + private static String sSortCriteriaisduplicate; + private static String[] sSortHeader = new String[4]; + private static String[] sSortAscend = new String[4]; + private static String[] sSortDescend = new String[4]; + private int MAXSORTCRITERIAINDEX = 3; + private static final int SOFIRSTSORTLST = 0; + private static final int SOSECSORTLST = 1; + private static final int SOTHIRDSORTLST = 2; + private static final int SOFOURTHSORTLST = 3; + private static final int[] SOSORTLST = new int[] + { + SOFIRSTSORTLST, SOSECSORTLST, SOTHIRDSORTLST, SOFOURTHSORTLST + }; + private XListBox[] xSortListBox = new XListBox[4]; + + class ItemListenerImpl implements com.sun.star.awt.XItemListener + { + + public void itemStateChanged(ItemEvent EventObject) + { + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); + int ikey = CurUnoDialog.getControlKey(EventObject.Source, CurUnoDialog.ControlList); + enableNextSortListBox(ikey); + Helper.setUnoPropertyValue(CurUnoDialog.xDialogModel, PropertyNames.PROPERTY_ENABLED, Boolean.TRUE); + } + + public void disposing(com.sun.star.lang.EventObject eventObject) + { + } + } + + public SortingComponent(WizardDialog CurUnoDialog, int iStep, int iCompPosX, int iCompPosY, int iCompWidth, int FirstHelpIndex) + { + try + { + this.CurUnoDialog = CurUnoDialog; + short curtabindex = UnoDialog.setInitialTabindex(iStep); + Integer IStep = Integer.valueOf(iStep); + Integer ICompPosX = Integer.valueOf(iCompPosX); + Integer ICompWidth = Integer.valueOf(iCompWidth); + + Integer IListBoxPosX = Integer.valueOf(iCompPosX + 6); + int iOptButtonWidth = 65; + Integer IOptButtonWidth = Integer.valueOf(iOptButtonWidth); + Integer IListBoxWidth = Integer.valueOf(iCompWidth - iOptButtonWidth - 12); + Integer IOptButtonPosX = Integer.valueOf(IListBoxPosX.intValue() + IListBoxWidth.intValue() + 6); + getResources(); + boolean bDoEnable; + String HIDString; + int iCurPosY = iCompPosY; + for (int i = 0; i < 4; i++) + { + bDoEnable = (i < 2); + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "lblSort" + Integer.toString(i + 1), new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + Boolean.valueOf(bDoEnable), 8, sSortHeader[i], 0, ICompPosX, Integer.valueOf(iCurPosY), IStep, Short.valueOf(curtabindex++), ICompWidth + }); + + HIDString = HelpIds.getHelpIdString(FirstHelpIndex); + xSortListBox[i] = CurUnoDialog.insertListBox("lstSort" + Integer.toString(i + 1), SOSORTLST[i], null, new ItemListenerImpl(), new String[] + { + "Dropdown", PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, "LineCount", PropertyNames.PROPERTY_NAME, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + true, bDoEnable, 12, HIDString, Short.valueOf(UnoDialog.getListBoxLineCount()), "lstSort" + Integer.valueOf(i + 1), IListBoxPosX, Integer.valueOf(iCurPosY + 14), IStep, Short.valueOf(curtabindex++), IListBoxWidth + }); //Short.valueOf((short) (17+i*4)) + + HIDString = HelpIds.getHelpIdString(FirstHelpIndex + 1); + CurUnoDialog.insertRadioButton("optAscend" + Integer.toString(i + 1), 0, new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tag", PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + bDoEnable, 10, HIDString, sSortAscend[i], IOptButtonPosX, Integer.valueOf(iCurPosY + 10), Short.valueOf((short) 1), IStep, Short.valueOf(curtabindex++), PropertyNames.ASC, IOptButtonWidth + }); //, Short.valueOf((short) (18+i*4)) + + HIDString = HelpIds.getHelpIdString(FirstHelpIndex + 2); + CurUnoDialog.insertRadioButton("optDescend" + Integer.toString(i + 1), 0, new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STATE, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, "Tag", PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + bDoEnable, 10, HIDString, sSortDescend[i], IOptButtonPosX, Integer.valueOf(iCurPosY + 24), Short.valueOf((short) 0), IStep, Short.valueOf(curtabindex++), "DESC", IOptButtonWidth + }); //, Short.valueOf((short) (19+i*4)) + iCurPosY = iCurPosY + 36; + FirstHelpIndex += 3; + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + private boolean getResources() + { + sSortHeader[0] = CurUnoDialog.m_oResource.getResText("RID_REPORT_20"); + sSortHeader[1] = CurUnoDialog.m_oResource.getResText("RID_REPORT_21"); + sSortHeader[2] = CurUnoDialog.m_oResource.getResText("RID_REPORT_51"); + sSortHeader[3] = CurUnoDialog.m_oResource.getResText("RID_REPORT_52"); + sSortAscend[0] = CurUnoDialog.m_oResource.getResText("RID_REPORT_36"); + sSortAscend[1] = CurUnoDialog.m_oResource.getResText("RID_REPORT_53"); + sSortAscend[2] = CurUnoDialog.m_oResource.getResText("RID_REPORT_54"); + sSortAscend[3] = CurUnoDialog.m_oResource.getResText("RID_REPORT_55"); + sSortDescend[0] = CurUnoDialog.m_oResource.getResText("RID_REPORT_37"); + sSortDescend[1] = CurUnoDialog.m_oResource.getResText("RID_REPORT_56"); + sSortDescend[2] = CurUnoDialog.m_oResource.getResText("RID_REPORT_57"); + sSortDescend[3] = CurUnoDialog.m_oResource.getResText("RID_REPORT_58"); + sSortCriteriaisduplicate = CurUnoDialog.m_oResource.getResText("RID_REPORT_74"); + sNoSorting = CurUnoDialog.m_oResource.getResText("RID_REPORT_8"); + return true; + } + + public void initialize(String[] _FieldNames, String[][] _SortFieldNames) + { + int FieldCount = _FieldNames.length; + String[] ViewFieldNames = new String[FieldCount + 1]; + ViewFieldNames[0] = sNoSorting; + System.arraycopy(_FieldNames, 0, ViewFieldNames, 1, FieldCount); + short[] SelList = null; + for (int i = 0; i < 4; i++) + { + if (i < _SortFieldNames.length) + { + SelList = new short[] + { + (short) (JavaTools.FieldInList(_FieldNames, _SortFieldNames[i][0]) + 1) + }; + } + else + { + SelList = new short[] + { + (short) 0 + }; + } + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(i + 1), PropertyNames.STRING_ITEM_LIST, ViewFieldNames); + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(i + 1), PropertyNames.SELECTED_ITEMS, SelList); + toggleSortListBox(i, (i <= _SortFieldNames.length)); + } + } + + private void setMaxSortIndex() + { + MaxSortIndex = -1; + for (int i = 0; i <= MAXSORTCRITERIAINDEX; i++) + { + if (xSortListBox[i].getSelectedItemPos() > 0) + { + MaxSortIndex += 1; + } + } + } + + /** + * sets the controls of a Sorting criterion to readonly or not. + * @param _index index of the Sorting criterion + */ + private void setReadOnly(int _index, boolean _breadonly) + { + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(_index + 1), PropertyNames.READ_ONLY, Boolean.valueOf(_breadonly)); + } + + /** + * + * @param _index the first Sorting criterion in which 'ReadOnly is set to 'false' + */ + public void setReadOnlyUntil(int _index) + { + for (int i = 0; i <= 4; i++) + { + boolean breadonly = i < _index; + setReadOnly(i, breadonly); + } + } + + private void enableNextSortListBox(int CurIndex) + { + try + { + setMaxSortIndex(); + boolean bDoEnable = (xSortListBox[CurIndex].getSelectedItemPos() != 0); + if (!bDoEnable) + { + moveupSortItems(CurIndex, bDoEnable); //disableListBoxesfromIndex(CurIndex); + } + else + { + toggleSortListBox(CurIndex + 1, true); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public String[][] getSortFieldNames() + { + try + { + short iCurState; + String CurFieldName; + setMaxSortIndex(); + ArrayList<String[]> SortFieldNames = new ArrayList<String[]>(); + ArrayList<String> SortDescriptions = new ArrayList<String>(); + for (int i = 0; i <= MaxSortIndex; i++) + { + CurFieldName = xSortListBox[i].getSelectedItem(); + SortDescriptions.add(CurFieldName); + iCurState = ((Short) CurUnoDialog.getControlProperty("optAscend" + Integer.toString(i + 1), PropertyNames.PROPERTY_STATE)).shortValue(); + SortFieldNames.add(new String[]{CurFieldName,iCurState == 1 ? PropertyNames.ASC :"DESC" }); + } + // When searching for a duplicate entry we can neglect whether the entries are to be sorted ascending or descending + // TODO for the future we should deliver a messagebox when two different sorting modes have been applied to one field + int iduplicate = JavaTools.getDuplicateFieldIndex(SortDescriptions.toArray(new String[SortDescriptions.size()])); + if (iduplicate != -1) + { + String sLocSortCriteriaisduplicate = JavaTools.replaceSubString(sSortCriteriaisduplicate, SortFieldNames.get(iduplicate)[0], "<FIELDNAME>"); + CurUnoDialog.showMessageBox("WarningBox", VclWindowPeerAttribute.OK, sLocSortCriteriaisduplicate); + CurUnoDialog.vetoableChange(new PropertyChangeEvent(CurUnoDialog, "Steps", 1, 2)); + CurUnoDialog.setFocus("lstSort" + (iduplicate + 1)); + return new String[][] + { + }; + } + else + { + return SortFieldNames.toArray(new String[SortFieldNames.size()][2]); + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + + + // The following code can be reactivated in a future version when task #100799 will be fixed + private void moveupSortItems(int CurIndex, boolean bDoEnable) + { + short iNextItemPos; + if ((!bDoEnable) && (MAXSORTCRITERIAINDEX > CurIndex)) + { + for (int i = CurIndex; i < MAXSORTCRITERIAINDEX; i++) + { + iNextItemPos = xSortListBox[i + 1].getSelectedItemPos(); + if (iNextItemPos != 0) + { + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(i + 1), PropertyNames.SELECTED_ITEMS, new short[] + { + iNextItemPos + }); + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(i + 2), PropertyNames.SELECTED_ITEMS, new short[] + { + }); + toggleSortListBox(i, true); + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(i + 2), PropertyNames.SELECTED_ITEMS, new short[] + { + 0 + }); + } + } + if (MaxSortIndex < xSortListBox.length - 2) + { + toggleSortListBox(MaxSortIndex + 2, false); + } + } + else + { + toggleSortListBox(CurIndex + 1, bDoEnable); + } + } + + private void toggleSortListBox(int CurIndex, boolean bDoEnable) + { + try + { + if (CurIndex < xSortListBox.length) + { + CurUnoDialog.setControlProperty("lblSort" + Integer.toString(CurIndex + 1), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(CurIndex + 1), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + CurUnoDialog.setControlProperty("optAscend" + Integer.toString(CurIndex + 1), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + CurUnoDialog.setControlProperty("optDescend" + Integer.toString(CurIndex + 1), PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bDoEnable)); + if (!bDoEnable) + { + CurUnoDialog.setControlProperty("lstSort" + Integer.toString(CurIndex + 1), PropertyNames.SELECTED_ITEMS, new short[] + { + 0 + }); + } + } + } + catch (Exception exception) + { + exception.printStackTrace(System.err); + } + } +} diff --git a/wizards/com/sun/star/wizards/ui/TitlesComponent.java b/wizards/com/sun/star/wizards/ui/TitlesComponent.java new file mode 100644 index 000000000..b9003f60d --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/TitlesComponent.java @@ -0,0 +1,240 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.wizards.common.Properties; +import com.sun.star.wizards.common.*; +import com.sun.star.beans.*; +import com.sun.star.awt.Size; +import com.sun.star.awt.XTextComponent; +import com.sun.star.awt.XTextListener; + +import java.util.*; + +public class TitlesComponent extends ControlScroller +{ + + private int iLabelPosX; + private static final int iRelLabelPosXDist = 6; + private String[] fieldnames; + private Map<String, String> fieldtitleset; + private String[] fieldtitles; + private static final String SOLABELPREFIX = "lblColumnName_"; + private static final String SOTITLEPREFIX = "lblTitleName_"; + + public TitlesComponent(WizardDialog _CurUnoDialog, int _iStep, int _iCompPosX, int _iCompPosY, int _iCompWidth, int _uitextfieldcount, String _slblColumnNames, String _slblColumnTitles, int _firsthelpindex) + { + super(_CurUnoDialog, _iStep, _iCompPosX, _iCompPosY, _iCompWidth, _uitextfieldcount, 18, _firsthelpindex); + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblColumnNames", new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + 8, _slblColumnNames, Integer.valueOf(iLabelPosX), Integer.valueOf(iCompPosY - 10), IStep, 60 + }); + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", "lblColumnTitles", new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + 8, _slblColumnTitles, 90, Integer.valueOf(iCompPosY - 10), IStep, 152 + }); + } + + @Override + protected void insertControlGroup(int i, int ypos) + { + iLabelPosX = iCompPosX + iRelLabelPosXDist; + ControlRow oControlRow = new ControlRow(i, ypos); + ControlGroupVector.add(oControlRow); + + } + + @Override + protected void setControlGroupVisible(int _index, boolean _bIsVisible) + { + CurUnoDialog.setControlVisible(getColumnName(_index), _bIsVisible); + CurUnoDialog.setControlVisible(getTitleName(_index), _bIsVisible); + } + + public void addTextListener(XTextListener _xTextListener) + { + for (int i = 0; i < super.ControlGroupVector.size(); i++) + { + ControlRow curControlRow = (ControlRow) ControlGroupVector.get(i); + XTextComponent xTextBox = curControlRow.xTextComponent; + if ((xTextBox != null) && (_xTextListener != null)) + { + xTextBox.addTextListener(_xTextListener); + } + } + } + + class ControlRow + { + + private XTextComponent xTextComponent; + + public ControlRow(int _index, int _iCompPosY) + { + String slabelname = getColumnName(_index); + String stextfieldname = getTitleName(_index); + + CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", slabelname, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 16, Boolean.TRUE, Integer.valueOf(iLabelPosX), Integer.valueOf(_iCompPosY + 1), UIConsts.INVISIBLESTEP, Short.valueOf(curtabindex++), 30 + }); + + xTextComponent = CurUnoDialog.insertTextField(stextfieldname, 0, null, + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 12, HelpIds.getHelpIdString(curHelpIndex++), Integer.valueOf(iLabelPosX + 30), Integer.valueOf(_iCompPosY), UIConsts.INVISIBLESTEP, Short.valueOf(curtabindex++), Integer.valueOf(iCompWidth - 90 - 20) + }); + } + } + + private String getColumnName(int _index) + { + return SOLABELPREFIX + Integer.toString(_index + 1); + } + + private String getTitleName(int _index) + { + return SOTITLEPREFIX + Integer.toString(_index + 1); + } + + @Override + protected void initializeScrollFields() + { + for (int i = 0; i < fieldnames.length; i++) + { + PropertyValue[] currowproperties = new PropertyValue[2]; + currowproperties[0] = Properties.createProperty(getColumnName(i), fieldnames[i], i); + currowproperties[1] = Properties.createProperty(getTitleName(i), fieldtitles[i], i); //getTitleName(i) + registerControlGroup(currowproperties, i); + } + } + + private void adjustPosSizes() + { + String sLongestFieldName = JavaTools.getlongestArrayItem(fieldnames); + Size aSize = CurUnoDialog.getpreferredLabelSize(getColumnName(0), sLongestFieldName); + double dblMAPConversion = CurUnoDialog.getMAPConversionFactor(getColumnName(0)); + int iFieldNameWidth = getFieldNameWidth(aSize.Width, dblMAPConversion) + 10; + Integer FieldNameWidth = Integer.valueOf(iFieldNameWidth); + Integer TitlePosX = Integer.valueOf(iLabelPosX + iFieldNameWidth + 2); + Integer TitleWidth = Integer.valueOf(iCompPosX + iCompWidth - TitlePosX.intValue() - iScrollBarWidth - 6); + for (short i = 0; i <= ncurfieldcount; i++) + { + CurUnoDialog.setControlProperty(getColumnName(i), PropertyNames.PROPERTY_WIDTH, FieldNameWidth); + CurUnoDialog.setControlProperties(getTitleName(i), new String[] + { + PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_WIDTH + }, new Object[] + { + TitlePosX, TitleWidth + }); + } + CurUnoDialog.setControlProperty("lblColumnNames", PropertyNames.PROPERTY_WIDTH, FieldNameWidth); + CurUnoDialog.setControlProperty("lblColumnTitles", PropertyNames.PROPERTY_POSITION_X, TitlePosX); + } + + public void initialize(String[] _fieldnames, Map<String, String> _fieldtitleset) + { + this.fieldnames = _fieldnames; + this.fieldtitleset = _fieldtitleset; + setFieldTitles(); + initializeScrollFields(); + super.initialize(fieldnames.length); + adjustPosSizes(); + } + + private void setFieldTitles() + { + fieldtitles = new String[fieldnames.length]; + for (int i = 0; i < fieldnames.length; i++) + { + if (this.fieldtitleset.containsKey(fieldnames[i])) + { + Object curvalue = fieldtitleset.get(fieldnames[i]); + if (curvalue != null) + { + fieldtitles[i] = (String) curvalue; + } + else + { + fieldtitles[i] = fieldnames[i]; + } + } + else + { + fieldtitles[i] = fieldnames[i]; + } + } + } + + public String getFieldNameByTitleControl(Object _fieldtitlemodel) + { + String sTitleModelName = (String) Helper.getUnoPropertyValue(_fieldtitlemodel, PropertyNames.PROPERTY_NAME); + String sindex = JavaTools.getSuffixNumber(sTitleModelName); + return (String) CurUnoDialog.getControlProperty(SOLABELPREFIX + sindex, PropertyNames.PROPERTY_LABEL); + } + + public String[] getFieldTitles() + { + PropertyValue[][] titlelist = this.getScrollFieldValues(); + PropertyValue[] currowproperties; + PropertyValue curtitleproperty; + for (int i = 0; i < titlelist.length; i++) + { + currowproperties = titlelist[i]; + curtitleproperty = currowproperties[1]; + fieldtitles[i] = (String) curtitleproperty.Value; + } + refreshtitleset(); + return fieldtitles; + } + + private void refreshtitleset() + { + for (int i = 0; i < fieldnames.length; i++) + { + fieldtitleset.put(fieldnames[i], fieldtitles[i]); + } + } + + private int getFieldNameWidth(int iMAPControlWidth, double dblMAPConversion) + { + int iFieldNameWidth = (int) (1.15 * (iMAPControlWidth) / dblMAPConversion); + double dblAvailableWidth = (iCompWidth - iScrollBarWidth - iRelLabelPosXDist); + if (iFieldNameWidth > (0.5 * (dblAvailableWidth))) + { + iFieldNameWidth = (int) (0.5 * (dblAvailableWidth)); + } + return iFieldNameWidth; + } +} diff --git a/wizards/com/sun/star/wizards/ui/UIConsts.java b/wizards/com/sun/star/wizards/ui/UIConsts.java new file mode 100644 index 000000000..eb57fefa8 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UIConsts.java @@ -0,0 +1,66 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.ui; + +public interface UIConsts +{ + Integer INVISIBLESTEP = 99; + String INFOIMAGEURL = "private:graphicrepository/dbaccess/res/exinfo.png"; + /** + * The tabindex of the navigation buttons in a wizard must be assigned a very + * high tabindex because on every step their taborder must appear at the end + */ + short SOFIRSTWIZARDNAVITABINDEX = 30000; + Integer INTEGER_12 = 12; + /**Steps of the QueryWizard + * + */ + int SOGROUPSELECTIONPAGE = 5; + int SOGROUPFILTERPAGE = 6; + int SOTITLESPAGE = 7; + Integer[] INTEGERS = new Integer[] + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 + }; + + class CONTROLTYPE + { + + public static final int BUTTON = 1; + public static final int IMAGECONTROL = 2; + public static final int LISTBOX = 3; + public static final int COMBOBOX = 4; + public static final int CHECKBOX = 5; + public static final int RADIOBUTTON = 6; + public static final int DATEFIELD = 7; + public static final int EDITCONTROL = 8; + public static final int FIXEDLINE = 10; + public static final int FIXEDTEXT = 11; + public static final int FORMATTEDFIELD = 12; + public static final int HYPERTEXT = 14; + public static final int NUMERICFIELD = 15; + public static final int PATTERNFIELD = 16; + public static final int PROGRESSBAR = 17; + public static final int ROADMAP = 18; + public static final int SCROLLBAR = 19; + public static final int TIMEFIELD = 20; + public static final int CURRENCYFIELD = 21; + public static final int UNKNOWN = -1; + } +} diff --git a/wizards/com/sun/star/wizards/ui/UIConsts.py b/wizards/com/sun/star/wizards/ui/UIConsts.py new file mode 100644 index 000000000..e5a4e25e2 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UIConsts.py @@ -0,0 +1,38 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +class UIConsts(): + + INVISIBLESTEP = 99 + INFOIMAGEURL = "private:graphicrepository/dbaccess/res/exinfo.png" + + ''' + The tabindex of the navigation buttons in a wizard must be assigned a very + high tabindex because on every step their taborder must appear at the end + ''' + SOFIRSTWIZARDNAVITABINDEX = 30000 + + # Steps of the QueryWizard + + SOFIELDSELECTIONPAGE = 1 + SOSORTINGPAGE = 2 + SOFILTERPAGE = 3 + SOAGGREGATEPAGE = 4 + SOGROUPSELECTIONPAGE = 5 + SOGROUPFILTERPAGE = 6 + SOTITLESPAGE = 7 + SOSUMMARYPAGE = 8 diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog.java b/wizards/com/sun/star/wizards/ui/UnoDialog.java new file mode 100644 index 000000000..404f3b619 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UnoDialog.java @@ -0,0 +1,836 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.awt.*; +import com.sun.star.beans.XMultiPropertySet; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XNameAccess; +import com.sun.star.container.XNameContainer; +import com.sun.star.lang.*; +import com.sun.star.frame.XFrame; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XComponent; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.*; +import com.sun.star.wizards.common.*; +import java.util.HashMap; + +public class UnoDialog +{ + + public XMultiServiceFactory xMSF; + XMultiServiceFactory MSFDialogModel; + private XNameContainer xDlgNames; + XControlContainer xDlgContainer; + private XNameAccess m_xDlgNameAccess; + public XControl xControl; + public XDialog xDialog; + public XReschedule xReschedule; + public XWindow xWindow; + public XComponent xComponent; + public XInterface xDialogModel; + private XInterface xUnoDialog; + private XVclWindowPeer xVclWindowPeer; + public HashMap<String, Integer> ControlList; + public Resource m_oResource; + public XWindowPeer xWindowPeer = null; + private PeerConfig m_oPeerConfig; + + public UnoDialog(XMultiServiceFactory xMSF) + { + try + { + this.xMSF = xMSF; + ControlList = new HashMap<String, Integer>(); + xDialogModel = (XInterface) xMSF.createInstance("com.sun.star.awt.UnoControlDialogModel"); + XMultiPropertySet xMultiPSetDlg = UnoRuntime.queryInterface(XMultiPropertySet.class, xDialogModel); + xMultiPSetDlg.setPropertyValues(new String[0], new Object[0]); + MSFDialogModel = UnoRuntime.queryInterface(XMultiServiceFactory.class, xDialogModel); + xUnoDialog = (XInterface) xMSF.createInstance("com.sun.star.awt.UnoControlDialog"); + xControl = UnoRuntime.queryInterface(XControl.class, xUnoDialog); + XControlModel xControlModel = UnoRuntime.queryInterface(XControlModel.class, xDialogModel); + xControl.setModel(xControlModel); + UnoRuntime.queryInterface(XPropertySet.class, xDialogModel); + xDlgContainer = UnoRuntime.queryInterface(XControlContainer.class, xUnoDialog); + xDlgNames = UnoRuntime.queryInterface(XNameContainer.class, xDialogModel); + xComponent = UnoRuntime.queryInterface(XComponent.class, xUnoDialog); + xWindow = UnoRuntime.queryInterface(XWindow.class, xUnoDialog); + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public int getControlKey(Object EventObject, HashMap<String, Integer> ControlList) + { + int iKey; + XControl xContrl = UnoRuntime.queryInterface(XControl.class, EventObject); + XControlModel xControlModel = xContrl.getModel(); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xControlModel); + try + { + String sName = (String) xPSet.getPropertyValue(PropertyNames.PROPERTY_NAME); + Integer KeyObject = ControlList.get(sName); + iKey = KeyObject.intValue(); + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + iKey = 2000; + } + return iKey; + } + + private void createPeerConfiguration() + { + m_oPeerConfig = new PeerConfig(this); + } + + public PeerConfig getPeerConfiguration() + { + if (m_oPeerConfig == null) + { + createPeerConfiguration(); + } + return m_oPeerConfig; + } + + XNameAccess getDlgNameAccess() + { + if (m_xDlgNameAccess == null) + { + m_xDlgNameAccess = UnoRuntime.queryInterface(XNameAccess.class, xDialogModel); + } + return m_xDlgNameAccess; + } + public void setControlProperty(String ControlName, String PropertyName, Object PropertyValue) + { + try + { + if (PropertyValue != null) + { + if (!getDlgNameAccess().hasByName(ControlName)) + { + return; + } + Object xControlModel = getDlgNameAccess().getByName(ControlName); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xControlModel); + if (AnyConverter.isArray(PropertyValue)) + { + com.sun.star.uno.Type seqType = new com.sun.star.uno.Type(PropertyValue.getClass()); + PropertyValue = new com.sun.star.uno.Any(seqType, PropertyValue); + } + xPSet.setPropertyValue(PropertyName, PropertyValue); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public Resource getResource() + { + return m_oResource; + } + + public void setControlProperties(String ControlName, String[] PropertyNames, Object[] PropertyValues) + { + try + { + if (PropertyValues != null) + { + if (!getDlgNameAccess().hasByName(ControlName)) + { + return; + } + Object xControlModel = getDlgNameAccess().getByName(ControlName); + XMultiPropertySet xMultiPSet = UnoRuntime.queryInterface(XMultiPropertySet.class, xControlModel); + xMultiPSet.setPropertyValues(PropertyNames, PropertyValues); + } + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + } + } + + public Object getControlProperty(String ControlName, String PropertyName) + { + try + { + Object xControlModel = getDlgNameAccess().getByName(ControlName); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xControlModel); + return xPSet.getPropertyValue(PropertyName); + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + + + public double getMAPConversionFactor(String ControlName) + { + XControl xControl2 = xDlgContainer.getControl(ControlName); + XView xView = UnoRuntime.queryInterface(XView.class, xControl2); + Size aSize = xView.getSize(); + double dblMAPWidth = ((Integer) Helper.getUnoPropertyValue(xControl2.getModel(), PropertyNames.PROPERTY_WIDTH)).intValue(); + return ((aSize.Width) / dblMAPWidth); + } + + public Size getpreferredLabelSize(String LabelName, String sLabel) + { + XControl xControl2 = xDlgContainer.getControl(LabelName); + XFixedText xFixedText = UnoRuntime.queryInterface(XFixedText.class, xControl2); + String OldText = xFixedText.getText(); + xFixedText.setText(sLabel); + XLayoutConstrains xLayoutConstrains = UnoRuntime.queryInterface(XLayoutConstrains.class, xControl2); + Size aSize = xLayoutConstrains.getPreferredSize(); + xFixedText.setText(OldText); + return aSize; + } + + public void removeSelectedItems(XListBox xListBox) + { + short[] SelList = xListBox.getSelectedItemsPos(); + int Sellen = SelList.length; + for (int i = Sellen - 1; i >= 0; i--) + { + xListBox.removeItems(SelList[i], (short) 1); + } + } + + public static int getListBoxItemCount(XListBox _xListBox) + { + // This function may look ugly, but this is the only way to check the count + // of values in the model,which is always right. + // the control is only a view and could be right or not. + final String[] fieldnames = (String[]) Helper.getUnoPropertyValue(getModel(_xListBox), PropertyNames.STRING_ITEM_LIST); + return fieldnames.length; + } + + public static short getSelectedItemPos(XListBox _xListBox) + { + short ipos[] = (short[]) Helper.getUnoPropertyValue(getModel(_xListBox), PropertyNames.SELECTED_ITEMS); + return ipos[0]; + } + + public static boolean isListBoxSelected(XListBox _xListBox) + { + short ipos[] = (short[]) Helper.getUnoPropertyValue(getModel(_xListBox), PropertyNames.SELECTED_ITEMS); + return ipos.length > 0; + } + + + + public XFixedText insertLabel(String sName, String[] sPropNames, Object[] oPropValues) + { + try + { + Object oFixedText = insertControlModel("com.sun.star.awt.UnoControlFixedTextModel", sName, sPropNames, oPropValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oFixedText); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + Object oLabel = xDlgContainer.getControl(sName); + return UnoRuntime.queryInterface(XFixedText.class, oLabel); + } + catch (java.lang.Exception ex) + { + ex.printStackTrace(); + return null; + } + } + + public XButton insertButton(String sName, int iControlKey, XActionListener xActionListener, String[] sProperties, Object[] sValues) throws com.sun.star.uno.Exception + { + Object oButtonModel = insertControlModel("com.sun.star.awt.UnoControlButtonModel", sName, sProperties, sValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oButtonModel); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + Object objectButton = xDlgContainer.getControl(sName); + XButton xButton = UnoRuntime.queryInterface(XButton.class, objectButton); + if (xActionListener != null) + { + xButton.addActionListener(xActionListener); + } + Integer ControlKey = Integer.valueOf(iControlKey); + if (ControlList != null) + { + ControlList.put(sName, ControlKey); + } + return xButton; + } + + public XScrollBar insertScrollBar(String sName, int iControlKey, XAdjustmentListener xAdjustmentListener, String[] sProperties, Object[] sValues) + { + try + { + Object oScrollModel = insertControlModel("com.sun.star.awt.UnoControlScrollBarModel", sName, sProperties, sValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oScrollModel); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + Object oScrollBar = xDlgContainer.getControl(sName); + XScrollBar xScrollBar = UnoRuntime.queryInterface(XScrollBar.class, oScrollBar); + if (xAdjustmentListener != null) + { + xScrollBar.addAdjustmentListener(xAdjustmentListener); + } + Integer ControlKey = Integer.valueOf(iControlKey); + if (ControlList != null) + { + ControlList.put(sName, ControlKey); + } + return xScrollBar; + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public XTextComponent insertTextField(String sName, int iControlKey, XTextListener xTextListener, String[] sProperties, Object[] sValues) + { + return insertEditField("com.sun.star.awt.UnoControlEditModel", sName, iControlKey, xTextListener, sProperties, sValues); + } + + public XTextComponent insertFormattedField(String sName, int iControlKey, XTextListener xTextListener, String[] sProperties, Object[] sValues) + { + return insertEditField("com.sun.star.awt.UnoControlFormattedFieldModel", sName, iControlKey, xTextListener, sProperties, sValues); + } + + private XTextComponent insertEditField(String ServiceName, String sName, int iControlKey, XTextListener xTextListener, String[] sProperties, Object[] sValues) + { + try + { + XInterface xTextModel = insertControlModel(ServiceName, sName, sProperties, sValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xTextModel); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + XControl xTextField = xDlgContainer.getControl(sName); + XTextComponent xTextBox = UnoRuntime.queryInterface(XTextComponent.class, xTextField); + if (xTextListener != null) + { + xTextBox.addTextListener(xTextListener); + } + Integer ControlKey = Integer.valueOf(iControlKey); + ControlList.put(sName, ControlKey); + return xTextBox; + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public XListBox insertListBox(String sName, int iControlKey, XActionListener xActionListener, XItemListener xItemListener, String[] sProperties, Object[] sValues) throws com.sun.star.uno.Exception + { + XInterface xListBoxModel = insertControlModel("com.sun.star.awt.UnoControlListBoxModel", sName, sProperties, sValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, xListBoxModel); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + XControl xControlListBox = xDlgContainer.getControl(sName); + XListBox xListBox = UnoRuntime.queryInterface(XListBox.class, xControlListBox); + if (xItemListener != null) + { + xListBox.addItemListener(xItemListener); + } + if (xActionListener != null) + { + xListBox.addActionListener(xActionListener); + } + Integer ControlKey = Integer.valueOf(iControlKey); + ControlList.put(sName, ControlKey); + return xListBox; + } + + public XRadioButton insertRadioButton(String sName, int iControlKey, XItemListener xItemListener, String[] sProperties, Object[] sValues) + { + XRadioButton xRadioButton = insertRadioButton(sName, iControlKey, sProperties, sValues); + if (xItemListener != null) + { + xRadioButton.addItemListener(xItemListener); + } + return xRadioButton; + } + + public XButton insertRadioButton(String sName, int iControlKey, XActionListener xActionListener, String[] sProperties, Object[] sValues) + { + XRadioButton xRadioButton = insertRadioButton(sName, iControlKey, sProperties, sValues); + XButton xButton = UnoRuntime.queryInterface(XButton.class, xRadioButton); + if (xActionListener != null) + { + xButton.addActionListener(xActionListener); + } + return xButton; + } + + public XRadioButton insertRadioButton(String sName, int iControlKey, String[] sProperties, Object[] sValues) + { + XRadioButton xRadioButton = insertRadioButton(sName, sProperties, sValues); + Integer ControlKey = Integer.valueOf(iControlKey); + ControlList.put(sName, ControlKey); + return xRadioButton; + } + + public XRadioButton insertRadioButton(String sName, String[] sProperties, Object[] sValues) + { + try + { + XInterface oRadioButtonModel = insertControlModel("com.sun.star.awt.UnoControlRadioButtonModel", sName, sProperties, sValues); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oRadioButtonModel); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, sName); + XControl xControlRadioButton = xDlgContainer.getControl(sName); + return UnoRuntime.queryInterface(XRadioButton.class, xControlRadioButton); + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + /** + * The problem with setting the visibility of controls is that changing the current step + * of a dialog will automatically make all controls visible. The PropertyNames.PROPERTY_STEP property always wins against + * the property "visible". Therefore a control meant to be invisible is placed on a step far far away. + * Afterwards the step property of the dialog has to be set with "repaintDialogStep". As the performance + * of that method is very bad it should be used only once for all controls + * @param controlname the name of the control + * @param bIsVisible sets the control visible or invisible + */ + public void setControlVisible(String controlname, boolean bIsVisible) + { + try + { + int iCurDialogStep = AnyConverter.toInt(Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_STEP)); + if (bIsVisible) + { + setControlProperty(controlname, PropertyNames.PROPERTY_STEP, Integer.valueOf(iCurDialogStep)); + } + else + { + setControlProperty(controlname, PropertyNames.PROPERTY_STEP, UIConsts.INVISIBLESTEP); + } + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + } + } + + /** + * repaints the currentDialogStep + */ + public void repaintDialogStep() + { + try + { + int ncurstep = AnyConverter.toInt(Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_STEP)); + Helper.setUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP, 99); + Helper.setUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP, Integer.valueOf(ncurstep)); + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + } + } + + public XInterface insertControlModel(String ServiceName, String sName, String[] sProperties, Object[] sValues) + { + try + { + XInterface xControlModel = (XInterface) MSFDialogModel.createInstance(ServiceName); + Helper.setUnoPropertyValues(xControlModel, sProperties, sValues); + xDlgNames.insertByName(sName, xControlModel); + return xControlModel; + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public void setFocus(String ControlName) + { + Object oFocusControl = xDlgContainer.getControl(ControlName); + XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, oFocusControl); + xWindow.setFocus(); + } + + public void selectListBoxItem(XListBox xListBox, short iFieldsSelIndex) + { + if (iFieldsSelIndex > -1) + { + int FieldCount = xListBox.getItemCount(); + if (FieldCount > 0) + { + if (iFieldsSelIndex < FieldCount) + { + xListBox.selectItemPos(iFieldsSelIndex, true); + } + else + { + xListBox.selectItemPos((short) (iFieldsSelIndex - 1), true); + } + } + } + } + + /** deselects a Listbox. MultipleMode is not supported + */ + public static void deselectListBox(XInterface _xBasisListBox) + { + Object oListBoxModel = getModel(_xBasisListBox); + Object sList = Helper.getUnoPropertyValue(oListBoxModel, PropertyNames.STRING_ITEM_LIST); + Helper.setUnoPropertyValue(oListBoxModel, PropertyNames.STRING_ITEM_LIST, new String[] + { + }); + Helper.setUnoPropertyValue(oListBoxModel, PropertyNames.STRING_ITEM_LIST, sList); + } + + public void calculateDialogPosition(Rectangle FramePosSize) + { + // TODO: check if it would be useful or possible to create a dialog peer, that can be used for the messageboxes to + // maintain modality when they pop up. + Rectangle CurPosSize = xWindow.getPosSize(); + int WindowHeight = FramePosSize.Height; + int WindowWidth = FramePosSize.Width; + int DialogWidth = CurPosSize.Width; + int DialogHeight = CurPosSize.Height; + int iXPos = ((WindowWidth / 2) - (DialogWidth / 2)); + int iYPos = ((WindowHeight / 2) - (DialogHeight / 2)); + xWindow.setPosSize(iXPos, iYPos, DialogWidth, DialogHeight, PosSize.POS); + } + + /** + * + * @return 0 for cancel, 1 for ok + */ + public short executeDialog(Rectangle FramePosSize) throws com.sun.star.uno.Exception + { + if (xControl.getPeer() == null) + { + throw new java.lang.IllegalArgumentException("Please create a peer, using your own frame"); + } + calculateDialogPosition(FramePosSize); + if (xWindowPeer == null) + { + createWindowPeer(); + } + xVclWindowPeer = UnoRuntime.queryInterface(XVclWindowPeer.class, xWindowPeer); + this.BisHighContrastModeActivated = Boolean.valueOf(this.isHighContrastModeActivated()); + xDialog = UnoRuntime.queryInterface(XDialog.class, xUnoDialog); + return xDialog.execute(); + } + + /** + * @return 0 for cancel, 1 for ok. + */ + public short executeDialog(XInterface xComponent) throws com.sun.star.uno.Exception + { + XFrame frame = UnoRuntime.queryInterface(XFrame.class, xComponent); + if (frame != null) + { + XWindow w = frame.getComponentWindow(); + if (w != null) + { + return executeDialog(w.getPosSize()); + } + } + + return executeDialog(new Rectangle(0, 0, 640, 400)); + } + + /** + * When possible, use the other executeDialog methods, since + * there may be problems retrieving the actual active frame, + * for example under linux. + * @return 0 for cancel, 1 for ok + */ + public short executeDialog() throws com.sun.star.uno.Exception + { + return executeDialog(Desktop.getActiveFrame(xMSF)); + } + + public void modifyFontWeight(String ControlName, float FontWeight) + { + FontDescriptor oFontDesc = new FontDescriptor(); + oFontDesc.Weight = FontWeight; + setControlProperty(ControlName, PropertyNames.FONT_DESCRIPTOR, oFontDesc); + } + + /** + * create a peer for this dialog, using the given peer as a parent. + */ + public XWindowPeer createWindowPeer(XWindowPeer parentPeer) throws com.sun.star.uno.Exception + { + xWindow.setVisible(false); + Object tk = xMSF.createInstance("com.sun.star.awt.Toolkit"); + if (parentPeer == null) + { + parentPeer = UnoRuntime.queryInterface(XToolkit.class, tk).getDesktopWindow(); + } + XToolkit xToolkit = UnoRuntime.queryInterface(XToolkit.class, tk); + xReschedule = UnoRuntime.queryInterface(XReschedule.class, xToolkit); + // TEUER! + xControl.createPeer(xToolkit, parentPeer); + xWindowPeer = xControl.getPeer(); + return xControl.getPeer(); + } + + /** + * Creates a peer for this dialog, using the active OO frame as the parent window. + */ + public XWindowPeer createWindowPeer() throws com.sun.star.uno.Exception + { + return createWindowPeer(null); + } + + public static Object getModel(Object control) + { + XControl xControl = UnoRuntime.queryInterface(XControl.class, control); + return xControl.getModel(); + } + + public static void setEnabled(Object control, boolean enabled) + { + setEnabled(control, enabled ? Boolean.TRUE : Boolean.FALSE); + } + + private static void setEnabled(Object control, Boolean enabled) + { + Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enabled); + } + + /** + * @param oControlModel the model of a control + * @return the LabelType according to UIConsts.CONTROLTYPE + */ + private static int getControlModelType(Object oControlModel) + { + XServiceInfo xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, oControlModel); + if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlFixedTextModel")) + { + return UIConsts.CONTROLTYPE.FIXEDTEXT; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlButtonModel")) + { + return UIConsts.CONTROLTYPE.BUTTON; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlCurrencyFieldModel")) + { + return UIConsts.CONTROLTYPE.CURRENCYFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlDateFieldModel")) + { + return UIConsts.CONTROLTYPE.DATEFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlFixedLineModel")) + { + return UIConsts.CONTROLTYPE.FIXEDLINE; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlFormattedFieldModel")) + { + return UIConsts.CONTROLTYPE.FORMATTEDFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlRoadmapModel")) + { + return UIConsts.CONTROLTYPE.ROADMAP; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlNumericFieldModel")) + { + return UIConsts.CONTROLTYPE.NUMERICFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlPatternFieldModel")) + { + return UIConsts.CONTROLTYPE.PATTERNFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlHyperTextModel")) + { + return UIConsts.CONTROLTYPE.HYPERTEXT; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlProgressBarModel")) + { + return UIConsts.CONTROLTYPE.PROGRESSBAR; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlTimeFieldModel")) + { + return UIConsts.CONTROLTYPE.TIMEFIELD; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlImageControlModel")) + { + return UIConsts.CONTROLTYPE.IMAGECONTROL; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlRadioButtonModel")) + { + return UIConsts.CONTROLTYPE.RADIOBUTTON; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlCheckBoxModel")) + { + return UIConsts.CONTROLTYPE.CHECKBOX; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlEditModel")) + { + return UIConsts.CONTROLTYPE.EDITCONTROL; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlComboBoxModel")) + { + return UIConsts.CONTROLTYPE.COMBOBOX; + } + else if (xServiceInfo.supportsService("com.sun.star.awt.UnoControlListBoxModel")) // TODO Comboboxes?? + { + return UIConsts.CONTROLTYPE.LISTBOX; + } + else + { + return UIConsts.CONTROLTYPE.UNKNOWN; + } + } + + /** + * @return the name of the property that contains the value of a controlmodel + */ + public static String getDisplayProperty(Object oControlModel) + { + int itype = getControlModelType(oControlModel); + return getDisplayProperty(itype); + } + + /** + * @param itype The type of the control conforming to UIConst.ControlType + * @return the name of the property that contains the value of a controlmodel + */ + private static String getDisplayProperty(int itype) + { + switch (itype) + { + case UIConsts.CONTROLTYPE.FIXEDTEXT: + return PropertyNames.PROPERTY_LABEL; + case UIConsts.CONTROLTYPE.BUTTON: + return PropertyNames.PROPERTY_LABEL; + case UIConsts.CONTROLTYPE.FIXEDLINE: + return PropertyNames.PROPERTY_LABEL; + case UIConsts.CONTROLTYPE.NUMERICFIELD: + return "Value"; + case UIConsts.CONTROLTYPE.CURRENCYFIELD: + return "Value"; + case UIConsts.CONTROLTYPE.FORMATTEDFIELD: + return "EffectiveValue"; + case UIConsts.CONTROLTYPE.DATEFIELD: + return "Date"; + case UIConsts.CONTROLTYPE.TIMEFIELD: + return "Time"; + case UIConsts.CONTROLTYPE.SCROLLBAR: + return "ScrollValue"; + case UIConsts.CONTROLTYPE.PROGRESSBAR: + return "ProgressValue"; + case UIConsts.CONTROLTYPE.IMAGECONTROL: + return PropertyNames.PROPERTY_IMAGEURL; + case UIConsts.CONTROLTYPE.RADIOBUTTON: + return PropertyNames.PROPERTY_STATE; + case UIConsts.CONTROLTYPE.CHECKBOX: + return PropertyNames.PROPERTY_STATE; + case UIConsts.CONTROLTYPE.EDITCONTROL: + return "Text"; + case UIConsts.CONTROLTYPE.COMBOBOX: + return "Text"; + case UIConsts.CONTROLTYPE.PATTERNFIELD: + return "Text"; + case UIConsts.CONTROLTYPE.LISTBOX: + return PropertyNames.SELECTED_ITEMS; + default: + return PropertyNames.EMPTY_STRING; + } + } + + public void addResourceHandler() + { + m_oResource = new Resource(xMSF); + } + + public static short setInitialTabindex(int _istep) + { + return (short) (_istep * 100); + } + private Boolean BisHighContrastModeActivated = null; + + private boolean isHighContrastModeActivated() + { + if (xVclWindowPeer != null) + { + if (BisHighContrastModeActivated == null) + { + int nUIColor; + try + { + nUIColor = AnyConverter.toInt(this.xVclWindowPeer.getProperty("DisplayBackgroundColor")); + } + catch (IllegalArgumentException e) + { + e.printStackTrace(System.err); + return false; + } + //TODO: The following methods could be wrapped in an own class implementation + int nRed = getRedColorShare(nUIColor); + int nGreen = getGreenColorShare(nUIColor); + int nBlue = getBlueColorShare(nUIColor); + int nLuminance = ((nBlue * 28 + nGreen * 151 + nRed * 77) / 256); + boolean bisactivated = (nLuminance <= 25); + BisHighContrastModeActivated = Boolean.valueOf(bisactivated); + return bisactivated; + } + else + { + return BisHighContrastModeActivated.booleanValue(); + } + } + else + { + return false; + } + } + + private static int getRedColorShare(int _nColor) + { + int nRed = _nColor / 65536; + return nRed; + } + + private static int getGreenColorShare(int _nColor) + { + int nRedModulo = _nColor % 65536; + int nGreen = nRedModulo / 256; + return nGreen; + } + + private static int getBlueColorShare(int _nColor) + { + int nRedModulo = _nColor % 65536; + int nGreenModulo = (nRedModulo % 256); + int nBlue = nGreenModulo; + return nBlue; + } + + public static short getListBoxLineCount() + { + return (short)20; + } +} diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog.py b/wizards/com/sun/star/wizards/ui/UnoDialog.py new file mode 100644 index 000000000..37376f1ee --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UnoDialog.py @@ -0,0 +1,254 @@ +# +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback +from .PeerConfig import PeerConfig +from .UIConsts import UIConsts +from ..common.PropertyNames import PropertyNames + +from com.sun.star.awt import Rectangle +from com.sun.star.awt.PosSize import POS + +class UnoDialog(object): + + createDict = False + dictProperties = None + BisHighContrastModeActivated = None + xVclWindowPeer = None + + def __init__(self, xMSF, PropertyNames, PropertyValues): + try: + self.xMSF = xMSF + self.ControlList = {} + self.xDialogModel = xMSF.createInstance( + "com.sun.star.awt.UnoControlDialogModel") + self.xUnoDialog = xMSF.createInstance( + "com.sun.star.awt.UnoControlDialog") + self.xUnoDialog.setModel(self.xDialogModel) + self.m_oPeerConfig = None + self.xWindowPeer = None + except Exception: + traceback.print_exc() + + # repaints the currentDialogStep + def repaintDialogStep(self): + try: + ncurstep = int(self.xDialogModel.Step) + self.xDialogModel.Step = 99 + self.xDialogModel.Step = ncurstep + except Exception: + traceback.print_exc() + + def insertControlModel(self, serviceName, componentName, sPropNames, oPropValues): + try: + xControlModel = self.xDialogModel.createInstance(serviceName) + uno.invoke(xControlModel, "setPropertyValues", + (sPropNames, oPropValues)) + self.xDialogModel.insertByName(componentName, xControlModel) + xControlModel.Name = componentName + except Exception: + traceback.print_exc() + + aObj = self.xUnoDialog.getControl(componentName) + return aObj + + def setFocus(self, ControlName): + oFocusControl = self.xUnoDialog.getControl(ControlName) + oFocusControl.setFocus() + + def calculateDialogPosition(self, FramePosSize): + # Todo:check if it would be useful or possible to create a dialog peer + # that can be used for the messageboxes to + # maintain modality when they pop up. + CurPosSize = self.xUnoDialog.getPosSize() + WindowHeight = FramePosSize.Height + WindowWidth = FramePosSize.Width + DialogWidth = CurPosSize.Width + DialogHeight = CurPosSize.Height + iXPos = ((WindowWidth / 2) - (DialogWidth / 2)) + iYPos = ((WindowHeight / 2) - (DialogHeight / 2)) + self.xUnoDialog.setPosSize( + iXPos, iYPos, DialogWidth, DialogHeight, POS) + + ''' + @param FramePosSize + @return 0 for cancel, 1 for ok + @throws com.sun.star.uno.Exception + ''' + + def executeDialog(self, FramePosSize): + if self.xUnoDialog.getPeer() is None: + raise AttributeError( + "Please create a peer, using your own frame") + + self.calculateDialogPosition(FramePosSize) + + if self.xWindowPeer is None: + self.createWindowPeer() + + self.xVclWindowPeer = self.xWindowPeer + self.BisHighContrastModeActivated = self.isHighContrastModeActivated() + return self.xUnoDialog.execute() + + def setVisible(self, parent): + self.calculateDialogPosition(parent.xUnoDialog.getPosSize()) + if self.xWindowPeer == None: + self.createWindowPeer() + + self.xUnoDialog.setVisible(True) + + ''' + @param XComponent + @return 0 for cancel, 1 for ok + @throws com.sun.star.uno.Exception + ''' + + def executeDialogFromComponent(self, xComponent): + if xComponent is not None: + w = xComponent.ComponentWindow + if w is not None: + return self.executeDialog(w.PosSize) + + return self.executeDialog( Rectangle (0, 0, 640, 400)) + + ''' + create a peer for this + dialog, using the given + peer as a parent. + @param parentPeer + @return + @throws java.lang.Exception + ''' + + def createWindowPeer(self, parentPeer=None): + self.xUnoDialog.setVisible(False) + xToolkit = self.xMSF.createInstance("com.sun.star.awt.Toolkit") + if parentPeer is None: + parentPeer = xToolkit.getDesktopWindow() + + self.xUnoDialog.createPeer(xToolkit, parentPeer) + self.xWindowPeer = self.xUnoDialog.getPeer() + return self.xUnoDialog.getPeer() + + @classmethod + def setEnabled(self, control, enabled): + control.Model.Enabled = enabled + + @classmethod + def getModel(self, control): + return control.getModel() + + @classmethod + def getDisplayProperty(self, xServiceInfo): + if xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlFixedTextModel"): + return PropertyNames.PROPERTY_LABEL + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlButtonModel"): + return PropertyNames.PROPERTY_LABEL + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlCurrencyFieldModel"): + return "Value" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlDateFieldModel"): + return "Date" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlFixedLineModel"): + return PropertyNames.PROPERTY_LABEL + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlFormattedFieldModel"): + return "EffectiveValue" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlNumericFieldModel"): + return "Value" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlPatternFieldModel"): + return "Text" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlProgressBarModel"): + return "ProgressValue" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlTimeFieldModel"): + return "Time" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlImageControlModel"): + return PropertyNames.PROPERTY_IMAGEURL + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlRadioButtonModel"): + return PropertyNames.PROPERTY_STATE + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlCheckBoxModel"): + return PropertyNames.PROPERTY_STATE + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlEditModel"): + return "Text" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlComboBoxModel"): + return "Text" + elif xServiceInfo.supportsService( + "com.sun.star.awt.UnoControlListBoxModel"): + return "SelectedItems" + else: + return "" + + def isHighContrastModeActivated(self): + if (self.xVclWindowPeer is not None): + if (self.BisHighContrastModeActivated is None): + nUIColor = 0 + try: + nUIColor = self.xVclWindowPeer.getProperty("DisplayBackgroundColor") + except Exception: + traceback.print_exc() + return False + + # TODO: The following methods could be wrapped in an own class implementation + nRed = self.getRedColorShare(nUIColor) + nGreen = self.getGreenColorShare(nUIColor) + nBlue = self.getBlueColorShare(nUIColor) + nLuminance = ((nBlue * 28 + nGreen * 151 + nRed * 77) / 256) + bisactivated = (nLuminance <= 25) + self.BisHighContrastModeActivated = bool(bisactivated) + return bisactivated; + else: + return self.BisHighContrastModeActivated + else: + return False + + + def getRedColorShare(self, _nColor): + nRed = _nColor / 65536 + nRedModulo = _nColor % 65536 + nGreen = nRedModulo / 256 + nGreenModulo = (nRedModulo % 256) + nBlue = nGreenModulo + return nRed + + def getGreenColorShare(self, _nColor): + nRed = _nColor / 65536 + nRedModulo = _nColor % 65536 + nGreen = nRedModulo / 256 + return nGreen + + def getBlueColorShare(self, _nColor): + nRed = _nColor / 65536 + nRedModulo = _nColor % 65536 + nGreen = nRedModulo / 256 + nGreenModulo = (nRedModulo % 256) + nBlue = nGreenModulo + return nBlue diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog2.java b/wizards/com/sun/star/wizards/ui/UnoDialog2.java new file mode 100644 index 000000000..24064585a --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UnoDialog2.java @@ -0,0 +1,195 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import com.sun.star.awt.XActionListener; +import com.sun.star.awt.XButton; +import com.sun.star.awt.XCheckBox; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XItemListener; +import com.sun.star.awt.XListBox; +import com.sun.star.awt.XRadioButton; +import com.sun.star.awt.XTextComponent; +import com.sun.star.awt.XTextListener; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.SystemDialog; + +/** + * This class contains convenience methods for inserting components to a dialog. + * <p>It was created for use with the automatic conversion of Basic XML Dialog + * description files to a Java class which builds the same dialog through the UNO API.</p> + * <p>It uses an Event-Listener method, which calls a method through reflection + * when an event on a component is triggered. + * see the classes CommonListener, MethodInvocation for details.</p> + */ +public class UnoDialog2 extends UnoDialog +{ + + public UnoDialog2(XMultiServiceFactory xmsf) + { + super(xmsf); + } + + public XButton insertButton(String sName, XActionListener actionListener, String[] sPropNames, Object[] oPropValues) + { + XButton xButton = (XButton) insertControlModel2("com.sun.star.awt.UnoControlButtonModel", sName, sPropNames, oPropValues, XButton.class); + + if (actionListener != null) + { + xButton.addActionListener(actionListener); + } + return xButton; + } + + public XButton insertImageButton(String sName, com.sun.star.awt.XActionListener actionPerformed, String[] sPropNames, Object[] oPropValues) + { + XButton xButton = (XButton) insertControlModel2("com.sun.star.awt.UnoControlButtonModel", sName, sPropNames, oPropValues, XButton.class); + + if (actionPerformed != null) + { + xButton.addActionListener(actionPerformed); + } + return xButton; + } + + public XCheckBox insertCheckBox(String sName, XItemListener itemListener, String[] sPropNames, Object[] oPropValues) + { + XCheckBox xCheckBox = (XCheckBox) insertControlModel2("com.sun.star.awt.UnoControlCheckBoxModel", sName, sPropNames, oPropValues, XCheckBox.class); + + if (itemListener != null) + { + xCheckBox.addItemListener(itemListener); + } + return xCheckBox; + } + + public XListBox insertListBox(String sName, XActionListener actionListener, XItemListener itemListener, String[] sPropNames, Object[] oPropValues) + { + XListBox xListBox = (XListBox) insertControlModel2("com.sun.star.awt.UnoControlListBoxModel", sName, sPropNames, oPropValues, XListBox.class); + if (actionListener != null) + { + xListBox.addActionListener(actionListener); + } + if (itemListener != null) + { + xListBox.addItemListener(itemListener); + } + return xListBox; + } + + public XRadioButton insertRadioButton(String sName, XItemListener itemListener, String[] sPropNames, Object[] oPropValues) + { + XRadioButton xRadioButton = (XRadioButton) insertControlModel2("com.sun.star.awt.UnoControlRadioButtonModel", sName, sPropNames, oPropValues, XRadioButton.class); + if (itemListener != null) + { + xRadioButton.addItemListener(itemListener); + } + return xRadioButton; + } + + + + public XTextComponent insertTextField(String sName, XTextListener textListener, String[] sPropNames, Object[] oPropValues) + { + return (XTextComponent) insertEditField(sName, textListener, "com.sun.star.awt.UnoControlEditModel", sPropNames, oPropValues, XTextComponent.class); + } + + private XControl insertImage(String sName, String[] sPropNames, Object[] oPropValues) + { + return (XControl) insertControlModel2("com.sun.star.awt.UnoControlImageControlModel", sName, sPropNames, oPropValues, XControl.class); + } + + public XControl insertInfoImage(int _posx, int _posy, int _iStep) + { + XControl xImgControl = insertImage(Desktop.getUniqueName(getDlgNameAccess(), "imgHint"), + new String[] + { + PropertyNames.PROPERTY_BORDER, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_IMAGEURL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "ScaleImage", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Short.valueOf((short) 0), 10, UIConsts.INFOIMAGEURL, Integer.valueOf(_posx), Integer.valueOf(_posy), Boolean.FALSE, Integer.valueOf(_iStep), 10 + }); + super.getPeerConfiguration().setImageUrl(getModel(xImgControl), UIConsts.INFOIMAGEURL); + return xImgControl; + } + + /** + * This method is used for creating Edit, Currency, Date, Formatted, Pattern, File + * and Time edit components. + */ + private Object insertEditField(String sName, XTextListener textListener, String sModelClass, String[] sPropNames, Object[] oPropValues, Class<? extends XInterface> type) + { + XTextComponent xField = (XTextComponent) insertControlModel2(sModelClass, sName, sPropNames, oPropValues, XTextComponent.class); + if (textListener != null) + { + xField.addTextListener(textListener); + } + return UnoRuntime.queryInterface(type, xField); + } + + public XControl insertFixedLine(String sName, String[] sPropNames, Object[] oPropValues) + { + Object oLine = insertControlModel2("com.sun.star.awt.UnoControlFixedLineModel", sName, sPropNames, oPropValues); + return UnoRuntime.queryInterface(XControl.class, oLine); + } + + + + + + + + private Object insertControlModel2(String serviceName, String componentName, String[] sPropNames, Object[] oPropValues) + { + try + { + XInterface xControlModel = insertControlModel(serviceName, componentName, new String[] + { + }, new Object[] + { + }); + Helper.setUnoPropertyValues(xControlModel, sPropNames, oPropValues); + Helper.setUnoPropertyValue(xControlModel, PropertyNames.PROPERTY_NAME, componentName); + } + catch (Exception ex) + { + ex.printStackTrace(); + } + return xDlgContainer.getControl(componentName); + } + + private Object insertControlModel2(String serviceName, String componentName, String[] sPropNames, Object[] oPropValues, Class<? extends XInterface> type) + { + return UnoRuntime.queryInterface(type, insertControlModel2(serviceName, componentName, sPropNames, oPropValues)); + } + + + + + + public int showMessageBox(String windowServiceName, int windowAttribute, String MessageText) + { + return SystemDialog.showMessageBox(xMSF, this.xControl.getPeer(), windowServiceName, windowAttribute, MessageText); + } +} diff --git a/wizards/com/sun/star/wizards/ui/UnoDialog2.py b/wizards/com/sun/star/wizards/ui/UnoDialog2.py new file mode 100644 index 000000000..42aee8c5f --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/UnoDialog2.py @@ -0,0 +1,204 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .UnoDialog import UnoDialog, UIConsts +from ..common.Desktop import Desktop +from ..common.PropertyNames import PropertyNames +from ..common.SystemDialog import SystemDialog +from .event.CommonListener import ItemListenerProcAdapter, \ + ActionListenerProcAdapter, TextListenerProcAdapter, \ + AdjustmentListenerProcAdapter + +''' +This class contains convenience methods for inserting components to a dialog. +It was created for use with the automatic conversion of Basic XML Dialog +description files to a Java class which builds +the same dialog through the UNO API.<br/> +It uses an Event-Listener method, which calls a method through reflection +when an event on a component is triggered. +see the classes CommonListener for details +''' + +class UnoDialog2(UnoDialog): + + ''' + Override this method to return another listener. + @return + ''' + + def __init__(self, xmsf): + super(UnoDialog2,self).__init__(xmsf,(), ()) + ControlList = {} + + def insertButton( + self, sName, actionPerformed, sPropNames, oPropValues, listener): + xButton = self.insertControlModel( + "com.sun.star.awt.UnoControlButtonModel", + sName, sPropNames, oPropValues) + if actionPerformed is not None: + actionPerformed = getattr(listener, actionPerformed) + xButton.addActionListener( + ActionListenerProcAdapter(actionPerformed)) + + return xButton + + def insertCheckBox( + self, sName, itemChanged, sPropNames, oPropValues, listener): + xCheckBox = self.insertControlModel( + "com.sun.star.awt.UnoControlCheckBoxModel", + sName, sPropNames, oPropValues) + if itemChanged is not None: + itemChanged = getattr(listener, itemChanged) + xCheckBox.addItemListener(ItemListenerProcAdapter(itemChanged)) + + return xCheckBox + + def insertComboBox( + self, sName, actionPerformed, itemChanged, + textChanged, sPropNames, oPropValues, listener): + xComboBox = self.insertControlModel( + "com.sun.star.awt.UnoControlComboBoxModel", + sName, sPropNames, oPropValues) + if actionPerformed is not None: + actionPerformed = getattr(listener, actionPerformed) + xComboBox.addActionListener( + ActionListenerProcAdapter(actionPerformed)) + + if itemChanged is not None: + itemChanged = getattr(listener, itemChanged) + xComboBox.addItemListener(ItemListenerProcAdapter(itemChanged)) + + if textChanged is not None: + textChanged = getattr(listener, textChanged) + xComboBox.addTextListener(TextListenerProcAdapter(textChanged)) + + return xComboBox + + def insertListBox( + self, sName, actionPerformed, itemChanged, + sPropNames, oPropValues, listener): + xListBox = self.insertControlModel( + "com.sun.star.awt.UnoControlListBoxModel", + sName, sPropNames, oPropValues) + + if itemChanged is not None: + itemChanged = getattr(listener, itemChanged) + xListBox.addItemListener(ItemListenerProcAdapter(itemChanged)) + + return xListBox + + def insertRadioButton( + self, sName, itemChanged, sPropNames, oPropValues, listener): + xRadioButton = self.insertControlModel( + "com.sun.star.awt.UnoControlRadioButtonModel", + sName, sPropNames, oPropValues) + if itemChanged is not None: + itemChanged = getattr(listener, itemChanged) + xRadioButton.addItemListener( + ItemListenerProcAdapter(itemChanged)) + + return xRadioButton + + def insertTextField( + self, sName, sTextChanged, sPropNames, oPropValues, listener): + return self.insertEditField( + sName, sTextChanged, "com.sun.star.awt.UnoControlEditModel", + sPropNames, oPropValues, listener) + + def insertImage(self, sName, sPropNames, oPropValues): + return self.insertControlModel( + "com.sun.star.awt.UnoControlImageControlModel", + sName, sPropNames, oPropValues) + + def insertInfoImage(self, _posx, _posy, _iStep): + xImgControl = self.insertImage( + Desktop.getUniqueName(self.xDialogModel, "imgHint"), + ("Border", + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_IMAGEURL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, "ScaleImage", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH), + (0, 10, UIConsts.INFOIMAGEURL, _posx, _posy, False, _iStep, 10)) + return xImgControl + + ''' + This method is used for creating Edit, Currency, Date, Formatted, + Pattern, File and Time edit components. + ''' + + def insertEditField( + self, sName, sTextChanged, sModelClass, + sPropNames, oPropValues, listener): + xField = self.insertControlModel(sModelClass, + sName, sPropNames, oPropValues) + if sTextChanged is not None: + sTextChanged = getattr(listener, sTextChanged) + xField.addTextListener(TextListenerProcAdapter(sTextChanged)) + return xField + + def insertDateField( + self, sName, sTextChanged, sPropNames, oPropValues, listener): + return self.insertEditField( + sName, sTextChanged, + "com.sun.star.awt.UnoControlDateFieldModel", + sPropNames, oPropValues, listener) + + def insertNumericField( + self, sName, sTextChanged, sPropNames, oPropValues, listener): + return self.insertEditField( + sName, sTextChanged, + "com.sun.star.awt.UnoControlNumericFieldModel", + sPropNames, oPropValues, listener) + + def insertTimeField( + self, sName, sTextChanged, sPropNames, oPropValues, listener): + return self.insertEditField( + sName, sTextChanged, + "com.sun.star.awt.UnoControlTimeFieldModel", + sPropNames, oPropValues, listener) + + def insertFixedLine(self, sName, sPropNames, oPropValues): + oLine = self.insertControlModel( + "com.sun.star.awt.UnoControlFixedLineModel", + sName, sPropNames, oPropValues) + return oLine + + def insertLabel(self, sName, sPropNames, oPropValues): + oFixedText = self.insertControlModel( + "com.sun.star.awt.UnoControlFixedTextModel", + sName, sPropNames, oPropValues) + return oFixedText + + def insertScrollBar(self, sName, sPropNames, oPropValues, + iControlKey, listener): + oScrollBar = self.insertControlModel( + "com.sun.star.awt.UnoControlScrollBarModel", + sName, sPropNames, oPropValues) + if listener is not None: + method = getattr(listener, "scrollControls") + oScrollBar.addAdjustmentListener( + AdjustmentListenerProcAdapter(method)) + if self.ControlList is not None: + self.ControlList[sName] = iControlKey + return oScrollBar + + def showMessageBox(self, windowServiceName, windowAttribute, MessageText): + return SystemDialog.showMessageBox( + super().xMSF, self.xControl.Peer, + windowServiceName, windowAttribute, MessageText) diff --git a/wizards/com/sun/star/wizards/ui/WizardDialog.java b/wizards/com/sun/star/wizards/ui/WizardDialog.java new file mode 100644 index 000000000..69fbf5ab7 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/WizardDialog.java @@ -0,0 +1,685 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui; + +import java.beans.VetoableChangeListener; +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.FontDescriptor; +import com.sun.star.awt.PushButtonType; +import com.sun.star.awt.XControl; +import com.sun.star.awt.XItemEventBroadcaster; +import com.sun.star.awt.XTopWindow; +import com.sun.star.beans.XPropertySet; +import com.sun.star.container.XIndexContainer; +import com.sun.star.frame.TerminationVetoException; +import com.sun.star.frame.XTerminateListener; +import com.sun.star.lang.EventObject; +import com.sun.star.lang.IllegalArgumentException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.lang.XSingleServiceFactory; +import com.sun.star.uno.AnyConverter; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.uno.XInterface; +import com.sun.star.wizards.common.Desktop; +import com.sun.star.wizards.common.HelpIds; +import com.sun.star.wizards.common.Helper; +import com.sun.star.wizards.common.PropertyNames; +import com.sun.star.wizards.common.Resource; +import com.sun.star.wizards.ui.event.XActionListenerAdapter; +import com.sun.star.wizards.ui.event.XItemListenerAdapter; + +public abstract class WizardDialog extends UnoDialog2 implements VetoableChangeListener, XTerminateListener +{ + + private static final int iButtonWidth = 50; + private int nNewStep = 1; + private int nOldStep = 1; + private int nMaxStep = 1; + private String[] sRMItemLabels; + private Object oRoadmap; + private XSingleServiceFactory xSSFRoadmap; + public XIndexContainer xIndexContRoadmap; + private final Resource oWizardResource; + private final int hid; + private boolean bTerminateListenermustberemoved = true; + + /** Creates a new instance of WizardDialog + * the hid is used as following : + * "HID:(hid)" - the dialog + * "HID:(hid+1) - the help button + * "HID:(hid+2)" - the back button + * "HID:(hid+3)" - the next button + * "HID:(hid+4)" - the create button + * "HID:(hid+5)" - the cancel button + */ + public WizardDialog(XMultiServiceFactory xMSF, int hid_) + { + super(xMSF); + hid = hid_; + oWizardResource = new Resource(xMSF); + oWizardResource.getResText("RID_DB_COMMON_33"); + } + + @Override + public Resource getResource() + { + return oWizardResource; + } + + private void activate() + { + try + { + XTopWindow top = UnoRuntime.queryInterface(XTopWindow.class, xWindow); + if (top != null) + { + top.toFront(); + } + } + catch (Exception ex) + { + // do nothing; + } + } + + public void setMaxStep(int i) + { + nMaxStep = i; + } + + public int getNewStep() + { + return nNewStep; + } + + /** + * @see java.beans.VetoableChangeListener#vetoableChange(java.beans.PropertyChangeEvent) + */ + public void vetoableChange(java.beans.PropertyChangeEvent arg0) + { + nNewStep = nOldStep; + } + + public void setRoadmapInteractive(boolean _bInteractive) + { + Helper.setUnoPropertyValue(oRoadmap, "Activated", Boolean.valueOf(_bInteractive)); + } + + public void setRoadmapComplete(boolean bComplete) + { + Helper.setUnoPropertyValue(oRoadmap, "Complete", Boolean.valueOf(bComplete)); + } + + private boolean isRoadmapComplete() + { + try + { + return AnyConverter.toBoolean(Helper.getUnoPropertyValue(oRoadmap, "Complete")); + } + catch (IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return false; + } + } + + public void setCurrentRoadmapItemID(short ID) + { + if (oRoadmap != null) + { + int nCurItemID = getCurrentRoadmapItemID(); + if (nCurItemID != ID) + { + Helper.setUnoPropertyValue(oRoadmap, "CurrentItemID", Short.valueOf(ID)); + } + } + } + + private int getCurrentRoadmapItemID() + { + try + { + return AnyConverter.toInt(Helper.getUnoPropertyValue(oRoadmap, "CurrentItemID")); + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return -1; + } + } + + public void addRoadmap() + { + try + { + int iDialogHeight = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_HEIGHT)).intValue(); + + // the roadmap control has got no real TabIndex ever + // that is not correct, but changing this would need time, so it is used + // without TabIndex as before + oRoadmap = insertControlModel("com.sun.star.awt.UnoControlRoadmapModel", "rdmNavi", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + "Tabstop", + PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(iDialogHeight - 26), + 0, + 0, + 0, + Short.valueOf((short)0), + Boolean.TRUE, + 85 + }); + XPropertySet xPSet = UnoRuntime.queryInterface(XPropertySet.class, oRoadmap); + xPSet.setPropertyValue(PropertyNames.PROPERTY_NAME, "rdmNavi"); + + xSSFRoadmap = UnoRuntime.queryInterface(XSingleServiceFactory.class, oRoadmap); + xIndexContRoadmap = UnoRuntime.queryInterface(XIndexContainer.class, oRoadmap); + + XControl xRoadmapControl = this.xDlgContainer.getControl("rdmNavi"); + XItemEventBroadcaster xRoadmapBroadcaster = UnoRuntime.queryInterface(XItemEventBroadcaster.class, xRoadmapControl); + xRoadmapBroadcaster.addItemListener(new XItemListenerAdapter() { + @Override + public void itemStateChanged(com.sun.star.awt.ItemEvent itemEvent) { + try + { + nNewStep = itemEvent.ItemId; + nOldStep = AnyConverter.toInt(Helper.getUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP)); + if (nNewStep != nOldStep) + { + switchToStep(); + } + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + } + } + }); + + Helper.setUnoPropertyValue(oRoadmap, "Text", oWizardResource.getResText("RID_COMMON_16")); + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + } + + public void setRMItemLabels(Resource _oResource) + { + sRMItemLabels = new String[nMaxStep]; + for (int i = 0; i < nMaxStep; ++i) { + sRMItemLabels[i] = _oResource.getResText("RID_QUERY_" + String.valueOf(i + 80)); + } + } + + public int insertRoadmapItem(int _Index, boolean _bEnabled, int _LabelID, int _CurItemID) + { + return insertRoadmapItem(_Index, _bEnabled, sRMItemLabels[_LabelID], _CurItemID); + } + + public int insertRoadmapItem(int Index, boolean _bEnabled, String _sLabel, int _CurItemID) + { + try + { + Object oRoadmapItem = xSSFRoadmap.createInstance(); + Helper.setUnoPropertyValue(oRoadmapItem, PropertyNames.PROPERTY_LABEL, _sLabel); + Helper.setUnoPropertyValue(oRoadmapItem, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bEnabled)); + Helper.setUnoPropertyValue(oRoadmapItem, "ID", Integer.valueOf(_CurItemID)); + xIndexContRoadmap.insertByIndex(Index, oRoadmapItem); + return Index + 1; + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return -1; + } + } + + public int getRMItemCount() + { + return xIndexContRoadmap.getCount(); + } + + public XInterface getRoadmapItemByID(int _ID) + { + try + { + int CurID; + XInterface CurRoadmapItem; + for (int i = 0; i < xIndexContRoadmap.getCount(); i++) + { + CurRoadmapItem = (XInterface) xIndexContRoadmap.getByIndex(i); + CurID = AnyConverter.toInt(Helper.getUnoPropertyValue(CurRoadmapItem, "ID")); + if (CurID == _ID) + { + return CurRoadmapItem; + } + } + return null; + } + catch (com.sun.star.uno.Exception exception) + { + exception.printStackTrace(System.err); + return null; + } + } + + public boolean switchToStep(int _nOldStep, int _nNewStep) + { + nOldStep = _nOldStep; + nNewStep = _nNewStep; + return switchToStep(); + } + + private boolean switchToStep() + { + leaveStep(nOldStep, nNewStep); + if (nNewStep != nOldStep) + { + if (nNewStep == nMaxStep) + { + setControlProperty("btnWizardNext", "DefaultButton", Boolean.FALSE); + setControlProperty("btnWizardFinish", "DefaultButton", Boolean.TRUE); + } + else + { + setControlProperty("btnWizardNext", "DefaultButton", Boolean.TRUE); + setControlProperty("btnWizardFinish", "DefaultButton", Boolean.FALSE); + } + changeToStep(nNewStep); + enterStep(nOldStep, nNewStep); + return true; + } + return false; + } + + abstract protected void leaveStep(int nOldStep, int nNewStep); + + abstract protected void enterStep(int nOldStep, int nNewStep); + + private void changeToStep(int nNewStep) + { + Helper.setUnoPropertyValue(xDialogModel, PropertyNames.PROPERTY_STEP, Integer.valueOf(nNewStep)); + setCurrentRoadmapItemID((short) (nNewStep)); + enableNextButton(getNextAvailableStep() > 0); + enableBackButton(nNewStep != 1); + } + + + public void drawNaviBar() + { + + try + { + short curtabindex = UIConsts.SOFIRSTWIZARDNAVITABINDEX; + Integer IButtonWidth = Integer.valueOf(iButtonWidth); + int iButtonHeight = 14; + Integer IButtonHeight = Integer.valueOf(iButtonHeight); + Integer ICurStep = 0; + int iDialogHeight = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_HEIGHT)).intValue(); + int iDialogWidth = ((Integer) Helper.getUnoPropertyValue(this.xDialogModel, PropertyNames.PROPERTY_WIDTH)).intValue(); + int iHelpPosX = 8; + int iBtnPosY = iDialogHeight - iButtonHeight - 6; + int iCancelPosX = iDialogWidth - iButtonWidth - 6; + int iFinishPosX = iCancelPosX - 6 - iButtonWidth; + int iNextPosX = iFinishPosX - 6 - iButtonWidth; + int iBackPosX = iNextPosX - 3 - iButtonWidth; + + insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "lnNaviSep", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + 1, 0, 0, Integer.valueOf(iDialogHeight - 26), ICurStep, Integer.valueOf(iDialogWidth) + }); + + insertControlModel("com.sun.star.awt.UnoControlFixedLineModel", "lnRoadSep", + new String[] + { + PropertyNames.PROPERTY_HEIGHT, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + Integer.valueOf(iBtnPosY - 6), 1, 85, 0, ICurStep, 1 + }); + + String[] propNames = new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "PushButtonType", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }; + + Helper.setUnoPropertyValue(super.xDialogModel, PropertyNames.PROPERTY_HELPURL, HelpIds.getHelpIdString(hid)); + insertButton("btnWizardHelp", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + callHelp(); + } + }, new String[] + { + PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, "PushButtonType", PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + true, IButtonHeight, oWizardResource.getResText("RID_COMMON_15"), Integer.valueOf(iHelpPosX), Integer.valueOf(iBtnPosY), Short.valueOf((short) PushButtonType.HELP_value), ICurStep, Short.valueOf(curtabindex++), IButtonWidth + }); + insertButton("btnWizardBack", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + gotoPreviousAvailableStep(); + } + }, propNames, + new Object[] + { + false, IButtonHeight, HelpIds.getHelpIdString(hid + 2), oWizardResource.getResText("RID_COMMON_13"), Integer.valueOf(iBackPosX), Integer.valueOf(iBtnPosY), Short.valueOf((short) PushButtonType.STANDARD_value), ICurStep, Short.valueOf(curtabindex++), IButtonWidth + }); + + insertButton("btnWizardNext", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + gotoNextAvailableStep(); + } + }, propNames, + new Object[] + { + true, IButtonHeight, HelpIds.getHelpIdString(hid + 3), oWizardResource.getResText("RID_COMMON_14"), Integer.valueOf(iNextPosX), Integer.valueOf(iBtnPosY), Short.valueOf((short) PushButtonType.STANDARD_value), ICurStep, Short.valueOf(curtabindex++), IButtonWidth + }); + + insertButton("btnWizardFinish", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + finishWizard_1(); + } + }, propNames, + new Object[] + { + true, IButtonHeight, HelpIds.getHelpIdString(hid + 4), oWizardResource.getResText("RID_COMMON_12"), Integer.valueOf(iFinishPosX), Integer.valueOf(iBtnPosY), Short.valueOf((short) PushButtonType.STANDARD_value), ICurStep, Short.valueOf(curtabindex++), IButtonWidth + }); + + insertButton("btnWizardCancel", new XActionListenerAdapter() { + @Override + public void actionPerformed(ActionEvent event) { + cancelWizard_1(); + } + }, propNames, + new Object[] + { + true, IButtonHeight, HelpIds.getHelpIdString(hid + 5), oWizardResource.getResText("RID_COMMON_11"), Integer.valueOf(iCancelPosX), Integer.valueOf(iBtnPosY), Short.valueOf((short) PushButtonType.STANDARD_value), ICurStep, Short.valueOf(curtabindex++), IButtonWidth + }); + + setControlProperty("btnWizardNext", "DefaultButton", Boolean.TRUE); + } + catch (java.lang.Exception jexception) + { + jexception.printStackTrace(System.err); + } + } + + + + public void enableNavigationButtons(boolean _bEnableBack, boolean _bEnableNext, boolean _bEnableFinish) + { + enableBackButton(_bEnableBack); + enableNextButton(_bEnableNext); + enableFinishButton(_bEnableFinish); + } + + private void enableBackButton(boolean enabled) + { + setControlProperty("btnWizardBack", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); + } + + public void enableNextButton(boolean enabled) + { + setControlProperty("btnWizardNext", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); + } + + public void enableFinishButton(boolean enabled) + { + setControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED, enabled ? Boolean.TRUE : Boolean.FALSE); + } + + public void setStepEnabled(int _nStep, boolean bEnabled) + { + XInterface xRoadmapItem = getRoadmapItemByID(_nStep); + if (xRoadmapItem != null) + { + Helper.setUnoPropertyValue(xRoadmapItem, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bEnabled)); + } + } + + public void enablefromStep(int _iStep, boolean _bDoEnable) + { + if (_iStep <= this.nMaxStep) + { + for (int i = _iStep; i <= nMaxStep; i++) + { + setStepEnabled(i, _bDoEnable); + } + enableFinishButton(_bDoEnable); + if (!_bDoEnable) + { + enableNextButton(_iStep > getCurrentStep() + 1); + } + else + { + enableNextButton(getCurrentStep() != nMaxStep); + } + } + } + + private boolean isStepEnabled(int _nStep) + { + try + { + boolean bIsEnabled; + XInterface xRoadmapItem = getRoadmapItemByID(_nStep); + if (xRoadmapItem == null) + // Todo: In this case an exception should be thrown + { + return false; + } + bIsEnabled = AnyConverter.toBoolean(Helper.getUnoPropertyValue(xRoadmapItem, PropertyNames.PROPERTY_ENABLED)); + return bIsEnabled; + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return false; + } + } + + private synchronized void gotoPreviousAvailableStep() + { + boolean bIsEnabled; + if (nNewStep > 1) + { + nOldStep = nNewStep; + nNewStep--; + while (nNewStep > 0) + { + bIsEnabled = isStepEnabled(nNewStep); + if (bIsEnabled) + { + break; + } + nNewStep--; + } + if (nNewStep == 0) // Exception??? + { + nNewStep = nOldStep; + } + switchToStep(); + } + } + + //TODO discuss with rp + private int getNextAvailableStep() + { + if (isRoadmapComplete()) + { + for (int i = nNewStep + 1; i <= nMaxStep; i++) + { + if (isStepEnabled(i)) + { + return i; + } + } + } + return -1; + } + + private synchronized void gotoNextAvailableStep() + { + nOldStep = nNewStep; + nNewStep = getNextAvailableStep(); + if (nNewStep > -1) + { + switchToStep(); + } + } + + public abstract boolean finishWizard(); + + /** + * This function will call if the finish button is pressed on the UI. + */ + private void finishWizard_1() + { + enableFinishButton(false); + boolean success = false; + try + { + success = finishWizard(); + } + finally + { + if ( !success ) + enableFinishButton( true ); + } + if ( success ) + removeTerminateListener(); + } + + public int getCurrentStep() + { + try + { + return AnyConverter.toInt(Helper.getUnoPropertyValue(this.MSFDialogModel, PropertyNames.PROPERTY_STEP)); + } + catch (com.sun.star.lang.IllegalArgumentException exception) + { + exception.printStackTrace(System.err); + return -1; + } + } + + public void setCurrentStep(int _nNewstep) + { + nNewStep = _nNewstep; + changeToStep(nNewStep); + } + + public void setRightPaneHeaders(Resource _oResource, String ResNameBase, int StartResID, int _nMaxStep) + { + String[] sRightPaneHeaders = new String[_nMaxStep]; + for (int i = 0; i < _nMaxStep; ++i) { + sRightPaneHeaders[i] = _oResource.getResText(ResNameBase + String.valueOf(i + StartResID)); + } + setRightPaneHeaders(sRightPaneHeaders); + } + + public void setRightPaneHeaders(String[] _sRightPaneHeaders) + { + this.nMaxStep = _sRightPaneHeaders.length; + FontDescriptor oFontDesc = new FontDescriptor(); + oFontDesc.Weight = com.sun.star.awt.FontWeight.BOLD; + + for (int i = 0; i < _sRightPaneHeaders.length; i++) + { + insertLabel("lblQueryTitle" + i, + new String[] + { + PropertyNames.FONT_DESCRIPTOR, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_LABEL, PropertyNames.PROPERTY_MULTILINE, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_TABINDEX, PropertyNames.PROPERTY_WIDTH + }, + new Object[] + { + oFontDesc, 16, _sRightPaneHeaders[i], Boolean.TRUE, 91, 8, Integer.valueOf(i + 1), Short.valueOf((short) 12), 212 + }); + } + } + + public void cancelWizard() + { + //can be overridden by extending class + xDialog.endExecute(); + } + + private void callHelp() + { + //should be overridden by extending class + } + + private void removeTerminateListener() + { + if (bTerminateListenermustberemoved) + { + Desktop.getDesktop(xMSF).removeTerminateListener(this); + bTerminateListenermustberemoved = false; + } + } + + /** + * called by the cancel button and + * by the window hidden event. + * if this method was not called before, + * perform a cancel. + */ + private void cancelWizard_1() + { + cancelWizard(); + removeTerminateListener(); + } + + public void notifyTermination(EventObject arg0) + { + cancelWizard_1(); + } + + public void queryTermination(EventObject arg0) + throws TerminationVetoException + { + activate(); + throw new TerminationVetoException(); + } + + public void disposing(EventObject arg0) + { + cancelWizard_1(); + } +} diff --git a/wizards/com/sun/star/wizards/ui/WizardDialog.py b/wizards/com/sun/star/wizards/ui/WizardDialog.py new file mode 100644 index 000000000..7f0060bdc --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/WizardDialog.py @@ -0,0 +1,447 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +import traceback +from abc import ABCMeta, abstractmethod +from .UnoDialog2 import UnoDialog2, Desktop, PropertyNames, UIConsts, \ + ItemListenerProcAdapter +from ..common.HelpIds import HelpIds +from ..common.FileAccess import FileAccess + +from com.sun.star.lang import NoSuchMethodException +from com.sun.star.frame import TerminationVetoException +from com.sun.star.awt.PushButtonType import HELP, STANDARD +from com.sun.star.awt.FontWeight import BOLD + +import imp, os +imp.load_source('strings', os.path.join(os.path.dirname(__file__), '../common/strings.hrc')) +import strings + +class WizardDialog(UnoDialog2): + + __metaclass__ = ABCMeta + + __NEXT_ACTION_PERFORMED = "gotoNextAvailableStep" + __BACK_ACTION_PERFORMED = "gotoPreviousAvailableStep" + __FINISH_ACTION_PERFORMED = "finishWizard_1" + __CANCEL_ACTION_PERFORMED = "cancelWizard_1" + __HELP_ACTION_PERFORMED = None + + ''' + Creates a new instance of WizardDialog + the hid is used as following : + "HID:(hid)" - the dialog + "HID:(hid+1) - the help button + "HID:(hid+2)" - the back button + "HID:(hid+3)" - the next button + "HID:(hid+4)" - the create button + "HID:(hid+5)" - the cancel button + @param xMSF + @param hid_ + ''' + + def __init__(self, xMSF, hid_): + super(WizardDialog,self).__init__(xMSF) + self.__hid = hid_ + self.iButtonWidth = 50 + self.nNewStep = 1 + self.nOldStep = 1 + self.nMaxStep = 1 + self.bTerminateListenermustberemoved = True + self.oRoadmap = None + self.terminateListener = None + + def activate(self): + try: + self.xUnoDialog.toFront() + except Exception: + pass + # do nothing; + + def itemStateChanged(self, itemEvent): + try: + self.nNewStep = itemEvent.ItemId + self.nOldStep = int(self.xDialogModel.Step) + if self.nNewStep != self.nOldStep: + self.switchToStep() + + except Exception: + traceback.print_exc() + + def setDialogProperties(self, closeable, height, moveable, position_x, + position_Y, step, tabIndex, title, width): + uno.invoke(self.xDialogModel, "setPropertyValues", + ((PropertyNames.PROPERTY_CLOSEABLE, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_MOVEABLE, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_TITLE, + PropertyNames.PROPERTY_WIDTH), + (closeable, height, moveable, position_x, position_Y, step, + tabIndex, title, width))) + + def setRoadmapInteractive(self, _bInteractive): + self.oRoadmap.Activated = _bInteractive + + def setRoadmapComplete(self, bComplete): + self.oRoadmap.Complete = bComplete + + def isRoadmapComplete(self): + try: + return bool(self.oRoadmap.Complete) + except Exception: + traceback.print_exc() + return False + + def setCurrentRoadmapItemID(self, ID): + if self.oRoadmap is not None: + nCurItemID = self.getCurrentRoadmapItemID() + if nCurItemID != ID: + self.oRoadmap.CurrentItemID = ID + + def getCurrentRoadmapItemID(self): + try: + return int(self.oRoadmap.CurrentItemID) + except Exception: + traceback.print_exc() + return -1 + + + def initializePaths(self): + xPropertySet = \ + self.xMSF.createInstance("com.sun.star.util.PathSettings") + self.sUserTemplatePath = \ + xPropertySet.getPropertyValue("Template_writable") + myFA = FileAccess(self.xMSF) + aInternalPaths = xPropertySet.getPropertyValue("Template_internal") + self.sTemplatePath = "" + for path in aInternalPaths: + if myFA.exists(path + "/wizard", False): + self.sTemplatePath = path + break + if self.sTemplatePath == "": + raise Exception("could not find wizard templates") + + def addRoadmap(self): + try: + iDialogHeight = self.xDialogModel.Height + # the roadmap control has got no real TabIndex ever + # that is not correct, but changing this would need time, + # so it is used without TabIndex as before + + xRoadmapControl = self.insertControlModel( + "com.sun.star.awt.UnoControlRoadmapModel", + "rdmNavi", + (PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, "Tabstop", + PropertyNames.PROPERTY_WIDTH), + ((iDialogHeight - 26), 0, 0, 0, + 0, True, 85)) + self.oRoadmap = xRoadmapControl.Model + method = getattr(self, "itemStateChanged") + xRoadmapControl.addItemListener( + ItemListenerProcAdapter(method)) + + self.oRoadmap.Text = strings.RID_COMMON_START_16 + except NoSuchMethodException: + from com.sun.star.awt.VclWindowPeerAttribute import OK + from .SystemDialog import SystemDialog + sError = "The files required could not be found.\n" + \ + "Please start the LibreOffice Setup and choose 'Repair'." + SystemDialog.showMessageBox(super().xMSF, "ErrorBox", OK, sError) + except Exception: + traceback.print_exc() + + def getRoadmapItemByID(self, _ID): + try: + getByIndex = self.oRoadmap.getByIndex + for i in list(range(self.oRoadmap.Count)): + CurRoadmapItem = getByIndex(i) + CurID = int(CurRoadmapItem.ID) + if CurID == _ID: + return CurRoadmapItem + + return None + except Exception: + traceback.print_exc() + return None + + def switchToStep(self,_nOldStep=None, _nNewStep=None): + if _nOldStep is not None and _nNewStep is not None: + self.nOldStep = _nOldStep + self.nNewStep = _nNewStep + + self.leaveStep(self.nOldStep, self.nNewStep) + if self.nNewStep != self.nOldStep: + if self.nNewStep == self.nMaxStep: + self.xDialogModel.btnWizardNext.DefaultButton = False + self.xDialogModel.btnWizardFinish.DefaultButton = True + else: + self.xDialogModel.btnWizardNext.DefaultButton = True + self.xDialogModel.btnWizardFinish.DefaultButton = False + + self.changeToStep(self.nNewStep) + self.enterStep(self.nOldStep, self.nNewStep) + return True + + return False + + @abstractmethod + def leaveStep(self, nOldStep, nNewStep): + pass + + @abstractmethod + def enterStep(self, nOldStep, nNewStep): + pass + + def changeToStep(self, nNewStep): + self.xDialogModel.Step = nNewStep + self.setCurrentRoadmapItemID(nNewStep) + self.enableNextButton(self.getNextAvailableStep() > 0) + self.enableBackButton(nNewStep != 1) + + def drawNaviBar(self): + try: + curtabindex = UIConsts.SOFIRSTWIZARDNAVITABINDEX + iButtonWidth = self.iButtonWidth + iButtonHeight = 14 + iCurStep = 0 + iDialogHeight = self.xDialogModel.Height + iDialogWidth = self.xDialogModel.Width + iHelpPosX = 8 + iBtnPosY = iDialogHeight - iButtonHeight - 6 + iCancelPosX = iDialogWidth - self.iButtonWidth - 6 + iFinishPosX = iCancelPosX - 6 - self.iButtonWidth + iNextPosX = iFinishPosX - 6 - self.iButtonWidth + iBackPosX = iNextPosX - 3 - self.iButtonWidth + self.insertControlModel( + "com.sun.star.awt.UnoControlFixedLineModel", + "lnNaviSep", + (PropertyNames.PROPERTY_HEIGHT, "Orientation", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH), + (1, 0, 0, iDialogHeight - 26, iCurStep, iDialogWidth)) + self.insertControlModel( + "com.sun.star.awt.UnoControlFixedLineModel", + "lnRoadSep", + (PropertyNames.PROPERTY_HEIGHT, + "Orientation", + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_WIDTH), + (iBtnPosY - 6, 1, 85, 0, iCurStep, 1)) + propNames = (PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_HELPURL, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "PushButtonType", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH) + self.xDialogModel.HelpURL = HelpIds.getHelpIdString(self.__hid) + self.insertButton("btnWizardHelp", + WizardDialog.__HELP_ACTION_PERFORMED, + (PropertyNames.PROPERTY_ENABLED, + PropertyNames.PROPERTY_HEIGHT, + PropertyNames.PROPERTY_LABEL, + PropertyNames.PROPERTY_POSITION_X, + PropertyNames.PROPERTY_POSITION_Y, + "PushButtonType", + PropertyNames.PROPERTY_STEP, + PropertyNames.PROPERTY_TABINDEX, + PropertyNames.PROPERTY_WIDTH), + (True, iButtonHeight, + strings.RID_COMMON_START_15, + iHelpPosX, iBtnPosY, + uno.Any("short",HELP), iCurStep, + uno.Any("short",(curtabindex + 1)), iButtonWidth), self) + self.insertButton("btnWizardBack", + WizardDialog.__BACK_ACTION_PERFORMED, propNames, + (False, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 2), + strings.RID_COMMON_START_13, + iBackPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep, + uno.Any("short",(curtabindex + 1)), iButtonWidth), self) + self.insertButton("btnWizardNext", + WizardDialog.__NEXT_ACTION_PERFORMED, propNames, + (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 3), + strings.RID_COMMON_START_14, + iNextPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep, + uno.Any("short",(curtabindex + 1)), iButtonWidth), self) + self.insertButton("btnWizardFinish", + WizardDialog.__FINISH_ACTION_PERFORMED, propNames, + (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 4), + strings.RID_COMMON_START_12, + iFinishPosX, iBtnPosY, uno.Any("short",STANDARD), + iCurStep, + uno.Any("short",(curtabindex + 1)), + iButtonWidth), self) + self.insertButton("btnWizardCancel", + WizardDialog.__CANCEL_ACTION_PERFORMED, propNames, + (True, iButtonHeight, HelpIds.getHelpIdString(self.__hid + 5), + strings.RID_COMMON_START_11, + iCancelPosX, iBtnPosY, uno.Any("short",STANDARD), iCurStep, + uno.Any("short",(curtabindex + 1)), + iButtonWidth), self) + self.xDialogModel.btnWizardNext.DefaultButton = True + except Exception: + traceback.print_exc() + + def insertRoadMapItems(self, items, enabled): + for index, item in enumerate(items): + try: + oRoadmapItem = self.oRoadmap.createInstance() + oRoadmapItem.Label = item + oRoadmapItem.Enabled = enabled[index] + oRoadmapItem.ID = index + 1 + self.oRoadmap.insertByIndex(index, oRoadmapItem) + except Exception: + traceback.print_exc() + + def enableBackButton(self, enabled): + self.xDialogModel.btnWizardBack.Enabled = enabled + + def enableNextButton(self, enabled): + self.xDialogModel.btnWizardNext.Enabled = enabled + + def enableFinishButton(self, enabled): + self.xDialogModel.btnWizardFinish.Enabled = enabled + + def isStepEnabled(self, _nStep): + try: + xRoadmapItem = self.getRoadmapItemByID(_nStep) + # Todo: In this case an exception should be thrown + if xRoadmapItem is None: + return False + bIsEnabled = bool(xRoadmapItem.Enabled) + return bIsEnabled + except Exception: + traceback.print_exc() + return False + + def gotoPreviousAvailableStep(self): + try: + if self.nNewStep > 1: + self.nOldStep = self.nNewStep + self.nNewStep -= 1 + while self.nNewStep > 0: + bIsEnabled = self.isStepEnabled(self.nNewStep) + if bIsEnabled: + break; + + self.nNewStep -= 1 + if (self.nNewStep == 0): + self.nNewStep = self.nOldStep + self.switchToStep() + except Exception: + traceback.print_exc() + + def getNextAvailableStep(self): + if self.isRoadmapComplete(): + i = self.nNewStep + 1 + while i <= self.nMaxStep: + if self.isStepEnabled(i): + return i + i += 1 + return -1 + + def gotoNextAvailableStep(self): + try: + self.nOldStep = self.nNewStep + self.nNewStep = self.getNextAvailableStep() + if self.nNewStep > -1: + self.switchToStep() + except Exception: + traceback.print_exc() + + @abstractmethod + def finishWizard(self): + pass + + def finishWizard_1(self): + '''This function will call + if the finish button is pressed on the UI''' + try: + self.enableFinishButton(False) + success = False + try: + success = self.finishWizard() + finally: + if not success: + self.enableFinishButton(True) + + if success: + self.removeTerminateListener() + except Exception: + traceback.print_exc() + + def getCurrentStep(self): + try: + return int(self.xDialogModel.Step) + except Exception: + traceback.print_exc() + return -1 + + def cancelWizard(self): + #can be overwritten by extending class + self.xUnoDialog.endExecute() + + def removeTerminateListener(self): + if self.bTerminateListenermustberemoved: + Desktop.getDesktop(self.xMSF).removeTerminateListener(self.terminateListener) + self.bTerminateListenermustberemoved = False + + ''' + called by the cancel button and + by the window hidden event. + if this method was not called before, + perform a cancel. + ''' + + def cancelWizard_1(self): + try: + self.cancelWizard() + self.removeTerminateListener() + except Exception: + traceback.print_exc() + + def windowHidden(self): + self.cancelWizard_1() + + def queryTermination(self): + self.activate() + raise TerminationVetoException() + + def disposing(self, arg0): + self.cancelWizard_1() + + def optCreateFromTemplateItemChanged(self): + self.bEditTemplate = False + + def optMakeChangesItemChanged(self): + self.bEditTemplate = True diff --git a/wizards/com/sun/star/wizards/ui/XFieldSelectionListener.java b/wizards/com/sun/star/wizards/ui/XFieldSelectionListener.java new file mode 100644 index 000000000..4a592b3a7 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/XFieldSelectionListener.java @@ -0,0 +1,35 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +package com.sun.star.wizards.ui; + +public interface XFieldSelectionListener +{ + + void shiftFromLeftToRight(String[] SelItems, String[] NewItems); + + void shiftFromRightToLeft(String[] OldSelItems, String[] NewItems); + + void moveItemUp(String Selitem); + + void moveItemDown(String Selitem); + + void setID(String sIncSuffix); + + +} diff --git a/wizards/com/sun/star/wizards/ui/__init__.py b/wizards/com/sun/star/wizards/ui/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/__init__.py diff --git a/wizards/com/sun/star/wizards/ui/event/CommonListener.py b/wizards/com/sun/star/wizards/ui/event/CommonListener.py new file mode 100644 index 000000000..c13119571 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/CommonListener.py @@ -0,0 +1,125 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import unohelper + +from com.sun.star.awt import XActionListener +class ActionListenerProcAdapter( unohelper.Base, XActionListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def actionPerformed( self, oActionEvent ): + if callable( self.oProcToCall ): + self.oProcToCall() + + def disposing(self, Event): + # TODO: Implement ? + pass + +from com.sun.star.awt import XItemListener +class ItemListenerProcAdapter( unohelper.Base, XItemListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def itemStateChanged( self, oItemEvent ): + if callable( self.oProcToCall ): + try: + self.oProcToCall() + except: + self.oProcToCall(oItemEvent) + + def disposing(self, Event): + # TODO: Implement ? + pass + +from com.sun.star.awt import XTextListener +class TextListenerProcAdapter( unohelper.Base, XTextListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def textChanged( self, oTextEvent ): + if callable( self.oProcToCall ): + self.oProcToCall() + + def disposing(self, Event): + # TODO: Implement ? + pass + +from com.sun.star.frame import XTerminateListener +class TerminateListenerProcAdapter( unohelper.Base, XTerminateListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def queryTermination(self, TerminateEvent): + if callable( self.oProcToCall ): + self.oProcToCall() + +from com.sun.star.awt import XWindowListener +class WindowListenerProcAdapter( unohelper.Base, XWindowListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def windowShown(self, TerminateEvent): + if callable( self.oProcToCall ): + self.oProcToCall() + + def windowHidden(self, Event): + # TODO: Implement ? + pass + + def windowResized(self, Event): + # TODO: Implement ? + pass + + def windowMoved(self, Event): + # TODO: Implement ? + pass + + def disposing(self, Event): + # TODO: Implement ? + pass + +from com.sun.star.awt import XAdjustmentListener +class AdjustmentListenerProcAdapter( unohelper.Base, XAdjustmentListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def adjustmentValueChanged(self, TerminateEvent): + if callable( self.oProcToCall ): + self.oProcToCall() + +from com.sun.star.awt import XFocusListener +class FocusListenerProcAdapter( unohelper.Base, XFocusListener ): + def __init__( self, oProcToCall): + self.oProcToCall = oProcToCall + + def focusGained(self, FocusEvent): + if callable( self.oProcToCall ): + self.oProcToCall(FocusEvent) + +from com.sun.star.awt import XKeyListener +class KeyListenerProcAdapter( unohelper.Base, XKeyListener ): + def __init__(self, oProcToCall): + self.oProcToCall = oProcToCall + + def keyPressed(self, KeyEvent): + if callable( self.oProcToCall ): + self.oProcToCall(KeyEvent) + + def disposing(self, Event): + # TODO: Implement ? + pass diff --git a/wizards/com/sun/star/wizards/ui/event/DataAware.py b/wizards/com/sun/star/wizards/ui/event/DataAware.py new file mode 100644 index 000000000..e062b48bd --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/DataAware.py @@ -0,0 +1,117 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import traceback +import uno +from abc import ABCMeta, abstractmethod + +from com.sun.star.util import Date +from com.sun.star.util import Time +from datetime import datetime + +''' +DataAware objects are used to live-synchronize UI and DataModel/DataObject. +It is used as listener on UI events, to keep the DataObject up to date. +This class, as a base abstract class, sets a frame of functionality, +delegating the data Object get/set methods to a Value object, +and leaving the UI get/set methods abstract. +Note that event listening is *not* a part of this model. +the updateData() or updateUI() methods should be programmatically called. +in child classes, the updateData() will be bound to UI event calls. +<br><br> +This class holds references to a Data Object and a Value object. +The Value object "knows" how to get and set a value from the +Data Object. +''' + +class DataAware(object): + __metaclass__ = ABCMeta + + ''' + creates a DataAware object for the given data object and Value object. + @param dataObject_ + @param value_ + ''' + + def __init__(self, dataObject_, field_): + self._dataObject = dataObject_ + self._field = field_ + + ''' + sets the given value to the UI control + @param newValue the value to set to the ui control. + ''' + @abstractmethod + def setToUI (self,newValue): + pass + + ''' + gets the current value from the UI control. + @return the current value from the UI control. + ''' + + @abstractmethod + def getFromUI (self): + pass + + ''' + updates the UI control according to the + current state of the data object. + ''' + + def updateUI(self): + try: + data = getattr(self._dataObject, self._field) + except Exception: + data = uno.invoke(self._dataObject, "get" + self._field, ()) + ui = self.getFromUI() + if data is not ui: + try: + self.setToUI(data) + except Exception: + traceback.print_exc() + + ''' + updates the DataObject according to + the current state of the UI control. + ''' + + def updateData(self): + useUno = False + try: + try: + data = getattr(self._dataObject, self._field) + except Exception: + useUno = True + data = uno.invoke(self._dataObject, "get" + self._field, ()) + ui = self.getFromUI() + if data is not ui: + if isinstance(ui,Date): + d = datetime(ui.Year, ui.Month, ui.Day) + ui = d.strftime('%d/%m/%y') + elif isinstance(ui,Time): + t = datetime(1, 1, 1, ui.Hours, ui.Minutes) + ui = t.strftime('%H:%M') + if useUno: + uno.invoke(self._dataObject, "set" + self._field, (ui,)) + else: + if isinstance(ui,tuple): + #Listbox Element + ui = ui[0] + setattr(self._dataObject, self._field, ui) + except Exception: + traceback.print_exc() diff --git a/wizards/com/sun/star/wizards/ui/event/EventListenerList.py b/wizards/com/sun/star/wizards/ui/event/EventListenerList.py new file mode 100644 index 000000000..e30536044 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/EventListenerList.py @@ -0,0 +1,27 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +class EventListenerList(object): + + def __init__(self): + self.list = [] + + def add(self, listener): + self.list.append(listener) + + def remove(self, listener): + self.list.remove(listener) diff --git a/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py b/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py new file mode 100644 index 000000000..a6f13e77d --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/ListModelBinder.py @@ -0,0 +1,67 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# + +from abc import abstractmethod + +from .ListDataListener import ListDataListener + +class ListModelBinder(ListDataListener): + + def __init__(self, unoListBox, listModel_): + self.unoList = unoListBox + self.unoListModel = unoListBox.Model + self.listModel = None + self.setListModel(listModel_) + self.renderer = self.Renderer() + + def setListModel(self, newListModel): + if self.listModel is not None: + self.listModel.removeListDataListener(self) + + self.listModel = newListModel + self.listModel.addListDataListener(self) + + def update(self, i): + self.remove(i, i) + self.insert(i) + + def remove(self, i1, i2): + self.unoList.removeItems(i1, i2 - i1 + 1) + + def insert(self, i): + self.unoList.addItem(self.getItemString(i), i) + + def getItemString(self, i): + return self.getItemString1(self.listModel.getElementAt(i)) + + def getItemString1(self, item): + return self.renderer.render(item) + + def getSelectedItems(self): + return self.unoListModel.SelectedItems + + class Renderer: + + @abstractmethod + def render(self, item): + if (item is None): + return "" + elif (isinstance(item, int)): + return str(item) + else: + return item.toString() diff --git a/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py b/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py new file mode 100644 index 000000000..67ba0ceb8 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/RadioDataAware.py @@ -0,0 +1,48 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from .CommonListener import ItemListenerProcAdapter +from .DataAware import DataAware + +class RadioDataAware(DataAware): + + def __init__(self, data, value, radioButtons): + super(RadioDataAware,self).__init__(data, value) + self.radioButtons = radioButtons + + def setToUI(self, value): + selected = int(value) + if selected == -1: + for i in self.radioButtons: + i.State = False + else: + self.radioButtons[selected].State = True + + def getFromUI(self): + for index, workwith in enumerate(self.radioButtons): + if workwith.State: + return index + + return -1 + + @classmethod + def attachRadioButtons(self, data, prop, buttons, field): + da = RadioDataAware(data, prop, buttons) + method = getattr(da,"updateData") + for i in da.radioButtons: + i.addItemListener(ItemListenerProcAdapter(method)) + return da diff --git a/wizards/com/sun/star/wizards/ui/event/Task.py b/wizards/com/sun/star/wizards/ui/event/Task.py new file mode 100644 index 000000000..aa44ed314 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/Task.py @@ -0,0 +1,76 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +import traceback + +from .TaskEvent import TaskEvent + +class Task: + successful = 0 + failed = 0 + maximum = 0 + taskName = "" + listeners = [] + subtaskName = "" + + def __init__(self, taskName_, subtaskName_, max_): + self.taskName = taskName_ + self.subtaskName = subtaskName_ + self.maximum = max_ + + def start(self): + self.fireTaskStarted() + + def fail(self): + self.fireTaskFailed() + + def getMax(self): + return self.maximum + + def setMax(self, max_): + self.maximum = max_ + self.fireTaskStatusChanged() + + def advance(self, success_): + if success_: + self.successful += 1 + print ("Success :", self.successful) + else: + self.failed += 1 + print ("Failed :", self.failed) + self.fireTaskStatusChanged() + if (self.failed + self.successful == self.maximum): + self.fireTaskFinished() + + def fireTaskStatusChanged(self): + te = TaskEvent(self, TaskEvent.TASK_STATUS_CHANGED) + for i in range(len(self.listeners)): + self.listeners[i].taskStatusChanged(te) + + def fireTaskStarted(self): + te = TaskEvent(self, TaskEvent.TASK_STARTED) + for i in range(len(self.listeners)): + self.listeners[i].taskStarted(te) + + def fireTaskFailed(self): + te = TaskEvent(self, TaskEvent.TASK_FAILED) + for i in range(len(self.listeners)): + self.listeners[i].taskFinished(te) + + def fireTaskFinished(self): + te = TaskEvent(self, TaskEvent.TASK_FINISHED) + for i in range(len(self.listeners)): + self.listeners[i].taskFinished(te) diff --git a/wizards/com/sun/star/wizards/ui/event/TaskEvent.py b/wizards/com/sun/star/wizards/ui/event/TaskEvent.py new file mode 100644 index 000000000..765bb07c9 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/TaskEvent.py @@ -0,0 +1,34 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . + +class TaskEvent: + + TASK_STARTED = 1 + TASK_FINISHED = 2 + TASK_STATUS_CHANGED = 3 + SUBTASK_NAME_CHANGED = 4 + TASK_FAILED = 5 + taskType = 0 + source = None + + #general constructor- + # @param source + # @param type_ + def __init__(self, source_, type_): + #super(TaskEvent, self).__init__(source) + self.taskType = type_ + self.source = source_ diff --git a/wizards/com/sun/star/wizards/ui/event/TaskListener.py b/wizards/com/sun/star/wizards/ui/event/TaskListener.py new file mode 100644 index 000000000..210bac4db --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/TaskListener.py @@ -0,0 +1,35 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +from abc import abstractmethod +from com.sun.star.script import EventListener + +class TaskListener(EventListener): + + @abstractmethod + def taskStarted(self, te): + pass + + @abstractmethod + def taskFinished(self, te): + pass + + # is called when the status of the task has advanced. + # @param te + @abstractmethod + def taskStatusChanged(self, te): + pass diff --git a/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py b/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py new file mode 100644 index 000000000..945c2cef2 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/UnoDataAware.py @@ -0,0 +1,104 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +import uno +from .CommonListener import ItemListenerProcAdapter, TextListenerProcAdapter +from .DataAware import DataAware, datetime, Date, Time +from ...common.PropertyNames import PropertyNames + +''' +This class supports simple cases where a UI control can +be directly synchronized with a data property. +Such controls are: the different text controls +(synchronizing the "Text" , "Value", "Date", "Time" property), +Checkbox controls, Dropdown listbox controls (synchronizing the +SelectedItems[] property. +For those controls, static convenience methods are offered, to simplify use. +''' + +class UnoDataAware(DataAware): + + def __init__(self, dataObject, field, unoObject_, unoPropName_, isShort=False): + super(UnoDataAware,self).__init__(dataObject, field) + self.unoControl = unoObject_ + self.unoModel = self.unoControl.Model + self.unoPropName = unoPropName_ + self.isShort = isShort + + def setToUI(self, value): + if (isinstance(value, list)): + value = tuple(value) + elif self.isShort: + value = uno.Any("[]short", (value,)) + if value: + if(hasattr(self.unoModel, self.unoPropName)): + if self.unoPropName == "Date": + d = datetime.strptime(value, '%d/%m/%y') + value = Date(d.day, d.month, d.year) + elif self.unoPropName == "Time": + t = datetime.strptime(value, '%H:%M') + value = Time(0, 0, t.minute, t.hour, False) + + setattr(self.unoModel, self.unoPropName, value) + else: + uno.invoke(self.unoModel, "set" + self.unoPropName, (value,)) + + def getFromUI(self): + return getattr(self.unoModel, self.unoPropName) + + @classmethod + def __attachTextControl( + self, data, prop, unoText, unoProperty, field, value): + uda = UnoDataAware(data, prop, unoText, unoProperty) + method = getattr(uda,"updateData") + unoText.addTextListener(TextListenerProcAdapter(method)) + return uda + + @classmethod + def attachEditControl(self, data, prop, unoControl, field): + return self.__attachTextControl( + data, prop, unoControl, "Text", field, "") + + @classmethod + def attachDateControl(self, data, prop, unoControl, field): + return self.__attachTextControl( + data, prop, unoControl, "Date", field, 0) + + @classmethod + def attachTimeControl(self, data, prop, unoControl, field): + return self.__attachTextControl( + data, prop, unoControl, "Time", field, 0) + + @classmethod + def attachNumericControl(self, data, prop, unoControl, field): + return self.__attachTextControl( + data, prop, unoControl, "Value", field, float(0)) + + @classmethod + def attachCheckBox( + self, data, prop, checkBox, field): + uda = UnoDataAware(data, prop, checkBox, PropertyNames.PROPERTY_STATE) + method = getattr(uda,"updateData") + checkBox.addItemListener(ItemListenerProcAdapter(method)) + return uda + + @classmethod + def attachListBox(self, data, prop, listBox, field): + uda = UnoDataAware(data, prop, listBox, "SelectedItems", True) + method = getattr(uda,"updateData") + listBox.addItemListener(ItemListenerProcAdapter(method)) + return uda diff --git a/wizards/com/sun/star/wizards/ui/event/XActionListenerAdapter.java b/wizards/com/sun/star/wizards/ui/event/XActionListenerAdapter.java new file mode 100644 index 000000000..b7dfddbb8 --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/XActionListenerAdapter.java @@ -0,0 +1,32 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui.event; + +import com.sun.star.awt.ActionEvent; +import com.sun.star.awt.XActionListener; +import com.sun.star.lang.EventObject; + +public class XActionListenerAdapter implements XActionListener { + + public void disposing(EventObject event) { + } + + public void actionPerformed(ActionEvent event) { + } + +} diff --git a/wizards/com/sun/star/wizards/ui/event/XItemListenerAdapter.java b/wizards/com/sun/star/wizards/ui/event/XItemListenerAdapter.java new file mode 100644 index 000000000..160ecdb4f --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/XItemListenerAdapter.java @@ -0,0 +1,32 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui.event; + +import com.sun.star.awt.ItemEvent; +import com.sun.star.awt.XItemListener; +import com.sun.star.lang.EventObject; + +public class XItemListenerAdapter implements XItemListener { + + public void disposing(EventObject event) { + } + + public void itemStateChanged(ItemEvent event) { + } + +} diff --git a/wizards/com/sun/star/wizards/ui/event/XTextListenerAdapter.java b/wizards/com/sun/star/wizards/ui/event/XTextListenerAdapter.java new file mode 100644 index 000000000..af95771af --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/XTextListenerAdapter.java @@ -0,0 +1,32 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +package com.sun.star.wizards.ui.event; + +import com.sun.star.awt.TextEvent; +import com.sun.star.awt.XTextListener; +import com.sun.star.lang.EventObject; + +public class XTextListenerAdapter implements XTextListener { + + public void disposing(EventObject event) { + } + + public void textChanged(TextEvent event) { + } + +} diff --git a/wizards/com/sun/star/wizards/ui/event/__init__.py b/wizards/com/sun/star/wizards/ui/event/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/wizards/com/sun/star/wizards/ui/event/__init__.py diff --git a/wizards/source/access2base/Application.xba b/wizards/source/access2base/Application.xba new file mode 100644 index 000000000..224cc394a --- /dev/null +++ b/wizards/source/access2base/Application.xba @@ -0,0 +1,1869 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Application" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const TRACEDEBUG = "DEBUG" ' To report values of variables +Global Const TRACEINFO = "INFO" ' To report any event +Global Const TRACEWARNING = "WARNING" ' To report some abnormal event +Global Const TRACEERRORS = "ERROR" ' To report user errors - Default value +Global Const TRACEFATAL = "FATAL" ' To report programmer errors - f.i. Wrong argument +Global Const TRACEABORT = "ABORT" ' To report Access2Base internal errors +Global Const TRACEANY = "===>" ' Always reported + ' ERRORs, FATALs and ABORTs are also displayed in a MsgBox (except on specific request) + ' FATALs and ABORTs interrupt the program execution + +Global Const ERRINIT = 1500 +Global Const ERRDBNOTCONNECTED = 1501 +Global Const ERRMISSINGARGUMENTS = 1502 +Global Const ERRWRONGARGUMENT = 1503 +Global Const ERRMAINFORM = 1504 +Global Const ERRMETHOD = 1505 +Global Const ERRFILEACCESS = 1506 +Global Const ERRFORMNOTIDENTIFIED = 1507 +Global Const ERRFORMNOTFOUND = 1508 +Global Const ERRFORMNOTOPEN = 1509 +Global Const ERRDFUNCTION = 1510 +Global Const ERROPENFORM = 1511 +Global Const ERRPROPERTY = 1512 +Global Const ERRPROPERTYVALUE = 1513 +Global Const ERRINDEXVALUE = 1514 +Global Const ERRCOLLECTION = 1515 +Global Const ERRPROPERTYNOTARRAY = 1516 +Global Const ERRCONTROLNOTFOUND = 1517 +Global Const ERRNOACTIVEFORM = 1518 +Global Const ERRDATABASEFORM = 1519 +Global Const ERRFOCUSINGRID = 1520 +Global Const ERRNOGRIDINFORM = 1521 +Global Const ERRFINDRECORD = 1522 +Global Const ERRSQLSTATEMENT = 1523 +Global Const ERROBJECTNOTFOUND = 1524 +Global Const ERROPENOBJECT = 1525 +Global Const ERRCLOSEOBJECT = 1526 +Global Const ERRMETHOD = 1527 +Global Const ERRACTION = 1528 +Global Const ERRSENDMAIL = 1529 +Global Const ERRFORMYETOPEN = 1530 +Global Const ERRPROPERTYINIT = 1531 +Global Const ERRFILENOTCREATED = 1532 +Global Const ERRDIALOGNOTFOUND = 1533 +Global Const ERRDIALOGUNDEFINED = 1534 +Global Const ERRDIALOGSTARTED = 1535 +Global Const ERRDIALOGNOTSTARTED = 1536 +Global Const ERRRECORDSETNODATA = 1537 +Global Const ERRRECORDSETCLOSED = 1538 +Global Const ERRRECORDSETRANGE = 1539 +Global Const ERRRECORDSETFORWARD = 1540 +Global Const ERRFIELDNULL = 1541 +Global Const ERROVERFLOW = 1542 +Global Const ERRNOTACTIONQUERY = 1543 +Global Const ERRNOTUPDATABLE = 1544 +Global Const ERRUPDATESEQUENCE = 1545 +Global Const ERRNOTNULLABLE = 1546 +Global Const ERRROWDELETED = 1547 +Global Const ERRRECORDSETCLONE = 1548 +Global Const ERRQUERYDEFDELETED = 1549 +Global Const ERRTABLEDEFDELETED = 1550 +Global Const ERRTABLECREATION = 1551 +Global Const ERRFIELDCREATION = 1552 +Global Const ERRSUBFORMNOTFOUND = 1553 +Global Const ERRWINDOW = 1554 +Global Const ERRCOMPATIBILITY = 1555 +Global Const ERRPRECISION = 1556 +Global Const ERRMODULENOTFOUND = 1557 +Global Const ERRPROCEDURENOTFOUND = 1558 + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const DBCONNECTBASE = 1 ' Connection from Base document (OpenConnection) +Global Const DBCONNECTFORM = 2 ' Connection from a database-aware form (OpenConnection) +Global Const DBCONNECTANY = 3 ' Connection from any document for data access only (OpenDatabase) + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const DBMS_UNKNOWN = 0 +Global Const DBMS_HSQLDB1 = 1 +Global Const DBMS_HSQLDB2 = 2 +Global Const DBMS_FIREBIRD = 3 +Global Const DBMS_MSACCESS2003 = 4 +Global Const DBMS_MSACCESS2007 = 5 +Global Const DBMS_MYSQL = 6 +Global Const DBMS_POSTGRES = 7 +Global Const DBMS_SQLITE = 8 + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const COLLALLDIALOGS = "ALLDIALOGS" +Global Const COLLALLFORMS = "ALLFORMS" +Global Const COLLALLMODULES = "ALLMODULES" +Global Const COLLCOMMANDBARS = "COMMANDBARS" +Global Const COLLCOMMANDBARCONTROLS = "COMMANDBARCONTROLS" +Global Const COLLCONTROLS = "CONTROLS" +Global Const COLLFORMS = "FORMS" +Global Const COLLFIELDS = "FIELDS" +Global Const COLLPROPERTIES = "PROPERTIES" +Global Const COLLQUERYDEFS = "QUERYDEFS" +Global Const COLLRECORDSETS = "RECORDSETS" +Global Const COLLTABLEDEFS = "TABLEDEFS" +Global Const COLLTEMPVARS = "TEMPVARS" + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const OBJAPPLICATION = "APPLICATION" +Global Const OBJCOLLECTION = "COLLECTION" +Global Const OBJCOMMANDBAR = "COMMANDBAR" +Global Const OBJCOMMANDBARCONTROL = "COMMANDBARCONTROL" +Global Const OBJCONTROL = "CONTROL" +Global Const OBJDATABASE = "DATABASE" +Global Const OBJDIALOG = "DIALOG" +Global Const OBJEVENT = "EVENT" +Global Const OBJFIELD = "FIELD" +Global Const OBJFORM = "FORM" +Global Const OBJMODULE = "MODULE" +Global Const OBJOPTIONGROUP = "OPTIONGROUP" +Global Const OBJPROPERTY = "PROPERTY" +Global Const OBJQUERYDEF = "QUERYDEF" +Global Const OBJRECORDSET = "RECORDSET" +Global Const OBJSUBFORM = "SUBFORM" +Global Const OBJTABLEDEF = "TABLEDEF" +Global Const OBJTEMPVAR = "TEMPVAR" + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const CTLCONTROL = "CONTROL" ' ClassId +Global Const CTLCHECKBOX = "CHECKBOX" ' 5 +Global Const CTLCOMBOBOX = "COMBOBOX" ' 7 +Global Const CTLCOMMANDBUTTON = "COMMANDBUTTON" ' 2 +Global Const CTLCURRENCYFIELD = "CURRENCYFIELD" ' 18 +Global Const CTLDATEFIELD = "DATEFIELD" ' 15 +Global Const CTLFILECONTROL = "FILECONTROL" ' 12 +Global Const CTLFIXEDTEXT = "FIXEDTEXT" ' 10 +Global Const CTLGRIDCONTROL = "GRIDCONTROL" ' 11 +Global Const CTLGROUPBOX = "GROUPBOX" ' 8 +Global Const CTLHIDDENCONTROL = "HIDDENCONTROL" ' 13 +Global Const CTLIMAGEBUTTON = "IMAGEBUTTON" ' 4 +Global Const CTLIMAGECONTROL = "IMAGECONTROL" ' 14 +Global Const CTLLISTBOX = "LISTBOX" ' 6 +Global Const CTLNAVIGATIONBAR = "NAVIGATIONBAR" ' 22 +Global Const CTLNUMERICFIELD = "NUMERICFIELD" ' 17 +Global Const CTLPATTERNFIELD = "PATTERNFIELD" ' 19 +Global Const CTLRADIOBUTTON = "RADIOBUTTON" ' 3 +Global Const CTLSCROLLBAR = "SCROLLBAR" ' 20 +Global Const CTLSPINBUTTON = "SPINBUTTON" ' 21 +Global Const CTLTEXTFIELD = "TEXTFIELD" ' 9 +Global Const CTLTIMEFIELD = "TIMEFIELD" ' 16 +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const CTLFORMATTEDFIELD = "FORMATTEDFIELD" ' 9 (idem TextField) +Global Const CTLFIXEDLINE = "FIXEDLINE" ' 24 (forced) +Global Const CTLPROGRESSBAR = "PROGRESSBAR" ' 23 (forced) +Global Const CTLSUBFORM = "SUBFORMCONTROL" ' None +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const CTLPARENTISFORM = "FORM" +Global Const CTLPARENTISDIALOG = "DIALOG" +Global Const CTLPARENTISSUBFORM = "SUBFORM" +Global Const CTLPARENTISGRID = "GRID" +Global Const CTLPARENTISGROUP = "OPTIONGROUP" + +REM ----------------------------------------------------------------------------------------------------------------------- +Global Const MODDOCUMENT = "DOCUMENT" +Global Const MODGLOBAL = "GLOBAL" + +REM ----------------------------------------------------------------------------------------------------------------------- +Type DocContainer + Document As Object ' com.sun.star.comp.dba.ODatabaseDocument or SwXTextDocument or ScModelObj + Active As Boolean + DbConnect As Integer ' DBCONNECTxxx constants + URL As String + DbContainers() As Variant ' One entry by (data-aware) form +End Type + +Type DbContainer + FormName As String ' name of data-aware form + Database As Object ' Database type +End Type + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- Next variable is initialized to empty at each macro execution start --- +REM --- Items in both lists correspond one by one --- +Public vFormNamesList As Variant ' (0) Buffer of hierarchical form names => "\;" separated values + ' (1) Buffer of persistent form names => "\;" separated values + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AllDialogs(ByVal Optional pvIndex As Variant) As Variant +' Return either a Collection or a Dialog object +' The dialogs are selected only if library is loaded + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "AllDialogs" + Utils._SetCalledSub(cstThisSub) + +Dim iMode As Integer, vDialogs() As Variant, i As Integer, j As Integer, iCount As Integer +Dim oMacLibraries As Object, vAllDialogs As Variant, oLibrary As Object, vNames() As Variant, bFound As Boolean +Dim oLibDialog As Object, sLibrary As String, oDocLibraries As Object, bLocalStorage As Boolean +Dim vLibraries() As Variant, vMacLibraries() As Variant, vDocLibraries() As Variant, oDocMacLib As Object +Dim vCurrentDocument As Variant +Const cstCount = 0 +Const cstByIndex = 1 +Const cstByName = 2 +Const cstSepar = "!" + + If IsMissing(pvIndex) Then + iMode = cstCount + Else + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + If VarType(pvIndex) = vbString Then iMode = cstByName Else iMode = cstByIndex + End If + + Set vAllDialogs = Nothing + + Set vCurrentDocument = Nothing + If Not IsNull(_A2B_.CurrentDocument) Then + Set vCurrentDocument = _A2B_.CurrentDocument.Document + ElseIf Not IsNull(ThisComponent) Then + Set vCurrentDocument = ThisComponent + End If + If IsNull(vCurrentDocument) Then + Set oDocLibraries = Nothing + vDocLibraries = Array() + Else + Set oDocLibraries = vCurrentDocument.DialogLibraries + vDocLibraries = oDocLibraries.getElementNames() + End If + Set oMacLibraries = GlobalScope.DialogLibraries + vMacLibraries = oMacLibraries.getElementNames() + 'Remove Access2Base from the list + If _A2B_.ExcludeA2B Then + For i = 0 To UBound(vMacLibraries) + If Left(vMacLibraries(i), 11) = "Access2Base" Then vMacLibraries(i) = "" + Next i + End If + vMacLibraries = Utils._TrimArray(vMacLibraries) + + If UBound(vDocLibraries) + UBound(vMacLibraries) < 0 Then ' No library + Set vAllDialogs = New Collect + Set vAllDialogs._This = vAllDialogs + vAllDialogs._CollType = COLLALLDIALOGS + vAllDialogs._Count = 0 + Goto Exit_Function + End If + + vNames = Array() + iCount = 0 + For i = 0 To UBound(vDocLibraries) + UBound(vMacLibraries) + 1 + bFound = False + If i <= UBound(vDocLibraries) Then + sLibrary = vDocLibraries(i) + bLocalStorage = True + Set oDocMacLib = oDocLibraries + ' Sometimes library not loaded as should ?? + If Not oDocMacLib.IsLibraryLoaded(sLibrary) Then oDocMacLib.loadLibrary(sLibrary) + Else + sLibrary = vMacLibraries(i - UBound(vDocLibraries) - 1) + bLocalStorage = False + Set oDocMacLib = oMacLibraries + End If + If oDocMacLib.IsLibraryLoaded(sLibrary) Then + Set oLibrary = oDocMacLib.getByName(sLibrary) + If oLibrary.hasElements() Then + vDialogs = oLibrary.getElementNames() + Select Case iMode + Case cstCount + iCount = iCount + UBound(vDialogs) + 1 + Case cstByIndex, cstByName + For j = 0 To UBound(vDialogs) + If iMode = cstByIndex Then + If pvIndex = iCount Then bFound = True + iCount = iCount + 1 + Else + If UCase(pvIndex) = UCase(vDialogs(j)) Then bFound = True + End If + If bFound Then + Set oLibDialog = oLibrary.getByName(vDialogs(j)) ' Create Dialog object + Exit For + End If + Next j + End Select + End If + End If + If bFound Then Exit For + Next i + + If iMode = cstCount Then + Set vAllDialogs = New Collect + Set vAllDialogs._This = vAllDialogs + vAllDialogs._CollType = COLLALLDIALOGS + vAllDialogs._Count = iCount + Else + If Not bFound Then + If iMode = cstByIndex Then Goto Trace_Error_Index Else Goto Trace_Not_Found + End If + Set vAllDialogs = New Dialog + With vAllDialogs + ._This = vAllDialogs + ._Name = vDialogs(j) + ._Shortcut = "Dialogs!" & vDialogs(j) + Set ._Dialog = oLibDialog + ._Library = sLibrary + ._Storage = Iif(bLocalStorage, "DOCUMENT", "GLOBAL") + End With + End If + +Exit_Function: + Set AllDialogs = vAllDialogs + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Not_Found: + TraceError(TRACEFATAL, ERRDIALOGNOTFOUND, Utils._CalledSub(), 0, , pvIndex) + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set vDialogs = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set vDialogs = Nothing + GoTo Exit_Function +End Function ' AllDialogs V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AllForms(ByVal Optional pvIndex As Variant) As Variant +' Return an object of type Form indicated by either its index (integer) or its name (NOT CASE-SENSITIVE string) +' Easiest use for standalone forms: AllForms(0) +' If no argument, return a Collection type + +Const cstThisSub = "AllForms" +Dim iIndex As Integer, vReturn As Variant +Dim iCurrentDoc As Integer, vCurrentDoc As Variant, oForms As Variant, oCounter As Variant, oFormsCollection As Object +Dim ofForm As Object +Dim vAllForms As Variant, i As Integer, vName As Variant, oDatabase As Object, bFound As Boolean +Const cstSeparator = "\;" + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + Set vReturn = Nothing + + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + Select Case VarType(pvIndex) + Case vbString + iIndex = -1 + Case Else + iIndex = pvIndex + End Select + End If + + iCurrentDoc = _A2B_.CurrentDocIndex() + If iCurrentDoc >= 0 Then + vCurrentDoc = _A2B_.CurrentDocument(iCurrentDoc) + Else + Goto Exit_Function + End If + +' Load complete list of hierarchical and persistent names when Base document + If vCurrentDoc.DbConnect = DBCONNECTBASE Then vAllForms = _GetAllHierarchicalNames() + +' Process when NO ARGUMENT + If IsMissing(pvIndex) Then ' No argument + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLALLFORMS + If vCurrentDoc.DbConnect = DBCONNECTFORM Then oCounter._Count = UBound(vCurrentDoc.DbContainers) + 1 Else oCounter._Count = UBound(vAllForms) + 1 + Set vReturn = oCounter + Goto Exit_Function + End If + +' Process when ARGUMENT = STRING or INDEX => Initialize form object + Set ofForm = New Form + Set ofForm._This = ofForm + Select Case vCurrentDoc.DbConnect + Case DBCONNECTBASE + ofForm._DocEntry = 0 + ofForm._DbEntry = 0 + If iIndex= -1 Then ' String argument + vName = Utils._InList(Utils._Trim(pvIndex), vAllForms, True) + If vName = False Then Goto Trace_Not_Found + ofForm._Initialize(vName) + Else + If iIndex > UBound(vAllForms) Or iIndex < 0 Then Goto Trace_Error_Index ' Numeric argument OK but value nonsense + ofForm._Initialize(vAllForms(iIndex)) + End If + Case DBCONNECTFORM + With vCurrentDoc + If iIndex = -1 Then + bFound = False + For i = 0 To UBound(vCurrentDoc.DbContainers) + Set oDatabase = vCurrentDoc.DbContainers(i).Database + If UCase(Utils._Trim(pvIndex)) = UCase(oDatabase.FormName) Then + bFound = True + ofForm._DbEntry = i + Exit For + End If + Next i + If Not bFound Then Goto Trace_Not_Found + ElseIf iIndex < 0 Or iIndex > UBound(vCurrentDoc.DbContainers) Then + Goto Trace_Error_Index + Else + ofForm._DbEntry = iIndex + Set oDatabase = vCurrentDoc.DbContainers(iIndex).Database + End If + End With + vName = oDatabase.FormName + ofForm._DocEntry = iCurrentDoc + ofForm._Initialize(vName) + End Select + + Set vReturn = ofForm + +Exit_Function: + Set AllForms = vReturn + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Not_Found: + TraceError(TRACEFATAL, ERRFORMNOTFOUND, Utils._CalledSub(), 0, , pvIndex) + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set vReturn = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set vReturn = Nothing + GoTo Exit_Function +End Function ' AllForms V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AllModules(ByVal Optional pvIndex As Variant, ByVal Optional pbAllModules As Boolean) As Variant +' Return either a Collection or a Module object +' The modules are selected only if library is loaded +' (UNPUBLISHED) pbAllModules = False collects only the modules located in the currently open document + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "AllModules" + Utils._SetCalledSub(cstThisSub) + +Dim iMode As Integer, vModules() As Variant, i As Integer, j As Integer, iCount As Integer +Dim oMacLibraries As Object, vAllModules As Variant, oLibrary As Object, vNames() As Variant, bFound As Boolean +Dim sScript As String, sLibrary As String, oDocLibraries As Object, sStorage As String +Dim vLibraries() As Variant, vMacLibraries() As Variant, vDocLibraries() As Variant, oDocMacLib As Object +Const cstCount = 0, cstByIndex = 1, cstByName = 2 +Const cstDot = "." + + If IsMissing(pvIndex) Then + iMode = cstCount + Else + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + If VarType(pvIndex) = vbString Then + iMode = cstByName + ' Determine full name STORAGE.LIBRARY.MODULE + vNames = Split(pvIndex, cstDot) + If UBound(vNames) = 2 Then + ElseIf UBound(vNames) = 1 Then + pvIndex = MODDOCUMENT & cstDot & pvIndex + ElseIf UBound(vNames) = 0 Then + pvIndex = MODDOCUMENT & cstDot & "STANDARD" & cstDot & pvIndex + Else + GoTo Trace_Not_Found + End If + Else + iMode = cstByIndex + End If + End If + + If IsMissing(pbAllModules) Then pbAllModules = True + If Not Utils._CheckArgument(pbAllModules, 2, vbBoolean) Then Goto Exit_Function + + Set vAllModules = Nothing + + Set oDocLibraries = _A2B_.CurrentDocument.Document.BasicLibraries ' ThisComponent.BasicLibraries + vDocLibraries = oDocLibraries.getElementNames() + If pbAllModules Then + Set oMacLibraries = GlobalScope.BasicLibraries + vMacLibraries = oMacLibraries.getElementNames() + 'Remove Access2Base from the list + If _A2B_.ExcludeA2B Then + For i = 0 To UBound(vMacLibraries) + If Left(vMacLibraries(i), 11) = "Access2Base" Then vMacLibraries(i) = "" + Next i + End If + vMacLibraries = Utils._TrimArray(vMacLibraries) + End If + + If UBound(vDocLibraries) + UBound(vMacLibraries) < 0 Then ' No library + Set vAllModules = New Collect + Set vAllModules._This = vAllModules + vAllModules._CollType = COLLALLMODULES + vAllModules._Count = 0 + Goto Exit_Function + End If + + iCount = 0 + For i = 0 To UBound(vDocLibraries) + UBound(vMacLibraries) + 1 + bFound = False + If i <= UBound(vDocLibraries) Then + sLibrary = vDocLibraries(i) + sStorage = MODDOCUMENT + Set oDocMacLib = oDocLibraries + ' Sometimes library not loaded as should ?? + If Not oDocMacLib.IsLibraryLoaded(sLibrary) Then oDocMacLib.loadLibrary(sLibrary) + Else + sLibrary = vMacLibraries(i - UBound(vDocLibraries) - 1) + sStorage = MODGLOBAL + Set oDocMacLib = oMacLibraries + End If + If oDocMacLib.IsLibraryLoaded(sLibrary) Then + Set oLibrary = oDocMacLib.getByName(sLibrary) + If oLibrary.hasElements() Then + vModules = oLibrary.getElementNames() + Select Case iMode + Case cstCount + iCount = iCount + UBound(vModules) + 1 + Case cstByIndex, cstByName + For j = 0 To UBound(vModules) + If iMode = cstByIndex Then + If pvIndex = iCount Then bFound = True + iCount = iCount + 1 + Else + If UCase(pvIndex) = UCase(sStorage & cstDot & sLibrary & cstDot & vModules(j)) Then bFound = True + End If + If bFound Then + sScript = oLibrary.getByName(vModules(j)) ' Initiate Module object + iCount = i + Exit For + End If + Next j + End Select + End If + End If + If bFound Then Exit For + Next i + + If iMode = cstCount Then + Set vAllModules = New Collect + Set vAllModules._This =vAllModules + vAllModules._CollType = COLLALLMODULES + vAllModules._Count = iCount + Else + If Not bFound Then + If iMode = cstByIndex Then Goto Trace_Error_Index Else Goto Trace_Not_Found + End If + Set vAllModules = New Module + Set vAllModules._This = vAllModules + vAllModules._Name = vModules(j) + vAllModules._LibraryName = sLibrary + Set vAllModules._Library = oLibrary + vAllModules._Storage = sStorage + vAllModules._Script = sScript + vAllModules._Initialize() + End If + +Exit_Function: + Set AllModules = vAllModules + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Not_Found: + TraceError(TRACEFATAL, ERRMODULENOTFOUND, Utils._CalledSub(), 0, , pvIndex) + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set vModules = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set vModules = Nothing + GoTo Exit_Function +End Function ' AllModules V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub CloseConnection () + +' Close all connections established by current document to free memory. +' - if Base document => close the one concerned database connection +' - if non-Base documents => close the connections of each individual standalone form + + If IsEmpty(_A2B_) Then Goto Exit_Sub + +Const cstThisSub = "CloseConnection" + Utils._SetCalledSub(cstThisSub) + + Call _A2B_.CloseConnection() + +Exit_Sub: + Utils._ResetCalledSub(cstThisSub) + Exit Sub +End Sub ' CloseConnection V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CommandBars(Optional ByVal pvIndex As Variant, Optional ByRef poWindow As Object) As Variant +' Return an object of type CommandBar indicated by its index or its name (CASE-INSENSITIVE string) +' If no pvIndex argument, return a Collection type +' (Unpublished) With poWindow, force the frame in which toolbars are detected + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CommandBars" + Utils._SetCalledSub(cstThisSub) + +Dim iObjectsCount As Integer, sObjectName As String, oObject As Object +Dim oWindow As Object, iWindowType As Integer +Dim i As Integer, j As Integer, k As Integer, bFound As Boolean +Dim sSupportedModules() As Variant, vModules() As Variant, oModuleUI As Object +Dim oToolbar As Object, sToolbarName As String, vUIElements() As Variant, sToolbarFullName As String, iBuiltin As Integer + +Const cstCustom = "CUSTOM" + + Set oObject = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + + iObjectsCount = 0 + bFound = False + + If IsMissing(poWindow) Then Set oWindow = _SelectWindow() Else Set oWindow = poWindow + If IsNull(oWindow.Frame) Then Goto Trace_WindowError + + ' List of 21 modules + vModules = CreateUnoService("com.sun.star.frame.ModuleManager").getElementNames() + + iWindowType = oWindow.WindowType + Select Case iWindowType ' Supported window types only + Case acForm + sSupportedModules = Array( "com.sun.star.sdb.FormDesign" ) + Case acBasicIDE + sSupportedModules = Array( "com.sun.star.script.BasicIDE" ) + Case acDatabaseWindow + sSupportedModules = Array( "com.sun.star.sdb.OfficeDatabaseDocument" ) + Case acReport + sSupportedModules = Array( "com.sun.star.sdb.TextReportDesign" ) + Case acDocument + Select Case oWindow.DocumentType + Case docCalc : sSupportedModules = Array( "com.sun.star.sheet.SpreadsheetDocument" ) + Case docWriter : sSupportedModules = Array( "com.sun.star.text.TextDocument" ) + Case docImpress : sSupportedModules = Array( "com.sun.star.presentation.PresentationDocument" ) + Case docDraw : sSupportedModules = Array( "com.sun.star.drawing.DrawingDocument" ) + Case docMath : sSupportedModules = Array( "com.sun.star.formula.FormulaProperties" ) + Case Else : sSupportedModules = Array() + End Select + Case acTable, acQuery + sSupportedModules = Array( "com.sun.star.sdb.DataSourceBrowser" _ + , "com.sun.star.sdb.TableDataView" _ + ) + Case acDiagram + sSupportedModules = Array( "com.sun.star.sdb.RelationDesign" ) + Case acWelcome + sSupportedModules = Array( "com.sun.star.frame.StartModule" ) + Case Else + sSupportedModules = Array() + End Select + + ' Find all standard and custom toolbars stored in LibO/AOO Base + Set oModuleUI = CreateUnoService("com.sun.star.ui.ModuleUIConfigurationManagerSupplier") + For k = 0 To UBound(vModules) + For j = 0 To UBound(sSupportedModules) + iBuiltin = 1 ' Default = builtin + If vModules(k) = sSupportedModules(j) Then ' Supported modules only + Set oToolbar = oModuleUI.getUIConfigurationManager(vModules(k)) + vUIElements() = oToolbar.getUIElementsInfo(0) + For i = 0 To UBound(vUIElements) + sToolbarFullName = _GetPropertyValue(vUIElements(i), "ResourceURL") + sToolbarName = Split(sToolbarFullName, "/")(2) + If _IsLeft(UCase(sToolbarName), UCase(cstCustom)) Then + sToolbarName = _GetPropertyValue(vUIElements(i), "UIName") + iBuiltin = 2 + End If + + iObjectsCount = iObjectsCount + 1 + Select Case True + Case IsMissing(pvIndex) + Case VarType(pvIndex) = vbString + If UCase(pvIndex) = UCase(sToolbarName) Then bFound = True + Case Else + If pvIndex < 0 Then Goto Trace_IndexError + If pvIndex = iObjectsCount - 1 Then bFound = True + End Select + + If bFound Then + Set oObject = _NewCommandBar(vModules(k), sToolbarName, sToolbarFullName, iBuiltin) + Set oObject._Window = oWindow.Frame + Set oObject._Toolbar = oToolbar + Goto Exit_Function + End If + Next i + End If + Next j + Next k + + ' Find all (not builtin) toolbars stored in current document (typically forms) + iBuiltin = 3 ' Stored in form itself + Set oToolbar = oWindow.Frame.Controller.Model.getUIConfigurationManager + vUIElements() = oToolbar.getUIElementsInfo(0) + For i = 0 To UBound(vUIElements) + sToolbarFullName = _GetPropertyValue(vUIElements(i), "ResourceURL") + sToolbarName = _GetPropertyValue(vUIElements(i), "UIName") + iObjectsCount = iObjectsCount + 1 + Select Case True + Case IsMissing(pvIndex) + Case VarType(pvIndex) = vbString + If UCase(pvIndex) = UCase(sToolbarName) Then bFound = True + Case Else + If pvIndex = iObjectsCount - 1 Then bFound = True + End Select + If bFound Then + Set oObject = _NewCommandBar("", sToolbarName, sToolbarFullName, iBuiltin) + Set oObject._Window = oWindow.Frame + Set oObject._Toolbar = oToolbar + Goto Exit_Function + End If + Next i + + ' MISSING : CUSTOM POPUPS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLCOMMANDBARS + oObject._Count = iObjectsCount + Case VarType(pvIndex) = vbString + Goto Trace_NotFound + Case Else ' pvIndex is numeric + Goto Trace_IndexError + End Select + +Exit_Function: + Set CommandBars = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("COMMANDBAR"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +Trace_WindowError: + TraceError(TRACEFATAL, ERRWINDOW, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' CommandBars V1,3,0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(ByVal Optional pvObject As Variant, Optional ByVal pvIndex As Variant) As Variant +' Return an object of type Control indicated by either its index (integer) or its name (CASE-INSENSITIVE string) +' The 1st argument pvObject can be either +' an object of type FORM (1) +' a main form name as string +' an object of type SUBFORM (2) +' The Form property in the returned variant contains a SUBFORM type +' an object of type CONTROL and subtype GRIDCONTROL (3) +' an object of type OPTIONGROUP (4) 2nd argument, if any, must be numeric +' If no pvIndex argument, return a Collection type + +If _ErrorHandler() Then On Local Error Goto Error_Function +Dim vObject As Object +Const cstThisSub = "Controls" + Utils._SetCalledSub(cstThisSub) + + If IsMissing(pvObject) Then Call _TraceArguments() + If IsNull(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments() + Controls = EMPTY + + If VarType(pvObject) = vbString Then + Set vObject = Forms(pvObject) + If IsNull(vObject) Then Goto Exit_Function + Else + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJSUBFORM, OBJOPTIONGROUP, CTLGRIDCONTROL)) Then Goto Exit_Function + Set vObject = pvObject + End If + + If IsMissing(pvIndex) Then + Controls = vObject.Controls() + Else + If Not Utils._CheckArgument(pvIndex, 2, Utils._AddNumeric(vbString)) Then Goto Exit_Function + Controls = vObject.Controls(pvIndex) + End If + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEERROR, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' Controls V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentDb() As Object +' Returns _A2B_.CurrentDocument().Database as an object to allow access to its properties + +Const cstThisSub = "CurrentDb" + Utils._SetCalledSub(cstThisSub) + + Set CurrentDb = Nothing + If IsEmpty(_A2B_) Then GoTo Exit_Function + Set CurrentDb = _A2B_.CurrentDb() + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' CurrentDb V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentUser() As String + +Dim oPath As Object, sUser As String + + Set oPath = CreateUnoService("com.sun.star.util.PathSubstitution") + sUser = oPath.getSubstituteVariableValue("$(username)") ' New since LibreOffice 5.2 + CurrentUser = sUser + +End Function ' CurrentUser V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DAvg( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return average of scope +Const cstThisSub = "DAvg" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DAvg = Application._CurrentDb()._DFunction("AVG", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DAvg + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DCount( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return # of occurrences of scope +Const cstThisSub = "DCount" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DCount = Application._CurrentDb()._DFunction("COUNT", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DLookup( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + , ByVal Optional pvOrderClause As Variant _ + ) As Variant + +' Return a value within a table + 'Arguments: psExpr: an SQL expression + ' psDomain: a table- or queryname + ' pvCriteria: an optional WHERE clause + ' pcOrderClause: an optional order clause incl. "DESC" if relevant + 'Return: Value of the psExpr if found, else Null. + 'Author: inspired from Allen Browne. http://allenbrowne.com/ser-42.html + 'Examples: + ' 1. To find the last value, include DESC in the OrderClause, e.g.: + ' DLookup("[Surname] & [FirstName]", "tblClient", , "ClientID DESC") + ' 2. To find the lowest non-null value of a field, use the Criteria, e.g.: + ' DLookup("ClientID", "tblClient", "Surname Is Not Null" , "Surname") + +Const cstThisSub = "DLookup" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DLookup = Application._CurrentDb()._DFunction("", psExpr, psDomain _ + , Iif(IsMissing(pvCriteria), "", pvCriteria) _ + , Iif(IsMissing(pvOrderClause), "", pvOrderClause) _ + ) + Utils._ResetCalledSub(cstThisSub) +End Function ' DLookup + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DMax( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return maximum of scope +Const cstThisSub = "DMax" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DMax = Application._CurrentDb()._DFunction("MAX", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DMax + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DMin( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return minimum of scope +Const cstThisSub = "DMin" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DMin = Application._CurrentDb()._DFunction("MIN", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DMin + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DStDev( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return standard deviation of scope +Const cstThisSub = "DStDev" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DStDev = Application._CurrentDb()._DFunction("STDDEV_SAMP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") ' STDDEV not STDEV ! + Utils._ResetCalledSub(cstThisSub) +End Function ' DStDev + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DStDevP( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return standard deviation of scope +Const cstThisSub = "DStDevP" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DStDevP = Application._CurrentDb()._DFunction("STDDEV_POP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") ' STDDEV not STDEV ! + Utils._ResetCalledSub(cstThisSub) +End Function ' DStDevP + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DSum( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return sum of scope +Const cstThisSub = "DSum" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DSum = Application._CurrentDb()._DFunction("SUM", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DSum + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DVar( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return variance of scope +Const cstThisSub = "DVar" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DVar = Application._CurrentDb()._DFunction("VAR_SAMP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DVar + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DVarP( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return variance of scope +Const cstThisSub = "DVarP" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DVarP = Application._CurrentDb()._DFunction("VAR_POP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DVarP + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Events(Optional poEvent As Variant) As Variant +' Return an event object corresponding with actual event + +Dim vEvent As Variant + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Events" + Utils._SetCalledSub(cstThisSub) + + Set vEvent = Nothing + If IsMissing(poEvent) Then Goto Exit_Function + If IsNull(poEvent) Then Goto Exit_Function + + If Not Utils._CheckArgument(poEvent, 1, vbObject, , False) Then Goto Exit_Function ' No error handling in CheckArgument + If Not Utils._hasUNOProperty(poEvent, "Source") Then Goto Trace_Error + Set vEvent = New Event + vEvent._Initialize(poEvent) + +Exit_Function: + Set Events = vEvent + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEWARNING, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_Error: + ' Errors are not displayed to avoid display infinite cycling + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, False, Array(1, Utils._CStr(poEvent))) + Set vEvent = Nothing + Goto Exit_Function +End Function ' Events V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Forms(ByVal Optional pvIndex As Variant) As Variant +' Return an object of type Form indicated by either its index (integer) or its name (NOT CASE-SENSITIVE string) +' The concerned form must be loaded. +' If no argument, return a Collection type + +Const cstThisSub = "Forms" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim ofForm As Object, oCounter As Variant, vForms As Variant, oIndex As Object + Set vForms = Nothing + +Dim iCount As Integer + If IsMissing(pvIndex) Then + iCount = Application._CountOpenForms() + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLFORMS + oCounter._Count = iCount + Forms = oCounter + Exit Function + Else + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + + Select Case VarType(pvIndex) + Case vbString + Set ofForm = Application.AllForms(Utils._Trim(pvIndex)) + Case Else + iCount = Application._CountOpenForms() + If iCount <= pvIndex Then Goto Trace_Error_Index + Set ofForm = Application._CountOpenForms(pvIndex) + End Select + + If IsNull(ofForm) Then Goto Trace_Error + If ofForm.IsLoaded Then + Set vForms = ofForm + Else + Set vForms = Nothing + TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, , ofForm._Name) + Goto Exit_Function + End If + +Exit_Function: + Set Forms = vForms + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvIndex)) + Set vForms = Nothing + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set vForms = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' Forms V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getObject(Optional pvShortcut As Variant) As Variant +' Return the object described by pvShortcut ignoring its final property +' Example: "Forms!myForm!myControl.myProperty" => Controls(Forms("myForm"), "myControl")) + +Const cstEXCLAMATION = "!" +Const cstDOT = "." + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "getObject" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvShortcut) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvShortcut, 1, vbString) Then Goto Exit_Function + +Dim iCurrentIndex As Integer, vCurrentObject As Variant, sCurrentProperty As String +Dim sComponents() As String, sSubComponents() As String, sDialog As String +Dim oDoc As Object + Set vCurrentObject = Nothing + sComponents = Split(Trim(pvShortcut), cstEXCLAMATION) + If UBound(sComponents) = 0 Then Goto Trace_Error + If Not Utils._InList(UCase(sComponents(0)), Array("FORMS", "DIALOGS", "TEMPVARS")) Then Goto Trace_Error + If sComponents(1) = "0" Or Left(sComponents(1), 2) = "0." Then + Set oDoc = _A2B_.CurrentDocument() + If oDoc.DbConnect = DBCONNECTFORM Then sComponents(1) = oDoc.DbContainers(0).FormName Else Goto Trace_Error + End If + + sSubComponents = Split(sComponents(UBound(sComponents)), cstDOT) + sComponents(UBound(sComponents)) = sSubComponents(0) ' Ignore final property, if any + + Set vCurrentObject = New Collect + Set vCurrentObject._This = vCurrentObject + Select Case UCase(sComponents(0)) + Case "FORMS" : vCurrentObject._CollType = COLLFORMS + Case "DIALOGS" : vCurrentObject._CollType = COLLALLDIALOGS + Case "TEMPVARS" : vCurrentObject._CollType = COLLTEMPVARS + End Select + For iCurrentIndex = 1 To UBound(sComponents) ' Start parsing ... + sSubComponents = Split(sComponents(iCurrentIndex), cstDOT) + sComponents(iCurrentIndex) = Utils._Trim(sSubComponents(0)) + Select Case UBound(sSubComponents) + Case 0 + sCurrentProperty = "" + Case 1 + sCurrentProperty = sSubComponents(1) + Case Else + Goto Trace_Error + End Select + Select Case vCurrentObject._Type + Case OBJCOLLECTION + Select Case vCurrentObject._CollType + Case COLLFORMS + vCurrentObject = Application.AllForms(sComponents(iCurrentIndex)) + Case COLLALLDIALOGS + sDialog = UCase(sComponents(iCurrentIndex)) + vCurrentObject = Application.AllDialogs(sDialog) + If Not vCurrentObject.IsLoaded Then Goto Trace_Error + Set vCurrentObject.UnoDialog = _A2B_.Dialogs.Item(sDialog) + Case COLLTEMPVARS + If UBound(sComponents) > 1 Then Goto Trace_Error + vCurrentObject = Application.TempVars(sComponents(1)) + 'Case Else + End Select + Case OBJFORM, OBJSUBFORM, OBJCONTROL, OBJDIALOG + vCurrentObject = vCurrentObject.Controls(sComponents(iCurrentIndex)) + End Select + If sCurrentProperty <> "" Then vCurrentObject = vCurrentObject.getProperty(sCurrentProperty) + Next iCurrentIndex + + Set getObject = vCurrentObject + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvShortcut)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' getObject V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getValue(Optional pvObject As Variant) As Variant +' getValue also interprets shortcut strings !! +Dim vItem As Variant, sProperty As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getValue") + If VarType(pvObject) = vbString Then + Utils._SetCalledSub("getValue") + Set vItem = getObject(pvObject) + sProperty = Utils._FinalProperty(pvObject) + If sProperty = "" Then sProperty = "Value" ' Default value if final property in shortcut is absent + getValue = vItem.getProperty(sproperty) + Utils._ResetCalledSub("getValue") + Else + Set vItem = pvObject + getValue = vItem.getProperty("Value") + End If +End Function ' getValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Function HtmlEncode(ByVal pvString As Variant, ByVal Optional pvLength As Variant) As String +' Converts a string to an HTML-encoded string. + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "HtmlEncode" + Utils._SetCalledSub(cstThisSub) + + HtmlEncode = "" + +Dim sOutput As String, l As Long, lLength As Long + If IsMissing(pvLength) Then pvLength = 0 + If Not Utils._CheckArgument(pvString, 1, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvLength, 1, _AddNumeric()) Then Goto Exit_Function + + sOutput = "" + lLength = CLng(pvLength) + If Len(pvString) > 0 Then + For l = 1 To Len(pvString) + If lLength > 0 And Len(sOutput) > lLength Then Exit For + sOutput = sOutput & Utils._UTF8Encode(Mid(pvString, l, 1)) + Next l + End If + + HtmlEncode = sOutput + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' HtmlEncode V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenConnection ( _ + Optional pvComponent As Variant _ + , ByVal Optional pvUser As Variant _ + , ByVal Optional pvPassword As Variant _ + ) As Object + +' Establish connection with the database designated in the currently open front-end (.odb) document +' Call template: +' Call OpenConnection(ThisDatabaseDocument[, "", ""]) +' Call stored in the OpenDocument event of the front-end database document +'OR +' Initiates processing of a (standalone ?) Writer, Calc, ... document with 1 or more data-aware forms +' Call template: +' Call OpenConnection(ThisComponent[, "", ""]) +' Call stored in the OpenDocument event of the document +' +' User and Password arguments are obsolete (still tolerated) +' - because no mean has been found to connect protected db from .odb via API +' - because having multiple forms with multiple db's and multiple passwords is meaningless + +Dim oComponent As Object, oForms As Object, iCurrent As Integer +Dim i As Integer, bFound As Boolean +Dim vCurrentDoc() As Variant +Dim oBaseContext As Object, sDbNames() As String, oBaseSource As Object +Dim sDatabaseURL As String, oHandler As Object +Dim vDbContainer As Variant, vDbContainers() As Variant, vDocContainer As Variant +Dim sFormName As String + + If IsEmpty(_A2B_) Then Call Application._RootInit() ' First use of Access2Base in current AOO/LibO session + Set OpenConnection = Nothing + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "OpenConnection" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvComponent) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvComponent, 1, vbObject) Then Goto Exit_Function + Set oComponent = pvComponent + If Not Utils._hasUNOProperty(oComponent, "ImplementationName") Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(1, oComponent)) + Exit Function + End If + If IsMissing(pvUser) Then pvUser = "" + If IsMissing(pvPassword) Then pvPassword = "" + If Not Utils._CheckArgument(pvUser, 2, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvPassword, 3, vbString) Then Goto Exit_Function + + If Not IsArray(_A2B_.CurrentDoc) Then + vCurrentDoc() = Array() + Redim vCurrentDoc(0 To 0) ' Create at least one entry for database document + Else + vCurrentDoc() = _A2B_.CurrentDoc() + End If + + ' Find index of entry to use for new connection + With oComponent + Select Case .ImplementationName + Case "com.sun.star.comp.dba.ODatabaseDocument" + iCurrent = 0 + Case Else ' "SwXTextDocument", "ScModelObj" + If UBound(vCurrentDoc) <= 0 Then ' First Calc or Writer during current session + iCurrent = 1 + Else ' Search entry already used earlier by same component + bFound = False + For i = 1 To UBound(vCurrentDoc) + If Not IsEmpty(vCurrentDoc(i)) Then + If vCurrentDoc(i).Active And vCurrentDoc(i).URL = .URL Then + iCurrent = i + bFound = True + Exit For + End If + End If + Next i + End If + If Not bFound Then + iCurrent = UBound(vCurrentDoc) + 1 ' No entry found, increment array + ReDim Preserve vCurrentDoc(0 To iCurrent) + End If + End Select + End With + + ' Initialize future entry + Set vDocContainer = New DocContainer + Set vDocContainer.Document = oComponent + vDocContainer.Active = True + vDocContainer.URL = oComponent.URL + ' Initialize each DbContainer entry + vDbContainers() = Array() + TraceLog(TRACEANY, Utils._GetProductName() & " - " & Application.ProductCode(), False) + Select Case oComponent.ImplementationName + Case "com.sun.star.comp.dba.ODatabaseDocument" ' Ignore pvUser and pvPassword arguments + vDbContainer = New DbContainer + vDbContainer.FormName = "" + Set vDbContainer.Database = New Database + Set vDbContainer.Database._This = vDbContainer.Database + With vDbContainer.Database + If Not oComponent.CurrentController.IsConnected Then + Set oHandler = createUnoService("com.sun.star.sdb.InteractionHandler") + Set .Connection = oComponent.DataSource.connectWithCompletion(oHandler) + oComponent.CurrentController.connect() + Else + Set .Connection = oComponent.CurrentController.ActiveConnection + End If + vDocContainer.DbConnect = DBCONNECTBASE + ._DbConnect = DBCONNECTBASE + Set .MetaData = .Connection.MetaData + ._LoadMetadata() + If .MetaData.DatabaseProductName = "MySQL" Then + ._ReadOnly = .MetaData.isReadOnly() + Else + ._ReadOnly = .Connection.isReadOnly() ' Always True in Mysql ?? + End If + Set .Document = oComponent + .Title = oComponent.Title + .URL = vDocContainer.URL + .Location = oComponent.Location + ReDim vDbContainers(0 To 0) + Set vDbContainers(0) = vDbContainer + TraceLog(TRACEANY, .Version, False) + TraceLog(TRACEANY, UCase(cstThisSub) & " " & .URL, False) + End With + Case Else + Set oForms = oComponent.CurrentController.Model.DrawPage.Forms + If oForms.Count < 1 Then Goto Error_MainForm + ReDim vDbContainers(0 To oForms.Count - 1) + For i = 0 To oForms.Count - 1 + vDbContainer = New DbContainer ' To make distinct entries !! + sFormName = oForms.ElementNames(i) + Set vDbContainer.Database = New Database + Set vDbContainer.Database._This = vDbContainer.Database + With vDbContainer.Database + .FormName = sFormName + vDbContainer.FormName = sFormName + Set .Form = oForms.getByName(sFormName) + Set .Connection = .Form.ActiveConnection ' Might be Nothing in Windows at AOO/LO startup (not met in Linux) + If Not IsNull(.Connection) Then + Set .MetaData = .Connection.MetaData + ._LoadMetadata() + ._ReadOnly = .Connection.isReadOnly() + TraceLog(TRACEANY, .MetaData.getDatabaseProductName() & " " & .MetaData.getDatabaseProductVersion, False) + End If + Set .Document = oComponent + .Title = oComponent.Title + .URL = .Form.DataSourceName + ._DbConnect = DBCONNECTFORM + Set vDbContainers(i) = vDbContainer + vDbContainers(i).FormName = sFormName + TraceLog(TRACEANY, UCase(cstThisSub) & " " & .URL & " Form=" & vDbContainer.FormName, False) + End With + Next i + vDocContainer.DbConnect = DBCONNECTFORM + End Select + + vDocContainer.DbContainers() = vDbContainers() + Set vCurrentDoc(iCurrent) = vDocContainer + + _A2B_.CurrentDoc = vCurrentDoc + Set OpenConnection = vDbContainers(0).Database + + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set _A2B_.CurrentDoc = Array() + GoTo Exit_Function +Error_MainForm: + TraceError(TRACEFATAL, ERRMAINFORM, Utils._CalledSub(), False, ,oComponent.Title) + Set _A2B_.CurrentDoc = Array() + GoTo Exit_Function +Trace_Error: + TraceError(TRACEABORT, ERRDBNOTCONNECTED, Utils._CalledSub(), 0,1) + Goto Exit_Function +End Function ' OpenConnection V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenDatabase ( _ + ByVal Optional pvDatabaseURL As Variant _ + , ByVal Optional pvUser As Variant _ + , ByVal Optional pvPassword As Variant _ + , ByVal Optional pvReadOnly As Variant _ + ) As Variant + +' Return a database object based on input arguments: +' Call template: +' Call OpenDatabase("... databaseURL ..."[, "", "", True/False]) +' pvDatabaseURL may be the name of a registered database or the URL of the targeted .odb file +' Might be called from any AOO/LibO application, independently from OpenConnection + +Dim odbDatabase As Variant, oBaseContext As Object, sDbNames() As String, oBaseSource As Object +Dim i As Integer, bFound As Boolean +Dim sDatabaseURL As String + + If IsEmpty(_A2B_) Then ' First use of Access2Base in current AOO/LibO session + Call Application._RootInit() + TraceLog(TRACEANY, Utils._GetProductName() & " - " & Application.ProductCode(), False) + End If + Set OpenDatabase = Nothing + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "OpenDatabase" + Utils._SetCalledSub(cstThisSub) + If pvDatabaseURL = "" Then Call _TraceArguments() + If Not Utils._CheckArgument(pvDatabaseURL, 1, vbString) Then Goto Exit_Function + If IsMissing(pvUser) Then pvUser = "" + If IsMissing(pvPassword) Then pvPassword = "" + If Not Utils._CheckArgument(pvUser, 2, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvPassword, 3, vbString) Then Goto Exit_Function + If IsMissing(pvReadOnly) Then pvReadOnly = False + If Not Utils._CheckArgument(pvReadOnly, 3, vbBoolean) Then Goto Exit_Function + + Set odbDatabase = New Database + Set odbDatabase._This = odbDatabase + odbDatabase._DbConnect = DBCONNECTANY + + Set oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") + sDbNames() = oBaseContext.getElementNames() + bFound = False + For i = 0 To UBound(sDbNames()) ' Enumerate registered databases and check non case-sensitive equality + If UCase(sDbNames(i)) = UCase(pvDatabaseURL) Then + sDatabaseURL = sDbNames(i) + Set oBaseSource = oBaseContext.getByName(sDatabaseURL) + odbDatabase.Location = oBaseContext.getDatabaseLocation(sDbNames(i)) + bFound = True + Exit For + End If + Next i + If Not bFound Then + sDatabaseURL = ConvertToURL(pvDatabaseURL) + If UCase(Right(sDatabaseURL, 4)) <> ".ODB" Then Goto Trace_Error + If Not FileExists(sDatabaseURL) Then Goto Trace_Error + Set oBaseSource = oBaseContext.getByName(sDatabaseURL) + odbDatabase.Location = sDatabaseURL + End If + + Set odbDatabase.Connection = oBaseSource.getConnection(pvUser, pvPassword) + If Not IsNull(odbDatabase.Connection) Then ' Null when standalone and target db does not exist + Set odbDatabase.MetaData = odbDatabase.Connection.MetaData + odbDatabase._LoadMetadata() + Else + Goto Trace_Error + End If + + odbDatabase.URL = sDatabaseURL + + If pvReadOnly Then + odbDatabase.Connection.isReadOnly = True + odbDatabase._ReadOnly = True + End If + + Set OpenDatabase = odbDatabase + + TraceLog(TRACEANY, odbDatabase.MetaData.getDatabaseProductName() & " " & odbDatabase.MetaData.getDatabaseProductVersion, False) + TraceLog(TRACEANY, UCase(cstThisSub) & " " & odbDatabase.URL, False) + + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_Error: + TraceError(TRACEABORT, ERRDBNOTCONNECTED, Utils._CalledSub(), 0,1) + Goto Exit_Function +End Function ' OpenDatabase V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ProductCode() + If IsEmpty(_A2B_) Then Call Application._RootInit() ' First use of Access2Base in current AOO/LibO session + ProductCode = "Access2Base " & _A2B_.VersionNumber +End Function ' ProductCode V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setValue(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' setValue also interprets shortcut strings !! +Dim vItem As Variant, sProperty As String + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setValue") + If VarType(pvObject) = vbString Then + Utils._SetCalledSub("setValue") + Set vItem = getObject(pvObject) + sProperty = Utils._FinalProperty(pvObject) + If sProperty = "" Then sProperty = "Value" + setValue = vItem.setProperty(sProperty, pvValue) + Utils._ResetCalledSub("setValue") + Else + Set vItem = pvObject + setValue = vItem.setProperty("Value", pvValue) + End If +End Function ' setValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SysCmd(Optional pvAction As Variant _ + , Optional pvText As Variant _ + , Optional pvValue As Variant _ + ) As Variant +' Manage progress meter in the status bar +' Other values supported by MSAccess are ignored + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "SysCmd" + Utils._SetCalledSub(cstThisSub) + SysCmd = False + +Const cstMissing = -1 +Const cstBarLength = 350 + If IsMissing(pvAction) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvAction, 1, Utils._AddNumeric(), Array( _ + acSysCmdAccessDir _ + , acSysCmdAccessVer _ + , acSysCmdClearHelpTopic _ + , acSysCmdClearStatus _ + , acSysCmdGetObjectState _ + , acSysCmdGetWorkgroupFile _ + , acSysCmdIniFile _ + , acSysCmdInitMeter _ + , acSysCmdProfile _ + , acSysCmdRemoveMeter _ + , acSysCmdRuntime _ + , acSysCmdSetStatus _ + , acSysCmdUpdateMeter _ + )) Then Goto Exit_Function + If IsMissing(pvValue) Then pvValue = cstMissing + If Not Utils._CheckArgument(pvAction, 1, Utils._AddNumeric()) Then Goto Exit_Function + Select Case pvAction + Case acSysCmdInitMeter, acSysCmdUpdateMeter, acSysCmdSetStatus + If IsMissing(pvText) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvText, 2, vbString) Then Goto Exit_Function + Case Else + End Select + If Not Utils._CheckArgument(pvValue, 3, Utils._AddNumeric()) Then Goto Exit_Function + +Dim vBar As Variant, iLen As Integer + Set vBar = _A2B_.StatusBar + Select Case pvAction + Case acSysCmdAccessVer + SysCmd = Application.Version() + Goto Exit_Function + Case acSysCmdSetStatus + If pvValue <> cstMissing Then Goto Error_Arg + iLen = Len(pvText) + vBar = _NewBar() + If Not IsNull(vBar) Then vBar.start(Iif(iLen >= cstBarLength, pvText, pvText & Space(cstBarLength - iLen)), 0) + Case acSysCmdClearStatus + If pvValue <> cstMissing Then Goto Error_Arg + If Not IsNull(vBar) Then + vBar.end() + Set _A2B_.StatusBar = Nothing + End If + Case acSysCmdInitMeter + If pvValue = cstMissing Then Call _TraceArguments() + vBar = _NewBar() + If Not IsNull(vBar) Then vBar.start(pvText, pvValue) + Case acSysCmdUpdateMeter + If pvValue = cstMissing Then Call _TraceArguments() + If Not IsNull(vBar) Then ' Otherwise ignore ! + vBar.setValue(pvValue) + If Len(pvText) > 0 Then vBar.setText(pvText) + End If + Case acSysCmdRemoveMeter + If Not IsNull(vBar) Then + vBar.end() + Set _A2B_.StatusBar = Nothing + End If + Case acSysCmdRuntime + SysCmd = False + Goto Exit_Function + Case Else + End Select + + SysCmd = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_Arg: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(3, pvValue)) + Goto Exit_Function +End Function ' SysCmd V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function TempVars(ByVal Optional pvIndex As Variant) As Variant +' Return either a Collection or a TempVar object + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "TempVars" + Utils._SetCalledSub(cstThisSub) + +Dim iMode As Integer, vTempVars As Variant, bFound As Boolean +Const cstCount = 0 +Const cstByIndex = 1 +Const cstByName = 2 + + If IsMissing(pvIndex) Then + iMode = cstCount + Else + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + If VarType(pvIndex) = vbString Then iMode = cstByName Else iMode = cstByIndex + End If + + Set vTempVars = Nothing + Select Case iMode + Case cstCount ' Build Collection object + Set vTempVars = New Collect + With vTempVars + ._This = vTempVars + ._CollType = COLLTEMPVARS + ._Count = _A2B_.TempVars.Count + End With + Case cstByIndex ' Build TempVar object + If pvIndex < 0 Or pvIndex >= _A2B_.TempVars.Count Then Goto Trace_Error_Index + Set vTempVars = _A2B_.TempVars.Item(pvIndex + 1) ' Builtin collections start at 1 + Case cstByName + bFound = _A2B_.hasItem(COLLTEMPVARS, pvIndex) + If Not bFound Then Goto Trace_NotFound + vTempVars = _A2B_.TempVars.Item(UCase(pvIndex)) + End Select + + Set TempVars = vTempVars + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set vTempVars = Nothing + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("TEMPVAR"), pvIndex)) + Goto Exit_Function +End Function ' TempVars V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Version() As String + Version = Utils._GetProductName() +End Function ' Version V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _CollectNames(ByRef poCollection As Object, ByVal psPrefix As String) As Variant +' Return a "\;" separated list of hierarchical (prefixed with Prefix) and persistent names contained in Collection +' If one of those names refers to a folder, function is called recursively +' Result = 2 items array: (0) list of hierarchical names +' (1) list of persistent names +' +Dim oObject As Object, vNamesList() As Variant, vPersistentList As Variant, i As Integer, sCollect(0 To 1) As String +Dim sName As String, sType As String, sPrefix As String +Const cstFormType = "application/vnd.oasis.opendocument.text" +Const cstSeparator = "\;" + + _CollectNames = sCollect() + vPersistentList = Array() + + With poCollection + If .getCount = 0 Then Exit Function + vNamesList = .getElementNames() + ReDim vPersistentList(0 To UBound(vNamesList)) + + For i = 0 To UBound(vNamesList) + sName = vNamesList(i) + Set oObject = .getByName(sName) + sType = oObject.getContentType() + Select Case sType + Case cstFormType + vNamesList(i) = psPrefix & vNamesList(i) + vPersistentList(i) = oObject.PersistentName + Case "" ' Folder + sCollect = _CollectNames(oObject, psPrefix & sName & "/") + vNamesList(i) = sCollect(0) + vPersistentList(i) = sCollect(1) + Case Else + End Select + Next i + + End With + + Set oObject = Nothing + sCollect(0) = Join(vNamesList, cstSeparator) + sCollect(1) = Join(vPersistentList, cstSeparator) + _CollectNames = sCollect() + +End Function ' _CollectNames V6.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CountOpenForms(ByVal Optional piCountMax As Integer) As Variant +' Return # of active forms if no argument +' Return name of piCountMax-th open form if argument present + +Dim i As Integer, iCount As Integer, iAllCount As Integer, ofForm As Variant + iAllCount = AllForms._Count + iCount = 0 + If iAllCount > 0 Then + For i = 0 To iAllCount - 1 + Set ofForm = Application.AllForms(i) + If ofForm._IsLoaded Then iCount = iCount + 1 + If Not IsMissing(piCountMax) Then + If iCount = piCountMax + 1 Then + _CountOpenForms = ofForm ' OO3.2 aborts when Set verb present ?!? + Exit For + End If + End If + Next i + End If + + If IsMissing(piCountMax) Then _CountOpenForms = iCount + +End Function ' CountOpenForms V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CurrentDb(ByVal Optional piDocEntry As Integer, ByVal Optional piDbEntry As Integer) As Variant +REM Without arguments same as CurrentDb() except that it generates an error if database not connected (internal use) +REM With 2 arguments return the corresponding entry in Root + +Dim oCurrentDb As Object + If IsEmpty(_A2B_) Then GoTo Trace_Error + If IsMissing(piDocEntry) Then Set oCurrentDb = Application.CurrentDb() _ + Else Set oCurrentDb = _A2B_._CurrentDb(piDocEntry, piDbEntry) + If IsNull(oCurrentDb) Then Goto Trace_Error Else Set _CurrentDb = oCurrentDb + +Exit_Function: + Exit Function +Trace_Error: + TraceError(TRACEABORT, ERRDBNOTCONNECTED, Utils._CalledSub(), 0, 1) + Goto Exit_Function +End Function ' _CurrentDb V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetAllHierarchicalNames() As Variant +' Return the full hierarchical names list of a database document +' Get it from the vFormNamesList buffer if the latter is not empty + +Dim vNamesList As Variant, iCurrentDoc As Integer, vCurrentDoc As Variant +Dim oForms As Object +Const cstSeparator = "\;" + + _GetAllHierarchicalNames = Array() + +' Load complete list of names when Base document + iCurrentDoc = _A2B_.CurrentDocIndex() + If iCurrentDoc >= 0 Then vCurrentDoc = _A2B_.CurrentDocument(iCurrentDoc) Else Exit Function + If vCurrentDoc.DbConnect = DBCONNECTBASE Then + If IsEmpty(vFormNamesList) Then + Set oForms = vCurrentDoc.Document.getFormDocuments() + vFormNamesList = _CollectNames(oForms, "") + End If + vNamesList = Split(vFormNamesList(0), cstSeparator) + Else + Exit Function + End If + + _GetAllHierarchicalNames = vNamesList + Set oForms = Nothing + +End Function ' _GetAllHierarchicalNames V 6.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetHierarchicalName(ByVal psPersistent As String) As String +' Return the full hierarchical name from the persistent name of a form/report + +Dim vPersistentList As Variant, vNamesList As Variant, i As Integer +Const cstSeparator = "\;" + + _GetHierarchicalName = "" + +' Load complete list of names when Base document + vNamesList = _GetAllHierarchicalNames() + If UBound(vNamesList) < 0 Then Exit Function + vPersistentList = Split(vFormNamesList(1), cstSeparator) + +' Search in list + For i = 0 To UBound(vPersistentList) + If vPersistentList(i) = psPersistent Then + _GetHierarchicalName = vNamesList(i) + Exit For + End If + Next i + +End Function ' _GetHierarchicalName V 6.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _NewBar() As Object +' Close current status bar, if any, and initialize new one + +Dim vBar As Variant, vWindow As Variant, vController As Object + On Local Error Resume Next + Set _NewBar = Nothing + + Set vBar = _A2B_.StatusBar + If Not IsNull(vBar) Then + If Utils._hasUNOMethod(vBar, "end") Then vBar.end() + Set _A2B_.StatusBar = Nothing + End If + + Set vBar = Nothing + Set vWindow = _SelectWindow() + If IsNull(vWindow.Frame) Then Exit Function + Select Case vWindow.WindowType + Case acForm, acReport, acBasicIDE, acDocument ' Not found how to make it work for acDatabaseWindow + Case Else + Exit Function + End Select + If Utils._hasUNOMethod(vWindow.Frame, "getCurrentController") Then + Set vController = vWindow.Frame.getCurrentController() + ElseIf Utils._hasUNOMethod(vWindow.Frame, "getController") Then + Set vController = vWindow.Frame.getController() + End If + + If Utils._hasUNOMethod(vController, "getStatusIndicator") Then vBar = vController.getStatusIndicator() + Set _A2B_.StatusBar = vBar + Set _NewBar = vBar + Exit Function + +End Function ' _NewBar V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _NewCommandBar(psModule As String _ + , psToolbarName As String _ + , psToolbarFullName As String _ + , piBuiltin As Integer _ + ) As Object + +Dim oObject As Object + Set oObject = New CommandBar + With oObject + ._This = oObject + ._Type = OBJCOMMANDBAR + ._Name = psToolbarName + ._ResourceURL = psToolbarFullName + ._Module = psModule + ._BarBuiltin = piBuiltin + Select Case UCase(Split(psToolbarFullName, "/")(1)) + Case "MENUBAR" : ._BarType = msoBarTypeMenuBar + Case "STATUSBAR" : ._BarType = msoBarTypeStatusBar + Case "TOOLBAR" : ._BarType = msoBarTypeNormal + Case "POPUP" : ._BarType = msoBarTypePopup + Case "FLOATER" : ._BarType = msoBarTypeFloater + Case Else : ._BarType = -1 + End Select + End With + Set _NewCommandBar = oObject + Exit Function + +End Function ' NewCommandBar V1.3.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _RootInit(Optional ByVal pbForce As Boolean) +' Initialize _A2B_ global variable. Reinit forced if pbForce = True + + If IsMissing(pbForce) Then pbForce = False + If IsEmpty(_A2B_) Or pbForce Then _A2B_ = New Root_ + +End Sub ' _RootInit V1.1.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Collect.xba b/wizards/source/access2base/Collect.xba new file mode 100644 index 000000000..df964b058 --- /dev/null +++ b/wizards/source/access2base/Collect.xba @@ -0,0 +1,399 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Collect" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM MODULE NAME <> COLLECTION (is a reserved name for ... collections) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be COLLECTION +Private _This As Object ' Workaround for absence of This builtin function +Private _CollType As String +Private _Parent As Object +Private _Count As Long + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJCOLLECTION + Set _This = Nothing + _CollType = "" + Set _Parent = Nothing + _Count = 0 +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get Count() As Long + Count = _PropertyGet("Count") +End Property ' Count (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Function Item(ByVal Optional pvItem As Variant) As Variant +'Return property value. +'pvItem either numeric index or property name + +Const cstThisSub = "Collection.getItem" + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvItem) Then Goto Exit_Function ' To allow object watching in Basic IDE, do not generate error + Select Case _CollType + Case COLLCOMMANDBARCONTROLS ' Have no name + If Not Utils._CheckArgument(pvItem, 1, Utils._AddNumeric()) Then Goto Exit_Function + Case Else + If Not Utils._CheckArgument(pvItem, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End Select + +Dim vNames() As Variant, oProperty As Object + + Set Item = Nothing + Select Case _CollType + Case COLLALLDIALOGS + Set Item = Application.AllDialogs(pvItem) + Case COLLALLFORMS + Set Item = Application.AllForms(pvItem) + Case COLLALLMODULES + Set Item = Application.AllModules(pvItem) + Case COLLCOMMANDBARS + Set Item = Application.CommandBars(pvItem) + Case COLLCOMMANDBARCONTROLS + If IsNull(_Parent) Then GoTo Error_Parent + Set Item = _Parent.CommandBarControls(pvItem) + Case COLLCONTROLS + If IsNull(_Parent) Then GoTo Error_Parent + Set Item = _Parent.Controls(pvItem) + Case COLLFORMS + Set Item = Application.Forms(pvItem) + Case COLLFIELDS + If IsNull(_Parent) Then GoTo Error_Parent + Set Item = _Parent.Fields(pvItem) + Case COLLPROPERTIES + If IsNull(_Parent) Then GoTo Error_Parent + Select Case _Parent._Type + Case OBJCONTROL, OBJSUBFORM, OBJDATABASE, OBJDIALOG, OBJFIELD _ + , OBJFORM, OBJQUERYDEF, OBJRECORDSET, OBJTABLEDEF + Set Item = _Parent.Properties(pvItem) + Case OBJCOLLECTION, OBJEVENT, OBJOPTIONGROUP, OBJPROPERTY + ' NOT SUPPORTED + End Select + Case COLLQUERYDEFS + Set Item = _Parent.QueryDefs(pvItem) + Case COLLRECORDSETS + Set Item = _Parent.Recordsets(pvItem) + Case COLLTABLEDEFS + Set Item = _Parent.TableDefs(pvItem) + Case COLLTEMPVARS + Set Item = Application.TempVars(pvItem) + Case Else + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + Set Item = Nothing + GoTo Exit_Function +Error_Parent: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, True, Array(_GetLabel("OBJECT"), _GetLabel("PARENT"))) + Set Item = Nothing + GoTo Exit_Function +End Function ' Item V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function Add(Optional pvNew As Variant, Optional pvValue As Variant) As Boolean +' Append a new TableDef or TempVar object to the TableDefs/TempVars collections + +Const cstThisSub = "Collection.Add" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim odbDatabase As Object, oConnection As Object, oTables As Object, oTable As Object +Dim vObject As Variant, oTempVar As Object + Add = False + If IsMissing(pvNew) Then Call _TraceArguments() + + Select Case _CollType + Case COLLTABLEDEFS + If Not Utils._CheckArgument(pvNew, 1, vbObject) Then Goto Exit_Function + Set vObject = pvNew + With vObject + Set odbDatabase = ._ParentDatabase + If odbDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + Set oConnection = odbDatabase.Connection + If IsNull(.TableDescriptor) Or .TableFieldsCount = 0 Then Goto Error_Sequence + Set oTables = oConnection.getTables() + oTables.appendByDescriptor(.TableDescriptor) + Set .Table = oTables.getByName(._Name) + .CatalogName = .Table.CatalogName + .SchemaName = .Table.SchemaName + .TableName = .Table.Name + .TableDescriptor.dispose() + Set .TableDescriptor = Nothing + .TableFieldsCount = 0 + .TableKeysCount = 0 + End With + Case COLLTEMPVARS + If Not Utils._CheckArgument(pvNew, 1, vbString) Then Goto Exit_Function + If pvNew = "" Then Goto Error_Name + If IsMissing(pvValue) Then Call _TraceArguments() + If _A2B_.hasItem(COLLTEMPVARS, pvNew) Then Goto Error_Name + Set oTempVar = New TempVar + oTempVar._This = oTempVar + oTempVar._Name = pvNew + oTempVar._Value = pvValue + _A2B_.TempVars.Add(oTempVar, UCase(pvNew)) + Case Else + Goto Error_NotApplicable + End Select + + _Count = _Count + 1 + Add = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Sequence: + TraceError(TRACEFATAL, ERRTABLECREATION, Utils._CalledSub(), 0, 1, vObject._Name) + Goto Exit_Function +Error_Name: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), False, ,Array(1, pvNew)) + AddItem = False + Goto Exit_Function +End Function ' Add V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Delete(ByVal Optional pvName As Variant) As Boolean +' Delete a TableDef or QueryDef object in the TableDefs/QueryDefs collections + +Const cstThisSub = "Collection.Delete" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim odbDatabase As Object, oColl As Object, vName As Variant + Delete = False + If IsMissing(pvName) Then pvName = "" + If Not Utils._CheckArgument(pvName, 1, vbString) Then Goto Exit_Function + If pvName = "" Then Call _TraceArguments() + + Select Case _CollType + Case COLLTABLEDEFS, COLLQUERYDEFS + If _A2B_.CurrentDocIndex() <> 0 Then Goto Error_NotApplicable + Set odbDatabase = Application._CurrentDb() + If odbDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + If _CollType = COLLTABLEDEFS Then Set oColl = odbDatabase.Connection.getTables() Else Set oColl = odbDatabase.Connection.getQueries() + With oColl + vName = _InList(pvName, .getElementNames(), True) + If vName = False Then Goto trace_NotFound + .dropByName(vName) + End With + odbDatabase.Document.store() + Case Else + Goto Error_NotApplicable + End Select + + _Count = _Count - 1 + Delete = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel(Left(_CollType, 5)), pvName)) + Goto Exit_Function +End Function ' Delete V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Collection.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Collection.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Remove(ByVal Optional pvName As Variant) As Boolean +' Remove a TempVar from the TempVars collection + +Const cstThisSub = "Collection.Remove" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim oColl As Object, vName As Variant + Remove = False + If IsMissing(pvName) Then pvName = "" + If Not Utils._CheckArgument(pvName, 1, vbString) Then Goto Exit_Function + If pvName = "" Then Call _TraceArguments() + + Select Case _CollType + Case COLLTEMPVARS + If Not _A2B_.hasItem(COLLTEMPVARS, pvName) Then Goto Error_Name + _A2B_.TempVars.Remove(UCase(pvName)) + Case Else + Goto Error_NotApplicable + End Select + + _Count = _Count - 1 + Remove = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Name: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), False, ,Array(1, pvName)) + AddItem = False + Goto Exit_Function +End Function ' Remove V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RemoveAll() As Boolean +' Remove the whole TempVars collection + +Const cstThisSub = "Collection.Remove" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + + Select Case _CollType + Case COLLTEMPVARS + Set _A2B_.TempVars = New Collection + _Count = 0 + Case Else + Goto Error_NotApplicable + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' RemoveAll V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + _PropertiesList = Array("Count", "Item", "ObjectType") +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Collection.get" & psProperty) + _PropertyGet = Nothing + + Select Case UCase(psProperty) + Case UCase("Count") + _PropertyGet = _Count + Case UCase("Item") + Case UCase("ObjectType") + _PropertyGet = _Type + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Collection.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Collection._PropertyGet", Erl) + _PropertyGet = Nothing + GoTo Exit_Function +End Function ' _PropertyGet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/CommandBar.xba b/wizards/source/access2base/CommandBar.xba new file mode 100644 index 000000000..c30f696fb --- /dev/null +++ b/wizards/source/access2base/CommandBar.xba @@ -0,0 +1,396 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="CommandBar" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be COMMANDBAR +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _ResourceURL As String +Private _Window As Object ' com.sun.star.frame.XFrame +Private _Module As String +Private _Toolbar As Object +Private _BarBuiltin As Integer ' 1 = builtin, 2 = custom stored in LO/AOO (Base), 3 = custom stored in document (Form) +Private _BarType As Integer ' See msoBarTypeXxx constants + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJCOMMANDBAR + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _ResourceURL = "" + Set _Window = Nothing + _Module = "" + Set _Toolbar = Nothing + _BarBuiltin = 0 + _BarType = -1 +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BuiltIn() As Boolean + BuiltIn = _PropertyGet("BuiltIn") +End Property ' BuiltIn (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Parent() As Object + Parent = _Parent +End Function ' Parent (get) V6.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Visible() As Variant + Visible = _PropertyGet("Visible") +End Property ' Visible (get) + +Property Let Visible(ByVal pvValue As Variant) + Call _PropertySet("Visible", pvValue) +End Property ' Visible (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CommandBarControls(Optional ByVal pvIndex As Variant) As Variant +' Return an object of type CommandBarControl indicated by its index +' Index is different from UNO index: separators do not count +' If no pvIndex argument, return a Collection type + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CommandBar.CommandBarControls" + Utils._SetCalledSub(cstThisSub) + +Dim oLayout As Object, vElements() As Variant, iIndexToolbar As Integer, oToolbar As Object +Dim i As Integer, iItemsCount As Integer, oSettings As Object, vItem() As Variant, bSeparator As Boolean +Dim oObject As Object + + Set oObject = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric()) Then Goto Exit_Function + If pvIndex < 0 Then Goto Trace_IndexError + End If + + Select Case _BarType + Case msoBarTypeNormal, msoBarTypeMenuBar + Case Else : Goto Error_NotApplicable ' Status bar not supported + End Select + + Set oLayout = _Window.LayoutManager + vElements = oLayout.getElements() + iIndexToolbar = _FindElement(vElements()) + If iIndexToolbar < 0 Then Goto Error_NotApplicable ' Toolbar not visible + Set oToolbar = vElements(iIndexToolbar) + + iItemsCount = 0 + Set oSettings = oToolbar.getSettings(False) + + bSeparator = False + For i = 0 To oSettings.getCount() - 1 + Set vItem() = oSettings.getByIndex(i) + If _GetPropertyValue(vItem, "Type", 1) <> 1 Then ' Type = 1 indicates separator + iItemsCount = iItemsCount + 1 + If Not IsMissing(pvIndex) Then + If pvIndex = iItemsCount - 1 Then + Set oObject = New CommandBarControl + With oObject + Set ._This = oObject + Set ._Parent = _This + ._ParentCommandBarName = _Name + ._ParentCommandBar = oToolbar + ._ParentBuiltin = ( _BarBuiltin = 1 ) + ._Element = vItem() + ._InternalIndex = i + ._Index = iItemsCount ' Indexes start at 1 + ._BeginGroup = bSeparator + End With + End If + bSeparator = False + End If + Else + bSeparator = True + End If + Next i + + If IsNull(oObject) Then + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLCOMMANDBARCONTROLS + Set oObject._Parent = _This + oObject._Count = iItemsCount + Case Else ' pvIndex is numeric + Goto Trace_IndexError + End Select + End If + +Exit_Function: + Set CommandBarControls = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' CommandBarControls V1,3,0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Alias for CommandBarControls (VBA) + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CommandBar.Controls" + Utils._SetCalledSub(cstThisSub) + +Dim oObject As Object + + If IsMissing(pvIndex) Then Set oObject = CommandBarControls() Else Set oObject = CommandBarControls(pvIndex) + +Exit_Function: + Set Controls = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' Controls V1,3,0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("CommandBar.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("CommandBar.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Reset() As Boolean +' Reset a whole command bar to its initial values + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CommandBar.Reset" + Utils._SetCalledSub(cstThisSub) + + _Toolbar.reload() + +Exit_Function: + Reset = True + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Reset = False + GoTo Exit_Function +End Function ' Reset V1.3.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _FindElement(pvElements As Variant) As Integer +' Return -1 if not found, otherwise return index in elements table of LayoutManager + +Dim i As Integer + + _FindElement = -1 + If Not IsArray(pvElements) Then Exit Function + + For i = 0 To UBound(pvElements) + If _ResourceURL = pvElements(i).ResourceURL Then + _FindElement = i + Exit Function + End If + Next i + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + _PropertiesList = Array("BuiltIn", "Name", "ObjectType", "Visible") +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "CommandBar.get" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertyGet = Nothing + +Dim oLayout As Object, iElementIndex As Integer + + Select Case UCase(psProperty) + Case UCase("BuiltIn") + _PropertyGet = ( _BarBuiltin = 1 ) + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Visible") + Set oLayout = _Window.LayoutManager + iElementIndex = _FindElement(oLayout.getElements()) + If iElementIndex < 0 Then _PropertyGet = False Else _PropertyGet = oLayout.isElementVisible(_ResourceURL) + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + _PropertyGet = Nothing + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean +' Return True if property setting OK + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "CommandBar.set" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertySet = True +Dim iArgNr As Integer +Dim oLayout As Object, iElementIndex As Integer + + + Select Case UCase(_A2B_.CalledSub) + Case UCase("setProperty") : iArgNr = 3 + Case UCase("CommandBar.setProperty") : iArgNr = 2 + Case UCase(cstThisSub) : iArgNr = 1 + End Select + + If Not hasProperty(psProperty) Then Goto Trace_Error + + Select Case UCase(psProperty) + Case UCase("Visible") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + Set oLayout = _Window.LayoutManager + With oLayout + iElementIndex = _FindElement(.getElements()) + If iElementIndex < 0 Then + If pvValue Then + .createElement(_ResourceURL) + .showElement(_ResourceURL) + End If + Else + If pvValue <> .isElementVisible(_ResourceURL) Then + If pvValue Then .showElement(_ResourceURL) Else .hideElement(_ResourceURL) + End If + End If + End With + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/CommandBarControl.xba b/wizards/source/access2base/CommandBarControl.xba new file mode 100644 index 000000000..9cf183ba9 --- /dev/null +++ b/wizards/source/access2base/CommandBarControl.xba @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="CommandBarControl" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be COMMANDBARCONTROL +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _InternalIndex As Integer ' Index in toolbar including separators +Private _Index As Integer ' Index in collection, starting at 1 !! +Private _ControlType As Integer ' 1 of the msoControl* constants +Private _ParentCommandBarName As String +Private _ParentCommandBar As Object ' com.sun.star.ui.XUIElement +Private _ParentBuiltin As Boolean +Private _Element As Variant +Private _BeginGroup As Boolean + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJCOMMANDBARCONTROL + Set _This = Nothing + Set _Parent = Nothing + _Index = -1 + _ParentCommandBarName = "" + Set _ParentCommandBar = Nothing + _ParentBuiltin = False + _Element = Array() + _BeginGroup = False +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BeginGroup() As Boolean + BeginGroup = _PropertyGet("BeginGroup") +End Property ' BeginGroup (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BuiltIn() As Boolean + BuiltIn = _PropertyGet("BuiltIn") +End Property ' BuiltIn (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Caption() As Variant + Caption = _PropertyGet("Caption") +End Property ' Caption (get) + +Property Let Caption(ByVal pvValue As Variant) + Call _PropertySet("Caption", pvValue) +End Property ' Caption (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Index() As Integer + Index = _PropertyGet("Index") +End Property ' Index (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnAction() As Variant + OnAction = _PropertyGet("OnAction") +End Property ' OnAction (get) + +Property Let OnAction(ByVal pvValue As Variant) + Call _PropertySet("OnAction", pvValue) +End Property ' OnAction (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Parent() As Object + Parent = _PropertyGet("Parent") +End Property ' Parent (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TooltipText() As Variant + TooltipText = _PropertyGet("TooltipText") +End Property ' TooltipText (get) + +Property Let TooltipText(ByVal pvValue As Variant) + Call _PropertySet("TooltipText", pvValue) +End Property ' TooltipText (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function pType() As Integer + pType = _PropertyGet("Type") +End Function ' Type (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Visible() As Variant + Visible = _PropertyGet("Visible") +End Property ' Visible (get) + +Property Let Visible(ByVal pvValue As Variant) + Call _PropertySet("Visible", pvValue) +End Property ' Visible (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Execute() +' Execute the command stored in a toolbar button + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CommandBarControl.Execute" + Utils._SetCalledSub(cstThisSub) + +Dim sExecute As String + + Execute = True + sExecute = _GetPropertyValue(_Element, "CommandURL", "") + + Select Case True + Case sExecute = "" : Execute = False + Case _IsLeft(sExecute, ".uno:") + Execute = DoCmd.RunCommand(sExecute) + Case _IsLeft(sExecute, "vnd.sun.star.script:") + Execute = Utils._RunScript(sExecute, Array(Nothing)) + Case Else + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Execute = False + GoTo Exit_Function +End Function ' Execute V1.3.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("CommandBarControl.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("CommandBar.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + _PropertiesList = Array("BeginGroup", "BuiltIn", "Caption", "Index" _ + , "ObjectType", "OnAction", "Parent" _ + , "TooltipText", "Type", "Visible" _ + ) +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "CommandBarControl.get" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertyGet = Null + +Dim oLayout As Object, iElementIndex As Integer +Dim sValue As String +Const cstUnoPrefix = ".uno:" + + Select Case UCase(psProperty) + Case UCase("BeginGroup") + _PropertyGet = _BeginGroup + Case UCase("BuiltIn") + sValue = _GetPropertyValue(_Element, "CommandURL", "") + _PropertyGet = ( _IsLeft(sValue, cstUnoPrefix) ) + Case UCase("Caption") + _PropertyGet = _GetPropertyValue(_Element, "Label", "") + Case UCase("Index") + _PropertyGet = _Index + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("OnAction") + _PropertyGet = _GetPropertyValue(_Element, "CommandURL", "") + Case UCase("Parent") + Set _PropertyGet = _Parent + Case UCase("TooltipText") + sValue = _GetPropertyValue(_Element, "Tooltip", "") + If sValue <> "" Then _PropertyGet = sValue Else _PropertyGet = _GetPropertyValue(_Element, "Label", "") + Case UCase("Type") + _PropertyGet = msoControlButton + Case UCase("Visible") + _PropertyGet = _GetPropertyValue(_Element, "IsVisible", "") + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + _PropertyGet = Nothing + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean +' Return True if property setting OK + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "CommandBarControl.set" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertySet = True +Dim iArgNr As Integer +Dim oSettings As Object, sValue As String + + + Select Case UCase(_A2B_.CalledSub) + Case UCase("setProperty") : iArgNr = 3 + Case UCase("CommandBar.setProperty") : iArgNr = 2 + Case UCase(cstThisSub) : iArgNr = 1 + End Select + + If Not hasProperty(psProperty) Then Goto Trace_Error + If _ParentBuiltin Then Goto Trace_Error ' Modifications of individual controls forbidden for builtin toolbars (design choice) + +Const cstUnoPrefix = ".uno:" +Const cstScript = "vnd.sun.star.script:" + + Set oSettings = _ParentCommandBar.getSettings(True) + Select Case UCase(psProperty) + Case UCase("OnAction") + If Not Utils._CheckArgument(pvValue, iArgNr, _AddNumeric(vbString), , False) Then Goto Trace_Error_Value + Select Case VarType(pvValue) + Case vbString + If _IsLeft(pvValue, cstUnoPrefix) Then + sValue = pvValue + ElseIf _IsLeft(pvValue, cstScript) Then + sValue = pvValue + Else + sValue = DoCmd.RunCommand(pvValue, True) + End If + Case Else ' Numeric + sValue = DoCmd.RunCommand(pvValue, True) + End Select + _SetPropertyValue(_Element, "CommandURL", sValue) + Case UCase("TooltipText") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + _SetPropertyValue(_Element, "Tooltip", pvValue) + Case UCase("Visible") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + _SetPropertyValue(_Element, "IsVisible", pvValue) + Case Else + Goto Trace_Error + End Select + oSettings.replaceByIndex(_InternalIndex, _Element) + _ParentCommandBar.setSettings(oSettings) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Control.xba b/wizards/source/access2base/Control.xba new file mode 100644 index 000000000..5e241186f --- /dev/null +++ b/wizards/source/access2base/Control.xba @@ -0,0 +1,2501 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Control" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be CONTROL +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _ImplementationName As String +Private _ClassId As Integer +Private _ParentType As String ' One of CTLPARENTISxxxx constants +Private _Shortcut As String +Private _Name As String +Private _FormComponent As Object ' com.sun.star.text.TextDocument +Private _MainForm As String ' To be propagated to all subcontrols +Private _DocEntry As Integer ' Doc- and DbContainer entries in Root structure +Private _DbEntry As Integer +Private _ControlType As Integer +Private _ThisProperties As Variant ' Buffer for properties list +Private _SubType As String +Private ControlModel As Object ' com.sun.star.comp.forms.XXXModel +Private ControlView As Object ' com.sun.star.comp.forms.XXXControl (NULL if form open in edit mode) +Private BoundField As Object ' com.sun.star.sdb.ODataColumn +Private LabelControl As Object ' com.sun.star.form.component.FixedText or com.sun.star.form.component.GroupBox + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJCONTROL + Set _This = Nothing + Set _Parent = Nothing + _ClassId = -1 + _ParentType = "" + _Shortcut = "" + _Name = "" + Set _FormComponent = Nothing + _MainForm = "" + _DocEntry = -1 + _DbEntry = -1 + _ThisProperties = Array() + _SubType = "" + Set ControlModel = Nothing + Set ControlView = Nothing + Set BoundField = Nothing + Set LabelControl = Nothing + +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get BackColor() As Variant + BackColor = _PropertyGet("BackColor") +End Property ' BackColor (get) + +Property Let BackColor(ByVal pvValue As Variant) + Call _PropertySet("BackColor", pvValue) +End Property ' BackColor (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BorderColor() As Variant + BorderColor = _PropertyGet("BorderColor") +End Property ' BorderColor (get) + +Property Let BorderColor(ByVal pvValue As Variant) + Call _PropertySet("BorderColor", pvValue) +End Property ' BorderColor (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BorderStyle() As Variant + BorderStyle = _PropertyGet("BorderStyle") +End Property ' BorderStyle (get) + +Property Let BorderStyle(ByVal pvValue As Variant) + Call _PropertySet("BorderStyle", pvValue) +End Property ' BorderStyle (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Cancel() As Variant + Cancel = _PropertyGet("Cancel") +End Property ' Cancel (get) + +Property Let Cancel(ByVal pvValue As Variant) + Call _PropertySet("Cancel", pvValue) +End Property ' Cancel (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Caption() As Variant + Caption = _PropertyGet("Caption") +End Property ' Caption (get) + +Property Let Caption(ByVal pvValue As Variant) + Call _PropertySet("Caption", pvValue) +End Property ' Caption (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ControlSource() As Variant + ControlSource = _PropertyGet("ControlSource") +End Property ' ControlSource (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ControlTipText() As Variant + ControlTipText = _PropertyGet("ControlTipText") +End Property ' ControlTipText (get) + +Property Let ControlTipText(ByVal pvValue As Variant) + Call _PropertySet("ControlTipText", pvValue) +End Property ' ControlTipText (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ControlType() As Variant + ControlType = _PropertyGet("ControlType") +End Property ' ControlType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Default() As Variant + Default = _PropertyGet("Default") +End Property ' Default (get) + +Property Let Default(ByVal pvValue As Variant) + Call _PropertySet("Default", pvValue) +End Property ' Default (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get DefaultValue() As Variant + DefaultValue = _PropertyGet("DefaultValue") +End Property ' DefaultValue (get) + +Property Let DefaultValue(ByVal pvValue As Variant) + Call _PropertySet("DefaultValue", pvValue) +End Property ' DefaultValue (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Enabled() As Variant + Enabled = _PropertyGet("Enabled") +End Property ' Enabled (get) + +Property Let Enabled(ByVal pvValue As Variant) + Call _PropertySet("Enabled", pvValue) +End Property ' Enabled (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontBold() As Variant + FontBold = _PropertyGet("FontBold") +End Property ' FontBold (get) + +Property Let FontBold(ByVal pvValue As Variant) + Call _PropertySet("FontBold", pvValue) +End Property ' FontBold (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontItalic() As Variant + FontItalic = _PropertyGet("FontItalic") +End Property ' FontItalic (get) + +Property Let FontItalic(ByVal pvValue As Variant) + Call _PropertySet("FontItalic", pvValue) +End Property ' FontItalic (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontName() As Variant + FontName = _PropertyGet("FontName") +End Property ' FontName (get) + +Property Let FontName(ByVal pvValue As Variant) + Call _PropertySet("FontName", pvValue) +End Property ' FontName (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontSize() As Variant + FontSize = _PropertyGet("FontSize") +End Property ' FontSize (get) + +Property Let FontSize(ByVal pvValue As Variant) + Call _PropertySet("FontSize", pvValue) +End Property ' FontSize (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontUnderline() As Variant + FontUnderline = _PropertyGet("FontUnderline") +End Property ' FontUnderline (get) + +Property Let FontUnderline(ByVal pvValue As Variant) + Call _PropertySet("FontUnderline", pvValue) +End Property ' FontUnderline (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FontWeight() As Variant + FontWeight = _PropertyGet("FontWeight") +End Property ' FontWeight (get) + +Property Let FontWeight(ByVal pvValue As Variant) + Call _PropertySet("FontWeight", pvValue) +End Property ' FontWeight (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ForeColor() As Variant + ForeColor = _PropertyGet("ForeColor") +End Property ' ForeColor (get) + +Property Let ForeColor(ByVal pvValue As Variant) + Call _PropertySet("ForeColor", pvValue) +End Property ' ForeColor (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Form() As Variant + Form = _PropertyGet("Form") +End Property ' Form (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Format() As Variant + Format = _PropertyGet("Format") +End Property ' Format (get) + +Property Let Format(ByVal pvValue As Variant) + Call _PropertySet("Format", pvValue) +End Property ' Format (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ItemData(ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvIndex) Then ItemData = _PropertyGet("ItemData") Else ItemData = _PropertyGet("ItemData", pvIndex) +End Property ' ItemData (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ListCount() As Variant + ListCount = _PropertyGet("ListCount") +End Property ' ListCount (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ListIndex() As Variant + ListIndex = _PropertyGet("ListIndex") +End Property ' ListIndex (get) + +Property Let ListIndex(ByVal pvValue As Variant) + Call _PropertySet("ListIndex", pvValue) +End Property ' ListIndex (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Locked() As Variant + Locked = _PropertyGet("Locked") +End Property ' Locked (get) + +Property Let Locked(ByVal pvValue As Variant) + Call _PropertySet("Locked", pvValue) +End Property ' Locked (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get MultiSelect() As Variant + MultiSelect = _PropertyGet("MultiSelect") +End Property ' MultiSelect (get) + +Property Let MultiSelect(ByVal pvValue As Variant) + Call _PropertySet("MultiSelect", pvValue) +End Property ' MultiSelect (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnActionPerformed() As Variant + OnActionPerformed = _PropertyGet("OnActionPerformed") +End Property ' OnActionPerformed (get) + +Property Let OnActionPerformed(ByVal pvValue As Variant) + Call _PropertySet("OnActionPerformed", pvValue) +End Property ' OnActionPerformed (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnAdjustmentValueChanged() As Variant + OnAdjustmentValueChanged = _PropertyGet("OnAdjustmentValueChanged") +End Property ' OnAdjustmentValueChanged (get) + +Property Let OnAdjustmentValueChanged(ByVal pvValue As Variant) + Call _PropertySet("OnAdjustmentValueChanged", pvValue) +End Property ' OnAdjustmentValueChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveAction() As Variant + OnApproveAction = _PropertyGet("OnApproveAction") +End Property ' OnApproveAction (get) + +Property Let OnApproveAction(ByVal pvValue As Variant) + Call _PropertySet("OnApproveAction", pvValue) +End Property ' OnApproveAction (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveReset() As Variant + OnApproveReset = _PropertyGet("OnApproveReset") +End Property ' OnApproveReset (get) + +Property Let OnApproveReset(ByVal pvValue As Variant) + Call _PropertySet("OnApproveReset", pvValue) +End Property ' OnApproveReset (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveUpdate() As Variant + OnApproveUpdate = _PropertyGet("OnApproveUpdate") +End Property ' OnApproveUpdate (get) + +Property Let OnApproveUpdate(ByVal pvValue As Variant) + Call _PropertySet("OnApproveUpdate", pvValue) +End Property ' OnApproveUpdate (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnChanged() As Variant + OnChanged = _PropertyGet("OnChanged") +End Property ' OnChanged (get) + +Property Let OnChanged(ByVal pvValue As Variant) + Call _PropertySet("OnChanged", pvValue) +End Property ' OnChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnErrorOccurred() As Variant + OnErrorOccurred = _PropertyGet("OnErrorOccurred") +End Property ' OnErrorOccurred (get) + +Property Let OnErrorOccurred(ByVal pvValue As Variant) + Call _PropertySet("OnErrorOccurred", pvValue) +End Property ' OnErrorOccurred (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnFocusGained() As Variant + OnFocusGained = _PropertyGet("OnFocusGained") +End Property ' OnFocusGained (get) + +Property Let OnFocusGained(ByVal pvValue As Variant) + Call _PropertySet("OnFocusGained", pvValue) +End Property ' OnFocusGained (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnFocusLost() As Variant + OnFocusLost = _PropertyGet("OnFocusLost") +End Property ' OnFocusLost (get) + +Property Let OnFocusLost(ByVal pvValue As Variant) + Call _PropertySet("OnFocusLost", pvValue) +End Property ' OnFocusLost (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnItemStateChanged() As Variant + OnItemStateChanged = _PropertyGet("OnItemStateChanged") +End Property ' OnItemStateChanged (get) + +Property Let OnItemStateChanged(ByVal pvValue As Variant) + Call _PropertySet("OnItemStateChanged", pvValue) +End Property ' OnItemStateChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnKeyPressed() As Variant + OnKeyPressed = _PropertyGet("OnKeyPressed") +End Property ' OnKeyPressed (get) + +Property Let OnKeyPressed(ByVal pvValue As Variant) + Call _PropertySet("OnKeyPressed", pvValue) +End Property ' OnKeyPressed (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnKeyReleased() As Variant + OnKeyReleased = _PropertyGet("OnKeyReleased") +End Property ' OnKeyReleased (get) + +Property Let OnKeyReleased(ByVal pvValue As Variant) + Call _PropertySet("OnKeyReleased", pvValue) +End Property ' OnKeyReleased (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseDragged() As Variant + OnMouseDragged = _PropertyGet("OnMouseDragged") +End Property ' OnMouseDragged (get) + +Property Let OnMouseDragged(ByVal pvValue As Variant) + Call _PropertySet("OnMouseDragged", pvValue) +End Property ' OnMouseDragged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseEntered() As Variant + OnMouseEntered = _PropertyGet("OnMouseEntered") +End Property ' OnMouseEntered (get) + +Property Let OnMouseEntered(ByVal pvValue As Variant) + Call _PropertySet("OnMouseEntered", pvValue) +End Property ' OnMouseEntered (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseExited() As Variant + OnMouseExited = _PropertyGet("OnMouseExited") +End Property ' OnMouseExited (get) + +Property Let OnMouseExited(ByVal pvValue As Variant) + Call _PropertySet("OnMouseExited", pvValue) +End Property ' OnMouseExited (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseMoved() As Variant + OnMouseMoved = _PropertyGet("OnMouseMoved") +End Property ' OnMouseMoved (get) + +Property Let OnMouseMoved(ByVal pvValue As Variant) + Call _PropertySet("OnMouseMoved", pvValue) +End Property ' OnMouseMoved (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMousePressed() As Variant + OnMousePressed = _PropertyGet("OnMousePressed") +End Property ' OnMousePressed (get) + +Property Let OnMousePressed(ByVal pvValue As Variant) + Call _PropertySet("OnMousePressed", pvValue) +End Property ' OnMousePressed (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseReleased() As Variant + OnMouseReleased = _PropertyGet("OnMouseReleased") +End Property ' OnMouseReleased (get) + +Property Let OnMouseReleased(ByVal pvValue As Variant) + Call _PropertySet("OnMouseReleased", pvValue) +End Property ' OnMouseReleased (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnResetted() As Variant + OnResetted = _PropertyGet("OnResetted") +End Property ' OnResetted (get) + +Property Let OnResetted(ByVal pvValue As Variant) + Call _PropertySet("OnResetted", pvValue) +End Property ' OnResetted (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnTextChanged() As Variant + OnTextChanged = _PropertyGet("OnTextChanged") +End Property ' OnTextChanged (get) + +Property Let OnTextChanged(ByVal pvValue As Variant) + Call _PropertySet("OnTextChanged", pvValue) +End Property ' OnTextChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUpdated() As Variant + OnUpdated = _PropertyGet("OnUpdated") +End Property ' OnUpdated (get) + +Property Let OnUpdated(ByVal pvValue As Variant) + Call _PropertySet("OnUpdated", pvValue) +End Property ' OnUpdated (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OptionValue() As Variant + OptionValue = _PropertyGet("OptionValue") +End Property ' OptionValue (get) + +Property Let OptionValue(ByVal pvValue As Variant) + Call _PropertySet("OptionValue", pvValue) +End Property ' OptionValue (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Page() As Variant + Page = _PropertyGet("Page") +End Property ' Page (get) + +Property Let Page(ByVal pvValue As Variant) + Call _PropertySet("Page", pvValue) +End Property ' Page (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Parent() As Object + Parent = _PropertyGet("Parent") +End Function ' Parent (get) V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Picture() As Variant + Picture = _PropertyGet("Picture") +End Property ' Picture (get) + +Property Let Picture(ByVal pvValue As Variant) + Call _PropertySet("Picture", pvValue) +End Property ' Picture (set) V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + + Utils._SetCalledSub("Control.Properties") +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub("Control.Properties") + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Required() As Variant + Required = _PropertyGet("Required") +End Property ' Required (get) + +Property Let Required(ByVal pvValue As Variant) + Call _PropertySet("Required", pvValue) +End Property ' Required (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RowSource() As Variant + RowSource = _PropertyGet("RowSource") +End Property ' RowSource (get) + +Property Let RowSource(ByVal pvValue As Variant) + Call _PropertySet("RowSource", pvValue) +End Property ' RowSource (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RowSourceType() As Variant + RowSourceType = _PropertyGet("RowSourceType") +End Property ' RowSourceType (get) + +Property Let RowSourceType(ByVal pvValue As Variant) + Call _PropertySet("RowSourceType", pvValue) +End Property ' RowSourceType (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Selected(ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvIndex) Then Selected = _PropertyGet("Selected") Else Selected = _PropertyGet("Selected", pvIndex) +End Property ' Selected (get) + +Property Let Selected(ByVal pvValue As Variant) ' , ByVal Optional pvIndex As Variant) +' If IsMissing(pvIndex) Then Call _PropertySet("Selected", pvValue) Else Call _PropertySet("Selected", pvValue, pvIndex) + Call _PropertySet("Selected", pvValue) +End Property ' Selected (set) + +Public Function SelectedI(ByVal pvValue As variant, ByVal pvIndex As Variant) + Call _PropertySet("Selected", pvValue, pvIndex) +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SelLength() As Variant + SelLength = _PropertyGet("SelLength") +End Property ' SelLength (get) + +Property Let SelLength(ByVal pvValue As Variant) + Call _PropertySet("SelLength", pvValue) +End Property ' SelLength (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SelStart() As Variant + SelStart = _PropertyGet("SelStart") +End Property ' SelStart (get) + +Property Let SelStart(ByVal pvValue As Variant) + Call _PropertySet("SelStart", pvValue) +End Property ' SelStart (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SelText() As Variant + SelText = _PropertyGet("SelText") +End Property ' SelText (get) + +Property Let SelText(ByVal pvValue As Variant) + Call _PropertySet("SelText", pvValue) +End Property ' SelText (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SpecialEffect() As Variant + SpecialEffect = _PropertyGet("SpecialEffect") +End Property ' SpecialEffect (get) + +Property Let SpecialEffect(ByVal pvValue As Variant) + Call _PropertySet("SpecialEffect", pvValue) +End Property ' SpecialEffect (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SubType() As Variant + SubType = _PropertyGet("SubType") +End Property ' SubType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TabIndex() As Variant + TabIndex = _PropertyGet("TabIndex") +End Property ' TabIndex (get) + +Property Let TabIndex(ByVal pvValue As Variant) + Call _PropertySet("TabIndex", pvValue) +End Property ' TabIndex (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TabStop() As Variant + TabStop = _PropertyGet("TabStop") +End Property ' TabStop (get) + +Property Let TabStop(ByVal pvValue As Variant) + Call _PropertySet("TabStop", pvValue) +End Property ' TabStop (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Tag() As Variant + Tag = _PropertyGet("Tag") +End Property ' Tag (get) + +Property Let Tag(ByVal pvValue As Variant) + Call _PropertySet("Tag", pvValue) +End Property ' Tag (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Text() As Variant + Text = _PropertyGet("Text") +End Property ' Text (get) + +Public Function pText() As variant + pText = _PropertyGet("Text") +End Function ' pText (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TextAlign() As Variant + TextAlign = _PropertyGet("TextAlign") +End Property ' TextAlign (get) + +Property Let TextAlign(ByVal pvValue As Variant) + Call _PropertySet("TextAlign", pvValue) +End Property ' TextAlign (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TripleState() As Variant + TripleState = _PropertyGet("TripleState") +End Property ' TripleState (get) + +Property Let TripleState(ByVal pvValue As Variant) + Call _PropertySet("TripleState", pvValue) +End Property ' TripleState (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Value() As Variant + Value = _PropertyGet("Value") +End Property ' Value (get) + +Property Let Value(ByVal pvValue As Variant) + Call _PropertySet("Value", pvValue) +End Property ' Value (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Visible() As Variant + Visible = _PropertyGet("Visible") +End Property ' Visible (get) + +Property Let Visible(ByVal pvValue As Variant) + Call _PropertySet("Visible", pvValue) +End Property ' Visible (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function AddItem(ByVal Optional pvItem As Variant, ByVal Optional pvIndex) As Boolean +' Add an item in a Listbox + + Utils._SetCalledSub("Control.AddItem") + AddItem = False + If _ErrorHandler() Then On Local Error Goto Error_Function + + If IsMissing(pvItem) Then Call _TraceArguments() + If IsMissing(pvIndex) Then pvIndex = -1 + +Dim iArgNr As Integer + Select Case UCase(_A2B_.CalledSub) + Case UCase("AddItem") : iArgNr = 1 + Case UCase("Control.AddItem") : iArgNr = 0 + End Select + + If Not Utils._CheckArgument(pvItem, iArgNr + 1, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvIndex, iArgNr + 2, Utils._AddNumeric()) Then Goto Exit_Function + If _SubType <> CTLLISTBOX Then Goto Error_Control + If _ParentType <> CTLPARENTISDIALOG Then + If ControlModel.ListSourceType <> com.sun.star.form.ListSourceType.VALUELIST Then Goto Error_Control + End If + +Dim vRowSource() As Variant, iCount As Integer, i As Integer + If IsArray(ControlModel.StringItemList) Then vRowSource = ControlModel.StringItemList Else vRowSource = Array(ControlModel.StringItemList) + iCount = UBound(vRowSource) + If pvIndex < -1 Or pvIndex > iCount + 1 Then Goto Error_Index + ReDim Preserve vRowSource(0 To iCount + 1) + If pvIndex = -1 Then pvIndex = iCount + 1 + For i = iCount + 1 To pvIndex + 1 Step -1 + vRowSource(i) = vRowSource(i - 1) + Next i + vRowSource(pvIndex) = pvItem + + If _ParentType <> CTLPARENTISDIALOG Then + ControlModel.ListSource = vRowSource() + End If + ControlModel.StringItemList = vRowSource() + AddItem = True + +Exit_Function: + Utils._ResetCalledSub("Control.AddItem") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Control.AddItem", Erl) + AddItem = False + GoTo Exit_Function +Error_Control: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , "Control.AddItem") + AddItem = False + Goto Exit_Function +Error_Index: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), False, ,Array(iArgNr + 2,pvIndex)) + AddItem = False + Goto Exit_Function +End Function ' AddItem V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Return a Control object with name or index = pvIndex + +Const cstThisSub = "Control.Controls" +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + +Dim ocControl As Variant, sParentShortcut As String, iControlCount As Integer +Dim oCounter As Variant, sControls() As Variant, i As Integer, bFound As Boolean, sIndex As String +Dim j As Integer, oView As Object + + If _SubType <> CTLGRIDCONTROL Then Goto Trace_Error_Context + Set ocControl = Nothing + iControlCount = ControlModel.getCount() + + If IsMissing(pvIndex) Then ' No argument, return Collection pseudo-object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLCONTROLS + Set oCounter._Parent = _This + oCounter._Count = iControlCount + Set Controls = oCounter + Goto Exit_Function + End If + + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + + ' Start building the ocControl object + ' Determine exact name + Set ocControl = New Control + Set ocControl._This = ocControl + Set ocControl._Parent = _This + ocControl._ParentType = CTLPARENTISGRID + sParentShortcut = _Shortcut + sControls() = ControlModel.getElementNames() + + Select Case VarType(pvIndex) + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + If pvIndex < 0 Or pvIndex > iControlCount - 1 Then Goto Trace_Error_Index + ocControl._Name = sControls(pvIndex) + Case vbString ' Check control name validity (non case sensitive) + bFound = False + sIndex = UCase(Utils._Trim(pvIndex)) + For i = 0 To iControlCount - 1 + If UCase(sControls(i)) = sIndex Then + bFound = True + Exit For + End If + Next i + If bFound Then ocControl._Name = sControls(i) Else Goto Trace_NotFound + End Select + + With ocControl + ._Shortcut = sParentShortcut & "!" & Utils._Surround(._Name) + Set .ControlModel = ControlModel.getByName(._Name) + ._ImplementationName = .ControlModel.ColumnServiceName ' getImplementationName aborts for subcontrols !? + ._FormComponent = ParentComponent + ._MainForm = _MainForm + If Utils._hasUNOProperty(.ControlModel, "ClassId") Then ._ClassId = .ControlModel.ClassId + ' Complex bypass to find View of grid subcontrols ! + If Not IsNull(ControlView) Then ' Anticipate absence of ControlView in grid controls when edit mode + For i = 0 to ControlView.getCount() - 1 + Set oView = ControlView.GetByIndex(i) + If Not IsNull(oView) Then + If oView.getModel.Name = ._Name Then + Set .ControlView = oView + Exit For + End If + End If + Next i + End If + + ._Initialize() + ._DocEntry = _DocEntry + ._DbEntry = _DbEntry + End With + Set Controls = ocControl + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set Controls = Nothing + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(pvIndex, _Name)) + Set Controls = Nothing + Goto Exit_Function +Trace_Error_Context: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , "Grid.Controls") + Set Controls = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set Controls = Nothing + GoTo Exit_Function +End Function ' Controls + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant, ByVal Optional pvIndex As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Control.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + If IsMissing(pvIndex) Then + getProperty = _PropertyGet(pvProperty) + Else + getProperty = _PropertyGet(pvProperty, pvIndex) + End If + Utils._ResetCalledSub("Control.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RemoveItem(ByVal Optional pvIndex) As Boolean +' Remove an item from a Listbox +' Index may be a string value or an index-position + + Utils._SetCalledSub("Control.RemoveItem") + If _ErrorHandler() Then On Local Error Goto Error_Function + + If IsMissing(pvIndex) Then Call _TraceArguments() +Dim iArgNr As Integer + Select Case UCase(_A2B_.CalledSub) + Case UCase("RemoveItem") : iArgNr = 1 + Case UCase("Control.RemoveItem") : iArgNr = 0 + End Select + If Not Utils._CheckArgument(pvIndex, iArgNr + 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + If _SubType <> CTLLISTBOX Then Goto Error_Control + If _ParentType <> CTLPARENTISDIALOG Then + If ControlModel.ListSourceType <> com.sun.star.form.ListSourceType.VALUELIST Then Goto Error_Control + End If + +Dim vRowSource() As Variant, iCount As Integer, i As Integer, j As integer, bFound As Boolean + If IsArray(ControlModel.StringItemList) Then vRowSource = ControlModel.StringItemList Else vRowSource = Array(ControlModel.StringItemList) + iCount = UBound(vRowSource) + + Select Case VarType(pvIndex) + Case vbString + bFound = False + For i = 0 To iCount + If vRowSource(i) = pvIndex Then + For j = i To iCount - 1 + vRowSource(j) = vRowSource(j + 1) + Next j + bFound = True + Exit For ' Remove only 1st occurrence of string + End If + Next i + Case Else + If pvIndex < 0 Or pvIndex > iCount Then Goto Error_Index + For i = pvIndex To iCount - 1 + vRowSource(i) = vRowSource(i + 1) + Next i + bFound = True + End Select + + If bFound Then + If iCount > 0 Then ' https://forum.openoffice.org/en/forum/viewtopic.php?f=47&t=75008 + ReDim Preserve vRowSource(0 To iCount - 1) + Else + vRowSource = Array() + End If + If _ParentType <> CTLPARENTISDIALOG Then + ControlModel.ListSource = vRowSource() + End If + ControlModel.StringItemList = vRowSource() + RemoveItem = True + Else + RemoveItem = False + End If + +Exit_Function: + Utils._ResetCalledSub("Control.RemoveItem") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Control.RemoveItem", Erl) + RemoveItem = False + GoTo Exit_Function +Error_Control: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, "Control.RemoveItem") + RemoveItem = False + Goto Exit_Function +Error_Index: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), False, ,Array(2, pvIndex)) + RemoveItem = False + Goto Exit_Function +End Function ' RemoveItem V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Requery() As Boolean +' Refresh data displayed in a form, subform, combobox or listbox + Utils._SetCalledSub("Control.Requery") + If _ErrorHandler() Then On Local Error Goto Error_Function + Requery = False + + Select Case _SubType + Case CTLCOMBOBOX, CTLLISTBOX + If Utils._InList(ControlModel.ListSourceType, Array( _ + com.sun.star.form.ListSourceType.QUERY _ + , com.sun.star.form.ListSourceType.TABLE _ + , com.sun.star.form.ListSourceType.TABLEFIELDS _ + , com.sun.star.form.ListSourceType.SQL _ + , com.sun.star.form.ListSourceType.SQLPASSTHROUGH _ + )) Then + ControlModel.refresh() + End If + Case Else + Goto Error_Control + End Select + Requery = True + +Exit_Function: + Utils._ResetCalledSub("Control.Requery") + Exit Function +Error_Control: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, "Control.Requery") + Requery = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Control.Requery", Erl) + GoTo Exit_Function +End Function ' Requery + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SetFocus() As Boolean +' Execute setFocus method + Utils._SetCalledSub("Control.SetFocus") + If _ErrorHandler() Then On Local Error Goto Error_Function + SetFocus = False + +Dim i As Integer, j As Integer, iColPosition As Integer +Dim ocControl As Object, ocGrid As Variant, oGridModel As Object + + If IsNull(ControlView) Then GoTo Exit_Function + If _ParentType = CTLPARENTISGRID Then 'setFocus method does not work on controlviews in grid ?!? + ' Find column position of control + iColPosition = -1 + ocGrid = getObject(_getUpperShortcut(_Shortcut, _Name)) ' return containing grid + Set oGridModel = ocGrid.ControlModel + j = -1 + For i = 0 To oGridModel.Count - 1 + Set ocControl = oGridModel.GetByIndex(i) + If Not ocControl.Hidden Then j = j + 1 ' Skip if hidden + If oGridModel.GetByIndex(i).Name = _Name Then + iColPosition = j + Exit For + End If + Next i + If iColPosition >= 0 Then + ocGrid.ControlView.setFocus() 'Set first focus on grid itself + ocGrid.ControlView.setCurrentColumnPosition(iColPosition) 'Deprecated but no alternative found + Else + Goto Error_Grid + End If + Else + ControlView.setFocus() + End If + SetFocus = True + +Exit_Function: + Utils._ResetCalledSub("Control.SetFocus") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Control.SetFocus", Erl) + Goto Exit_Function +Error_Grid: + TraceError(TRACEFATAL, ERRFOCUSINGRID, Utils._CalledSub(), 0, 1, Array(_Name, ocGrid._Name)) + Goto Exit_Function +End Function ' SetFocus V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant, ByVal Optional pvIndex As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("Control.setProperty") + If IsMissing(pvIndex) Then + setProperty = _PropertySet(psProperty, pvValue) + Else + setProperty = _PropertySet(psProperty, pvValue, pvIndex) + End If + Utils._ResetCalledSub("Control.setProperty") +End Function ' setProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SetSelected(ByVal Optional pvValue As Variant, ByVal Optional pvIndex As Variant) As Boolean +' Workaround for limitation of Basic: Property Let does not accept optional arguments + + If IsMissing(pvValue) Then Call _TraceArguments() + If IsMissing(pvIndex) Then + SetSelected = _PropertySet("Selected", pvValue) + Else + SetSelected = _PropertySet("Selected", pvValue, pvIndex) + End If + +End Function ' SetSelected + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _Formats(ByVal psControlType As String) As Variant +' Return allowed format entries for Date and Time control types + +Dim vFormats() As Variant + Select Case psControlType + Case CTLDATEFIELD + vFormats = Array( _ + "Standard (short)" _ + , "Standard (short YY)" _ + , "Standard (short YYYY)" _ + , "Standard (long)" _ + , "DD/MM/YY" _ + , "MM/DD/YY" _ + , "YY/MM/DD" _ + , "DD/MM/YYYY" _ + , "MM/DD/YYYY" _ + , "YYYY/MM/DD" _ + , "YY-MM-DD" _ + , "YYYY-MM-DD" _ + ) + Case CTLTIMEFIELD + vFormats = Array( _ + "24h short" _ + , "24h long" _ + , "12h short" _ + , "12h long" _ + ) + Case Else + vFormats = Array() + End Select + + _Formats = vFormats + +End Function ' _Formats V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetListener(ByVal psProperty As String) As String +' Return the X...Listener corresponding with the property in argument + + Select Case UCase(psProperty) + Case UCase("OnActionPerformed") + _GetListener = "XActionListener" + Case UCase("OnAdjustmentValueChanged") + _GetListener = "XAdjustmentListener" + Case UCase("OnApproveAction") + _GetListener = "XApproveActionListener" + Case UCase("OnApproveReset"), UCase("OnResetted") + _GetListener = "XResetListener" + Case UCase("OnApproveUpdate"), UCase("OnUpdated") + _GetListener = "XUpdateListener" + Case UCase("OnChanged") + _GetListener = "XChangeListener" + Case UCase("OnErrorOccurred") + _GetListener = "XErrorListener" + Case UCase("OnFocusGained"), UCase("OnFocusLost") + _GetListener = "XFocusListener" + Case UCase("OnItemStateChanged") + _GetListener = "XItemListener" + Case UCase("OnKeyPressed"), UCase("OnKeyReleased") + _GetListener = "XKeyListener" + Case UCase("OnMouseDragged"), UCase("OnMouseMoved") + _GetListener = "XMouseMotionListener" + Case UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMousePressed"), UCase("OnMouseReleased") + _GetListener = "XMouseListener" + Case UCase("OnTextChanged") + _GetListener = "XTextListener" + End Select + +End Function ' _GetListener V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _Initialize() +' Initialize new Control +' ControlModel, ParentType, Name, Shortcut, ControlView, ImplementationName, ClassId (if parent <> dialog) +' are presumed preexisting + + ' Identify SubType and ControlView +Dim sControlTypes() As Variant, i As Integer, vSplit() As Variant, sTrailer As String + sControlTypes = array( CTLCONTROL _ + , CTLCOMMANDBUTTON _ + , CTLRADIOBUTTON _ + , CTLIMAGEBUTTON _ + , CTLCHECKBOX _ + , CTLLISTBOX _ + , CTLCOMBOBOX _ + , CTLGROUPBOX _ + , CTLTEXTFIELD _ + , CTLFIXEDTEXT _ + , CTLGRIDCONTROL _ + , CTLFILECONTROL _ + , CTLHIDDENCONTROL _ + , CTLIMAGECONTROL _ + , CTLDATEFIELD _ + , CTLTIMEFIELD _ + , CTLNUMERICFIELD _ + , CTLCURRENCYFIELD _ + , CTLPATTERNFIELD _ + , CTLSCROLLBAR _ + , CTLSPINBUTTON _ + , CTLNAVIGATIONBAR _ + , CTLPROGRESSBAR _ + , CTLFIXEDLINE _ + ) + + Select Case _ParentType + Case CTLPARENTISDIALOG + vSplit = Split(ControlModel.getServiceName(), ".") + sTrailer = UCase(vSplit(UBound(vSplit))) + ' Manage homonyms + Select Case sTrailer + Case "BUTTON" : sTrailer = CTLCOMMANDBUTTON + Case "EDIT" : sTrailer = CTLTEXTFIELD + Case Else + End Select + If sTrailer <> CTLFORMATTEDFIELD Then + For i = 0 To UBound(sControlTypes) + If sControlTypes(i) = sTrailer Then + _ClassId = i + 1 + _SubType = sTrailer + _ControlType = _ClassId + Exit For + End If + Next i + Else + _ClassId = acFormattedField + _SubType = CTLFORMATTEDFIELD + _ControlType = _ClassId + End If + Case Else + 'Is ClassId one of the properties ? + If _ClassId > 0 Then ' All control types have a ClassId except subforms + _SubType = sControlTypes(_ClassId - 1) + _ControlType = _ClassId + If _SubType = CTLTEXTFIELD Then ' Formatted fields belong to the TextField family + If _ImplementationName = "com.sun.star.comp.forms.OFormattedFieldWrapper" _ + Or _ImplementationName = "com.sun.star.comp.forms.OFormattedFieldWrapper_ForcedFormatted" _ + Or _ImplementationName = "com.sun.star.form.component.FormattedField" Then ' When in datagrid + _SubType = CTLFORMATTEDFIELD + _ControlType = acFormattedField + End If + End If + Else ' Initialize subform Control + If ControlModel.ImplementationName = "com.sun.star.comp.forms.ODatabaseForm" Then + _SubType = CTLSUBFORM + _ControlType = acSubform + End If + End If + End Select + +End Sub ' _Initialize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ListboxBound() As Boolean +' Return True if listbox has a bound column + +Dim bListboxBound As Boolean, j As Integer +Dim vValue() As variant, vString As Variant + + bListboxBound = False + + If Not IsNull(ControlModel.ValueItemList) _ + And ControlModel.DataField <> "" _ + And Not IsNull(ControlModel.BoundField) _ + And Utils._InList(ControlModel.ListSourceType, Array( _ + com.sun.star.form.ListSourceType.TABLE _ + , com.sun.star.form.ListSourceType.QUERY _ + , com.sun.star.form.ListSourceType.SQL _ + , com.sun.star.form.ListSourceType.SQLPASSTHROUGH _ + )) Then ' MultiSelect behaviour changed in OpenOffice >= 3.3 + If IsArray(ControlModel.ValueItemList) Then + vValue = ControlModel.ValueItemList + vString = ControlModel.StringItemList + For j = 0 To UBound(vValue) + If VarType(vValue(j)) <> VarType(vString(j)) Then + bListboxBound = True + ElseIf vValue(j) <> vString(j) Then + bListboxBound = True + End If + If bListboxBound Then Exit For + Next j + End If + End If + + _ListboxBound = bListboxBound + +End Function ' _ListboxBound V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant +' Based on ControlProperties.ods analysis + +Dim vFullPropertiesList() As Variant + + 'List established only once + If UBound(_ThisProperties) > -1 Then + _PropertiesList = _ThisProperties + Exit Function + End If + + vFullPropertiesList = Array( _ + "BackColor" _ + , "BorderColor" _ + , "BorderStyle" _ + , "Cancel" _ + , "Caption" _ + , "ControlSource" _ + , "ControlTipText" _ + , "ControlType" _ + , "Default" _ + , "DefaultValue" _ + , "Enabled" _ + , "FontBold" _ + , "FontItalic" _ + , "FontName" _ + , "FontSize" _ + , "FontUnderline" _ + , "FontWeight" _ + , "ForeColor" _ + , "Form" _ + , "Format" _ + , "ItemData" _ + , "LinkChildFields" _ + , "LinkMasterFields" _ + , "ListCount" _ + , "ListIndex" _ + , "Locked" _ + , "MultiSelect" _ + , "Name" _ + , "ObjectType" _ + , "OnActionPerformed" _ + , "OnAdjustmentValueChanged" _ + , "OnApproveAction" _ + , "OnApproveReset" _ + , "OnApproveUpdate" _ + , "OnChanged" _ + , "OnErrorOccurred" _ + , "OnFocusGained" _ + , "OnFocusLost" _ + , "OnItemStateChanged" _ + , "OnKeyPressed" _ + , "OnKeyReleased" _ + , "OnMouseDragged" _ + , "OnMouseEntered" _ + , "OnMouseExited" _ + , "OnMouseMoved" _ + , "OnMousePressed" _ + , "OnMouseReleased" _ + , "OnResetted" _ + , "OnTextChanged" _ + , "OnUpdated" _ + , "OptionValue" _ + , "Page" _ + , "Parent" _ + , "Picture" _ + , "Required" _ + , "RowSource" _ + , "RowSourceType" _ + , "Selected" _ + , "SelLength" _ + , "SelStart" _ + , "Seltext" _ + , "SpecialEffect" _ + , "SubType" _ + , "TabIndex" _ + , "TabStop" _ + , "Tag" _ + , "Text" _ + , "TextAlign" _ + , "TripleState" _ + , "Value" _ + , "Visible" _ + ) +Dim vPropertiesMatrix(25) As Variant + Select Case _ParentType + Case CTLPARENTISFORM, CTLPARENTISSUBFORM + vPropertiesMatrix(acCheckBox) = Array(0,4,5,6,7,9,10,11,12,13,14,15,16,17,27,28,29,32,36,37,38,39,40,41,42,43,44,45,46,47,52,54,61,62,63,64,65,67,68,69,70) + vPropertiesMatrix(acComboBox) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,20,23,24,25,27,28,29,32,33,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,52,54,55,56,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acCommandButton) = Array(0,3,4,6,7,8,10,11,12,13,14,15,16,17,27,28,29,31,32,36,37,38,39,40,41,42,43,44,45,46,47,52,53,62,63,64,65,67,69,70) + vPropertiesMatrix(acCurrencyField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,63,64,65,67,69,70) + vPropertiesMatrix(acDateField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,19,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acFileControl) = Array(0,1,2,6,7,9,10,11,12,13,14,15,16,17,25,27,28,32,36,37,39,40,41,42,43,44,45,46,47,48,52,62,63,64,65,66,69,70) + vPropertiesMatrix(acFixedText) = Array(0,1,2,4,6,7,10,11,12,13,14,15,16,17,27,28,36,37,39,40,41,42,43,44,45,46,52,62,65,67,70) + vPropertiesMatrix(acFormattedField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,19,25,27,28,32,33,35,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acGridControl) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,27,28,32,33,35,36,37,39,40,41,42,43,44,45,46,47,49,52,62,63,64,65,70) + vPropertiesMatrix(acGroupBox) = Array(4,6,7,10,11,12,13,14,15,16,17,27,28,32,36,37,39,40,41,42,43,44,45,46,47,52,62,65,70) + vPropertiesMatrix(acHiddenControl) = Array(7,27,28,52,62,65,69,70) + vPropertiesMatrix(acImageButton) = Array(0,1,2,6,7,10,27,28,31,36,37,39,40,41,42,43,44,45,46,52,53,62,63,64,65,70) + vPropertiesMatrix(acImageControl) = Array(0,1,2,5,6,7,10,25,27,28,32,36,37,39,40,41,42,43,44,45,46,47,52,53,54,62,63,64,65,70) + vPropertiesMatrix(acListBox) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,20,23,24,25,26,27,28,29,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,49,52,54,55,56,57,62,63,64,65,67,69,70) + vPropertiesMatrix(acNavigationBar) = Array(0,2,6,7,10,11,12,13,14,15,16,17,27,28,36,37,39,40,41,42,43,44,45,46,52,62,63,64,65,70) + vPropertiesMatrix(acNumericField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,63,64,65,67,69,70) + vPropertiesMatrix(acPatternField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,58,59,60,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acRadioButton) = Array(0,4,5,6,7,9,10,11,12,13,14,15,16,17,27,28,29,32,36,37,38,39,40,41,42,43,44,45,46,47,50,52,54,61,62,63,64,65,67,69,70) + vPropertiesMatrix(acScrollBar) = Array(0,1,2,6,7,10,27,28,30,32,33,36,37,39,40,41,42,43,44,45,46,47,49,52,62,63,64,65,69,70) + vPropertiesMatrix(acSpinButton) = Array(0,1,2,6,7,9,10,27,28,30,32,33,36,37,39,40,41,42,43,44,45,46,47,49,52,62,63,64,65,69,70) + vPropertiesMatrix(0) = Array(7,18,21,22,27,28,52,62) + vPropertiesMatrix(acTextField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,25,27,28,32,33,34,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,58,59,60,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acTimeField) = Array(0,1,2,5,6,7,9,10,11,12,13,14,15,16,17,19,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,63,64,65,66,67,69,70) + Case CTLPARENTISGROUP + ' To be duplicated from above !!! + vPropertiesMatrix(acRadioButton) = Array(0,4,5,6,7,9,10,11,12,13,14,15,16,17,27,28,29,32,36,37,38,39,40,41,42,43,44,45,46,47,50,52,54,61,62,63,64,65,67,69,70) + Case CTLPARENTISGRID + vPropertiesMatrix(acCheckBox) = Array(4,5,6,7,9,10,27,28,29,32,36,37,38,39,40,41,42,43,44,45,46,47,52,54,61,62,65,67,68,69) + vPropertiesMatrix(acComboBox) = Array(4,5,6,7,9,10,20,23,24,25,27,28,32,33,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,52,54,55,56,62,65,66,67,69) + vPropertiesMatrix(acCurrencyField) = Array(4,5,6,7,9,10,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,65,67,69) + vPropertiesMatrix(acDateField) = Array(4,5,6,7,9,10,19,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,65,66,67,69) + vPropertiesMatrix(acFormattedField) = Array(4,5,6,7,9,10,19,25,27,28,32,33,35,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,65,66,67,69) + vPropertiesMatrix(acListBox) = Array(4,5,6,7,9,10,20,23,24,25,26,27,28,32,33,35,36,37,38,39,40,41,42,43,44,45,46,47,49,52,54,55,56,57,62,65,67,69) + vPropertiesMatrix(acNumericField) = Array(4,5,6,7,9,10,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,65,67,69) + vPropertiesMatrix(acPatternField) = Array(4,5,6,7,9,10,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,58,59,60,62,65,66,67,69) + vPropertiesMatrix(acTextField) = Array(4,5,6,7,9,10,25,27,28,32,33,34,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,58,59,60,62,65,66,67,69) + vPropertiesMatrix(acTimeField) = Array(4,5,6,7,9,10,19,25,27,28,32,33,36,37,39,40,41,42,43,44,45,46,47,48,49,52,54,62,65,66,67,69) + Case CTLPARENTISDIALOG + vPropertiesMatrix(acCheckBox) = Array(0,4,6,7,10,11,12,13,14,15,16,17,27,28,29,36,37,38,39,40,41,42,43,44,45,46,51,52,61,62,63,64,65,67,68,69,70) + vPropertiesMatrix(acComboBox) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,20,23,24,25,27,28,29,36,37,38,39,40,41,42,43,44,45,46,48,51,52,55,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acCommandButton) = Array(0,3,4,6,7,8,10,11,12,13,14,15,16,17,27,28,29,36,37,38,39,40,41,42,43,44,45,46,51,52,53,62,63,64,65,67,70) + vPropertiesMatrix(acCurrencyField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,67,69,70) + vPropertiesMatrix(acDateField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,19,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acFileControl) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acFixedLine) = Array(0,4,6,7,10,11,12,13,14,15,16,17,27,28,36,37,39,40,41,42,43,44,45,46,51,52,62,63,65,70) + vPropertiesMatrix(acFixedText) = Array(0,1,2,4,6,7,10,11,12,13,14,15,16,17,27,28,36,37,39,40,41,42,43,44,45,46,51,52,62,63,64,65,67,70) + vPropertiesMatrix(acFormattedField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,19,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acGroupBox) = Array(4,6,7,10,11,12,13,14,15,16,17,27,28,36,37,39,40,41,42,43,44,45,46,51,52,62,63,65,70) + vPropertiesMatrix(acImageControl) = Array(0,1,2,6,7,10,27,28,36,37,39,40,41,42,43,44,45,46,51,52,53,62,63,64,65,70) + vPropertiesMatrix(acListBox) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,20,23,24,25,26,27,28,29,36,37,38,39,40,41,42,43,44,45,46,51,52,55,57,62,63,64,65,67,69,70) + vPropertiesMatrix(acNavigationBar) = Array(36,37,39,40,41,42,43,44,45,46) + vPropertiesMatrix(acNumericField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,67,69,70) + vPropertiesMatrix(acPatternField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,58,59,60,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acProgressBar) = Array(0,1,2,6,7,10,27,28,36,37,39,40,41,42,43,44,45,46,51,52,62,63,65,69,70) + vPropertiesMatrix(acRadioButton) = Array(0,4,6,7,10,11,12,13,14,15,16,17,27,28,29,36,37,38,39,40,41,42,43,44,45,46,50,51,52,61,62,63,64,65,67,69,70) + vPropertiesMatrix(acScrollBar) = Array(0,1,2,6,7,10,27,28,30,36,37,39,40,41,42,43,44,45,46,51,52,62,63,64,65,69,70) + vPropertiesMatrix(acTextField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,58,59,60,62,63,64,65,66,67,69,70) + vPropertiesMatrix(acTimeField) = Array(0,1,2,6,7,10,11,12,13,14,15,16,17,19,25,27,28,36,37,39,40,41,42,43,44,45,46,48,51,52,62,63,64,65,66,67,69,70) + End Select + +Dim i As Integer, iIndex As Integer + If _ControlType = acSubForm Then iIndex = 0 Else iIndex = _ControlType + If IsEmpty(vPropertiesMatrix(iIndex)) Then + _ThisProperties = Array() + Else + ReDim _ThisProperties(0 To UBound(vPropertiesMatrix(iIndex))) + For i = 0 To UBound(_ThisProperties) + _ThisProperties(i) = vFullPropertiesList(vPropertiesMatrix(iIndex)(i)) + Next i + End If + + _PropertiesList = _ThisProperties() + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String, ByVal Optional pvIndex As Variant) As Variant +' Return property value of the psProperty property name + +Dim iArg As Integer + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Control.get" & psProperty) + _PropertyGet = EMPTY + +'Check Index argument +Dim iArgNr As Integer + If Not IsMissing(pvIndex) Then + Select Case UCase(_A2B_.CalledSub) + Case UCase("getProperty") : iArgNr = 3 + Case UCase("Control.getProperty") : iArgNr = 2 + Case UCase("Control.get" & psProperty) : iArgNr = 1 + End Select + If Not Utils._CheckArgument(pvIndex, iArgNr, Utils._AddNumeric()) Then Goto Exit_Function + End If + +Dim vDefaultValue As Variant, oDefaultValue As Object, vValue As Variant, oValue As Object, iIndex As Integer +Dim lListIndex As Long, i As Integer, j As Integer, vCurrentValue As Variant, lListCount As Long +Dim vListboxValue As Variant, vListSource, bSelected() As Boolean, bListboxBound As Boolean +Dim vGet As Variant, vDate As Variant +Dim ofSubForm As Object +Dim vFormats() As Variant +Dim vSelection As Variant, sSelectedText As String +Dim oControlEvents As Object, sEventName As String + + If Not hasProperty(psProperty) Then Goto Trace_Error + + Select Case UCase(psProperty) + Case UCase("BackColor") + If Utils._hasUNOProperty(ControlModel, "BackgroundColor") Then _PropertyGet = ControlModel.BackgroundColor + Case UCase("BorderColor") + If Utils._hasUNOProperty(ControlModel, "BorderColor") Then _PropertyGet = ControlModel.BorderColor + Case UCase("BorderStyle") + If Utils._hasUNOProperty(ControlModel, "Border") Then _PropertyGet = ControlModel.Border + Case UCase("Cancel") + If Utils._hasUNOProperty(ControlModel, "PushButtonType") Then _PropertyGet = ( ControlModel.PushButtonType = com.sun.star.awt.PushButtonType.CANCEL ) + Case UCase("Caption") + If Utils._hasUNOProperty(ControlModel, "Label") Then _PropertyGet = ControlModel.Label + Case UCase("ControlSource") + If Utils._hasUNOProperty(ControlModel, "DataField") Then _PropertyGet = ControlModel.DataField + Case UCase("ControlTipText") + If Utils._hasUNOProperty(ControlModel, "HelpText") Then _PropertyGet = ControlModel.HelpText + Case UCase("ControlType") + _PropertyGet = _ControlType + Case UCase("Default") + If Utils._hasUNOProperty(ControlModel, "DefaultButton") Then _PropertyGet = ControlModel.DefaultButton + Case UCase("DefaultValue") + Select Case _SubType + Case CTLCHECKBOX, CTLRADIOBUTTON + If Utils._hasUNOProperty(ControlModel, "DefaultState") Then _PropertyGet = ControlModel.DefaultState + Case CTLCOMBOBOX, CTLFILECONTROL, CTLPATTERNFIELD, CTLTEXTFIELD + If Utils._hasUNOProperty(ControlModel, "DefaultText") Then _PropertyGet = ControlModel.DefaultText + Case CTLCURRENCYFIELD, CTLNUMERICFIELD + If Utils._hasUNOProperty(ControlModel, "DefaultValue") Then _PropertyGet = ControlModel.DefaultValue + Case CTLDATEFIELD + If Utils._hasUNOProperty(ControlModel, "DefaultDate") Then + Select Case VarType(ControlModel.DefaultDate) + Case vbLong ' AOO and LO <= 4.1 + vDefaultValue = ControlModel.DefaultDate + vGet = DateSerial(Left(vDefaultValue, 4), Mid(vDefaultValue, 5, 2), Right(vDefaultValue, 2)) + Case vbObject ' LO >= 4.2 com.sun.star.Util.Date + Set oDefaultValue = ControlModel.DefaultDate + vGet = DateSerial(oDefaultValue.Year,oDefaultValue.Month, oDefaultValue.Day) + Case vbEmpty + End Select + End If + Case CTLFORMATTEDFIELD + If Utils._hasUNOProperty(ControlModel, "EffectiveDefault") Then _PropertyGet = ControlModel.EffectiveDefault + Case CTLLISTBOX + If Utils._hasUNOProperty(ControlModel, "DefaultSelection") And Utils._hasUNOProperty(ControlModel, "StringItemList") Then + vDefaultValue = ControlModel.DefaultSelection + If IsArray(vDefaultValue) Then + If UBound(vDefaultValue) >= LBound(vDefaultValue) Then ' Is array initialized ? + iIndex = UBound(ControlModel.StringItemList) + If vDefaultValue(0) >= 0 And vDefaultValue(0) <= iIndex Then _PropertyGet = ControlModel.StringItemList(vDefaultValue(0)) + ' Only first default value is considered + End If + End If + End If + Case CTLSPINBUTTON + If Utils._hasUNOProperty(ControlModel, "DefaultSpinValue") Then _PropertyGet = ControlModel.DefaultSpinValue + Case CTLTIMEFIELD + If Utils._hasUNOProperty(ControlModel, "DefaultTime") Then + Select Case VarType(ControlModel.DefaultTime) + Case vbLong ' AOO and LO <= 4.1 + _PropertyGet = ControlModel.DefaultTime + Case vbObject ' LO >= 4.2 com.sun.star.Util.Time + Set oDefaultValue = ControlModel.DefaultTime + _PropertyGet = TimeSerial(oDefaultValue.Hours, oDefaultValue.Minutes, oDefaultValue.Seconds) + Case vbEmpty + End Select + End If + Case Else + Goto Trace_Error + End Select + Case UCase("Enabled") + If Utils._hasUNOProperty(ControlModel, "Enabled") Then _PropertyGet = ControlModel.Enabled + Case UCase("FontBold") + If Utils._hasUNOProperty(ControlModel, "FontWeight") Then _PropertyGet = ( ControlModel.FontWeight >= com.sun.star.awt.FontWeight.BOLD ) + Case UCase("FontItalic") + If Utils._hasUNOProperty(ControlModel, "FontSlant") Then _PropertyGet = ( ControlModel.FontSlant = com.sun.star.awt.FontSlant.ITALIC ) + Case UCase("FontName") + If Utils._hasUNOProperty(ControlModel, "FontName") Then _PropertyGet = ControlModel.FontName + Case UCase("FontSize") + If Utils._hasUNOProperty(ControlModel, "FontHeight") Then _PropertyGet = ControlModel.FontHeight + Case UCase("FontUnderline") + If Utils._hasUNOProperty(ControlModel, "FontUnderline") Then _PropertyGet = _ + Not ( ControlModel.FontUnderline = com.sun.star.awt.FontUnderline.NONE _ + Or ControlModel.FontUnderline = com.sun.star.awt.FontUnderline.DONTKNOW ) + Case UCase("FontWeight") + If Utils._hasUNOProperty(ControlModel, "FontWeight") Then _PropertyGet = ControlModel.FontWeight + Case UCase("ForeColor") + If Utils._hasUNOProperty(ControlModel, "TextColor") Then _PropertyGet = ControlModel.TextColor + Case UCase("Form") + Set ofSubForm = New SubForm ' Start building the SUBFORM object + With ofSubForm + Set ._This = ofSubForm + Set .DatabaseForm = ControlModel + ._Name = _Name + ._Shortcut = _Shortcut & ".Form" + ._MainForm = _MainForm + .ParentComponent = _FormComponent + ._DocEntry = _DocEntry + ._DbEntry = _DbEntry + ._OrderBy = ControlModel.Order + End With + set _PropertyGet = ofSubForm + Case UCase("Format") + vFormats = _Formats(_Subtype) + Select Case _SubType + Case CTLDATEFIELD + If Utils._hasUNOProperty(ControlModel, "DateFormat") Then + If ControlModel.DateFormat <= UBound(vFormats) Then _PropertyGet = vFormats(ControlModel.DateFormat) + End If + Case CTLTIMEFIELD + If Utils._hasUNOProperty(ControlModel, "TimeFormat") Then + If ControlModel.TimeFormat <= UBound(vFormats) Then _PropertyGet = vFormats(ControlModel.TimeFormat) + End If + Case Else + If Utils._hasUNOProperty(ControlModel, "FormatKey") Then + If Utils._hasUNOProperty(ControlModel, "FormatsSupplier") Then + _PropertyGet = ControlModel.FormatsSupplier.getNumberFormats.getByKey(ControlModel.FormatKey).FormatString + End If + End If + End Select + Case UCase("ItemData") + If Utils._hasUNOProperty(ControlModel, "StringItemList") Then + If IsMissing(pvIndex) Then + _PropertyGet = ControlModel.StringItemList + Else + If pvIndex < 0 Or pvIndex > UBound(ControlModel.StringItemList) Then Goto Trace_Error_Index + _PropertyGet = ControlModel.StringItemList(pvIndex) + End If + End If + Case UCase("ListCount") + If Utils._hasUNOProperty(ControlModel, "StringItemList") Then _PropertyGet = UBound(ControlModel.StringItemList) + 1 + Case UCase("ListIndex") + If Utils._hasUNOProperty(ControlModel, "StringItemList") Then + lListIndex = -1 ' Either Multiple selections or no selection at all + Select Case _SubType + Case CTLCOMBOBOX + If Not Utils._hasUNOProperty(ControlModel, "Text") Then Goto Trace_Error + iIndex = 0 + If ControlModel.Text <> "" Then + For j = 0 To UBound(ControlModel.StringItemList) + If ControlModel.StringItemList(j) = ControlModel.Text Then + lListIndex = j + iIndex = iIndex + 1 + End If + Next j + If iIndex <> 1 Then lListIndex = -1 ' Multiselection or synonyms rejected + End If + Case CTLLISTBOX ' No mean found to access bound column !! See mail Lionel 10/5/2013 for improvement + If Not Utils._hasUNOProperty(ControlModel, "SelectedItems") Then Goto Trace_Error + If UBound(ControlModel.SelectedItems) > 0 Then ' Several items selected + Else ' Mono selection + If _ParentType <> CTLPARENTISDIALOG Then ' getCurrentValue not found in dialog listboxes ?? + vCurrentValue = ControlModel.getCurrentValue() ' Space or uninitialized array if no selection at all + If IsArray(vCurrentValue) Then ' Is an array if MultiSelect + vListboxValue = "" + If UBound(vCurrentValue) = 0 Then vListboxValue = vCurrentValue(0) + Else + vListboxValue = vCurrentValue + End If + If vListboxValue <> "" Then ' Speed up search PM Pastim 12/02/2013 + If Ubound(ControlModel.SelectedItems) >= 0 Then lListIndex = Controlmodel.Selecteditems(0) + End If + Else + If Ubound(ControlModel.SelectedItems) >= 0 Then lListIndex = Controlmodel.Selecteditems(0) + End If + End If + End Select + _PropertyGet = lListIndex + End If + Case UCase("Locked") + If Utils._hasUNOProperty(ControlModel, "ReadOnly") Then _PropertyGet = ControlModel.ReadOnly + Case UCase("MultiSelect") + If Utils._hasUNOProperty(ControlModel, "MultiSelection") Then + _PropertyGet = ControlModel.MultiSelection ' Boolean in OO, Integer (0, 1 or 2) in VBA + ElseIf Utils._hasUNOProperty(ControlModel, "MultiSelectionSimpleMode") Then ' Not documented: only for GridControls !? Changed in OO >= 3,3 !? + _PropertyGet = ControlModel.MultiSelectionSimpleMode + Else + _PropertyGet = False + End If + Case UCase("Name") + _PropertyGet = _Name + Case UCase("OnActionPerformed"), UCase("OnAdjustmentValueChanged"), UCase("OnApproveAction"), UCase("OnApproveReset") _ + , UCase("OnApproveUpdate"), UCase("OnChanged"), UCase("OnErrorOccurred"), UCase("OnFocusGained") _ + , UCase("OnFocusLost"), UCase("OnItemStateChanged"), UCase("OnKeyPressed"), UCase("OnKeyReleased") _ + , UCase("OnMouseDragged"), UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMouseMoved") _ + , UCase("OnMousePressed"), UCase("OnMouseReleased"), UCase("OnResetted"), UCase("OnTextChanged") _ + , UCase("OnUpdated") + Select Case _ParentType + Case CTLPARENTISDIALOG + Set oControlEvents = ControlModel.getEvents() + sEventName = "com.sun.star.awt." & _GetListener(psProperty) & "::" & Utils._GetEventName(psProperty) + If oControlEvents.hasByName(sEventName) Then + _PropertyGet = oControlEvents.getByName(sEventName).ScriptCode + Else + _PropertyGet = "" + End If + Case Else + _PropertyGet = Utils._GetEventScriptCode(ControlModel, psProperty, _Name) + End Select + Case UCase("OptionValue") + If Utils._hasUNOProperty(ControlModel, "RefValue") Then + If ControlModel.RefValue <> "" Then + _PropertyGet = ControlModel.RefValue + ElseIf Utils._hasUNOProperty(ControlModel, "Label") Then + _PropertyGet = ControlModel.Label + End If + End If + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Page") + If Utils._hasUNOProperty(ControlModel, "Step") Then _PropertyGet = ControlModel.Step + Case UCase("Parent") + Set _PropertyGet = _Parent + Case UCase("Picture") + _PropertyGet = ConvertToUrl(ControlModel.ImageURL) + Case UCase("Required") + If Utils._hasUNOProperty(ControlModel, "InputRequired") Then _PropertyGet = ControlModel.InputRequired + Case UCase("RowSource") + Select Case _ParentType + Case CTLPARENTISDIALOG + If Utils._hasUNOProperty(ControlModel, "StringItemList") Then + If IsArray(ControlModel.StringItemList) Then vListSource = ControlModel.StringItemList Else vListSource = Array(ControlModel.StringItemList) + _PropertyGet = Join(vListSource, ";") + End If + Case Else + If Utils._hasUNOProperty(ControlModel, "ListSource") Then + Select Case ControlModel.ListSourceType + Case com.sun.star.form.ListSourceType.VALUELIST _ + , com.sun.star.form.ListSourceType.TABLEFIELDS + If IsArray(ControlModel.StringItemList) Then vListSource = ControlModel.StringItemList Else vListSource = Array(ControlModel.StringItemList) + Case com.sun.star.form.ListSourceType.TABLE _ + , com.sun.star.form.ListSourceType.QUERY _ + , com.sun.star.form.ListSourceType.SQL _ + , com.sun.star.form.ListSourceType.SQLPASSTHROUGH + If IsArray(ControlModel.ListSource) Then vListSource = ControlModel.ListSource Else vListSource = Array(ControlModel.ListSource) + End Select + _PropertyGet = Join(vListSource, ";") + End If + End Select + Case UCase("RowSourceType") + If Utils._hasUNOProperty(ControlModel, "ListSourceType") Then _PropertyGet = ControlModel.ListSourceType + Case UCase("Selected") + If Utils._hasUNOProperty(ControlModel, "StringItemList") Then + lListIndex = UBound(ControlModel.StringItemList) + If Not IsMissing(pvIndex) Then + If pvIndex < 0 Or pvIndex > lListIndex Then Goto Trace_Error_Index + End If + If lListIndex < 0 Then ' Do nothing if listbox empty + _PropertyGet = Array() + Else + Redim bSelected(0 To lListIndex) + For j = 0 To lListIndex + bSelected(j) = False + Next j + For j = 0 To UBound(ControlModel.SelectedItems) + iIndex = ControlModel.SelectedItems(j) + If iIndex >= 0 And iIndex <= lListIndex Then bSelected(iIndex) = True + Next j + If IsMissing(pvIndex) Then _PropertyGet = bSelected Else _PropertyGet = bSelected(pvIndex) + End If + End If + Case UCase("SelLength") + If Utils._hasUNOProperty(ControlView, "Selection") Then + vSelection = ControlView.getSelection() + If vSelection.Max >= vSelection.Min Then + _PropertyGet = vSelection.Max - vSelection.Min + Else + _PropertyGet = 0 ' probably control does not have focus + End If + Else + _PropertyGet = 0 + End If + Case UCase("SelStart") + If Utils._hasUNOProperty(ControlView, "Selection") Then + vSelection = ControlView.getSelection() + If vSelection.Max >= vSelection.Min Then + _PropertyGet = vSelection.Min + 1 + Else + _PropertyGet = 1 ' probably control does not have focus + End If + Else + _PropertyGet = 1 + End If + Case UCase("SelText") + If Utils._hasUNOProperty(ControlView, "SelectedText") Then + _PropertyGet = ControlView.getSelectedText() + Else + _PropertyGet = "" + End If + Case UCase("SpecialEffect") + If Utils._hasUNOProperty(ControlModel, "VisualEffect") Then _PropertyGet = ControlModel.VisualEffect + Case UCase("SubType") + _PropertyGet = _SubType + Case UCase("TabIndex") + If Utils._hasUNOProperty(ControlModel, "TabIndex") Then _PropertyGet = ControlModel.TabIndex + Case UCase("TabStop") + If Utils._hasUNOProperty(ControlModel, "Tabstop") Then _PropertyGet = ControlModel.Tabstop + Case UCase("Tag") + If Utils._hasUNOProperty(ControlModel, "Tag") Then _PropertyGet = ControlModel.Tag + Case UCase("Text") + Select Case _SubType + Case CTLDATEFIELD + If Utils._hasUNOProperty(ControlModel, "Date") Then + If Utils._hasUNOProperty(ControlModel, "FormatKey") Then + If Utils._hasUNOProperty(ControlModel, "FormatsSupplier") Then + Select Case VarType(ControlModel.Date) + Case vbLong ' AOO and LO <= 4.1 + vDate = DateSerial(Left(ControlModel.Date, 4), Mid(ControlModel.Date, 5, 2), Right(ControlModel.Date, 2)) + Case vbObject ' LO >= 4.2 + vDate = DateSerial(ControlModel.Date.Year, ControlModel.Date.Month, ControlModel.Date.Day) + Case vbEmpty + End Select + _PropertyGet = Format(vDate, ControlModel.FormatsSupplier.getNumberFormats.getByKey(ControlModel.FormatKey).FormatString) + End If + End If + End If + Case CTLTIMEFIELD + If Utils._hasUNOProperty(ControlModel, "Text") Then + Select Case VarType(ControlModel.Time) + Case vbLong ' AOO and LO <= 4.1 + _PropertyGet = Format(ControlModel.Time, "HH:MM:SS") + Case vbObject ' LO >= 4.2 com.sun.star.Util.Time + Set oValue = ControlModel.Time + _PropertyGet = Format(TimeSerial(oValue.Hours, oValue.Minutes, oValue.Seconds), "HH:MM:SS") + Case vbEmpty + End Select + End If + Case Else + If Utils._hasUNOProperty(ControlModel, "Text") Then _PropertyGet = ControlModel.Text + End Select + Case UCase("TextAlign") + If Utils._hasUNOProperty(ControlModel, "Tag") Then _PropertyGet = ControlModel.Tag + Case UCase("TripleState") + If Utils._hasUNOProperty(ControlModel, "TriState") Then _PropertyGet = ControlModel.TriState + Case UCase("Value") + Select Case _SubType + Case CTLCHECKBOX + If Utils._hasUNOProperty(ControlModel, "State") Then vGet = ControlModel.State + Case CTLCOMMANDBUTTON + vGet = False + If Utils._hasUNOProperty(ControlModel, "Toggle") Then + If Utils._hasUNOProperty(ControlModel, "State") Then vGet = ( ControlModel.State = 1 ) + End If + Case CTLCOMBOBOX, CTLFILECONTROL, CTLPATTERNFIELD, CTLTEXTFIELD + If Utils._hasUNOProperty(ControlModel, "Text") Then vGet = ControlModel.Text + Case CTLCURRENCYFIELD + If Utils._hasUNOProperty(ControlModel, "Value") Then vGet = ControlModel.Value + Case CTLDATEFIELD + If Utils._hasUNOProperty(ControlModel, "Date") Then + Select Case VarType(ControlModel.Date) + Case vbLong ' AOO and LO <= 4.1 + vValue = ControlModel.Date + vGet = DateSerial(Left(vValue, 4), Mid(vValue, 5, 2), Right(vValue, 2)) + Case vbObject ' LO >= 4.2 com.sun.star.Util.Date + Set oValue = ControlModel.Date + vGet = DateSerial(oValue.Year, oValue.Month, oValue.Day) + Case vbEmpty + End Select + End If + Case CTLFORMATTEDFIELD + If Utils._hasUNOProperty(ControlModel, "EffectiveValue") Then vGet = ControlModel.EffectiveValue + Case CTLHIDDENCONTROL + If Utils._hasUNOProperty(ControlModel, "HiddenValue") Then vGet = ControlModel.HiddenValue + Case CTLLISTBOX + If Not Utils._hasUNOProperty(ControlModel, "StringItemList") Then Goto Trace_Error + If Not Utils._hasUNOProperty(ControlModel, "SelectedItems") Then Goto Trace_Error + If UBound(ControlModel.SelectedItems) > 0 Then ' Several items selected + vGet = EMPTY ' Listbox has no value, only an array of Selected flags to identify values + Else ' Mono selection + Select Case _ParentType + Case CTLPARENTISDIALOG + If Ubound(ControlModel.SelectedItems) >= 0 Then + lListIndex = Controlmodel.Selecteditems(0) + If lListIndex > -1 And lListIndex <= UBound(ControlModel.StringItemList) Then + vGet = ControlModel.StringItemList(lListIndex) + Else + vGet = EMPTY + End If + End If + Case Else + 'getCurrentValue does not return any significant value anymore + ' Speed up getting value PM PASTIM 12/02/2013 + If Ubound(ControlModel.SelectedItems) >= 0 Then lListIndex = Controlmodel.Selecteditems(0) Else lListIndex = -1 + ' If listbox has hidden column = real bound field, then explore ValueItemList + If _ListboxBound() Then + If lListIndex > -1 Then vGet = ControlModel.ValueItemList(lListIndex) ' PASTIM + Else + If lListIndex > -1 Then vGet = ControlModel.getItemText(lListIndex) + End If + End Select + End If + Case CTLNUMERICFIELD + If Utils._hasUNOProperty(ControlModel, "Value") Then vGet = ControlModel.Value + Case CTLPROGRESSBAR + If Utils._hasUNOProperty(ControlModel, "ProgressValue") Then vGet = ControlModel.ProgressValue + Case CTLSCROLLBAR + If Utils._hasUNOProperty(ControlModel, "ScrollValue") Then vGet = ControlModel.ScrollValue + Case CTLSPINBUTTON + If Utils._hasUNOProperty(ControlModel, "SpinValue") Then vGet = ControlModel.SpinValue + Case CTLTIMEFIELD + If Utils._hasUNOProperty(ControlModel, "Time") Then + Select Case VarType(ControlModel.Time) + Case vbLong ' AOO and LO <= 4.1 + vGet = ControlModel.Time + Case vbObject ' LO >= 4.2 com.sun.star.Util.Time + Set oValue = ControlModel.Time + vGet = TimeSerial(oValue.Hours, oValue.Minutes, oValue.Seconds) + Case vbEmpty + End Select + End If + Case Else + End Select + If _SubType <> CTLLISTBOX Then ' Give getCurrentValue an additional try + If IsEmpty(vGet) And Utils._hasUNOMethod(ControlModel, "getCurrentValue") Then vGet = ControlModel.getCurrentValue() + End If + _PropertyGet = vGet + Case UCase("Visible") + Select Case _SubType + Case CTLHIDDENCONTROL + _PropertyGet = False + Case Else + If Utils._hasUNOMethod(ControlView, "isVisible") Then _PropertyGet = CBool(ControlView.isVisible()) + End Select + Case Else + Goto Trace_Error + End Select + + If IsEmpty(_PropertyGet) Then TraceError(TRACEINFO, ERRPROPERTYINIT, Utils._CalledSub(), 0, , psProperty) + +Exit_Function: + Utils._ResetCalledSub("Control.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Control._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant, ByVal Optional pvIndex As Variant) As Boolean +' Return True if property setting OK + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Control.set" & psProperty) + _PropertySet = True + +'Check Index argument + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric()) Then Goto Exit_Function + End If +'Execute +Dim iArgNr As Integer, vButton As Variant, i As Integer +Dim odbDatabase As Object, vNames() As Variant, bFound As Boolean, sName As String +Dim bMultiSelect As Boolean, iCount As Integer, iSelectedItems() As Integer, lListCount As Long, bSelected() As Boolean +Dim vItemList() As Variant, vFormats() As Variant +Dim oStruct As Object, sValue As String +Dim vSelection As Variant, sText As String, lStart As long +Dim oControlEvents As Object, sListener As String, sEvent As String, sEventName As String, oEvent As Object + + _PropertySet = True + Select Case UCase(_A2B_.CalledSub) + Case UCase("setProperty") : iArgNr = 3 + Case UCase("Control.setProperty") : iArgNr = 2 + Case UCase("Control.set" & psProperty) : iArgNr = 1 + End Select + + If Not hasProperty(psProperty) Then Goto Trace_Error + + Select Case UCase(psProperty) + Case UCase("BackColor") + If Not Utils._hasUNOProperty(ControlModel, "BackgroundColor") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.BackgroundColor = CLng(pvValue) + Case UCase("BorderColor") + If Not Utils._hasUNOProperty(ControlModel, "BorderColor") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.BorderColor = CLng(pvValue) + Case UCase("BorderStyle") + If Not Utils._hasUNOProperty(ControlModel, "BorderColor") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > 2 Then Goto Trace_Error_Value ' 0 = No border, 1 = 3D border, 2 = Normal border + ControlModel.Border = CLng(pvValue) + Case UCase("Cancel") + If Not Utils._hasUNOProperty(ControlModel, "PushButtonType") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then vButton = com.sun.star.awt.PushButtonType.CANCEL Else vButton = com.sun.star.awt.PushButtonType.STANDARD + ControlModel.PushButtonType = vButton + Case UCase("Caption") + If Not Utils._hasUNOProperty(ControlModel, "Label") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.Label = pvValue + Case UCase("ControlTipText") + If Not Utils._hasUNOProperty(ControlModel, "HelpText") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.HelpText = pvValue + Case UCase("Default") + If Not Utils._hasUNOProperty(ControlModel, "DefaultButton") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.DefaultButton = pvValue + Case UCase("DefaultValue") + Select Case _SubType + Case CTLDATEFIELD + If Not Utils._hasUNOProperty(ControlModel, "DefaultDate") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value + Select Case VarType(ControlModel.DefaultDate) + Case vbEmpty, vbLong ' AOO and LO <= 4.1 + ControlModel.DefaultDate = Year(pvValue) * 10000 + Month(pvValue) * 100 + Day(pvValue) + Case vbObject ' LO >= 4.2 com.sun.star.Util.Date + ControlModel.DefaultDate.Year = Year(pvValue) + ControlModel.DefaultDate.Month = Month(pvValue) + ControlModel.DefaultDate.Day = Day(pvValue) + End Select + Case CTLLISTBOX + If Not Utils._hasUNOProperty(ControlModel, "DefaultSelection") Or Not Utils._hasUNOProperty(ControlModel, "StringItemList") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + For i = 0 To UBound(ControlModel.StringItemList) + If UCase(pvValue) = UCase(ControlModel.StringItemList(i)) Then + ControlModel.DefaultSelection = Array(i) + Exit For + End If + Next i + Case CTLSPINBUTTON + If Not Utils._hasUNOProperty(ControlModel, "DefaultSpinValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.DefaultSpinValue = pvValue + Case CTLCHECKBOX + If Not Utils._hasUNOProperty(ControlModel, "DefaultState") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > 2 Then Goto Trace_Error_Value ' 0 = Not checked 1 = Checked 2 = don't know + ControlModel.DefaultState = pvValue + Case CTLRADIOBUTTON + If Not Utils._hasUNOProperty(ControlModel, "DefaultState") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > 1 Then Goto Trace_Error_Value ' 0 = Not checked 1 = Checked + ControlModel.DefaultState = pvValue + Case CTLCOMBOBOX, CTLFILECONTROL, CTLPATTERNFIELD, CTLTEXTFIELD + If Not Utils._hasUNOProperty(ControlModel, "DefaultText") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.DefaultText = pvValue + Case CTLTIMEFIELD + If Not Utils._hasUNOProperty(ControlModel, "DefaultTime") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue >= 0 And pvValue <= 23595999 Then + Select Case VarType(ControlModel.DefaultTime) + Case vbEmpty, vbLong ' AOO and LO <= 4.1 + ControlModel.DefaultTime = pvValue + Case vbObject ' LO >= 4.2 com.sun.star.Util.Time + ControlModel.DefaultDate.Hours = Hour(pvValue) + ControlModel.DefaultDate.Minutes = Minute(pvValue) + ControlModel.DefaultDate.Seconds = Second(pvValue) + End Select + Else Goto Trace_Error_Value + End If + Case CTLCURRENCYFIELD, CTLNUMERICFIELD + If Not Utils._hasUNOProperty(ControlModel, "DefaultValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.DefaultValue = pvValue + Case CTLFORMATTEDFIELD + If Not Utils._hasUNOProperty(ControlModel, "EffectiveDefault") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.EffectiveDefault = pvValue ' Thanks, PASTIM + Case Else + Goto Trace_Error + End Select + Case UCase("Enabled") + If Not Utils._hasUNOProperty(ControlModel, "Enabled") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.Enabled = pvValue + Case UCase("FontBold") + If Not Utils._hasUNOProperty(ControlModel, "FontWeight") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then ' Iif construction does not work ! + ControlModel.FontWeight = com.sun.star.awt.FontWeight.BOLD + Else + ControlModel.FontWeight = com.sun.star.awt.FontWeight.NORMAL + End If + Case UCase("FontItalic") + If Not Utils._hasUNOProperty(ControlModel, "FontSlant") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then ' Iif construction does not work ! + ControlModel.FontSlant = com.sun.star.awt.FontSlant.ITALIC + Else + ControlModel.FontSlant = com.sun.star.awt.FontSlant.NONE + End If + Case UCase("FontName") + If Not Utils._hasUNOProperty(ControlModel, "FontName") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.FontName = pvValue + Case UCase("FontSize") + If Not Utils._hasUNOProperty(ControlModel, "FontHeight") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 1 Or pvValue > 127 Then Goto Trace_Error_Value + ControlModel.FontHeight = pvValue + Case UCase("FontUnderline") + If Not Utils._hasUNOProperty(ControlModel, "FontUnderline") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then ' Iif construction does not work ! + ControlModel.FontUnderline = com.sun.star.awt.FontUnderline.SINGLE + Else + ControlModel.FontUnderline = com.sun.star.awt.FontUnderline.NONE + End If + Case UCase("FontWeight") + If Not Utils._hasUNOProperty(ControlModel, "FontWeight") Then Goto Trace_Error + If Not Utils._IsScalar(CSng(pvValue), vbSingle, Array( _ + com.sun.star.awt.FontWeight.THIN _ + , com.sun.star.awt.FontWeight.ULTRALIGHT _ + , com.sun.star.awt.FontWeight.LIGHT _ + , com.sun.star.awt.FontWeight.SEMILIGHT _ + , com.sun.star.awt.FontWeight.NORMAL _ + , com.sun.star.awt.FontWeight.SEMIBOLD _ + , com.sun.star.awt.FontWeight.BOLD _ + , com.sun.star.awt.FontWeight.ULTRABOLD _ + , com.sun.star.awt.FontWeight.BLACK _ + )) Then Goto Trace_Error_Value + ControlModel.FontWeight = pvValue + Case UCase("Format") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + vFormats = _Formats(_SubType) + Select Case _SubType + Case CTLDATEFIELD, CTLTIMEFIELD + bFound = False + For i = 0 To UBound(vFormats) + If UCase(pvValue) = UCase(vFormats(i)) Then + If _SubType = CTLDATEFIELD Then + If Utils._hasUNOProperty(ControlModel, "DateFormat") Then ControlModel.DateFormat = i Else Goto Trace_Error + Else + If Utils._hasUNOProperty(ControlModel, "TimeFormat") Then ControlModel.TimeFormat = i Else Goto Trace_Error + End If + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_Error_Value + Case Else + Goto Trace_Error + End Select + Case UCase("ForeColor") + If Not Utils._hasUNOProperty(ControlModel, "TextColor") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.TextColor = CLng(pvValue) + Case UCase("ListIndex") + If Not Utils._hasUNOProperty(ControlModel, "StringItemList") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > UBound(ControlModel.StringItemList) Then Goto Trace_Error_Value + Select Case _SubType + Case CTLCOMBOBOX + ControlModel.Text = ControlModel.StringItemList(pvValue) + Case CTLLISTBOX + ControlModel.SelectedItems = Array(pvValue) + End Select + Case UCase("Locked") + If Not Utils._hasUNOProperty(ControlModel, "ReadOnly") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.ReadOnly = pvValue + Case UCase("MultiSelect") + If Not Utils._hasUNOProperty(ControlModel, "MultiSelection") And Not Utils._hasUNOProperty(ControlModel, "MultiSelectionSimpleMode") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ControlModel, "MultiSelection") Then + ControlModel.MultiSelection = pvValue + ElseIf Utils._hasUNOProperty(ControlModel, "MultiSelectionSimpleMode") Then + ControlModel.MultiSelectionSimpleMode = pvValue + End If + If Not pvValue Then ControlModel.SelectedItems = Array() ' Cancel selections when MultiSelect becomes False + Case UCase("OnActionPerformed"), UCase("OnAdjustmentValueChanged"), UCase("OnApproveAction"), UCase("OnApproveReset") _ + , UCase("OnApproveUpdate"), UCase("OnChanged"), UCase("OnErrorOccurred"), UCase("OnFocusGained") _ + , UCase("OnFocusLost"), UCase("OnItemStateChanged"), UCase("OnKeyPressed"), UCase("OnKeyReleased") _ + , UCase("OnMouseDragged"), UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMouseMoved") _ + , UCase("OnMousePressed"), UCase("OnMouseReleased"), UCase("OnResetted"), UCase("OnTextChanged") _ + , UCase("OnUpdated") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + Select Case _ParentType + Case CTLPARENTISDIALOG + If Not Utils._RegisterDialogEventScript(ControlModel _ + , psProperty _ + , _GetListener(psProperty) _ + , pvValue _ + ) Then GoTo Trace_Error + Case Else + If Not Utils._RegisterEventScript(ControlModel _ + , psProperty _ + , _GetListener(psProperty) _ + , pvValue _ + , _Name _ + ) Then GoTo Trace_Error + End Select + Case UCase("OptionValue") + If Not Utils._hasUNOProperty(ControlModel, "RefValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Not Utils._hasUNOProperty(ControlModel, "Label") Then + If pvValue = "" Then Goto Trace_Error_Value + If ControlModel.RefValue <> "" Then ControlModel.RefValue = pvValue + Else + ControlModel.Label = pvValue + End If + Case UCase("Page") + If Not Utils._hasUNOProperty(ControlModel, "Step") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Then Goto Trace_Error_Value + ControlModel.Step = pvValue + Case UCase("Picture") + If Not Utils._hasUNOProperty(ControlModel, "ImageURL") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.ImageURL = ConvertToUrl(pvValue) + Case UCase("Required") + If Not Utils._hasUNOProperty(ControlModel, "InputRequired") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.InputRequired = pvValue + Case UCase("RowSource") + Select Case _ParentType + Case CTLPARENTISDIALOG + If Not Utils._hasUNOProperty(ControlModel, "StringItemList") Then Goto Trace_Error + ControlModel.StringItemList = Split(pvValue, ";") + Case Else + If Not Utils._hasUNOProperty(ControlModel, "ListSource") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + Select Case ControlModel.ListSourceType + Case com.sun.star.form.ListSourceType.QUERY _ + , com.sun.star.form.ListSourceType.TABLE _ + , com.sun.star.form.ListSourceType.TABLEFIELDS + Set odbDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + If ControlModel.ListSourceType = com.sun.star.form.ListSourceType.QUERY Then vNames = odbDatabase.Connection.getQueries.GetElementNames _ + Else vNames = odbDatabase.Connection.getTables.GetElementNames + bFound = False ' Check existence of table or query and find its correct (case-sensitive) name + For i = 0 To UBound(vNames) + If UCase(vNames(i)) = UCase(pvValue) Then + bFound = True + sName = vNames(i) + Exit For + End If + Next i + If Not bFound Then Goto Trace_Error_Value + If _SubType = CTLCOMBOBOX Then ControlModel.ListSource = sName Else ControlModel.ListSource = Array(sName) + ControlModel.refresh() + Case com.sun.star.form.ListSourceType.SQL + Set odbDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + If _SubType = CTLCOMBOBOX Then ControlModel.ListSource = odbDatabase._ReplaceSquareBrackets(pvValue) Else ControlModel.ListSource = Array(odbDatabase._ReplaceSquareBrackets(pvValue)) + ControlModel.refresh() + Case com.sun.star.form.ListSourceType.VALUELIST ' Forbidden for COMBOBOX ! + If _SubType = CTLCOMBOBOX Then Goto Trace_Error + ControlModel.ListSource = Split(pvValue, ";") + ControlModel.StringItemList = ControlModel.ListSource + Case com.sun.star.form.ListSourceType.SQLPASSTHROUGH + If _SubType = CTLCOMBOBOX Then ControlModel.ListSource = pvValue Else ControlModel.ListSource = Array(pvValue) + ControlModel.refresh() + End Select + End Select + If _SubType = CTLLISTBOX Then ControlModel.SelectedItems = Array() + Case UCase("RowSourceType") ' Refresh done when RowSource changes, not RowSourceType + If Not Utils._hasUNOProperty(ControlModel, "ListSourceType") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Not Utils._IsScalar(pvValue, Utils._AddNumeric(), Array( _ + com.sun.star.form.ListSourceType.VALUELIST _ + , com.sun.star.form.ListSourceType.TABLE _ + , com.sun.star.form.ListSourceType.QUERY _ + , com.sun.star.form.ListSourceType.SQL _ + , com.sun.star.form.ListSourceType.SQLPASSTHROUGH _ + , com.sun.star.form.ListSourceType.TABLEFIELDS _ + )) Then Goto Trace_Error_Value + ControlModel.ListSourceType = pvValue + Case UCase("Selected") + If Not Utils._hasUNOProperty(ControlModel, "SelectedItems") Then Goto Trace_Error + If Not Utils._hasUNOProperty(ControlModel, "StringItemList") Then Goto Trace_Error + If Utils._hasUNOProperty(ControlModel, "MultiSelection") Then + bMultiSelect = ControlModel.MultiSelection + ElseIf Utils._hasUNOProperty(ControlModel, "MultiSelectionSimpleMode") Then + bMultiSelect = ControlModel.MultiSelectionSimpleMode + Else: Goto Trace_Error + End If + lListCount = UBound(ControlModel.StringItemList) + 1 + If IsMissing(pvIndex) Then ' Full boolean array passed + If Not IsArray(pvValue) Then Goto Trace_Error_Array + If LBound(pvValue) <> 0 Or UBound(pvValue) < 0 Then Goto Trace_Error_Array + If Not Utils._CheckArgument(pvValue(0), iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If UBound(pvValue) <> lListCount - 1 Then Goto Trace_Error_Index + iCount = 0 + For i = 0 To UBound(pvValue) ' Count True values + If pvValue(i) Then iCount = iCount + 1 + Next i + If iCount > 0 Then + Redim iSelectedItems(0 To iCount - 1) + iCount = 0 + For i = 0 To UBound(pvValue) + If pvValue(i) Then + iSelectedItems(iCount) = i + iCount = iCount + 1 + End If + Next i + ControlModel.SelectedItems = iSelectedItems ' iSelectedItems maps OO internals (size = # of selected items) + Else + ControlModel.SelectedItems = Array() + End If + Else ' Single boolean value passed + If Not Utils._CheckArgument(pvIndex, iArgNr + 1, Utils._AddNumeric()) Then Goto Exit_Function + If pvIndex < 0 Or pvIndex >= lListCount Then Goto Trace_Error_Index + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ReDim bSelected(0 To lListCount - 1) ' bSelected maps VBA internals (size = # of displayed items) + If Not bMultiSelect Then ' Set all other values to False + For i = 0 To lListCount - 1 + If i = pvIndex Then + bSelected(i) = pvValue ' All entries = False except one + Else + bSelected(i) = False + End If + Next i + Else + For i = 0 To lListCount - 1 + bSelected(i) = False + Next i + iSelectedItems = ControlModel.SelectedItems + iCount = UBound(iSelectedItems) + For i = 0 To iCount + bSelected(iSelectedItems(i)) = True + Next i + bSelected(pvIndex) = pvValue + End If + iCount = 0 ' Rebuild SelectedItems + For i = 0 To lListCount - 1 + If bSelected(i) Then iCount = iCount + 1 + Next i + If iCount > 0 Then + Redim iSelectedItems(0 To iCount - 1) + iCount = 0 + For i = 0 To lListCount - 1 + If bSelected(i) Then + iSelectedItems(iCount) = i + iCount = iCount + 1 + End If + Next i + ControlModel.SelectedItems = iSelectedItems + Else + ControlModel.SelectedItems = Array() + End If + End If + Case UCase("SelLength") + If Not Utils._hasUNOProperty(ControlView, "Selection") Then Goto trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Then Goto Trace_Error_Value + vSelection = ControlView.getSelection() + vSelection.Max = vSelection.Min + pvValue + ControlView.setSelection(vSelection) + Case UCase("SelStart") + If Not Utils._hasUNOProperty(ControlView, "Selection") Then Goto trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 1 Or pvValue > Len(ControlModel.Text) + 1 Then Goto Trace_Error_Value + vSelection = ControlView.getSelection() + vSelection.Min = pvValue - 1 + vSelection.Max = pvValue - 1 ' Also reset length to 0 + ControlView.setSelection(vSelection) + Case UCase("SelText") + If Not Utils._hasUNOProperty(ControlView, "Selection") Then Goto trace_Error + If Not Utils._hasUNOProperty(ControlModel, "Text") Then Goto trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Len(pvValue) > 0 Then + vSelection = ControlView.getSelection() + sText = ControlModel.Text + lStart = InStr(1, sText, pvValue, 0) ' Case sensitive ! + If lStart > 0 Then + vSelection.Min = lStart - 1 + vSelection.Max = lStart + Len(pvValue) - 1 + ControlView.setSelection(vSelection) + End If + End If + Case UCase("SpecialEffect") + If Not Utils._hasUNOProperty(ControlModel, "VisualEffect") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > 2 Then Goto Trace_Error_Value ' 0 = None, 1 = Look3D, 2 = Flat + ControlModel.VisualEffect = pvValue + Case UCase("TabIndex") + If Not Utils._hasUNOProperty(ControlModel, "TabIndex") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < -1 Then Goto Trace_Error_Value + ControlModel.TabIndex = pvValue + Case UCase("TabStop") + If Not Utils._hasUNOProperty(ControlModel, "Tabstop") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.Tabstop = pvValue + Case UCase("Tag") + If Not Utils._hasUNOProperty(ControlModel, "Tag") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.Tag = pvValue + Case UCase("TextAlign") + If Not Utils._hasUNOProperty(ControlModel, "Align") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > 2 Then Goto Trace_Error_Value ' 0 = Left, 1 = Center, 2 = Right + ControlModel.Align = pvValue + Case UCase("TripleState") + If Not Utils._hasUNOProperty(ControlModel, "TriState") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ControlModel.TriState = pvValue + Case UCase("Value") + Select Case _SubType + Case CTLCHECKBOX + If Not Utils._hasUNOProperty(ControlModel, "State") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(vbBoolean), , False) Then Goto Trace_Error_Value + If VarType(pvValue) = vbBoolean Then pvValue = Iif(pvValue, 1, 0) + If pvValue < 0 Or pvValue > 2 Then Goto Trace_Error_Value ' 0 = Not checked 1 = Checked 2 = don't know + ControlModel.State = pvValue + Case CTLCOMMANDBUTTON + If Not Utils._hasUNOProperty(ControlModel, "State") Then Goto Trace_Error + If Not Utils._hasUNOProperty(ControlModel, "Toggle") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then ControlModel.State = 1 Else ControlModel.State = 0 + Case CTLCOMBOBOX + If Not Utils._hasUNOProperty(ControlModel, "Text") Or Not Utils._hasUNOProperty(ControlModel, "StringItemList") _ + Then Goto Trace_Error + If pvValue <> "" Then + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, ControlModel.StringItemList, False) Then Goto Trace_Error_Value + End If + ControlModel.Text = pvValue + Case CTLCURRENCYFIELD, CTLNUMERICFIELD + If Not Utils._hasUNOProperty(ControlModel, "Value") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + ControlModel.Value = pvValue + Case CTLDATEFIELD + If Not Utils._hasUNOProperty(ControlModel, "Date") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value + Select Case _InspectPropertyType(ControlModel, "Date") + Case "long" ' AOO and LO <= 4.1 + 'ControlModel.Date = Year(pvValue) * 10000 + Month(pvValue) * 100 + Day(pvValue) ' Gives error in dialogs ?!? + ControlModel.setPropertyValue("Date", Year(pvValue) * 10000 + Month(pvValue) * 100 + Day(pvValue)) + Case "com.sun.star.util.Date" ' LO >= 4.2 + 'Direct assignment of ControlModel.Date.Xxx has no effect ?!? + Set oStruct = CreateUnoStruct("com.sun.star.util.Date") + oStruct.Year = Year(pvValue) + oStruct.Month = Month(pvValue) + oStruct.Day = Day(pvValue) + Set ControlModel.Date = oStruct + End Select + Case CTLFILECONTROL, CTLPATTERNFIELD, CTLTEXTFIELD + If Not Utils._hasUNOProperty(ControlModel, "Text") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + ControlModel.Text = pvValue + Case CTLFORMATTEDFIELD + If Not Utils._hasUNOProperty(ControlModel, "EffectiveValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(vbString), , False) Then Goto Trace_Error_Value + ControlModel.EffectiveValue = pvValue + Case CTLHIDDENCONTROL + If Not Utils._hasUNOProperty(ControlModel, "HiddenValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(Array(vbString, vbBoolean, vbDate)), , False) Then Goto Trace_Error_Value + ControlModel.HiddenValue = pvValue + Case CTLLISTBOX + If Not Utils._hasUNOProperty(ControlModel, "SelectedItems") Or Not Utils._hasUNOProperty(ControlModel, "StringItemList") _ + Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(Array(vbString, vbDate)), , False) Then Goto Trace_Error_Value ' PASTIM + If IsArray(pvValue) Then Goto Trace_Error_Value ' Setting the value on a listbox is allowed only if single value and value in the list + ' Check ValueItemList + bFound = False + Select Case _ParentType + Case CTLPARENTISDIALOG + vItemList = ControlModel.StringItemList + Case Else + If _ListboxBound() Then ' Performance improvement (PASTIM PM 9 Feb 2013) + If Not Utils._hasUNOProperty(ControlModel, "ValueItemList") Then Goto Trace_Error + vItemList = ControlModel.ValueItemList + Else + vItemList = ControlModel.StringItemList + End If + End Select + For i = 0 To UBound(vItemList) + If pvValue = vItemList(i) Then + bFound = True + Exit For + End If + Next i + If bFound Then ControlModel.SelectedItems = Array(i) Else Goto Trace_Error_Value + Case CTLPROGRESSBAR + If Not Utils._hasUNOProperty(ControlModel, "ProgressValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ControlModel, "ProgressValueMin") Then + If pvValue < ControlModel.ProgressValueMin Then Goto Trace_Error_Value + End If + If Utils._hasUNOProperty(ControlModel, "ProgressValueMax") Then + If pvValue > ControlModel.ProgressValueMax Then Goto Trace_Error_Value + End If + ControlModel.ProgressValue = pvValue + Case CTLSCROLLBAR + If Not Utils._hasUNOProperty(ControlModel, "ScrollValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ControlModel, "ScrollValueMin") Then + If pvValue < ControlModel.ScrollValueMin Then Goto Trace_Error_Value + End If + If Utils._hasUNOProperty(ControlModel, "ScrollValueMax") Then + If pvValue > ControlModel.ScrollValueMax Then Goto Trace_Error_Value + End If + ControlModel.ScrollValue = pvValue + Case CTLSPINBUTTON + If Not Utils._hasUNOProperty(ControlModel, "SpinValue") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ControlModel, "SpinValueMin") Then + If pvValue < ControlModel.SpinValueMin Then Goto Trace_Error_Value + End If + If Utils._hasUNOProperty(ControlModel, "SpinValueMax") Then + If pvValue > ControlModel.SpinValueMax Then Goto Trace_Error_Value + End If + ControlModel.SpinValue = pvValue + Case CTLTIMEFIELD + If Not Utils._hasUNOProperty(ControlModel, "Time") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + Select Case _InspectPropertyType(ControlModel, "Time") + Case "long" ' AOO and LO <= 4.0 + ControlModel.Time = CLng(pvValue) + Case "com.sun.star.util.Time" ' LO >= 4.1 + 'Direct assignment of ControlModel.Time.Xxx gives error ?!? + Set oStruct = CreateUnoStruct("com.sun.star.util.Time") + sValue = Right("00000000" & Str(CLng(pvValue)), 8) + oStruct.Hours = Val(Left(sValue, 2)) + oStruct.Minutes = Val(Mid(sValue, 3, 2)) + oStruct.Seconds = Val(Mid(sValue, 5, 2)) + Set ControlModel.Time = oStruct + End Select + Case Else + Goto Trace_Error + End Select + ' FINAL COMMITMENT + If Utils._hasUNOMethod(ControlModel, "commit") Then ControlModel.commit() ' f.i. checkboxes have no commit method ?? [PASTIM] + Case UCase("Visible") + If _SubType = CTLHIDDENCONTROL Then Goto Trace_Error ' Hidden remains hidden !! + If Not Utils._hasUNOMethod(ControlView, "setVisible") Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then ControlModel.EnableVisible = True + ControlView.setVisible(pvValue) + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Control.set" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Array: + TraceError(TRACEFATAL, ERRPROPERTYNOTARRAY, Utils._CalledSub(), 0, 1, iArgNr) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Control._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet V1.1.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/DataDef.xba b/wizards/source/access2base/DataDef.xba new file mode 100644 index 000000000..338e99c55 --- /dev/null +++ b/wizards/source/access2base/DataDef.xba @@ -0,0 +1,587 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="DataDef" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be TABLEDEF or QUERYDEF +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String ' For tables: [[Catalog.]Schema.]Table +Private _ParentDatabase As Object +Private _ReadOnly As Boolean +Private Table As Object ' com.sun.star.sdb.dbaccess.ODBTable +Private CatalogName As String +Private SchemaName As String +Private TableName As String +Private Query As Object ' com.sun.star.sdb.dbaccess.OQuery +Private TableDescriptor As Object ' com.sun.star.sdb.dbaccess.ODBTable +Private TableFieldsCount As Integer +Private TableKeysCount As Integer + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = "" + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + Set _ParentDatabase = Nothing + _ReadOnly = False + Set Table = Nothing + CatalogName = "" + SchemaName = "" + TableName = "" + Set Query = Nothing + Set TableDescriptor = Nothing + TableFieldsCount = 0 + TableKeysCount = 0 +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SQL() As Variant + SQL = _PropertyGet("SQL") +End Property ' SQL (get) + +Property Let SQL(ByVal pvValue As Variant) + Call _PropertySet("SQL", pvValue) +End Property ' SQL (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function pType() As Integer + pType = _PropertyGet("Type") +End Function ' Type (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function CreateField(ByVal Optional pvFieldName As Variant _ + , ByVal optional pvType As Variant _ + , ByVal optional pvSize As Variant _ + , ByVal optional pvAttributes As variant _ + ) As Object +'Return a Field object +Const cstThisSub = "TableDef.CreateField" + Utils._SetCalledSub(cstThisSub) + + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim oTable As Object, oNewField As Object, oKeys As Object, oPrimaryKey As Object, oColumn As Object +Const cstMaxKeyLength = 30 + + CreateField = Nothing + If _ParentDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + If IsMissing(pvFieldName) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvFieldName, 1, vbString) Then Goto Exit_Function + If pvFieldName = "" Then Call _TraceArguments() + If IsMissing(pvType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvType, 1, Utils._AddNumeric( _ + dbInteger, dbLong, dbBigInt, dbFloat, vbSingle, dbDouble _ + , dbNumeric, dbDecimal, dbText, dbChar, dbMemo _ + , dbDate, dbTime, dbTimeStamp _ + , dbBinary, dbVarBinary, dbLongBinary, dbBoolean _ + )) Then Goto Exit_Function + If IsMissing(pvSize) Then pvSize = 0 + If pvSize < 0 Then pvSize = 0 + If Not Utils._CheckArgument(pvSize, 1, Utils._AddNumeric()) Then Goto Exit_Function + If IsMissing(pvAttributes) Then pvAttributes = 0 + If Not Utils._CheckArgument(pvAttributes, 1, Utils._AddNumeric(), Array(0, dbAutoIncrField)) Then Goto Exit_Function + + If _Type <> OBJTABLEDEF Then Goto Error_NotApplicable + If IsNull(Table) And IsNull(TableDescriptor) Then Goto Error_NotApplicable + + If _ReadOnly Then Goto Error_NoUpdate + + Set oNewField = New Field + With oNewField + ._This = oNewField + ._Name = pvFieldName + ._ParentName = _Name + ._ParentType = OBJTABLEDEF + If IsNull(Table) Then Set oTable = TableDescriptor Else Set oTable = Table + Set .Column = oTable.Columns.createDataDescriptor() + End With + With oNewField.Column + .Name = pvFieldName + Select Case pvType + Case dbInteger : .Type = com.sun.star.sdbc.DataType.TINYINT + Case dbLong : .Type = com.sun.star.sdbc.DataType.INTEGER + Case dbBigInt : .Type = com.sun.star.sdbc.DataType.BIGINT + Case dbFloat : .Type = com.sun.star.sdbc.DataType.FLOAT + Case dbSingle : .Type = com.sun.star.sdbc.DataType.REAL + Case dbDouble : .Type = com.sun.star.sdbc.DataType.DOUBLE + Case dbNumeric, dbCurrency : .Type = com.sun.star.sdbc.DataType.NUMERIC + Case dbDecimal : .Type = com.sun.star.sdbc.DataType.DECIMAL + Case dbText : .Type = com.sun.star.sdbc.DataType.CHAR + Case dbChar : .Type = com.sun.star.sdbc.DataType.VARCHAR + Case dbMemo : .Type = com.sun.star.sdbc.DataType.LONGVARCHAR + Case dbDate : .Type = com.sun.star.sdbc.DataType.DATE + Case dbTime : .Type = com.sun.star.sdbc.DataType.TIME + Case dbTimeStamp : .Type = com.sun.star.sdbc.DataType.TIMESTAMP + Case dbBinary : .Type = com.sun.star.sdbc.DataType.BINARY + Case dbVarBinary : .Type = com.sun.star.sdbc.DataType.VARBINARY + Case dbLongBinary : .Type = com.sun.star.sdbc.DataType.LONGVARBINARY + Case dbBoolean : .Type = com.sun.star.sdbc.DataType.BOOLEAN + End Select + .Precision = Int(pvSize) + If pvType = dbNumeric Or pvType = dbDecimal Or pvType = dbCurrency Then .Scale = Int(pvSize * 10) - Int(pvSize) * 10 + .IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE + If Utils._hasUNOProperty(oNewField.Column, "CatalogName") Then .CatalogName = CatalogName + If Utils._hasUNOProperty(oNewField.Column, "SchemaName") Then .SchemaName = SchemaName + If Utils._hasUNOProperty(oNewField.Column, "TableName") Then .TableName = TableName + If Not IsNull(TableDescriptor) Then TableFieldsCount = TableFieldsCount + 1 + If pvAttributes = dbAutoIncrField Then + If Not IsNull(Table) Then Goto Error_Sequence ' Do not accept adding an AutoValue field when table exists + Set oKeys = oTable.Keys + Set oPrimaryKey = oKeys.createDataDescriptor() + Set oColumn = oPrimaryKey.Columns.createDataDescriptor() + oColumn.Name = pvFieldName + oColumn.CatalogName = CatalogName + oColumn.SchemaName = SchemaName + oColumn.TableName = TableName + oColumn.IsAutoIncrement = True + oColumn.IsNullable = com.sun.star.sdbc.ColumnValue.NO_NULLS + oPrimaryKey.Columns.appendByDescriptor(oColumn) + oPrimaryKey.Name = Left("PK_" & Join(Split(TableName, " "), "_") & "_" & Join(Split(pvFieldName, " "), "_"), cstMaxKeyLength) + oPrimaryKey.Type = com.sun.star.sdbcx.KeyType.PRIMARY + oKeys.appendByDescriptor(oPrimaryKey) + .IsAutoIncrement = True + .IsNullable = com.sun.star.sdbc.ColumnValue.NO_NULLS + oColumn.dispose() + Else + .IsAutoIncrement = False + End If + End With + oTable.Columns.appendByDescriptor(oNewfield.Column) + + Set CreateField = oNewField + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Sequence: + TraceError(TRACEFATAL, ERRFIELDCREATION, Utils._CalledSub(), 0, 1, pvFieldName) + Goto Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' CreateField V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Execute(ByVal Optional pvOptions As Variant) As Boolean +'Execute a stored query. The query must be an ACTION query. + +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".Execute" + Utils._SetCalledSub(cstThisSub) + On Local Error Goto Error_Function +Const cstNull = -1 + Execute = False + If _Type <> OBJQUERYDEF Then Goto Trace_Method + If IsMissing(pvOptions) Then + pvOptions = cstNull + Else + If Not Utils._CheckArgument(pvOptions, 1, Utils._AddNumeric(), dbSQLPassThrough) Then Goto Exit_Function + End If + + 'Check action query +Dim oStatement As Object, vResult As Variant +Dim iType As Integer, sSql As String + iType = pType + If ( (iType And DBQAction) = 0 ) And ( (iType And DBQDDL) = 0 ) Then Goto Trace_Action + + 'Execute action query + Set oStatement = _ParentDatabase.Connection.createStatement() + sSql = Query.Command + If pvOptions = dbSQLPassThrough Then oStatement.EscapeProcessing = False _ + Else oStatement.EscapeProcessing = Query.EscapeProcessing + On Local Error Goto SQL_Error + vResult = oStatement.executeUpdate(_ParentDatabase._ReplaceSquareBrackets(sSql)) + On Local Error Goto Error_Function + + Execute = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Method: + TraceError(TRACEFATAL, ERRMETHOD, cstThisSub, 0, , cstThisSub) + Goto Exit_Function +Trace_Action: + TraceError(TRACEFATAL, ERRNOTACTIONQUERY, cstThisSub, 0, , _Name) + Goto Exit_Function +SQL_Error: + TraceError(TRACEFATAL, ERRSQLSTATEMENT, Utils._CalledSub(), 0, , sSql) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' Execute V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Fields(ByVal Optional pvIndex As variant) As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".Fields" + Utils._SetCalledSub(cstThisSub) + + Set Fields = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + +Dim sObjects() As String, sObjectName As String, oObject As Object +Dim i As Integer, bFound As Boolean, oFields As Object + + If _Type = OBJTABLEDEF Then Set oFields = Table.getColumns() Else Set oFields = Query.getColumns() + sObjects = oFields.ElementNames() + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLFIELDS + Set oObject._Parent = _This + oObject._Count = UBound(sObjects) + 1 + Goto Exit_Function + Case VarType(pvIndex) = vbString + bFound = False + ' Check existence of object and find its exact (case-sensitive) name + For i = 0 To UBound(sObjects) + If UCase(pvIndex) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + Case Else ' pvIndex is numeric + If pvIndex < 0 Or pvIndex > UBound(sObjects) Then Goto Trace_IndexError + sObjectName = sObjects(pvIndex) + End Select + + Set oObject = New Field + Set oObject._This = oObject + oObject._Name = sObjectName + Set oObject.Column = oFields.getByName(sObjectName) + oObject._ParentName = _Name + oObject._ParentType = _Type + Set oObject._ParentDatabase = _ParentDatabase + +Exit_Function: + Set Fields = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("FIELD"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Fields + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".getProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub(cstThisSub) + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".hasProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Utils._ResetCalledSub(cstThisSub) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenRecordset(ByVal Optional pvType As Variant, ByVal Optional pvOptions As Variant, ByVal Optional pvLockEdit As Variant) As Object +'Return a Recordset object based on current table- or querydef object + +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".OpenRecordset" + Utils._SetCalledSub(cstThisSub) +Const cstNull = -1 +Dim lCommandType As Long, sCommand As String, oObject As Object,bPassThrough As Boolean + + Set oObject = Nothing + If IsMissing(pvType) Then + pvType = cstNull + Else + If Not Utils._CheckArgument(pvType, 1, Utils._AddNumeric(), Array(cstNull, dbOpenForwardOnly)) Then Goto Exit_Function + End If + If IsMissing(pvOptions) Then + pvOptions = cstNull + Else + If Not Utils._CheckArgument(pvOptions, 2, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + End If + If IsMissing(pvLockEdit) Then + pvLockEdit = cstNull + Else + If Not Utils._CheckArgument(pvLockEdit, 3, Utils._AddNumeric(), Array(cstNull, dbReadOnly)) Then Goto Exit_Function + End If + + Select Case _Type + Case OBJTABLEDEF + lCommandType = com.sun.star.sdb.CommandType.TABLE + sCommand = _Name + Case OBJQUERYDEF + lCommandType = com.sun.star.sdb.CommandType.QUERY + sCommand = _Name + If pvOptions = dbSQLPassThrough Then bPassThrough = True Else bPassThrough = Not Query.EscapeProcessing + End Select + + Set oObject = New Recordset + With oObject + ._CommandType = lCommandType + ._Command = sCommand + ._ParentName = _Name + ._ParentType = _Type + ._ForwardOnly = ( pvType = dbOpenForwardOnly ) + ._PassThrough = bPassThrough + ._ReadOnly = ( (pvLockEdit = dbReadOnly) Or _ReadOnly ) + Set ._ParentDatabase = _ParentDatabase + Set ._This = oObject + Call ._Initialize() + End With + With _ParentDatabase + .RecordsetMax = .RecordsetMax + 1 + oObject._Name = Format(.RecordsetMax, "0000000") + .RecordsetsColl.Add(oObject, UCase(oObject._Name)) + End With + + If Not ( oObject._BOF And oObject._EOF ) Then oObject.MoveFirst() ' Do nothing if resultset empty + +Exit_Function: + Set OpenRecordset = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Set oObject = Nothing + GoTo Exit_Function +End Function ' OpenRecordset V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".Properties" + Utils._SetCalledSub(cstThisSub) + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + Set vProperty._ParentDatabase = _ParentDatabase + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".setProperty" + Utils._SetCalledSub(cstThisSub) + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub(cstThisSub) +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + Select Case _Type + Case OBJTABLEDEF + _PropertiesList = Array("Name", "ObjectType") + Case OBJQUERYDEF + _PropertiesList = Array("Name", "ObjectType", "SQL", "Type") + Case Else + End Select + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) + Utils._SetCalledSub(cstThisSub & ".get" & psProperty) +Dim sSql As String, sVerb As String, iType As Integer + _PropertyGet = EMPTY + If Not hasProperty(psProperty) Then Goto Trace_Error + + Select Case UCase(psProperty) + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("SQL") + _PropertyGet = Query.Command + Case UCase("Type") + iType = 0 + sSql = Utils._Trim(UCase(Query.Command)) + sVerb = Split(sSql, " ")(0) + If sVerb = "SELECT" Then iType = iType + dbQSelect + If sVerb = "SELECT" And InStr(sSql, " INTO ") > 0 _ + Or sVerb = "CREATE" And InStr(sSql, " TABLE ") > 0 _ + Then iType = iType + dbQMakeTable + If sVerb = "SELECT" And InStr(sSql, " UNION ") > 0 Then iType = iType + dbQSetOperation + If Not Query.EscapeProcessing Then iType = iType + dbQSQLPassThrough + If sVerb = "INSERT" Then iType = iType + dbQAppend + If sVerb = "DELETE" Then iType = iType + dbQDelete + If sVerb = "UPDATE" Then iType = iType + dbQUpdate + If sVerb = "CREATE" _ + Or sVerb = "ALTER" _ + Or sVerb = "DROP" _ + Or sVerb = "RENAME" _ + Or sVerb = "TRUNCATE" _ + Then iType = iType + dbQDDL + ' dbQAction implied by dbQMakeTable, dbQAppend, dbQDelete and dbQUpdate + ' To check Type use: If (iType And dbQxxx) <> 0 Then ... + _PropertyGet = iType + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub & ".get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub & "._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean +' Return True if property setting OK + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) + Utils._SetCalledSub(cstThisSub & ".set" & psProperty) + +'Execute +Dim iArgNr As Integer + + _PropertySet = True + Select Case UCase(_A2B_.CalledSub) + Case UCase("setProperty") : iArgNr = 3 + Case UCase(cstThisSub & ".setProperty") : iArgNr = 2 + Case UCase(cstThisSub & ".set" & psProperty) : iArgNr = 1 + End Select + + If Not hasProperty(psProperty) Then Goto Trace_Error + + If _ReadOnly Then Goto Error_NoUpdate + + Select Case UCase(psProperty) + Case UCase("SQL") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + Query.Command = pvValue + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub & ".set" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub & "._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Database.xba b/wizards/source/access2base/Database.xba new file mode 100644 index 000000000..2e361cecf --- /dev/null +++ b/wizards/source/access2base/Database.xba @@ -0,0 +1,1884 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Database" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be DATABASE +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _DbConnect As Integer ' DBCONNECTxxx constants +Private Title As String +Private Document As Object ' com.sun.star.comp.dba.ODatabaseDocument or SwXTextDocument or ScModelObj +Private Connection As Object ' com.sun.star.sdbc.drivers.OConnectionWrapper or com.sun.star.sdbc.XConnection +Private URL As String +Private Location As String ' Different from URL for registered databases +Private _ReadOnly As Boolean +Private MetaData As Object ' interface XDatabaseMetaData +Private _RDBMS As Integer ' DBMS constants +Private _ColumnTypes() As Variant ' Part of Metadata.GetTypeInfo() +Private _ColumnTypeNames() As Variant +Private _ColumnPrecisions() As Variant +Private _ColumnTypesReference() As Variant +Private _ColumnTypesAlias() As Variant ' To what should a field whose origin is another DBMS be converted ? See DataTypes By RDBMS.ods +Private _BinaryStream As Boolean ' False = binary fields must NOT be streamed f.i. via ReadAllBytes or WriteAllBytes +Private Form As Object ' com.sun.star.form.XForm +Private FormName As String +Private RecordsetMax As Long ' To make unique names in Collection below (See bug # 121342) +Private RecordsetsColl As Object ' Collection of active recordsets + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJDATABASE + Set _This = Nothing + Set _Parent = Nothing + _DbConnect = 0 + Title = "" + Set Document = Nothing + Set Connection = Nothing + URL = "" + _ReadOnly = False + Set MetaData = Nothing + _RDBMS = DBMS_UNKNOWN + _ColumnTypes = Array() + _ColumnTypeNames = Array() + _ColumnPrecisions = Array() + _ColumnTypesReference = Array() + _ColumnTypesAlias() = Array() + _BinaryStream = False + Set Form = Nothing + FormName = "" + RecordsetMax = 0 + Set RecordsetsColl = New Collection +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call CloseAllRecordsets() + If _DbConnect <> DBCONNECTANY Then + If Not IsNull(Connection) Then + Connection.close() + Connection.dispose() + Set Connection = Nothing + End If + Else + mClose() + End If + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + + + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get Connect() As String + Connect = _PropertyGet("Connect") +End Property ' Connect (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnCreate() As String + OnCreate = _PropertyGet("OnCreate") +End Property ' OnCreate (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnFocus() As String + OnFocus = _PropertyGet("OnFocus") +End Property ' OnFocus (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnLoad() As String + OnLoad = _PropertyGet("OnLoad") +End Property ' OnLoad (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnLoadFinished() As String + OnLoadFinished = _PropertyGet("OnLoadFinished") +End Property ' OnLoadFinished (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnModifyChanged() As String + OnModifyChanged = _PropertyGet("OnModifyChanged") +End Property ' OnModifyChanged (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnNew() As String + OnNew = _PropertyGet("OnNew") +End Property ' OnNew (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnPrepareUnload() As String + OnPrepareUnload = _PropertyGet("OnPrepareUnload") +End Property ' OnPrepareUnload (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnPrepareViewClosing() As String + OnPrepareViewClosing = _PropertyGet("OnPrepareViewClosing") +End Property ' OnPrepareViewClosing (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSave() As String + OnSave = _PropertyGet("OnSave") +End Property ' OnSave (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSaveAs() As String + OnSaveAs = _PropertyGet("OnSaveAs") +End Property ' OnSaveAs (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSaveAsDone() As String + OnSaveAsDone = _PropertyGet("OnSaveAsDone") +End Property ' OnSaveAsDone (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSaveAsFailed() As String + OnSaveAsFailed = _PropertyGet("OnSaveAsFailed") +End Property ' OnSaveAsFailed (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSaveDone() As String + OnSaveDone = _PropertyGet("OnSaveDone") +End Property ' OnSaveDone (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSaveFailed() As String + OnSaveFailed = _PropertyGet("OnSaveFailed") +End Property ' OnSaveFailed (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSubComponentClosed() As String + OnSubComponentClosed = _PropertyGet("OnSubComponentClosed") +End Property ' OnSubComponentClosed (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnSubComponentOpened() As String + OnSubComponentOpened = _PropertyGet("OnSubComponentOpened") +End Property ' OnSubComponentOpened (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnTitleChanged() As String + OnTitleChanged = _PropertyGet("OnTitleChanged") +End Property ' OnTitleChanged (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnfocus() As String + OnUnfocus = _PropertyGet("OnUnfocus") +End Property ' OnUnfocus (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnload() As String + OnUnload = _PropertyGet("OnUnload") +End Property ' OnUnload (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnViewClosed() As String + OnViewClosed = _PropertyGet("OnViewClosed") +End Property ' OnViewClosed (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnViewCreated() As String + OnViewCreated = _PropertyGet("OnViewCreated") +End Property ' OnViewCreated (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Version() As String + Version = _PropertyGet("Version") +End Property ' Version (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function mClose() As Variant +' Close the database + +If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Database.Close" + Utils._SetCalledSub(cstThisSub) + mClose = False + If _DbConnect <> DBCONNECTANY Then Goto Error_NotApplicable + + With Connection + If Utils._hasUNOMethod(Connection, "flush") Then .flush + .close() + .dispose() + End With + Set Connection = Nothing + mClose = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + GoTo Exit_Function +End Function ' (m)Close + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub CloseAllRecordsets() +' Clean all recordsets for housekeeping + +Dim sRecordsets() As String, i As Integer, oRecordset As Object + On Local Error Goto Exit_Sub + + If IsNull(RecordsetsColl) Then Exit Sub + If RecordsetsColl.Count < 1 Then Exit Sub + For i = 1 To RecordsetsColl.Count + Set oRecordset = RecordsetsColl.Item(i) + oRecordset.mClose(False) ' Do not remove entry in collection + Next i + Set RecordsetsColl = New Collection + RecordsetMax = 0 + +Exit_Sub: + Exit Sub +End Sub ' CloseAllRecordsets V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CreateQueryDef(ByVal Optional pvQueryName As Variant _ + , ByVal Optional pvSql As Variant _ + , ByVal Optional pvOption As Variant _ + ) As Object +'Return a (new) QueryDef object based on SQL statement +Const cstThisSub = "Database.CreateQueryDef" + Utils._SetCalledSub(cstThisSub) + +Const cstNull = -1 +Dim oQuery As Object, oQueries As Object, i As Integer, sQueryName As String + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set CreateQueryDef = Nothing + If _DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + If IsMissing(pvQueryName) Then Call _TraceArguments() + If IsMissing(pvSql) Then Call _TraceArguments() + If IsMissing(pvOption) Then pvOption = cstNull + + If Not Utils._CheckArgument(pvQueryName, 1, vbString) Then Goto Exit_Function + If pvQueryName = "" Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSql, 2, vbString) Then Goto Exit_Function + If pvSql = "" Then Call _TraceArguments() + If Not Utils._CheckArgument(pvOption, 3, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + + If _ReadOnly Then Goto Error_NoUpdate + + Set oQuery = CreateUnoService("com.sun.star.sdb.QueryDefinition") + oQuery.rename(pvQueryName) + oQuery.Command = _ReplaceSquareBrackets(pvSql) + oQuery.EscapeProcessing = Not ( pvOption = dbSQLPassThrough ) + + Set oQueries = Document.DataSource.getQueryDefinitions() + With oQueries + For i = 0 To .getCount() - 1 + sQueryName = .getByIndex(i).Name + If UCase(sQueryName) = UCase(pvQueryName) Then + TraceError(TRACEWARNING, ERRQUERYDEFDELETED, Utils._CalledSub(), 0, False, sQueryName) + .removeByName(sQueryName) + Exit For + End If + Next i + .insertByName(pvQueryName, oQuery) + End With + Set CreateQueryDef = QueryDefs(pvQueryName) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' CreateQueryDef V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CreateTableDef(ByVal Optional pvTableName As Variant) As Object +'Return a (new/empty) TableDef object +Const cstThisSub = "Database.CreateTableDef" + Utils._SetCalledSub(cstThisSub) + +Dim oTable As Object, oTables As Object, sTables() As String +Dim i As Integer, sTableName As String, oNewTable As Object +Dim vNameComponents() As Variant, iNames As Integer + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set CreateTableDef = Nothing + If _DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + If IsMissing(pvTableName) Then Call _TraceArguments() + + If Not Utils._CheckArgument(pvTableName, 1, vbString) Then Goto Exit_Function + If pvTableName = "" Then Call _TraceArguments() + + If _ReadOnly Then Goto Error_NoUpdate + + Set oTables = Connection.getTables + With oTables + sTables = .ElementNames() + ' Check existence of object and find its exact (case-sensitive) name + For i = 0 To UBound(sTables) + If UCase(pvTableName) = UCase(sTables(i)) Then + sTableName = sTables(i) + TraceError(TRACEWARNING, ERRTABLEDEFDELETED, Utils._CalledSub(), 0, False, sTableName) + .dropByName(sTableName) + Exit For + End If + Next i + Set oNewTable = New DataDef + Set oNewTable._This = oNewTable + oNewTable._Type = OBJTABLEDEF + oNewTable._Name = pvTableName + vNameComponents = Split(pvTableName, ".") + iNames = UBound(vNameComponents) + If iNames >= 2 Then oNewtable.CatalogName = vNameComponents(iNames - 2) Else oNewTable.CatalogName = "" + If iNames >= 1 Then oNewtable.SchemaName = vNameComponents(iNames - 1) Else oNewTable.SchemaName = "" + oNewtable.TableName = vNameComponents(iNames) + Set oNewTable._ParentDatabase = _This + Set oNewTable.TableDescriptor = .createDataDescriptor() + oNewTable.TableDescriptor.CatalogName = oNewTable.CatalogName + oNewTable.TableDescriptor.SchemaName = oNewTable.SchemaName + oNewTable.TableDescriptor.Name = oNewTable.TableName + oNewTable.TableDescriptor.Type = "TABLE" + End With + + Set CreateTabledef = oNewTable + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' CreateTableDef V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DAvg( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return average of scope +Const cstThisSub = "Database.DAvg" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DAvg = _DFunction("AVG", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DAvg + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DCount( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return # of occurrences of scope +Const cstThisSub = "Database.DCount" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DCount = _DFunction("COUNT", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DLookup( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + , ByVal Optional pvOrderClause As Variant _ + ) As Variant + +' Return a value within a table + 'Arguments: psExpr: an SQL expression + ' psDomain: a table- or queryname + ' pvCriteria: an optional WHERE clause + ' pcOrderClause: an optional order clause incl. "DESC" if relevant + 'Return: Value of the psExpr if found, else Null. + 'Author: inspired from Allen Browne. http://allenbrowne.com/ser-42.html + 'Examples: + ' 1. To find the last value, include DESC in the OrderClause, e.g.: + ' DLookup("[Surname] & [FirstName]", "tblClient", , "ClientID DESC") + ' 2. To find the lowest non-null value of a field, use the Criteria, e.g.: + ' DLookup("ClientID", "tblClient", "Surname Is Not Null" , "Surname") + +Const cstThisSub = "Database.DLookup" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DLookup = _DFunction("", psExpr, psDomain _ + , Iif(IsMissing(pvCriteria), "", pvCriteria) _ + , Iif(IsMissing(pvOrderClause), "", pvOrderClause) _ + ) + Utils._ResetCalledSub(cstThisSub) +End Function ' DLookup + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DMax( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return maximum of scope +Const cstThisSub = "Database.DMax" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DMax = _DFunction("MAX", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DMax + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DMin( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return minimum of scope +Const cstThisSub = "Database.DMin" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DMin = _DFunction("MIN", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DMin + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DStDev( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return standard deviation of scope +Const cstThisSub = "Database.DStDev" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DStDev = _DFunction("STDDEV_SAMP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") ' STDDEV not STDEV ! + Utils._ResetCalledSub(cstThisSub) +End Function ' DStDev + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DStDevP( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return standard deviation of scope +Const cstThisSub = "Database.DStDevP" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DStDevP = _DFunction("STDDEV_POP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") ' STDDEV not STDEV ! + Utils._ResetCalledSub(cstThisSub) +End Function ' DStDevP + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DSum( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return sum of scope +Const cstThisSub = "Database.DSum" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DSum = _DFunction("SUM", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DSum + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DVar( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return variance of scope +Const cstThisSub = "Database.DVar" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DVar = _DFunction("VAR_SAMP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DVar + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function DVarP( _ + ByVal Optional psExpr As String _ + , ByVal Optional psDomain As String _ + , ByVal Optional pvCriteria As Variant _ + ) As Variant +' Return variance of scope +Const cstThisSub = "Database.DVarP" + Utils._SetCalledSub(cstThisSub) + If IsMissing(psExpr) Or IsMissing(psDomain) Then Call _TraceArguments() + DVarP = _DFunction("VAR_POP", psExpr, psDomain, Iif(IsMissing(pvCriteria), "", pvCriteria), "") + Utils._ResetCalledSub(cstThisSub) +End Function ' DVarP + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Database.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Database.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenRecordset(ByVal Optional pvSource As Variant _ + , ByVal Optional pvType As Variant _ + , ByVal Optional pvOptions As Variant _ + , ByVal Optional pvLockEdit As Variant _ + ) As Object +'Return a Recordset object based on Source (= SQL, table or query name) + +Const cstThisSub = "Database.OpenRecordset" + Utils._SetCalledSub(cstThisSub) +Const cstNull = -1 + +Dim lCommandType As Long, sCommand As String, oObject As Object +Dim sSource As String, i As Integer, iCount As Integer +Dim sObjects() As String, bFound As Boolean, oTables As Object, oQueries As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function + Set oObject = Nothing + If IsMissing(pvSource) Then Call _TraceArguments() + If pvSource = "" Then Call _TraceArguments() + If IsMissing(pvType) Then + pvType = cstNull + Else + If Not Utils._CheckArgument(pvType, 2, Utils._AddNumeric(), Array(cstNull, dbOpenForwardOnly)) Then Goto Exit_Function + End If + If IsMissing(pvOptions) Then + pvOptions = cstNull + Else + If Not Utils._CheckArgument(pvOptions, 3, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + End If + If IsMissing(pvLockEdit) Then + pvLockEdit = cstNull + Else + If Not Utils._CheckArgument(pvLockEdit, 4, Utils._AddNumeric(), Array(cstNull, dbReadOnly)) Then Goto Exit_Function + End If + + sSource = Split(UCase(Trim(pvSource)), " ")(0) + Select Case True + Case sSource = "SELECT" + lCommandType = com.sun.star.sdb.CommandType.COMMAND + sCommand = _ReplaceSquareBrackets(pvSource) + Case Else + sSource = UCase(Trim(pvSource)) + REM Explore tables + Set oTables = Connection.getTables + sObjects = oTables.ElementNames() + bFound = False + For i = 0 To UBound(sObjects) + If sSource = UCase(sObjects(i)) Then + sCommand = sObjects(i) + bFound = True + Exit For + End If + Next i + If bFound Then + lCommandType = com.sun.star.sdb.CommandType.TABLE + Else + REM Explore queries + Set oQueries = Connection.getQueries + sObjects = oQueries.ElementNames() + For i = 0 To UBound(sObjects) + If sSource = UCase(sObjects(i)) Then + sCommand = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + lCommandType = com.sun.star.sdb.CommandType.QUERY + End If + End Select + + Set oObject = New Recordset + With oObject + ._CommandType = lCommandType + ._Command = sCommand + ._ParentName = Title + ._ParentType = _Type + ._ForwardOnly = ( pvType = dbOpenForwardOnly ) + ._PassThrough = ( pvOptions = dbSQLPassThrough ) + ._ReadOnly = ( (pvLockEdit = dbReadOnly) Or _ReadOnly ) + Set ._This = oObject + Set ._ParentDatabase = _This + Call ._Initialize() + RecordsetMax = RecordsetMax + 1 + ._Name = Format(RecordsetMax, "0000000") + RecordsetsColl.Add(oObject, UCase(._Name)) + End With + + If Not ( oObject._BOF And oObject._EOF ) Then oObject.MoveFirst() ' Do nothing if resultset empty + +Exit_Function: + Set OpenRecordset = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("TABLE") & "/" & _GetLabel("QUERY"), pvSource)) + Goto Exit_Function +End Function ' OpenRecordset V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenSQL(Optional ByVal pvSQL As Variant _ + , Optional ByVal pvOption As Variant _ + ) As Boolean +' Return True if the execution of the SQL statement was successful +' SQL must contain a SELECT query +' pvOption can force pass through mode + + If _ErrorHandler() Then On Local Error Goto Error_Function + +Const cstThisSub = "Database.OpenSQL" + Utils._SetCalledSub(cstThisSub) + + OpenSQL = False + If IsMissing(pvSQL) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSQL, 1, vbString) Then Goto Exit_Function +Const cstNull = -1 + If IsMissing(pvOption) Then + pvOption = cstNull + Else + If Not Utils._CheckArgument(pvOption, 2, Utils._AddNumeric(), Array(dbSQLPassThrough, cstNull)) Then Goto Exit_Function + End If + If _DbConnect <> DBCONNECTBASE And _DbConnect <> DBCONNECTFORM Then Goto Error_NotApplicable + +Dim oURL As New com.sun.star.util.URL, oDispatch As Object +Dim vArgs(8) as New com.sun.star.beans.PropertyValue + + oURL.Complete = ".component:DB/DataSourceBrowser" + oDispatch = StarDesktop.queryDispatch(oURL, "_Blank", 8) + + vArgs(0).Name = "ActiveConnection" : vArgs(0).Value = Connection + vArgs(1).Name = "CommandType" : vArgs(1).Value = com.sun.star.sdb.CommandType.COMMAND + vArgs(2).Name = "Command" : vArgs(2).Value = _ReplaceSquareBrackets(pvSQL) + vArgs(3).Name = "ShowMenu" : vArgs(3).Value = True + vArgs(4).Name = "ShowTreeView" : vArgs(4).Value = False + vArgs(5).Name = "ShowTreeViewButton" : vArgs(5).Value = False + vArgs(6).Name = "Filter" : vArgs(6).Value = "" + vArgs(7).Name = "ApplyFilter" : vArgs(7).Value = False + vArgs(8).Name = "EscapeProcessing" : vArgs(8).Value = CBool(Not ( pvOption = dbSQLPassThrough )) + + oDispatch.dispatch(oURL, vArgs) + OpenSQL = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenSQL", Erl) + GoTo Exit_Function +SQL_Error: + TraceError(TRACEFATAL, ERRSQLSTATEMENT, Utils._CalledSub(), 0, , pvSQL) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' OpenSQL V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OutputTo(ByVal pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + , ByVal Optional pvOutputFormat As Variant _ + , ByVal Optional pvOutputFile As Variant _ + , ByVal Optional pvAutoStart As Variant _ + , ByVal Optional pvTemplateFile As Variant _ + , ByVal Optional pvEncoding As Variant _ + , ByVal Optional pvQuality As Variant _ + , ByRef Optional pvHeaders As Variant _ + , ByRef Optional pvData As Variant _ + ) As Boolean +'Supported: acFormatHTML, acFormatODS, acFormatXLS, acFormatXLSX, acFormatTXT for tables and queries +'pvHeaders and pvData (unpublished) when pvObjectType = acOutputArray + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Database.OutputTo" + Utils._SetCalledSub(cstThisSub) + + OutputTo = False + + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), Array(acOutputTable, acOutputQuery, acOutputArray)) Then Goto Exit_Function + If IsMissing(pvObjectName) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvObjectName, 2, vbString) Then Goto Exit_Function + If IsMissing(pvOutputFormat) Then pvOutputFormat = "" + If Not Utils._CheckArgument(pvOutputFormat, 3, vbString) Then Goto Exit_Function + If pvOutputFormat <> "" Then + If Not Utils._CheckArgument(UCase(pvOutputFormat), 3, vbString, Array( _ + UCase(acFormatHTML), "HTML" _ + , UCase(acFormatODS), "ODS" _ + , UCase(acFormatXLS), "XLS" _ + , UCase(acFormatXLSX), "XLSX" _ + , UCase(acFormatTXT), "TXT", "CSV" _ + , "")) _ + Then Goto Exit_Function ' A 2nd time to allow case unsensitivity + End If + If IsMissing(pvOutputFile) Then pvOutputFile = "" + If Not Utils._CheckArgument(pvOutputFile, 4, vbString) Then Goto Exit_Function + If IsMissing(pvAutoStart) Then pvAutoStart = False + If Not Utils._CheckArgument(pvAutoStart, 5, vbBoolean) Then Goto Exit_Function + If IsMissing(pvTemplateFile) Then pvTemplateFile = "" + If Not Utils._CheckArgument(pvTemplateFile, 6, vbString) Then Goto Exit_Function + If IsMissing(pvEncoding) Then pvEncoding = 0 + If Not Utils._CheckArgument(pvEncoding, 7, _AddNumeric()) Then Goto Exit_Function + If IsMissing(pvQuality) Then pvQuality = acExportQualityPrint + If Not Utils._CheckArgument(pvQuality, 7, _AddNumeric(), Array(acExportQualityPrint, acExportQualityScreen)) Then Goto Exit_Function + If pvObjectType = acOutputArray Then + If IsMissing(pvHeaders) Or IsMissing(pvData) Then Call _TraceArguments() + pvOutputFormat = "HTML" + End If + +Dim sOutputFile As String, oTable As Object +Dim sOutputFormat As String, iTemplate As Integer, iOutputFile As Integer, bOutput As Boolean, sSuffix As String + + If pvObjectType = acOutputArray Then + Set oTable = Nothing + Else + 'Find applicable table or query + If pvObjectType = acOutputTable Then Set oTable = TableDefs(pvObjectName, True) Else Set oTable = Querydefs(pvObjectName, True) + If IsNull(oTable) Then Goto Error_NotFound + End If + + 'Determine format and parameters + If pvOutputFormat = "" Then + sOutputFormat = _PromptFormat(Array("HTML", "ODS", "XLS", "XLSX", "TXT")) ' Prompt user for format + If sOutputFormat = "" Then Goto Exit_Function + Else + sOutputFormat = UCase(pvOutputFormat) + End If + + 'Determine output file + If pvOutputFile = "" Then ' Prompt file picker to user + Select Case sOutputFormat + Case UCase(acFormatHTML), "HTML" : sSuffix = "html" + Case UCase(acFormatODS), "ODS" : sSuffix = "ods" + Case UCase(acFormatXLS), "XLS" : sSuffix = "xls" + Case UCase(acFormatXLSX), "XLSX" : sSuffix = "xlsx" + Case UCase(acFormatTXT), "TXT", "CSV" : sSuffix = "txt" + End Select + sOutputFile = _PromptFilePicker(sSuffix) + If sOutputFile = "" Then Goto Exit_Function + Else + sOutputFile = pvOutputFile + End If + sOutputFile = ConvertToURL(sOutputFile) + + 'Create file + Select Case sOutputFormat + Case UCase(acFormatHTML), "HTML" + If pvObjectType = acOutputArray Then + bOutput = _OutputToHTML(Nothing, pvObjectName, sOutputFile, pvTemplateFile, pvHeaders, pvData) + Else + bOutput = _OutputToHTML(oTable, pvObjectName, sOutputFile, pvTemplateFile) + End If + Case UCase(acFormatODS), "ODS" + bOutput = _OutputToCalc(oTable, sOutputFile, acFormatODS) + Case UCase(acFormatXLS), "XLS" + bOutput = _OutputToCalc(oTable, sOutputFile, acFormatXLS) + Case UCase(acFormatXLS), "XLSX" + bOutput = _OutputToCalc(oTable, sOutputFile, acFormatXLSX) + Case UCase(acFormatTXT), "TXT", "CSV" + bOutput = _OutputToCalc(oTable, sOutputFile, acFormatTXT, pvEncoding) + End Select + + 'Launch application, if requested + If bOutput Then + If pvAutoStart Then Call _ShellExecute(sOutputFile) + Else + GoTo Error_File + End If + + OutputTo = True + +Exit_Function: + If Not IsNull(oTable) Then + oTable.Dispose() + Set oTable = Nothing + End If + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_File: + TraceError(TRACEFATAL, ERRFILENOTCREATED, Utils._CalledSub(), 0, , sOutputFile) + GoTo Exit_Function +End Function ' OutputTo V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + + Utils._SetCalledSub("Database.Properties") +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + Set vProperty._ParentDatabase = _This + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub("Database.Properties") + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function QueryDefs(ByVal Optional pvIndex As Variant, ByVal Optional pbCheck As Boolean) As Object +' Collect all Queries in the database +' pbCheck unpublished + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Database.QueryDefs") + If IsMissing(pbCheck) Then pbCheck = False + +Dim sObjects() As String, sObjectName As String, oObject As Object +Dim i As Integer, bFound As Boolean, oQueries As Object + Set oObject = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + + Set oQueries = Connection.getQueries + sObjects = oQueries.ElementNames() + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLQUERYDEFS + Set oObject._Parent = _This + oObject._Count = UBound(sObjects) + 1 + Goto Exit_Function + Case VarType(pvIndex) = vbString + bFound = False + ' Check existence of object and find its exact (case-sensitive) name + For i = 0 To UBound(sObjects) + If UCase(pvIndex) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + Case Else ' pvIndex is numeric + If pvIndex < 0 Or pvIndex > UBound(sObjects) Then Goto Trace_IndexError + sObjectName = sObjects(pvIndex) + End Select + + Set oObject = New DataDef + Set oObject._This = oObject + oObject._Type = OBJQUERYDEF + oObject._Name = sObjectName + Set oObject._ParentDatabase = _This + oObject._readOnly = _ReadOnly + Set oObject.Query = oQueries.getByName(sObjectName) + +Exit_Function: + Set QueryDefs = oObject + Set oObject = Nothing + Utils._ResetCalledSub("Database.QueryDefs") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Database.QueryDefs", Erl) + GoTo Exit_Function +Trace_NotFound: + If Not pbCheck Then TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("QUERY"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' QueryDefs V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Recordsets(ByVal Optional pvIndex As Variant) As Object +' Collect all active recordsets + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Database.Recordsets") + + Set Recordsets = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + +Dim sObjects() As String, sObjectName As String, oObject As Object +Dim i As Integer, bFound As Boolean, oTables As Object + + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLRECORDSETS + Set oObject._Parent = _This + oObject._Count = RecordsetsColl.Count + Case VarType(pvIndex) = vbString + bFound = _hasRecordset(pvIndex) + If Not bFound Then Goto Trace_NotFound + Set oObject = RecordsetsColl.Item(pvIndex) + Case Else ' pvIndex is numeric + If pvIndex < 0 Or pvIndex >= RecordsetsColl.Count Then Goto Trace_IndexError + Set oObject = RecordsetsColl.Item(pvIndex + 1) ' Collection members are numbered 1 ... Count + End Select + +Exit_Function: + Set Recordsets = oObject + Set oObject = Nothing + Utils._ResetCalledSub("Database.Recordsets") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Database.Recordsets", Erl) + GoTo Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("RECORDSET"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Recordsets V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RunSQL(Optional ByVal pvSQL As Variant _ + , Optional ByVal pvOption As Variant _ + ) As Boolean +' Return True if the execution of the SQL statement was successful +' SQL must contain an ACTION query + + If _ErrorHandler() Then On Local Error Goto Error_Function + +Const cstThisSub = "Database.RunSQL" + Utils._SetCalledSub(cstThisSub) + + RunSQL = False + If IsMissing(pvSQL) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSQL, 1, vbString) Then Goto Exit_Function +Const cstNull = -1 + If IsMissing(pvOption) Then + pvOption = cstNull + Else + If Not Utils._CheckArgument(pvOption, 2, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + End If + +Dim oStatement As Object, vResult As Variant + Set oStatement = Connection.createStatement() + oStatement.EscapeProcessing = Not ( pvOption = dbSQLPassThrough ) + On Local Error Goto SQL_Error + vResult = oStatement.execute(_ReplaceSquareBrackets(pvSQL)) + On Local Error Goto Error_Function + RunSQL = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +SQL_Error: + TraceError(TRACEFATAL, ERRSQLSTATEMENT, Utils._CalledSub(), 0, , pvSQL) + Goto Exit_Function +End Function ' RunSQL V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function TableDefs(ByVal Optional pvIndex As Variant, ByVal Optional pbCheck As Boolean) As Object +' Collect all tables in the database +' pbCheck unpublished + +Const cstThisSub = "Database.TableDefs" + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + If IsMissing(pbCheck) Then pbCheck = False + +Dim sObjects() As String, sObjectName As String, oObject As Object +Dim i As Integer, bFound As Boolean, oTables As Object + Set oObject = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + + Set oTables = Connection.getTables + sObjects = oTables.ElementNames() + Select Case True + Case IsMissing(pvIndex) + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLTABLEDEFS + Set oObject._Parent = _This + oObject._Count = UBound(sObjects) + 1 + Goto Exit_Function + Case VarType(pvIndex) = vbString + bFound = False + ' Check existence of object and find its exact (case-sensitive) name + For i = 0 To UBound(sObjects) + If UCase(pvIndex) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + Case Else ' pvIndex is numeric + If pvIndex < 0 Or pvIndex > UBound(sObjects) Then Goto Trace_IndexError + sObjectName = sObjects(pvIndex) + End Select + + Set oObject = New DataDef + With oObject + ._This = oObject + ._Type = OBJTABLEDEF + ._Name = sObjectName + Set ._ParentDatabase = _This + ._ReadOnly = _ReadOnly + Set .Table = oTables.getByName(sObjectName) + .CatalogName = .Table.CatalogName + .SchemaName = .Table.SchemaName + .TableName = .Table.Name + End With + +Exit_Function: + Set TableDefs = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_NotFound: + If Not pbCheck Then TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("TABLE"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' TableDefs V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _DFunction(ByVal psFunction As String _ + , ByVal psExpr As String _ + , ByVal psDomain As String _ + , ByVal pvCriteria As Variant _ + , ByVal Optional pvOrderClause As Variant _ + ) As Variant + 'Arguments: psFunction an optional aggregate function + ' psExpr: an SQL expression [might contain an aggregate function] + ' psDomain: a table- or queryname + ' pvCriteria: an optional WHERE clause + ' pcOrderClause: an optional order clause incl. "DESC" if relevant + +If _ErrorHandler() Then On Local Error GoTo Error_Function + +Dim oResult As Object 'To retrieve the value to find. +Dim vResult As Variant 'Return value for function. +Dim sSql As String 'SQL statement. +Dim oStatement As Object 'For CreateStatement method +Dim sExpr As String 'For inclusion of aggregate function +Dim sTempField As String 'Random temporary field in SQL expression + +Dim sTarget as String, sWhere As String, sOrderBy As String, sLimit As String +Dim sProductName As String + + vResult = Null + + Randomize 2^14-1 + sTempField = "[TEMP" & Right("00000" & Int(100000 * Rnd), 5) & "]" + If pvCriteria <> "" Then sWhere = " WHERE " & pvCriteria Else sWhere = "" + If pvOrderClause <> "" Then sOrderBy = " ORDER BY " & pvOrderClause Else sOrderBy = "" + sLimit = "" + +' Workaround for https://bugs.documentfoundation.org/show_bug.cgi?id=118767 +' awaiting solution for https://bugs.documentfoundation.org/show_bug.cgi?id=118809 + sProductName = UCase(MetaData.getDatabaseProductName()) + If sProductName = "" Then + If MetaData.URL = "sdbc:embedded:firebird" Or Left(MetaData.URL, 13) = "sdbc:firebird" Then sProductName = "FIREBIRD" + End If + + Select Case sProductName + Case "MYSQL", "SQLITE" + If psFunction = "" Then + sTarget = psExpr + sLimit = " LIMIT 1" + Else + sTarget = UCase(psFunction) & "(" & psExpr & ")" + End If + sSql = "SELECT " & sTarget & " AS " & sTempField & " FROM " & psDomain & sWhere & sOrderBy & sLimit + Case "FIREBIRD" + If psFunction = "" Then sTarget = "FIRST 1 " & psExpr Else sTarget = UCase(psFunction) & "(" & psExpr & ")" + sSql = "SELECT " & sTarget & " AS " & sTempField & " FROM " & psDomain & sWhere & sOrderBy + Case Else ' Standard syntax - Includes HSQLDB + If psFunction = "" Then sTarget = "TOP 1 " & psExpr Else sTarget = UCase(psFunction) & "(" & psExpr & ")" + sSql = "SELECT " & sTarget & " AS " & sTempField & " FROM " & psDomain & sWhere & sOrderBy + End Select + + 'Lookup the value. + Set oStatement = Connection.createStatement() + With oStatement + .ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY + .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY + .EscapeProcessing = False + sSql = _ReplaceSquareBrackets(sSql) 'Substitute [] by quote string + Set oResult = .executeQuery(sSql) + If Not IsNull(oResult) And Not IsEmpty(oResult) Then + If Not oResult.next() Then Goto Exit_Function + vResult = Utils._getResultSetColumnValue(oResult, 1, True) ' Force return of binary field + End If + End With + +Exit_Function: + 'Assign the returned value. + _DFunction = vResult + Set oResult = Nothing + Set oStatement = Nothing + Exit Function +Error_Function: + TraceError(TRACEFATAL, ERRDFUNCTION, _A2B_.CalledSub, 0, , sSQL) + Goto Exit_Function +End Function ' DFunction V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _FilterOptionsDefault(ByVal plEncoding As Long) As String +' Return the default FilterOptions string for table/query export to csv + +Dim sFieldSeparator as string +Const cstComma = "," +Const cstTextDelimitor = """" + + If _DecimalPoint() = "," Then sFieldSeparator = ";" Else sFieldSeparator = cstComma + _FilteroptionsDefault = Trim(Str(Asc(sFieldSeparator))) _ + & cstComma & Trim(Str(Asc(cstTextDelimitor))) _ + & cstComma & Trim(Str(plEncoding)) _ + & cstComma & "1" + +End Function ' _FilterOptionsDefault V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _hasRecordset(ByVal psName As String) As Boolean +' Return True if psName if in the collection of Recordsets + +Dim oRecordset As Object + If _ErrorHandler() Then On Local Error Goto Error_Function + Set oRecordset = RecordsetsColl.Item(psName) + _hasRecordset = True + +Exit_Function: + Exit Function +Error_Function: ' Item by key aborted + _hasRecordset = False + GoTo Exit_Function +End Function ' _hasRecordset V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub _LoadMetadata() +' Load essentially getTypeInfo() results from Metadata + +Dim sProduct As String +Dim iInfo As Integer, oTypeInfo As Object, sName As String, lType As Integer + +Const cstMaxInfo = 40 + ReDim _ColumnTypes(0 To cstMaxInfo) + ReDim _ColumnTypeNames(0 To cstMaxInfo) + ReDim _ColumnPrecisions(0 To cstMaxInfo) +Const cstHSQLDB1 = "HSQL Database Engine 1." +Const cstHSQLDB2 = "HSQL Database Engine 2." +Const cstFirebird = "sdbc:embedded:firebird" +Const cstMSAccess2003 = "MS Jet 0" +Const cstMSAccess2007 = "MS Jet 04." +Const cstMYSQL = "MySQL" +Const cstPOSTGRES = "PostgreSQL" +Const cstSQLITE = "SQLite" + + With com.sun.star.sdbc.DataType + _ColumnTypesReference = Array( _ + .ARRAY _ + , .BIGINT _ + , .BINARY _ + , .BIT _ + , .BLOB _ + , .BOOLEAN _ + , .CHAR _ + , .CLOB _ + , .DATE _ + , .DECIMAL _ + , .DISTINCT _ + , .DOUBLE _ + , .FLOAT _ + , .INTEGER _ + , .LONGVARBINARY _ + , .LONGVARCHAR _ + , .NUMERIC _ + , .OBJECT _ + , .OTHER _ + , .REAL _ + , .REF _ + , .SMALLINT _ + , .SQLNULL _ + , .STRUCT _ + , .TIME _ + , .TIMESTAMP _ + , .TINYINT _ + , .VARBINARY _ + , .VARCHAR _ + ) + End With + + With Metadata + sProduct = .getDatabaseProductName() & " " & .getDatabaseProductVersion + Select Case True + Case Len(sProduct) > Len(cstHSQLDB1) And Left(sProduct, Len(cstHSQLDB1)) = cstHSQLDB1 + _RDBMS = DBMS_HSQLDB1 + _ColumnTypesAlias = Array(0, -5, -2, 16, -4, 16, 1, -1, 91, 3, 0, 8, 6, 4, -4, -1, 2, 0, 0, 7, 0, 5, 0, 0, 92, 93, -6, -3, 12) + _BinaryStream = True + Case Len(sProduct) > Len(cstHSQLDB2) And Left(sProduct, Len(cstHSQLDB2)) = cstHSQLDB2 + _RDBMS = DBMS_HSQLDB2 + _ColumnTypesAlias = Array(0, -5, -3, -7, 2004, 16, 1, 2005, 91, 3, 0, 8, 8, 4, -3, 12, 2, 0, 0, 8, 0, 5, 0, 0, 92, 93, -6, -3, 12) + _BinaryStream = True + Case .URL = cstFirebird ' Only embedded 3.0 + _RDBMS = DBMS_FIREBIRD + _ColumnTypesAlias = Array(0, -5, -2, 16, 2004, 16, 1, 2005, 91, 3, 0, 8, 6, 4, -4, 2005, 2, 0, 0, 8, 0, 5, 0, 0, 92, 93, 4, 2004, 12) + _BinaryStream = True + Case Len(sProduct) > Len(cstMSAccess2007) And Left(sProduct, Len(cstMSAccess2007)) = cstMSAccess2007 + _RDBMS = DBMS_MSACCESS2007 + _ColumnTypesAlias = Array(0, 4, -2, 16, -2, 16, 12, 12, 93, 8, 0, 8, 6, 4, -3, 12, 2, 0, 0, 8, 0, 5, 0, 0, 93, 93, -6, -2, 12) + _BinaryStream = True + Case Len(sProduct) > Len(cstMSAccess2003) And Left(sProduct, Len(cstMSAccess2003)) = cstMSAccess2003 + _RDBMS = DBMS_MSACCESS2003 + _ColumnTypesAlias = Array(0, 4, -2, 16, -2, 16, 12, 12, 93, 8, 0, 8, 6, 4, -3, 12, 2, 0, 0, 8, 0, 5, 0, 0, 93, 93, -6, -2, 12) + _BinaryStream = True + Case Len(sProduct) > Len(cstMYSQL) And Left(sProduct, Len(cstMYSQL)) = cstMYSQL + _RDBMS = DBMS_MYSQL + _ColumnTypesAlias = Array(0, -5, -2, -7, -4, -7, 1, -1, 91, 3, 0, 8, 8, 4, -4, -1, 2, 0, 0, 7, 0, 5, 0, 0, 92, 93, -6, -3, -1) + _BinaryStream = False + Case Len(sProduct) > Len(cstPOSTGRES) And Left(sProduct, Len(cstPOSTGRES)) = cstPOSTGRES + _RDBMS = DBMS_POSTGRES + _ColumnTypesAlias = Array(0, -5, -3, 16, -3, 16, 1, 12, 91, 8, 0, 8, 8, 4, -3, 12, 2, 0, 0, 7, 0, 5, 0, 0, 92, 93, 4, -3, 12) + _BinaryStream = True + Case Len(sProduct) > Len(cstSQLITE) And Left(sProduct, Len(cstSQLITE)) = cstSQLITE + _RDBMS = DBMS_SQLITE + _ColumnTypesAlias = Array(0, -5, -4, -7, -4, -7, 1, -1, 91, 8, 0, 8, 6, 4, -4, -1, 8, 0, 0, 8, 0, 5, 0, 0, 92, 93, -6, -4, 12) + _BinaryStream = True + Case Else + _RDBMS = DBMS_UNKNOWN + _BinaryStream = True + End Select + + iInfo = -1 + Set oTypeInfo = MetaData.getTypeInfo() + With oTypeInfo + .next() + Do While Not .isAfterLast() And iInfo < cstMaxInfo + sName = .getString(1) + lType = .getLong(2) + If _RDBMS = DBMS_POSTGRES And (Left(sName, 1) <> "_" Or lType <> -1) Then ' Skip + Else + iInfo = iInfo + 1 + _ColumnTypeNames(iInfo) = sName + _ColumnTypes(iInfo) = lType + _ColumnPrecisions(iInfo) = CLng(.getLong(3)) + End If + .next() + Loop + End With + ReDim Preserve _ColumnTypes(0 To iInfo) + ReDim Preserve _ColumnTypeNames(0 To iInfo) + ReDim Preserve _ColumnPrecisions(0 To iInfo) + End With + +End Sub ' _LoadMetadata V1.6.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputBinaryToHTML() As String +' Converts Binary value to HTML compatible string + + _OutputBinaryToHTML = "&nbsp;" + +End Function ' _OutputBinaryToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputBooleanToHTML(ByVal pbBool As Boolean) As String +' Converts input boolean value to HTML compatible string + + _OutputBooleanToHTML = Iif(pbBool, "&#x2714;", "&#x2716;") ' ✔ and ✖ + +End Function ' _OutputBooleanToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputClassToHTML(ByVal pvArray As variant) As String +' Formats classes attribute of <tr> and <td> tags + + If Not IsArray(pvArray) Then + _OutputClassToHTML = "" + ElseIf UBound(pvArray) < LBound(pvArray) Then + _OutputClassToHTML = "" + Else + _OutputClassToHTML = " class=""" & Join(pvArray, " ") & """" + End If + +End Function ' _OutputClassToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputDataToHTML(ByRef pvTable As Variant, ByVal pvName As String, ByVal piFile As Integer _ + , ByRef Optional pvHeaders As Variant _ + , ByRef Optional pvData As Variant _ + ) As Boolean +' Write html tags around data found in pvTable +' Exit when error without execution stop (to avoid file remaining open ...) + +Dim oTableRS As Object, vData() As Variant, i As Integer, j As Integer +Dim vFieldsBin() As Variant, iDataType As Integer, iNumRows As Integer, iNumFields As Integer, vDataCell As Variant +Dim bDataArray As Boolean, sHeader As String +Dim vTrClass() As Variant, vTdClass As Variant, iCountRows As Integer, iLastRow As Integer +Const cstMaxRows = 200 + On Local Error GoTo Error_Function + + bDataArray = IsNull(pvTable) + Print #piFile, " <table class=""dbdatatable"">" + Print #piFile, " <caption>" & pvName & "</caption>" + + vFieldsBin() = Array() + If bDataArray Then + Set oTableRS = Nothing + iNumFields = UBound(pvHeaders) + 1 + ReDim vFieldsBin(0 To iNumFields - 1) + For i = 0 To iNumFields - 1 + vFieldsBin(i) = False + Next i + Else + Set oTableRS = pvTable.OpenRecordset( , , dbReadOnly) + iNumFields = oTableRS.Fields.Count + ReDim vFieldsBin(0 To iNumFields - 1) + With com.sun.star.sdbc.DataType + For i = 0 To iNumFields - 1 + iDataType = oTableRS.Fields(i).DataType + vFieldsBin(i) = Utils._IsBinaryType(iDataType) + Next i + End With + End If + + With oTableRS + Print #piFile, " <thead>" + Print #piFile, " <tr>" + For i = 0 To iNumFields - 1 + If bDataArray Then sHeader = pvHeaders(i) Else sHeader = .Fields(i)._Name + Print #piFile, " <th scope=""col"">" & sHeader & "</th>" + Next i + Print #piFile, " </tr>" + Print #piFile, " </thead>" + Print #piFile, " <tfoot>" + Print #piFile, " </tfoot>" + + Print #piFile, " <tbody>" + If bDataArray Then + iLastRow = UBound(pvData, 2) + 1 + Else + .MoveLast + iLastRow = .RecordCount + .MoveFirst + End If + iCountRows = 0 + Do While iCountRows < iLastRow + If bDataArray Then + iNumRows = iLastRow + Else + vData() = .GetRows(cstMaxRows) + iNumRows = UBound(vData, 2) + 1 + End If + For j = 0 To iNumRows - 1 + iCountRows = iCountRows + 1 + vTrClass() = Array() + If iCountRows = 1 Then vTrClass() = _AddArray(vTrClass, "firstrow") + If iCountRows = iLastRow Then vTrClass() = _AddArray(vTrClass, "lastrow") + If (iCountRows Mod 2) = 0 Then vTrClass() = _AddArray(vTrClass, "even") Else vTrClass() = _AddArray(vTrClass, "odd") + Print #piFile, " <tr" & _OutputClassToHTML(vTrClass) & ">" + For i = 0 To iNumFields - 1 + vTdClass() = Array() + If i = 0 Then vTdClass() = _AddArray(vTdClass, "firstcol") + If i = iNumFields - 1 Then vTdClass() = _AddArray(vTdClass, "lastcol") + If Not vFieldsBin(i) Then + If bDataArray Then vDataCell = pvData(i, j) Else vDataCell = vData(i, j) + If vDataCell Is Nothing Then vDataCell = Null ' Necessary because Null object has not a VarType = vbNull + If VarType(vDataCell) = vbString Then ' Null string gives IsDate = True ! + If Len(vDataCell) > 0 And IsDate(vDataCell) Then vDataCell = CDate(vDataCell) + End If + Select Case VarType(vDataCell) + Case vbEmpty, vbNull + vTdClass() = _AddArray(vTdClass, "null") + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputNullToHTML() & "</td>" + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbDecimal, vbUShort, vbULong, vbBigInt + vTdClass() = _AddArray(vTdClass, "numeric") + If vDataCell < 0 Then vTdClass() = _AddArray(vTdClass, "negative") + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputNumberToHTML(vDataCell) & "</td>" + Case vbBoolean + vTdClass() = _AddArray(vTdClass, "bool") + If vDataCell = False Then vTdClass() = _AddArray(vTdClass, "false") + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputBooleanToHTML(vDataCell) & "</td>" + Case vbDate + vTdClass() = _AddArray(vTdClass, "date") + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputDateToHTML(vDataCell) & "</td>" + Case vbString + vTdClass() = _AddArray(vTdClass, "char") + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputStringToHTML(vDataCell) & "</td>" + Case Else + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _CStr(vDataCell) & "</td>" + End Select + Else ' Binary fields + Print #piFile, " <td" & _OutputClassToHTML(vTdClass) & ">" & _OutputBinaryToHTML() & "</td>" + End If + Next i + Print #piFile, " </tr>" + Next j + Loop + + If Not bDataArray Then .mClose() + End With + Set oTableRS = Nothing + + Print #piFile, " </tbody>" + Print #piFile, " </table>" + _OutputDataToHTML = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEWARNING, Err, "_OutputDataToHTML", Erl) + _OutputDataToHTML = False + Resume Exit_Function +End Function ' _OutputDataToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputDateToHTML(ByVal psDate As Date) As String +' Converts input date to HTML compatible string + + _OutputDateToHTML = Format(psDate) ' With regional settings - Ignores time if = to 0 + +End Function ' _OutputDateToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputNullToHTML() As String +' Converts Null value to HTML compatible string + + _OutputNullToHTML = "&nbsp;" + +End Function ' _OutputNullToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputNumberToHTML(ByVal pvNumber As Variant, ByVal Optional piPrecision As Integer) As String +' Converts input number to HTML compatible string + +Dim vNumber As Variant + If IsMissing(piPrecision) Then piPrecision = -1 + If pvNumber = Int(pvNumber) Then + vNumber = Int(pvNumber) + Else + If piPrecision >= 0 Then vNumber = (Int(pvNumber * 10 ^ piPrecision + 0.5)) / 10 ^ piPrecision Else vNumber = pvNumber + End If + _OutputNumberToHTML = Format(vNumber) + +End Function ' _OutputNumberToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputStringToHTML(ByVal psString As String) As String +' Converts input string to HTML compatible string +' - UTF-8 encoding +' - recognition of next patterns +' - &quot; - &amp; - &apos; - &lt; - &gt; +' - <pre> +' - <a href="... +' - <br> +' - <img src="... +' - <b>, <u>, <i> + +Dim vPatterns As Variant +Dim lCurrentChar as Long, lPattern As Long, lNextPattern As Long, sPattern As String +Dim sOutput As String, sChar As String +Dim sUrl As String, lNextQuote As Long, lUrl As Long, bQuote As Boolean, bTagEnd As Boolean +Dim i As Integer, l As Long + + vPatterns = Array( _ + "&quot;", "&amp;", "&apos;", "&lt;", "&gt;", "&nbsp;" _ + , "<pre>", "</pre>", "<br>" _ + , "<a href=""", "<a id=""", "</a>", "<img src=""" _ + , "<span class=""", "</span>" _ + , "<b>", "</b>", "<u>", "</u>", "<i>", "</i>" _ + ) + + lCurrentChar = 1 + sOutput = "" + + Do While lCurrentChar <= Len(psString) + ' Where is next closest pattern ? + lPattern = Len(psString) + 1 + sPattern = "" + For i = 0 To UBound(vPatterns) + lNextPattern = InStr(lCurrentChar, psString, vPatterns(i), 1) ' Text (not case-sensitive) string comparison + If lNextPattern > 0 And lNextPattern < lPattern Then + lPattern = lNextPattern + sPattern = Mid(psString, lPattern, Len(vPatterns(i))) + End If + Next i + ' Up to the next pattern or to the end of the string, UTF8-encode each character + For l = lCurrentChar To lPattern - 1 + sChar = Mid(psString, l, 1) + sOutput = sOutput & Utils._UTF8Encode(sChar) + Next l + ' Process hyperlink patterns and keep others + If Len(sPattern) > 0 Then + Select Case LCase(sPattern) + Case "<a href=""", "<a id=""", "<img src=""", "<span class=""" + ' Up to next quote, url-encode + lNextQuote = 0 + lUrl = lPattern + Len(sPattern) + lNextQuote = InStr(lUrl, psString, """", 1) + If lNextQuote = 0 Then lNextQuote = Len(psString) ' Should not happen but, if quoted string not closed ... + sUrl = Mid(psString, lUrl, lNextQuote - lUrl) + sOutput = sOutput & sPattern & sUrl & """" + lCurrentChar = lNextQuote + 1 + bQuote = False + bTagEnd = False + Do + sChar = Mid(psString, lCurrentChar, 1) + Select Case sChar + Case """" + bQuote = Not bQuote + sOutput = sOutput & sChar + Case ">" ' Tag end if not somewhere between quotes + If Not bQuote Then + bTagEnd = True + sOutput = sOutput & sChar + Else + sOutput = sOutput & _UTF8Encode(sChar) + End If + Case Else + sOutput = sOutput & _UTF8Encode(sChar) + End Select + lCurrentChar = lCurrentChar + 1 + If lCurrentChar > Len(psString) Then bTagEnd = True ' Should not happen but, if tag not closed ... + Loop Until bTagEnd + Case Else + sOutput = sOutput & sPattern + lCurrentChar = lPattern + Len(sPattern) + End Select + Else + lCurrentChar = Len(psString) + 1 + End If + Loop + + _OutputStringToHTML = sOutput + +End Function ' _OutputStringToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OutputToCalc(poData As Object _ + , ByVal psOutputFile As String _ + , ByVal psFilter As String _ + , Optional ByVal plEncoding As Long _ + ) As Boolean +' https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Database_Import +' https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options + +Dim oCalcDoc As Object, oSheet As Object, vWin As Variant +Dim vImportDesc() As Variant, iSource As Integer +Dim oRange As Object, i As Integer, iCol As Integer, oColumns As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function + _OutputToCalc = False + If IsMissing(plEncoding) Then plEncoding = acUTF8Encoding + ' Create a new OO-Calc-Document + Set oCalcDoc = StarDesktop.LoadComponentFromURL( _ + "private:factory/scalc" _ + , "_default" ,0, Array() _ + ) + + ' Get the unique spreadsheet + Set oSheet = oCalcDoc.Sheets(0) + + ' Describe import + With poData + If ._Type = "TABLEDEF" Then + iSource = com.sun.star.sheet.DataImportMode.TABLE + Else + iSource = com.sun.star.sheet.DataImportMode.QUERY + End If + vImportDesc = Array( _ + _MakePropertyValue("DatabaseName", URL) _ + , _MakePropertyValue("SourceType", iSource) _ + , _MakePropertyValue("SourceObject", ._Name) _ + ) + oSheet.Name = ._Name + End With + + ' Import + oSheet.getCellByPosition(0, 0).doImport(vImportDesc()) + + Select Case psFilter + Case acFormatODS, acFormatXLS, acFormatXLSX ' Formatting + iCol = poData.Fields().Count + Set oRange = oSheet.getCellRangeByPosition(0, 0, iCol - 1, 0) + oRange.CharWeight = com.sun.star.awt.FontWeight.BOLD + oRange.CellBackColor = RGB(200, 200, 200) + oRange.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER + Set oColumns = oRange.getColumns() + For i = 0 To iCol - 1 + oColumns.getByIndex(i).OptimalWidth = True + Next i + oCalcDoc.storeAsUrl(psOutputFile, Array( _ + _MakePropertyValue("FilterName", psFilter) _ + , _MakePropertyValue("Overwrite", True) _ + )) + Case Else + oCalcDoc.storeAsUrl(psOutputFile, Array( _ + _MakePropertyValue("FilterName", psFilter) _ + , _MakePropertyValue("FilterOptions", _FilterOptionsDefault(plEncoding)) _ + , _MakePropertyValue("Overwrite", True) _ + )) + End Select + + oCalcDoc.close(False) + _OutputToCalc = True + +Exit_Function: + Set oColumns = Nothing + Set oRange = Nothing + Set oSheet = Nothing + Set oCalcDoc = Nothing + Exit Function +Error_Function: + TraceError(TRACEABORT, ERRDFUNCTION, _A2B_.CalledSub, 0, , sSQL) + Goto Exit_Function +End Function ' OutputToCalc V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _OutputToHTML(ByRef pvTable As Variant, ByVal pvName As String, ByVal psOutputFile As String, ByVal psTemplateFile As String _ + , ByRef Optional pvHeaders As Variant _ + , ByRef Optional pvData As Variant _ + ) As Boolean +' http://www.ehow.com/how_5652706_create-html-template-ms-access.html + +Dim bDataArray As Boolean +Dim vMinimalTemplate As Variant, vTemplate As Variant +Dim iFile As Integer, i As Integer, sLine As String, lBody As Long +Const cstTitle = "<!--Template_Title-->", cstBody = "<!--Template_Body-->" +Const cstTitleAlt = "<!--AccessTemplate_Title-->", cstBodyAlt = "<!--AccessTemplate_Body-->" + + On Local Error GoTo Error_Function + vMinimalTemplate = Array( _ + "<!DOCTYPE html>" _ + , "<html>" _ + , " <head>" _ + , " <title>" & cstTitle & "</title>" _ + , " </head>" _ + , " <body>" _ + , " " & cstBody _ + , " </body>" _ + , "</html>" _ + ) + + vTemplate = _ReadFileIntoArray(psTemplateFile) + If LBound(vTemplate) > UBound(vTemplate) Then vTemplate() = vMinimalTemplate() + + bDataArray = IsNull(pvTable) + +' Write output file + iFile = FreeFile() + Open psOutputFile For Output Access Write Lock Read Write As #iFile + For i = 0 To UBound(vTemplate) + sLine = vTemplate(i) + sLine = Join(Split(sLine, cstTitleAlt), cstTitle) + sLine = Join(Split(sLine, cstBodyAlt), cstBody) + Select Case True + Case InStr(sLine, cstTitle) > 0 + sLine = Join(Split(sLine, cstTitle), pvName) + Print #iFile, sLine + Case InStr(sLine, cstBody) > 0 + lBody = InStr(sLine, cstBody) + If lBody > 1 Then Print #iFile, Left(sLine, lBody - 1) + If bDataArray Then + _OutputDataToHTML(pvTable, pvName, iFile, pvHeaders, pvData) + Else + _OutputDataToHTML(pvTable, pvName, iFile) + End If + If Len(sLine) > lBody + Len(cstBody) - 1 Then Print #iFile, Right(sLine, Len(sLine) - lBody + Len(cstBody) + 1) + Case Else + Print #iFile, sLine + End Select + Next i + Close #iFile + + _OutputToHTML = True + +Exit_Function: + Exit Function +Error_Function: + _OutputToHTML = False + GoTo Exit_Function +End Function ' _OutputToHTML V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + _PropertiesList = Array("Connect", "Name", "ObjectType" _ + , "OnCreate", "OnFocus", "OnLoad", "OnLoadFinished", "OnModifyChanged" _ + , "OnNew", "OnPrepareUnload", "OnPrepareViewClosing", "OnSave", "OnSaveAs" _ + , "OnSaveAsDone", "OnSaveAsFailed", "OnSaveDone", "OnSaveFailed", "OnSaveTo" _ + , "OnSaveToDone", "OnSaveToFailed", "OnSubComponentClosed", "OnSubComponentOpened" _ + , "OnTitleChanged", "OnUnfocus", "OnUnload", "OnViewClosed", "OnViewCreated" _ + , "Version" _ + ) + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + +Dim i As Integer, vEvents As Variant, sEvent As String, vEvent As Variant + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Database.get" & psProperty) + + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("Connect") + If IsNull(Document) Then _PropertyGet = "" Else _PropertyGet = Document.Datasource.URL + ' Location = ConvertFromUrl(URL) + Case UCase("Name") + _PropertyGet = Title + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("OnCreate"), UCase("OnFocus"), UCase("OnLoad"), UCase("OnLoadFinished"), UCase("OnModifyChanged") _ + , UCase("OnNew"), UCase("OnPrepareUnload"), UCase("OnPrepareViewClosing"), UCase("OnSave"), UCase("OnSaveAs") _ + , UCase("OnSaveAsDone"), UCase("OnSaveAsFailed"), UCase("OnSaveDone"), UCase("OnSaveFailed"), UCase("OnSaveTo") _ + , UCase("OnSaveToDone"), UCase("OnSaveToFailed"), UCase("OnSubComponentClosed"), UCase("OnSubComponentOpened") _ + , UCase("OnTitleChanged"), UCase("OnUnfocus"), UCase("OnUnload"), UCase("OnViewClosed"), UCase("OnViewCreated") + ' Find script event + sEvent = "" + If IsNull(Document) Then vEvents = Array() Else vEvents = Document.getEvents().ElementNames ' Returns an array + For i = 0 To UBound(vEvents) + If UCase(vEvents(i)) = UCase(psProperty) Then + sEvent = vEvents(i) + Exit For + End If + Next i + If sEvent = "" Then + _PropertyGet = "" + Else + vEvent = Document.getEvents().getByName(sEvent) + If IsEmpty(vEvent) Then + _PropertyGet = "" + ElseIf vEvent(0).Value <> "Script" Then + _PropertyGet = "" + Else + _PropertyGet = vEvent(1).Value + End If + End If + Case UCase("Version") + _PropertyGet = MetaData.getDatabaseProductName() & " " & MetaData.getDatabaseProductVersion + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Database.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Database._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ReplaceSquareBrackets(ByVal psSql As String) As String +' Returns psSql after substitution of [] by quote character +' [] square brackets in (single) quoted strings not affected + +Dim sQuote As String 'RDBMS specific quote character +Dim vSubStrings() As Variant, i As Integer +Const cstSingleQuote = "'" + + sQuote = MetaData.IdentifierQuoteString + If sQuote = " " Then ' IdentifierQuoteString returns a space " " if identifier quoting is not supported. + _ReplaceSquareBrackets = Trim(psSql) + Exit Function + End If + vSubStrings() = Split(psSql, cstSingleQuote) + For i = 0 To UBound(vSubStrings) + If (i Mod 2) = 0 Or (i = UBound(vSubStrings)) Then ' Only even substrings are parsed for square brackets. Last substring is parsed anyway + vSubStrings(i) = Join(Split(vSubStrings(i), "["), sQuote) + vSubStrings(i) = Join(Split(vSubStrings(i), "]"), sQuote) + End If + Next i + + _ReplaceSquareBrackets = Trim(Join(vSubStrings, cstSingleQuote)) + +End Function ' ReplaceSquareBrackets V1.1.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Dialog.xba b/wizards/source/access2base/Dialog.xba new file mode 100644 index 000000000..69caed33c --- /dev/null +++ b/wizards/source/access2base/Dialog.xba @@ -0,0 +1,818 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Dialog" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be DIALOG +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _Shortcut As String +Private _Dialog As Object ' com.sun.star.io.XInputStreamProvider +Private _Storage As String ' GLOBAL or DOCUMENT +Private _Library As String +Private UnoDialog As Object ' com.sun.star.awt.XControl + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJDIALOG + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + Set _Dialog = Nothing + _Storage = "" + _Library = "" + Set UnoDialog = Nothing +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Caption() As Variant + Caption = _PropertyGet("Caption") +End Property ' Caption (get) + +Property Let Caption(ByVal pvValue As Variant) + Call _PropertySet("Caption", pvValue) +End Property ' Caption (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Height() As Variant + Height = _PropertyGet("Height") +End Property ' Height (get) + +Property Let Height(ByVal pvValue As Variant) + Call _PropertySet("Height", pvValue) +End Property ' Height (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get IsLoaded() As Boolean + IsLoaded = _PropertyGet("IsLoaded") +End Property + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnFocusGained() As Variant + OnFocusGained = _PropertyGet("OnFocusGained") +End Property ' OnFocusGained (get) + +Property Let OnFocusGained(ByVal pvValue As Variant) + Call _PropertySet("OnFocusGained", pvValue) +End Property ' OnFocusGained (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnFocusLost() As Variant + OnFocusLost = _PropertyGet("OnFocusLost") +End Property ' OnFocusLost (get) + +Property Let OnFocusLost(ByVal pvValue As Variant) + Call _PropertySet("OnFocusLost", pvValue) +End Property ' OnFocusLost (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnKeyPressed() As Variant + OnKeyPressed = _PropertyGet("OnKeyPressed") +End Property ' OnKeyPressed (get) + +Property Let OnKeyPressed(ByVal pvValue As Variant) + Call _PropertySet("OnKeyPressed", pvValue) +End Property ' OnKeyPressed (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnKeyReleased() As Variant + OnKeyReleased = _PropertyGet("OnKeyReleased") +End Property ' OnKeyReleased (get) + +Property Let OnKeyReleased(ByVal pvValue As Variant) + Call _PropertySet("OnKeyReleased", pvValue) +End Property ' OnKeyReleased (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseDragged() As Variant + OnMouseDragged = _PropertyGet("OnMouseDragged") +End Property ' OnMouseDragged (get) + +Property Let OnMouseDragged(ByVal pvValue As Variant) + Call _PropertySet("OnMouseDragged", pvValue) +End Property ' OnMouseDragged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseEntered() As Variant + OnMouseEntered = _PropertyGet("OnMouseEntered") +End Property ' OnMouseEntered (get) + +Property Let OnMouseEntered(ByVal pvValue As Variant) + Call _PropertySet("OnMouseEntered", pvValue) +End Property ' OnMouseEntered (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseExited() As Variant + OnMouseExited = _PropertyGet("OnMouseExited") +End Property ' OnMouseExited (get) + +Property Let OnMouseExited(ByVal pvValue As Variant) + Call _PropertySet("OnMouseExited", pvValue) +End Property ' OnMouseExited (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseMoved() As Variant + OnMouseMoved = _PropertyGet("OnMouseMoved") +End Property ' OnMouseMoved (get) + +Property Let OnMouseMoved(ByVal pvValue As Variant) + Call _PropertySet("OnMouseMoved", pvValue) +End Property ' OnMouseMoved (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMousePressed() As Variant + OnMousePressed = _PropertyGet("OnMousePressed") +End Property ' OnMousePressed (get) + +Property Let OnMousePressed(ByVal pvValue As Variant) + Call _PropertySet("OnMousePressed", pvValue) +End Property ' OnMousePressed (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnMouseReleased() As Variant + OnMouseReleased = _PropertyGet("OnMouseReleased") +End Property ' OnMouseReleased (get) + +Property Let OnMouseReleased(ByVal pvValue As Variant) + Call _PropertySet("OnMouseReleased", pvValue) +End Property ' OnMouseReleased (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OptionGroup(ByVal Optional pvGroupName As Variant) As Variant +' Return either an error or an object of type OPTIONGROUP based on its name +' A group is determined by the successive TabIndexes of the radio button +' The name of the group = the name of its first element + + Utils._SetCalledSub("Dialog.OptionGroup") + If IsMissing(pvGroupName) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set OptionGroup = Nothing + If Not Utils._CheckArgument(pvGroupName, 1, vbString) Then Goto Exit_Function + +Dim iAllCount As Integer, iRadioLast As Integer, iGroupCount As Integer, iBegin As Integer, iEnd As Integer +Dim oRadios() As Object, sGroupName As String +Dim i As Integer, j As Integer, bFound As Boolean, ocControl As Object, oRadio As Object, iTabIndex As Integer +Dim ogGroup As Object, vGroup() As Variant, vIndex() As Variant + iAllCount = Controls.Count + If iAllCount > 0 Then + iRadioLast = -1 + ReDim oRadios(0 To iAllCount - 1) + For i = 0 To iAllCount - 1 ' Store all RadioButtons objects + Set ocControl = Controls(i) + If ocControl._SubType = CTLRADIOBUTTON Then + iRadioLast = iRadioLast + 1 + Set oRadios(iRadioLast) = ocControl + End If + Next i + Else + Goto Error_Arg ' No control in dialog + End If + + If iRadioLast < 0 then Goto Error_Arg ' No radio buttons in the dialog + + 'Resort oRadio array based on tab indexes + If iRadioLast > 0 Then + For i = 0 To iRadioLast - 1 ' Bubble sort + For j = i + 1 To iRadioLast + If oRadios(i).TabIndex > oRadios(j).TabIndex Then + Set oRadio = oRadios(i) + Set oRadios(i) = oRadios(j) + Set oRadios(j) = oRadio + End If + Next j + Next i + End If + + 'Scan Names to find match with argument + bFound = False + For i = 0 To iRadioLast + If UCase(oRadios(i)._Name) = UCase(pvGroupName) Then + Select Case i + Case 0 : bFound = True + Case Else + If oRadios(i).TabIndex > oRadios(i - 1).TabIndex + 1 Then + bFound = True + Else + Goto Error_Arg ' same group as preceding item although name correct + End If + End Select + If bFound Then + iBegin = i + iEnd = i + sGroupName = oRadios(i)._Name + End If + ElseIf bFound Then + If oRadios(i).TabIndex = oRadios(i - 1).TabIndex + 1 Then iEnd = i + End If + Next i + + If bFound Then ' Create OptionGroup + iGroupCount = iEnd - iBegin + 1 + Set ogGroup = New OptionGroup + ReDim vGroup(0 To iGroupCount - 1) + ReDim vIndex(0 To iGroupCount - 1) + With ogGroup + ._This = ogGroup + ._Name = sGroupName + ._Count = iGroupCount + ._ButtonsGroup = vGroup + ._ButtonsIndex = vIndex + For i = 0 To iGroupCount - 1 + Set ._ButtonsGroup(i) = oRadios(iBegin + i).ControlModel + ._ButtonsIndex(i) = i + Next i + ._ParentType = CTLPARENTISDIALOG + ._ParentComponent = UnoDialog + End With + Else Goto Error_Arg + End If + + Set OptionGroup = ogGroup + +Exit_Function: + Utils._ResetCalledSub("Dialog.OptionGroup") + Exit Function +Error_Arg: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvGroupName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.OptionGroup", Erl) + GoTo Exit_Function +End Function ' OptionGroup V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Page() As Variant + Page = _PropertyGet("Page") +End Property ' Page (get) + +Property Let Page(ByVal pvValue As Variant) + Call _PropertySet("Page", pvValue) +End Property ' Page (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Parent() As Object + Parent = _Parent +End Function ' Parent (get) V6.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Const cstThisSub = "Dialog.Properties" + Utils._SetCalledSub(cstThisSub) + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Visible() As Variant + Visible = _PropertyGet("Visible") +End Property ' Visible (get) + +Property Let Visible(ByVal pvValue As Variant) + Call _PropertySet("Visible", pvValue) +End Property ' Visible (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Width() As Variant + Width = _PropertyGet("Width") +End Property ' Width (get) + +Property Let Width(ByVal pvValue As Variant) + Call _PropertySet("Width", pvValue) +End Property ' Width (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Return a Control object with name or index = pvIndex + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Dialog.Controls") + +Dim ocControl As Variant, sParentShortcut As String, iControlCount As Integer +Dim oCounter As Variant, sControls() As Variant, i As Integer, bFound As Boolean, sIndex As String +Dim j As Integer + + Set ocControl = Nothing + If Not IsLoaded Then Goto Trace_Error_NotOpen + Set ocControl = New Control + Set ocControl._This = ocControl + Set ocControl._Parent = _This + ocControl._ParentType = CTLPARENTISDIALOG + sParentShortcut = _Shortcut + sControls() = UnoDialog.Model.getElementNames() + iControlCount = UBound(sControls) + 1 + + If IsMissing(pvIndex) Then ' No argument, return Collection object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLCONTROLS + oCounter._Count = iControlCount + Set oCounter._Parent = _This + Set Controls = oCounter + Goto Exit_Function + End If + + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + + ' Start building the ocControl object + ' Determine exact name + + Select Case VarType(pvIndex) + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + If pvIndex < 0 Or pvIndex > iControlCount - 1 Then Goto Trace_Error_Index + ocControl._Name = sControls(pvIndex) + Case vbString ' Check control name validity (non case sensitive) + bFound = False + sIndex = UCase(Utils._Trim(pvIndex)) + For i = 0 To iControlCount - 1 + If UCase(sControls(i)) = sIndex Then + bFound = True + Exit For + End If + Next i + If bFound Then ocControl._Name = sControls(i) Else Goto Trace_NotFound + End Select + + ocControl._Shortcut = sParentShortcut & "!" & Utils._Surround(ocControl._Name) + Set ocControl.ControlModel = UnoDialog.Model.getByName(ocControl._Name) + Set ocControl.ControlView = UnoDialog.getControl(ocControl._Name) + ocControl._ImplementationName = ocControl.ControlModel.getImplementationName() + ocControl._FormComponent = UnoDialog + + ocControl._Initialize() + Set Controls = ocControl + +Exit_Function: + Utils._ResetCalledSub("Dialog.Controls") + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(iArg, pvIndex)) + Set Controls = Nothing + Goto Exit_Function +Trace_Error_NotOpen: + TraceError(TRACEFATAL, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, , _Name) + Set Controls = Nothing + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set Controls = Nothing + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(pvIndex, pvIndex)) + Set Controls = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.Controls", Erl) + Set Controls = Nothing + GoTo Exit_Function +End Function ' Controls + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub EndExecute(ByVal Optional pvReturn As Variant) +' Stop executing the dialog + +If _ErrorHandler() Then On Local Error Goto Error_Sub + Utils._SetCalledSub("Dialog.endExecute") + + If IsMissing(pvReturn) Then pvReturn = 0 + If Not Utils._CheckArgument(pvReturn, 1, Utils._AddNumeric(), , False) Then Goto Trace_Error + +Dim lExecute As Long + lExecute = CLng(pvReturn) + If IsNull(_Dialog) Then Goto Error_Execute + If IsNull(UnoDialog) Then Goto Error_Not_Started + Call UnoDialog.endDialog(lExecute) + +Exit_Sub: + Utils._ResetCalledSub("Dialog.endExecute") + Exit Sub +Trace_Error: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array("1", Utils._CStr(pvReturn))) + Goto Exit_Sub +Error_Execute: + TraceError(TRACEFATAL, ERRDIALOGUNDEFINED, Utils._CalledSub(), 0) + Goto Exit_Sub +Error_Not_Started: + TraceError(TRACEWARNING, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, 1, _Name) + Goto Exit_Sub +Error_Sub: + TraceError(TRACEABORT, Err, "Dialog.endExecute", Erl) + GoTo Exit_Sub +End Sub ' EndExecute + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Execute() As Long +' Execute dialog + +'If _ErrorHandler() Then On Local Error Goto Error_Function +'Seems smart not to trap errors: debugging of dialog events otherwise made very difficult ! + Utils._SetCalledSub("Dialog.Execute") + +Dim lExecute As Long + If IsNull(_Dialog) Then Goto Error_Execute + If IsNull(UnoDialog) Then Goto Error_Not_Started + lExecute = UnoDialog.execute() + + Select Case lExecute + Case 1 : Execute = dlgOK + Case 0 : Execute = dlgCancel + Case Else : Execute = lExecute + End Select + +Exit_Function: + Utils._ResetCalledSub("Dialog.Execute") + Exit Function +Error_Execute: + TraceError(TRACEFATAL, ERRDIALOGUNDEFINED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Not_Started: + TraceError(TRACEWARNING, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, 1, _Name) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.Execute", Erl) + GoTo Exit_Function +End Function ' Execute + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Dialog.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Dialog.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Move( ByVal Optional pvLeft As Variant _ + , ByVal Optional pvTop As Variant _ + , ByVal Optional pvWidth As Variant _ + , ByVal Optional pvHeight As Variant _ + ) As Variant +' Execute Move method + Utils._SetCalledSub("Dialog.Move") + On Local Error Goto Error_Function + Move = False +Dim iArgNr As Integer + Select Case UCase(_A2B_.CalledSub) + Case UCase("Move") : iArgNr = 1 + Case UCase("Dialog.Move") : iArgNr = 0 + End Select + If IsMissing(pvLeft) Then pvLeft = -1 + If IsMissing(pvTop) Then pvTop = -1 + If IsMissing(pvWidth) Then pvWidth = -1 + If IsMissing(pvHeight) Then pvHeight = -1 + If Not Utils._CheckArgument(pvLeft, iArgNr + 1, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvTop, iArgNr + 2, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWidth, iArgNr + 3, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvHeight, iArgNr + 4, Utils._AddNumeric()) Then Goto Exit_Function + +Dim iArg As Integer, iWrong As Integer ' Check arguments values + iArg = 0 + If pvHeight < -1 Then + iArg = 4 : iWrong = pvHeight + ElseIf pvWidth < -1 Then + iArg = 3 : iWrong = pvWidth + ElseIf pvTop < -1 Then + iArg = 2 : iWrong = pvTop + ElseIf pvLeft < -1 Then + iArg = 1 : iWrong = pvLeft + End If + If iArg > 0 Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(iArgNr + iArg, iWrong)) + Goto Exit_Function + End If + +Dim iPosSize As Integer + iPosSize = 0 + If pvLeft >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.X + If pvTop >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.Y + If pvWidth > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.WIDTH + If pvHeight > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.HEIGHT + If iPosSize > 0 Then UnoDialog.setPosSize(pvLeft, pvTop, pvWidth, pvHeight, iPosSize) + Move = True + +Exit_Function: + Utils._ResetCalledSub("Dialog.Move") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.Move", Erl) + GoTo Exit_Function +End Function ' Move + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("Dialog.setProperty") + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub("Dialog.setProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Start() As Boolean +' Create dialog + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Dialog.Start") + +Dim oStart As Object + Start = False + If IsNull(_Dialog) Then Goto Error_Start + If Not IsNull(UnoDialog) Then Goto Error_Yet_Started + Set oStart = CreateUnoDialog(_Dialog) + If IsNull(oStart) Then + Goto Error_Start + Else + Start = True + Set UnoDialog = oStart + With _A2B_ + If .hasItem(COLLALLDIALOGS, _Name) Then .Dialogs.Remove(_Name) ' Inserted to solve errors, when aborts between start and terminate + .Dialogs.Add(UnoDialog, UCase(_Name)) + End With + End If + +Exit_Function: + Utils._ResetCalledSub("Dialog.Start") + Exit Function +Error_Start: + TraceError(TRACEFATAL, ERRDIALOGUNDEFINED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Yet_Started: + TraceError(TRACEWARNING, ERRDIALOGSTARTED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.Start", Erl) + GoTo Exit_Function +End Function ' Start + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Terminate() As Boolean +' Close dialog + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Dialog.Terminate") + + Terminate = False + If IsNull(_Dialog) Then Goto Error_Terminate + If IsNull(UnoDialog) Then Goto Error_Not_Started + UnoDialog.Dispose() + Set UnoDialog = Nothing + _A2B_.Dialogs.Remove(_Name) + Terminate = True + +Exit_Function: + Utils._ResetCalledSub("Dialog.Terminate") + Exit Function +Error_Terminate: + TraceError(TRACEFATAL, ERRDIALOGUNDEFINED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Not_Started: + TraceError(TRACEWARNING, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, 1, _Name) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog.Terminate", Erl) + GoTo Exit_Function +End Function ' Terminate + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetListener(ByVal psProperty As String) As String +' Return the X...Listener corresponding with the property in argument + + Select Case UCase(psProperty) + Case UCase("OnFocusGained"), UCase("OnFocusLost") + _GetListener = "XFocusListener" + Case UCase("OnKeyPressed"), UCase("OnKeyReleased") + _GetListener = "XKeyListener" + Case UCase("OnMouseDragged"), UCase("OnMouseMoved") + _GetListener = "XMouseMotionListener" + Case UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMousePressed"), UCase("OnMouseReleased") + _GetListener = "XMouseListener" + End Select + +End Function ' _GetListener V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + If IsLoaded Then + _PropertiesList = Array("Caption", "Height", "IsLoaded", "Name" _ + , "OnFocusGained", "OnFocusLost", "OnKeyPressed", "OnKeyReleased", "OnMouseDragged" _ + , "OnMouseEntered", "OnMouseExited", "OnMouseMoved", "OnMousePressed", "OnMouseReleased" _ + , "ObjectType", "Page", "Visible", "Width" _ + ) + Else + _PropertiesList = Array("IsLoaded", "Name" _ + ) + End If + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Dialog.get" & psProperty) + +Dim oDialogEvents As Object, sEventName As String + +'Execute + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("Name"), UCase("IsLoaded") + Case Else + If IsNull(UnoDialog) Then Goto Trace_Error_Dialog + End Select + Select Case UCase(psProperty) + Case UCase("Caption") + _PropertyGet = UnoDialog.getTitle() + Case UCase("Height") + _PropertyGet = UnoDialog.getPosSize().Height + Case UCase("IsLoaded") + _PropertyGet = _A2B_.hasItem(COLLALLDIALOGS, _Name) + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("OnFocusGained"), UCase("OnFocusLost"), UCase("OnKeyPressed"), UCase("OnKeyReleased") _ + , UCase("OnMouseDragged"), UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMouseMoved") _ + , UCase("OnMousePressed"), UCase("OnMouseReleased") + Set oDialogEvents = unoDialog.Model.getEvents() + sEventName = "com.sun.star.awt." & _GetListener(psProperty) & "::" & Utils._GetEventName(psProperty) + If oDialogEvents.hasByName(sEventName) Then + _PropertyGet = oDialogEvents.getByName(sEventName).ScriptCode + Else + _PropertyGet = "" + End If + Case UCase("Page") + _PropertyGet = UnoDialog.Model.Step + Case UCase("Visible") + _PropertyGet = UnoDialog.IsVisible() + Case UCase("Width") + _PropertyGet = UnoDialog.getPosSize().Width + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Dialog.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Error_Dialog: + TraceError(TRACEFATAL, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, 1, _Name) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + + Utils._SetCalledSub("Dialog.set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +Dim oDialogEvents As Object, sEventName As String, oEvent As Object, sListener As String, sEvent As String + +'Execute +Dim iArgNr As Integer + + If _IsLeft(_A2B_.CalledSub, "Dialog.") Then iArgNr = 1 Else iArgNr = 2 + If IsNull(UnoDialog) Then Goto Trace_Error_Dialog + Select Case UCase(psProperty) + Case UCase("Caption") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + UnoDialog.setTitle(pvValue) + Case UCase("Height") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + UnoDialog.setPosSize(0, 0, 0, pvValue, com.sun.star.awt.PosSize.HEIGHT) + Case UCase("OnFocusGained"), UCase("OnFocusLost"), UCase("OnKeyPressed"), UCase("OnKeyReleased") _ + , UCase("OnMouseDragged"), UCase("OnMouseEntered"), UCase("OnMouseExited"), UCase("OnMouseMoved") _ + , UCase("OnMousePressed"), UCase("OnMouseReleased") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Not Utils._RegisterDialogEventScript(UnoDialog.Model _ + , psProperty _ + , _GetListener(psProperty) _ + , pvValue _ + ) Then GoTo Trace_Error_Dialog + Case UCase("Page") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Then Goto Trace_Error_Value + UnoDialog.Model.Step = pvValue + Case UCase("Visible") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + UnoDialog.setVisible(pvValue) + Case UCase("Width") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric()) Then Goto Trace_Error_Value + UnoDialog.setPosSize(0, 0, pvValue, 0, com.sun.star.awt.PosSize.WIDTH) + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Dialog.set" & psProperty) + Exit Function +Trace_Error_Dialog: + TraceError(TRACEFATAL, ERRDIALOGNOTSTARTED, Utils._CalledSub(), 0, 1, _Name) + _PropertySet = False + Goto Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Dialog._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/DoCmd.xba b/wizards/source/access2base/DoCmd.xba new file mode 100644 index 000000000..27b0d74be --- /dev/null +++ b/wizards/source/access2base/DoCmd.xba @@ -0,0 +1,2662 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="DoCmd" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +Type _FindParams + FindRecord As Integer ' Set to 1 at first invocation of FindRecord + FindWhat As Variant + Match As Integer + MatchCase As Boolean + Search As Integer + SearchAsFormatted As Boolean ' Must be False + FindFirst As Boolean + OnlyCurrentField As Integer + Form As String ' Shortcut + GridControl As String ' Shortcut + Target As String ' Shortcut + LastRow As Long ' Last row explored - 0 = before first + LastColumn As Integer ' Last column explored - 0 ... N-1 index in next arrays; 0 if OnlyCurrentField = acCurrent + ColumnNames() As String ' Array of column names in grid with boundfield and of same type as FindWhat + ResultSetIndex() As Integer ' Array of column numbers in ResultSet +End Type + +Type _Window + Frame As Object ' com.sun.star.comp.framework.Frame + _Name As String ' Object Name + WindowType As Integer ' One of the object types + DocumentType As String ' Writer, Calc, ... - Only if WindowType = acDocument +End Type + +REM VBA allows call to actions with missing arguments e.g. OpenForm("aaa",,"[field]=2") +REM in StarBasic IsMissing requires Variant parameters + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ApplyFilter( _ + ByVal Optional pvFilter As Variant _ + , ByVal Optional pvSQL As Variant _ + , ByVal Optional pvControlName As Variant _ + ) As Boolean +' Set filter on open table, query, form or subform (if pvControlName present) + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "ApplyFilter" + Utils._SetCalledSub(cstThisSub) + ApplyFilter = False + + If IsMissing(pvFilter) And IsMissing(pvSQL) Then Call _TraceArguments() + If IsMissing(pvFilter) Then pvFilter = "" + If Not Utils._CheckArgument(pvFilter, 1, vbString) Then Goto Exit_Function + If IsMissing(pvSQL) Then pvSQL = "" + If Not Utils._CheckArgument(pvSQL, 1, vbString) Then Goto Exit_Function + If IsMissing(pvControlName) Then pvControlName = "" + If Not Utils._CheckArgument(pvControlName, 1, vbString) Then Goto Exit_Function + +Dim sFilter As String, oWindow As Object, oDatabase As Object, oTarget As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + If pvSQL <> "" _ + Then sFilter = oDatabase._ReplaceSquareBrackets(pvSQL) _ + Else sFilter = oDatabase._ReplaceSquareBrackets(pvFilter) + + Set oWindow = _SelectWindow() + With oWindow + Select Case .WindowType + Case acForm + Set oTarget = _DatabaseForm(._Name, pvControlName) + Case acQuery, acTable + If pvControlName <> "" Then Goto Exit_Function + If IsNull(.Frame.Controller.FormOperations) Then Goto Error_NotApplicable + ' FormOperations returns <Null> in OpenOffice + Set oTarget = .Frame.Controller.FormOperations.Cursor + Case Else ' Ignore action + Goto Exit_Function + End Select + End With + + With oTarget + .Filter = sFilter + .ApplyFilter = True + .reload() + End With + ApplyFilter = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' ApplyFilter V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function mClose(Optional ByVal pvObjectType As Variant _ + , Optional ByVal pvObjectName As Variant _ + , Optional ByVal pvSave As Variant _ + ) As Boolean + If _ErrorHandler() Then On Local Error Goto Error_Function + +Const cstThisSub = "Close" + Utils._SetCalledSub(cstThisSub) + mClose = False + If IsMissing(pvObjectType) Or IsMissing(pvObjectName) Then Call _TraceArguments() + If IsMissing(pvSave) Then pvSave = acSavePrompt + If Not (Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), _ + Array(acTable, acQuery, acForm, acReport)) _ + And Utils._CheckArgument(pvObjectName, 2, vbString) _ + And Utils._CheckArgument(pvSave, 3, Utils._AddNumeric(), Array(acSavePrompt)) _ + ) Then Goto Exit_Function + +Dim sObjects() As String, sObjectName As String, oController As Object, oObject As Object +Dim i As Integer, bFound As Boolean, lComponent As Long +Dim oDatabase As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + ' Check existence of object and find its exact (case-sensitive) name + Select Case pvObjectType + Case acForm + sObjects = Application._GetAllHierarchicalNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.FORM + Case acTable + sObjects = oDatabase.Connection.getTables.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.TABLE + Case acQuery + sObjects = oDatabase.Connection.getQueries.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.QUERY + Case acReport + sObjects = oDatabase.Document.getReportDocuments.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.REPORT + End Select + bFound = False + For i = 0 To UBound(sObjects) + If UCase(pvObjectName) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + + Select Case pvObjectType + Case acForm + Set oController = oDatabase.Document.getFormDocuments.getByHierarchicalName(sObjectName) + mClose = oController.close() + Case acTable, acQuery ' Not optimal but it works !! + Set oController = oDatabase.Document.CurrentController + Set oObject = oController.loadComponent(lComponent, sObjectName, False) + oObject.frame.close(False) + mClose = True + Case acReport + Set oController = oDatabase.Document.getReportDocuments.getByName(sObjectName) + mClose = oController.close() + End Select + + +Exit_Function: + Set oObject = Nothing + Set oController = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Close", Erl) + GoTo Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERRCLOSEOBJECT, Utils._CalledSub(), 0, , Array(_GetLabel(Array("Table", "Query", "Form", "Report")(pvObjectType)), pvObjectName)) + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel(Array("Table", "Query", "Form", "Report")(pvObjectType)), pvObjectName)) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' (m)Close V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CopyObject(ByVal Optional pvSourceDatabase As Variant _ + , ByVal Optional pvNewName As Variant _ + , ByVal Optional pvSourceType As Variant _ + , ByVal Optional pvSourceName As Variant _ + ) As Boolean +' Copies tables and queries into identical (new) objects + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "CopyObject" + Utils._SetCalledSub(cstThisSub) + CopyObject = False + + If IsMissing(pvSourceDatabase) Then pvSourceDatabase = "" + If VarType(pvSourceDatabase) <> vbString Then + If Not Utils._CheckArgument(pvSourceDatabase, 1, OBJDATABASE) Then Goto Exit_Function + End If + If IsMissing(pvNewName) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvNewName, 2, vbString) Then Goto Exit_Function + If IsMissing(pvSourceType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSourceType, 1, Utils._AddNumeric(), Array(acQuery, acTable) _ + ) Then Goto Exit_Function + If IsMissing(pvSourceName) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSourceName, 2, vbString) Then Goto Exit_Function + +Dim oSource As Object, oSourceDatabase As Object, oTarget As Object, oDatabase As Object, bSameDatabase As Boolean +Dim oSourceTable As Object, oSourceColumns As Object, oSourceCol As Object, oTargetCol As Object, iRDBMS As Integer +Dim oSourceKeys As Object, oSourceKey As Object, oTargetKey As Object +Dim i As Integer, j As Integer, sSql As String, vPrimaryKeys() As Variant +Dim vNameComponents() As Variant, iNames As Integer, sSurround As String +Dim vInputField As Variant, vFieldBinary() As Variant, vOutputField As Variant +Dim oInput as Object, oOutput As Object, iNbFields As Integer, vValue As Variant +Dim vBinary As Variant, lInputSize As Long, lOutputSize As Long +Dim lInputRecs As Long, lInputMax As Long, vField As Variant, bProgressMeter As Boolean, sFile As String + +Const cstMaxBinlength = 2 * 65535 +Const cstChunkSize = 2 * 65535 +Const cstProgressMeterLimit = 100 + + Set oDatabase = Application._CurrentDb() + bSameDatabase = False + If VarType(pvSourceDatabase) = vbString Then + If pvSourceDatabase = "" Then + Set oSourceDatabase = oDatabase + bSameDatabase = True + Else + Set oSourceDatabase = Application.OpenDatabase(ConvertToUrl(pvSourceDatabase), , , True) + If IsNull(oSourceDatabase) Then Goto Exit_Function + End If + Else + Set oSourceDatabase = pvSourceDatabase + End If + + With oDatabase + iRDBMS = ._RDBMS + If ._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + Select Case pvSourceType + + Case acQuery + Set oSource = oSourceDatabase.QueryDefs(pvSourceName, True) + If IsNull(oSource) Then Goto Error_NotFound + Set oTarget = .QueryDefs(pvNewName, True) + If Not IsNull(oTarget) Then .Connection.getQueries.dropByName(oTarget.Name) ' a query with same name exists already ... drop it + If oSource.Query.EscapeProcessing Then + Set oTarget = .CreateQueryDef(pvNewName, oSource.SQL) + Else + Set oTarget = .CreateQueryDef(pvNewName, oSource.SQL, dbSQLPassThrough) + End If + ' Save .odb document + .Document.store() + + Case acTable + Set oSource = oSourceDatabase.TableDefs(pvSourceName, True) + If IsNull(oSource) Then Goto Error_NotFound + Set oTarget = .TableDefs(pvNewName, True) + ' A table with same name exists already ... drop it + If Not IsNull(oTarget) Then .Connection.getTables.dropByName(oTarget.Name) + ' Copy source table columns + Set oSourceTable = oSource.Table + Set oTarget = .Connection.getTables.createDataDescriptor + oTarget.Description = oSourceTable.Description + vNameComponents = Split(pvNewName, ".") + iNames = UBound(vNameComponents) + If iNames >= 2 Then oTarget.CatalogName = vNameComponents(iNames - 2) Else oTarget.CatalogName = "" + If iNames >= 1 Then oTarget.SchemaName = vNameComponents(iNames - 1) Else oTarget.SchemaName = "" + oTarget.Name = vNameComponents(iNames) + oTarget.Type = oSourceTable.Type + Set oSourceColumns = oSourceTable.Columns + Set oTargetCol = oTarget.Columns.createDataDescriptor + For i = 0 To oSourceColumns.getCount() - 1 + ' Append each individual column to the table descriptor + Set oSourceCol = oSourceColumns.getByIndex(i) + _ConvertDataDescriptor oSourceCol, oSourceDatabase._RDBMS, oTargetCol, oDatabase + oTarget.Columns.appendByDescriptor(oTargetCol) + Next i + + ' Copy keys + Set oSourceKeys = oSourceTable.Keys + Set oTargetKey = oTarget.Keys.createDataDescriptor() + For i = 0 To oSourceKeys.getCount() - 1 + ' Append each key to table descriptor + Set oSourceKey = oSourceKeys.getByIndex(i) + oTargetKey.DeleteRule = oSourceKey.DeleteRule + oTargetKey.Name = oSourceKey.Name + oTargetKey.ReferencedTable = oSourceKey.ReferencedTable + oTargetKey.Type = oSourceKey.Type + oTargetKey.UpdateRule = oSourceKey.UpdateRule + Set oTargetCol = oTargetKey.Columns.createDataDescriptor() + For j = 0 To oSourceKey.Columns.getCount() - 1 + Set oSourceCol = oSourceKey.Columns.getByIndex(j) + _ConvertDataDescriptor oSourceCol, oSourceDatabase._RDBMS, oTargetCol, oDatabase, True + oTargetKey.Columns.appendByDescriptor(oTargetCol) + Next j + oTarget.Keys.appendByDescriptor(oTargetKey) + Next i + ' Duplicate table whole design + .Connection.getTables.appendByDescriptor(oTarget) + + ' Copy data + Select Case bSameDatabase + Case True + ' Build SQL statement to copy data + sSurround = Utils._Surround(oSource.Name) + sSql = "INSERT INTO " & Utils._Surround(pvNewName) & " SELECT " & sSurround & ".* FROM " & sSurround + DoCmd.RunSQL(sSql) + Case False + ' Copy data row by row and field by field + ' As it is slow ... display a progress meter + Set oInput = oSourceDatabase.OpenRecordset(oSource.Name, , , dbReadOnly) + Set oOutput = .Openrecordset(pvNewName) + + With oInput + If Not ( ._BOF And ._EOF ) Then + .MoveLast + lInputMax = .RecordCount + lInputRecs = 0 + .MoveFirst + bProgressMeter = ( lInputMax > cstProgressMeterLimit ) + + iNbFields = .Fields().Count - 1 + vFieldBinary = Array() + ReDim vFieldBinary(0 To iNbFields) + For i = 0 To iNbFields + vFieldBinary(i) = Utils._IsBinaryType(.Fields(i).Column.Type) + Next i + Else + bProgressMeter = False + End If + If bProgressMeter Then Application.SysCmd acSysCmdInitMeter, pvNewName & " 0 %", lInputMax + Do While Not .EOF() + oOutput.RowSet.moveToInsertRow() + oOutput._EditMode = dbEditAdd + For i = 0 To iNbFields + Set vInputField = .Fields(i) + Set vOutputField = oOutput.Fields(i) + If vFieldBinary(i) Then + lInputSize = vInputField.FieldSize + If lInputSize <= cstMaxBinlength Then + vField = Utils._getResultSetColumnValue(.RowSet, i + 1, True) + Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, vField) + ElseIf oDatabase._BinaryStream Then + ' Typically for SQLite where binary fields are limited + If lInputSize > vOutputField._Precision Then + TraceError(TRACEWARNING, ERRPRECISION, Utils._CalledSub(), 0, 1, Array(vOutputField._Name, lInputRecs + 1)) + Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, Null) + Else + sFile = Utils._GetRandomFileName("BINARY") + vInputField._WriteAll(sFile, "WriteAllBytes") + vOutputField._ReadAll(sFile, "ReadAllBytes") + Kill ConvertToUrl(sFile) + End If + End If + Else + vField = Utils._getResultSetColumnValue(.RowSet, i + 1) + If VarType(vField) = vbString Then + If Len(vField) > vOutputField._Precision Then + TraceError(TRACEWARNING, ERRPRECISION, Utils._CalledSub(), 0, 1, Array(vOutputField._Name, lInputRecs + 1)) + End If + End If + ' Update is done anyway, if too long, with truncation + Utils._updateResultSetColumnValue(iRDBMS, oOutput.RowSet, i + 1, vField) + End If + Next i + + If oOutput.RowSet.IsNew And oOutput.RowSet.IsModified Then oOutput.RowSet.insertRow() + oOutput._EditMode = dbEditNone + lInputRecs = lInputRecs + 1 + If bProgressMeter Then + If lInputRecs Mod (lInputMax / 100) = 0 Then + Application.SysCmd acSysCmdUpdateMeter, pvNewName & " " & CStr(CLng(lInputRecs * 100 / lInputMax)) & "%", lInputRecs + End If + End If + .MoveNext + Loop + End With + + oOutput.mClose() + Set oOutput = Nothing + oInput.mClose() + Set oInput = Nothing + if bProgressMeter Then Application.SysCmd acSysCmdClearStatus + End Select + + Case Else + End Select + End With + + CopyObject = True + +Exit_Function: + ' Avoid closing the current database or the database object given as source argument + If VarType(pvSourceDatabase) = vbString And Not bSameDatabase Then + If Not IsNull(oSourceDatabase) Then oSourceDatabase.mClose() + End If + Set oSourceDatabase = Nothing + If Not IsNull(oOutput) Then oOutput.mClose() + Set oOutput = Nothing + If Not IsNull(oInput) Then oInput.mClose() + Set oInput = Nothing + Set oSourceCol = Nothing + Set oSourceKey = Nothing + Set oSourceKeys = Nothing + Set oSource = Nothing + Set oSourceTable = Nothing + Set oSourceColumns = Nothing + Set oTargetCol = Nothing + Set oTargetKey = Nothing + Set oTarget = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(Iif(pvSourceType = acQuery, _GetLabel("QUERY"), _GetLabel("TABLE")), pvSourceName)) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' CopyObject V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function FindNext() As Boolean +' Must be called after a FindRecord +' Execute instructions set in FindRecord object + + If _ErrorHandler() Then On Local Error Goto Error_Function + FindNext = False + Utils._SetCalledSub("FindNext") + +Dim ofForm As Object, ocGrid As Object +Dim i As Integer, lInitialRow As Long, lFindRow As Long +Dim bFound As Boolean, b2ndRound As Boolean, bStop As Boolean +Dim vFindValue As Variant, oFindrecord As Object + + Set oFindRecord = _A2B_.FindRecord + If IsNull(oFindRecord) Then GoTo Error_FindRecord + With oFindRecord + + If .FindRecord = 0 Then Goto Error_FindRecord + .FindRecord = 0 + Set ofForm = getObject(.Form) + If ofForm._Type = OBJCONTROL Then Set ofForm = ofForm.Form ' Bug Tombola + Set ocGrid = getObject(.GridControl) + + ' Move cursor to the initial row. Operation based on last FindRecord, not on user interactions done inbetween + If ofForm.DatabaseForm.RowCount <= 0 then Goto Exit_Function ' Dataset is empty + + lInitialRow = .LastRow ' Used if Search = acSearchAll + + bFound = False + lFindRow = .LastRow + b2ndRound = False + Do + ' Last column ? Go to next row + If .LastColumn >= UBound(.ColumnNames) Then + bStop = False + If ofForm.DatabaseForm.isAfterLast() And .Search = acUp Then + ofForm.DatabaseForm.last() + ElseIf ofForm.DatabaseForm.isLast() And .Search = acSearchAll Then + ofForm.DatabaseForm.first() + b2ndRound = True + ElseIf ofForm.DatabaseForm.isBeforeFirst() And (.Search = acDown Or .Search = acSearchAll) Then + ofForm.DatabaseForm.first() + ElseIf ofForm.DatabaseForm.isFirst() And .search = acUp Then + ofForm.DatabaseForm.beforeFirst() + bStop = True + ElseIf ofForm.DatabaseForm.isLast() And .search = acDown Then + ofForm.DatabaseForm.afterLast() + bStop = True + ElseIf .Search = acUp Then + ofForm.DatabaseForm.previous() + Else + ofForm.DatabaseForm.next() + End If + lFindRow = ofForm.DatabaseForm.getRow() + If bStop Or (.Search = acSearchAll And lFindRow >= lInitialRow And b2ndRound) Then + ofForm.DatabaseForm.absolute(lInitialRow) + Exit Do + End If + .LastColumn = 0 + Else + .LastColumn = .LastColumn + 1 + End If + + ' Examine column contents + If .LastColumn <= UBound(.ColumnNames) Then + For i = .LastColumn To UBound(.ColumnNames) + vFindValue = Utils._getResultSetColumnValue(ofForm.DatabaseForm.createResultSet(), .ResultSetIndex(i)) + Select Case VarType(.FindWhat) + Case vbDate, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + bFound = ( .FindWhat = vFindValue ) + Case vbString + If VarType(vFindValue) = vbString Then + Select Case .Match + Case acStart + If .MatchCase Then + bFound = ( Left(.FindWhat, Len(.FindWhat)) = vFindValue ) + Else + bFound = ( UCase(Left(.FindWhat, Len(.FindWhat))) = UCase(vFindValue) ) + End If + Case acAnyWhere + If .MatchCase Then + bFound = ( InStr(1, vFindValue, .FindWhat, 0) > 0 ) + Else + bFound = ( InStr(vFindValue, .FindWhat) > 0 ) + End If + Case acEntire + If .MatchCase Then + bFound = ( .FindWhat = vFindValue ) + Else + bFound = ( UCase(.FindWhat) = UCase(vFindValue) ) + End If + End Select + Else + bFound = False + End If + End Select + If bFound Then + .LastColumn = i + Exit For + End If + Next i + End If + Loop While Not bFound + + .LastRow = lFindRow + If bFound Then + ocGrid.Controls(.ColumnNames(.LastColumn)).setFocus() + .FindRecord = 1 + FindNext = True + End If + + End With + +Exit_Function: + Utils._ResetCalledSub("FindNext") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "FindNext", Erl) + GoTo Exit_Function +Error_FindRecord: + TraceError(TRACEERRORS, ERRFINDRECORD, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' FindNext V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function FindRecord(Optional ByVal pvFindWhat As Variant _ + , Optional ByVal pvMatch As Variant _ + , Optional ByVal pvMatchCase As Variant _ + , Optional ByVal pvSearch As Variant _ + , Optional ByVal pvSearchAsFormatted As Variant _ + , Optional ByVal pvTargetedField As Variant _ + , Optional ByVal pvFindFirst As Variant _ + ) As Boolean + +'Find a value (string or other) in the underlying data of a gridcontrol +'Search in all columns or only in one single control +' see pvTargetedField = acAll or acCurrent +' pvTargetedField may also be a shortcut to a GridControl or one of its subcontrols +'Initialize _Findrecord structure in Database root and call FindNext() to set cursor on found value + + If _ErrorHandler() Then On Local Error Goto Error_Function + FindRecord = False + + Utils._SetCalledSub("FindRecord") + If IsMissing(pvFindWhat) Or pvFindWhat = "" Then Call _TraceArguments() + If IsMissing(pvMatch) Then pvMatch = acEntire + If IsMissing(pvMatchCase) Then pvMatchCase = False + If IsMissing(pvSearch) Then pvSearch = acSearchAll + If IsMissing(pvSearchAsFormatted) Then pvSearchAsFormatted = False ' Anyway only False supported + If IsMissing(pvTargetedField) Then pvTargetedField = acCurrent + If IsMissing(pvFindFirst) Then pvFindFirst = True + If Not (Utils._CheckArgument(pvFindWhat, 1, Utils._AddNumeric(Array(vbString, vbDate))) _ + And Utils._CheckArgument(pvMatch, 2, Utils._AddNumeric(), Array(acAnywhere, acEntire, acStart)) _ + And Utils._CheckArgument(pvMatchCase, 3, vbBoolean) _ + And Utils._CheckArgument(pvSearch, 4, Utils._AddNumeric(), Array(acDown, acSearchAll, acUp)) _ + And Utils._CheckArgument(pvSearchAsFormatted, 5, vbBoolean, Array(False)) _ + And Utils._CheckArgument(pvTargetedField, 6, Utils._AddNumeric(vbString)) _ + And Utils._CheckArgument(pvFindFirst, 7, vbBoolean) _ + ) Then Exit Function + If VarType(pvTargetedField) <> vbString Then + If Not Utils._CheckArgument(pvTargetedField, 6, Utils._AddNumeric(), Array(acAll, acCurrent)) Then Exit Function + End If + +Dim ocTarget As Object, i As Integer, j As Integer, vNames() As Variant, iCount As Integer, vIndexes() As Variant +Dim vColumn As Variant, vDataField As Variant, ofParentForm As Variant, oColumns As Object, vParentGrid As Object +Dim bFound As Boolean, ocGridControl As Object, iFocus As Integer +Dim oFindRecord As _FindParams + With oFindRecord + .FindRecord = 0 + .FindWhat = pvFindWhat + .Match = pvMatch + .MatchCase = pvMatchCase + .Search = pvSearch + .SearchAsFormatted = pvSearchAsFormatted + .FindFirst = pvFindFirst + + ' Determine target + ' Either: pvTargetedField = Grid => search all fields + ' pvTargetedField = Control in Grid => search only in that column + ' pvTargetedField = acAll or acCurrent => determine focus + Select Case True + + Case VarType(pvTargetedField) = vbString + Set ocTarget = getObject(pvTargetedField) + + If ocTarget.SubType = CTLGRIDCONTROL Then + .OnlyCurrentField = acAll + .GridControl = ocTarget._Shortcut + .Target = .GridControl + ofParentForm = getObject(_getUpperShortcut(ocTarget._Shortcut, ocTarget._Name)) + If IsNull(ofParentForm.DatabaseForm) Then Goto Error_DatabaseForm + Set oColumns = ofParentForm.DatabaseForm.createResultSet().Columns + iCount = -1 + For i = 0 To ocTarget.ControlModel.Count - 1 + Set vColumn = ocTarget.ControlModel.getByIndex(i) + Set vDataField = vColumn.BoundField ' examine field type + If Not IsNull(vDataField) Then + If _CheckColumnType(pvFindWhat, vDataField) Then + iCount = iCount + 1 + ReDim Preserve vNames(0 To iCount) + vNames(iCount) = vColumn.Name + ReDim Preserve vIndexes(0 To iCount) + For j = 0 To oColumns.Count - 1 + If vDataField.Name = oColumns.ElementNames(j) Then + vIndexes(iCount) = j + 1 + Exit For + End If + Next j + End If + End If + Next i + + ElseIf ocTarget._Type = OBJCONTROL Then ' Control within a grid tbc + If IsNull(ocTarget.ControlModel.BoundField) Then Goto Error_Target ' Control MUST be bound to a database record or query + ' BoundField is in ControlModel, thanks PASTIM ! + .OnlyCurrentField = acCurrent + vParentGrid = getObject(_getUpperShortcut(ocTarget._Shortcut, ocTarget._Name)) + If vParentGrid.SubType <> CTLGRIDCONTROL Then Goto Error_Target + .GridControl = vParentGrid._Shortcut + ofParentForm = getObject(_getUpperShortcut(vParentGrid._Shortcut, vParentGrid._Name)) + If ofParentForm._Type = OBJCONTROL Then Set ofParentForm = ofParentForm.Form ' Bug Tombola + If IsNull(ofParentForm.DatabaseForm) Then Goto Error_DatabaseForm + .Target = ocTarget._Shortcut + Set vDataField = ocTarget.ControlModel.BoundField + If Not _CheckColumnType(pvFindWhat, vDataField) Then Goto Error_Target + ReDim vNames(0), vIndexes(0) + vNames(0) = ocTarget._Name + Set oColumns = ofParentForm.DatabaseForm.createResultSet().Columns + For j = 0 To oColumns.Count - 1 + If vDataField.Name = oColumns.ElementNames(j) Then + vIndexes(0) = j + 1 + Exit For + End If + Next j + End If + + Case Else ' Determine focus + iCount = Application.Forms()._Count + If iCount = 0 Then Goto Error_ActiveForm + bFound = False + For i = 0 To iCount - 1 ' Determine form having the focus + Set ofParentForm = Application.Forms(i) + If ofParentForm.Component.CurrentController.Frame.IsActive() Then + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Error_ActiveForm + If IsNull(ofParentForm.DatabaseForm) Then Goto Error_DatabaseForm + iCount = ofParentForm.Controls().Count + bFound = False + For i = 0 To iCount - 1 + Set ocGridControl = ofParentForm.Controls(i) + If ocGridControl.SubType = CTLGRIDCONTROL Then + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Error_NoGrid + .GridControl= ocGridControl._Shortcut + iFocus = -1 + iFocus = ocGridControl.ControlView.getCurrentColumnPosition() ' Deprecated but no alternative found !! + + If pvTargetedField = acAll Or iFocus < 0 Or iFocus >= ocGridControl.ControlModel.Count Then ' Has a control within the grid the focus ? NO + .OnlyCurrentField = acAll + Set oColumns = ofParentForm.DatabaseForm.createResultSet().Columns + iCount = -1 + For i = 0 To ocGridControl.ControlModel.Count - 1 + Set vColumn = ocGridControl.ControlModel.getByIndex(i) + Set vDataField = vColumn.BoundField ' examine field type + If Not IsNull(vDataField) Then + If _CheckColumnType(pvFindWhat, vDataField) Then + iCount = iCount + 1 + ReDim Preserve vNames(0 To iCount) + vNames(iCount) = vColumn.Name + ReDim Preserve vIndexes(0 To iCount) + For j = 0 To oColumns.Count - 1 + If vDataField.Name = oColumns.ElementNames(j) Then + vIndexes(iCount) = j + 1 + Exit For + End If + Next j + End If + End If + Next i + + Else ' Has a control within the grid the focus ? YES + .OnlyCurrentField = acCurrent + Set vColumn = ocGridControl.ControlModel.getByIndex(iFocus) + Set ocTarget = ocGridControl.Controls(vColumn.Name) + .Target = ocTarget._Shortcut + Set vDataField = ocTarget.ControlModel.BoundField + If IsNull(vDataField) Then Goto Error_Target ' Control MUST be bound to a database record or query + If Not _CheckColumnType(pvFindWhat, vDataField) Then Goto Error_Target + ReDim vNames(0), vIndexes(0) + vNames(0) = ocTarget._Name + Set oColumns = ofParentForm.DatabaseForm.createResultSet().Columns + For j = 0 To oColumns.Count - 1 + If vDataField.Name = oColumns.ElementNames(j) Then + vIndexes(0) = j + 1 + Exit For + End If + Next j + End If + + End Select + + .Form = ofParentForm._Shortcut + .LastColumn = UBound(vNames) + .ColumnNames = vNames + .ResultSetIndex = vIndexes + If pvFindFirst Then + Select Case pvSearch + Case acDown, acSearchAll + ofParentForm.DatabaseForm.beforeFirst() + .LastRow = 0 + Case acUp + ofParentForm.DatabaseForm.afterLast() + .LastRow = ofParentForm.DatabaseForm.RowCount + 1 + End Select + Else + Select Case True + Case ofParentForm.DatabaseForm.isBeforeFirst And (pvSearch = acSearchAll Or pvSearch = acDown) + .LastRow = 0 + Case ofParentForm.DatabaseForm.isAfterLast And pvSearch = acUp + ofParentForm.DatabaseForm.last() ' RowCount produces a wrong value as long as last record has not been reached + .LastRow = ofParentForm.DatabaseForm.RowCount + 1 + Case Else + .LastRow = ofParentForm.DatabaseForm.getRow() + End Select + End If + + .FindRecord = 1 + + End With + Set _A2B_.FindRecord = oFindRecord + FindRecord = DoCmd.Findnext() + +Exit_Function: + Utils._ResetCalledSub("FindRecord") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "FindRecord", Erl) + GoTo Exit_Function +Error_ActiveForm: + TraceError(TRACEERRORS, ERRNOACTIVEFORM, Utils._CalledSub(), 0) + Goto Exit_Function +Error_DatabaseForm: + TraceError(TRACEFATAL, ERRDATABASEFORM, Utils._CalledSub(), 0, 1, vParentForm._Name) + Goto Exit_Function +Error_Target: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(6, pvTargetedField)) + Goto Exit_Function +Error_NoGrid: + TraceError(TRACEFATAL, ERRNOGRIDINFORM, Utils._CalledSub(), 0, 1, vParentForm._Name) + Goto Exit_Function +End Function ' FindRecord V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function GetHiddenAttribute(ByVal Optional pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "GetHiddenAttribute" + Utils._SetCalledSub(cstThisSub) + + If IsMissing(pvObjectType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), _ + Array(acDiagram, acForm, acQuery, acTable, acReport, acBasicIDE, acDatabaseWindow, acDocument) _ + ) Then Goto Exit_Function + If IsMissing(pvObjectName) Then + Select Case pvObjectType + Case acForm, acQuery, acTable, acReport, acDocument : Call _TraceArguments() + Case Else + End Select + pvObjectName = "" + Else + If Not Utils._CheckArgument(pvObjectName, 2, vbString) Then Goto Exit_Function + End If + +Dim oWindow As Object + Set oWindow = _SelectWindow(pvObjectType, pvObjectName) + If IsNull(oWindow.Frame) Then Goto Error_NotFound + GetHiddenAttribute = Not oWindow.Frame.ContainerWindow.isVisible() + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' GetHiddenAttribute V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function GoToControl(Optional ByVal pvControlName As variant) As Boolean +' Set the focus on the named control on the active form. +' Return False if the control does not exist or is disabled, + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("GoToControl") + If IsMissing(pvControlName) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvControlName, 1, vbString) Then Goto Exit_Function + + GoToControl = False +Dim oWindow As Object, ofForm As Object, ocControl As Object +Dim i As Integer, iCount As Integer + Set oWindow = _SelectWindow() + If oWindow.WindowType = acForm Then + Set ofForm = Application.Forms(oWindow._Name) + iCount = ofForm.Controls().Count + For i = 0 To iCount - 1 + ocControl = ofForm.Controls(i) + If UCase(ocControl._Name) = UCase(pvControlName) Then + If Methods.hasProperty(ocControl, "Enabled") Then + If ocControl.Enabled Then + ocControl.setFocus() + GoToControl = True + Exit For + End If + End If + End If + Next i + End If + +Exit_Function: + Utils._ResetCalledSub("GoToControl") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "GoToControl", Erl) + GoTo Exit_Function +End Function ' GoToControl V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function GoToRecord(Optional ByVal pvObjectType As Variant _ + , Optional ByVal pvObjectName As Variant _ + , Optional ByVal pvRecord As Variant _ + , Optional ByVal pvOffset As Variant _ + ) As Boolean + +'Move to record indicated by pvRecord/pvOffset in the window designated by pvObjectType and pvObjectName + + If _ErrorHandler() Then On Local Error Goto Error_Function + GoToRecord = False + +Const cstThisSub = "GoTorecord" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvObjectName) Then pvObjectName = "" + If IsMissing(pvObjectType) Then pvObjectType = acActiveDataObject + If IsMissing(pvRecord) Then pvRecord = acNext + If IsMissing(pvOffset) Then pvOffset = 1 + If Not (Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric() _ + , Array(acActiveDataObject, acDataForm, acDataQuery, acDataTable)) _ + And Utils._CheckArgument(pvObjectName, 2, vbString) _ + And Utils._CheckArgument(pvRecord, 3, Utils._AddNumeric() _ + , Array(acFirst, acGoTo, acLast, acNewRec, acNext, acPrevious)) _ + And Utils._CheckArgument(pvOffset, 4, Utils._AddNumeric()) _ + ) Then Goto Exit_Function + If pvObjectType = acActiveDataObject And pvObjectName <> "" Then Goto Error_Target + If pvOffset < 0 And pvRecord <> acGoTo Then Goto Error_Offset + +Dim ofForm As Object, oGeneric As Object, oResultSet As Object, oWindow As Object +Dim i As Integer, iCount As Integer, bFound As Boolean, lOffset As Long +Dim sObjectName, iLengthName As Integer + Select Case pvObjectType + Case acActiveDataObject + Set oWindow = _SelectWindow() + With oWindow + Select Case .WindowType + Case acForm + Set oResultSet = _DatabaseForm(._Name, "") + Case acQuery, acTable + If IsNull(.Frame.Controller.FormOperations) Then Goto Error_NotApplicable + ' FormOperations returns <Null> in OpenOffice + Set oResultSet = .Frame.Controller.FormOperations.Cursor + Case Else ' Ignore action + Goto Exit_Function + End Select + End With + Case acDataForm + ' pvObjectName can be "myForm", "Forms!myForm", "Forms!myForm!mySubform" or "Forms!myForm!mySubform.Form" + sObjectName = UCase(pvObjectName) + iLengthName = Len(sObjectName) + Select Case True + Case iLengthName > 6 And Left(sObjectName, 6) = "FORMS!" And Right(sObjectName, 5) = ".FORM" + Set ofForm = getObject(pvObjectName) + If ofForm._Type <> OBJSUBFORM Then Goto Error_Target + Case iLengthName > 6 And Left(sObjectName, 6) = "FORMS!" + Set oGeneric = getObject(pvObjectName) + If oGeneric._Type = OBJFORM Or oGeneric._Type = OBJSUBFORM Then + Set ofForm = oGeneric + ElseIf oGeneric.SubType = CTLSUBFORM Then + Set ofForm = oGeneric.Form + Else Goto Error_Target + End If + Case sObjectName = "" + Call _TraceArguments() + Case Else + Set ofForm = Application.Forms(pvObjectName) + End Select + Set oResultSet = ofForm.DatabaseForm + Case acDataQuery + Set oWindow = _SelectWindow(acQuery, pvObjectName) + If IsNull(oWindow.Frame.Controller.FormOperations) Then Goto Error_NotApplicable + ' FormOperations returns <Null> in OpenOffice + Set oResultSet = oWindow.Frame.Controller.FormOperations.Cursor + Case acDataTable + Set oWindow = _SelectWindow(acTable, pvObjectName) + If IsNull(oWindow.Frame.Controller.FormOperations) Then Goto Error_NotApplicable + Set oResultSet = oWindow.Frame.Controller.FormOperations.Cursor + Case Else + End Select + + ' Check if current row updated => Save it + If oResultSet.IsNew Then + oResultSet.insertRow() + ElseIf oResultSet.IsModified Then + oResultSet.updateRow() + End If + + lOffset = pvOffset + Select Case pvRecord + Case acFirst : GoToRecord = oResultSet.first() + Case acGoTo : GoToRecord = oResultSet.absolute(lOffset) + Case acLast : GoToRecord = oResultSet.last() + Case acNewRec + oResultSet.last() ' To simulate the behaviour in the UI + oResultSet.moveToInsertRow() + GoToRecord = True + Case acNext + If lOffset = 1 Then + GoToRecord = oResultSet.next() + Else + GoToRecord = oResultSet.relative(lOffset) + End If + Case acPrevious + If lOffset = 1 Then + GoToRecord = oResultSet.previous() + Else + GoToRecord = oResultSet.relative(- lOffset) + End If + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_Target: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(2, pvObjectName)) + Goto Exit_Function +Error_Offset: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(4, pvOffset)) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' GoToRecord + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Maximize() As Boolean +' Maximize the window having the focus + Utils._SetCalledSub("Maximize") + +Dim oWindow As Object + Maximize = False + Set oWindow = _SelectWindow() + If Not IsNull(oWindow.Frame) Then + If Utils._hasUNOProperty(oWindow.Frame.ContainerWindow, "IsMaximized") Then oWindow.Frame.ContainerWindow.IsMaximized = True ' Ignored when <= OO3.2 + Maximize = True + End If + + Utils._ResetCalledSub("Maximize") + Exit Function +End Function ' Maximize V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Minimize() As Boolean +' Maximize the form having the focus + Utils._SetCalledSub("Minimize") + +Dim oWindow As Object + Minimize = False + Set oWindow = _SelectWindow() + If Not IsNull(oWindow.Frame) Then + If Utils._hasUNOProperty(oWindow.Frame.ContainerWindow, "IsMinimized") Then oWindow.Frame.ContainerWindow.IsMinimized = True + Minimize = True + End If + + Utils._ResetCalledSub("Minimize") + Exit Function +End Function ' Minimize V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function MoveSize(ByVal Optional pvLeft As Variant _ + , ByVal Optional pvTop As Variant _ + , ByVal Optional pvWidth As Variant _ + , ByVal Optional pvHeight As Variant _ + ) As Variant +' Execute MoveSize action + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("MoveSize") + MoveSize = False + If IsMissing(pvLeft) Then pvLeft = -1 + If IsMissing(pvTop) Then pvTop = -1 + If IsMissing(pvWidth) Then pvWidth = -1 + If IsMissing(pvHeight) Then pvHeight = -1 + If Not Utils._CheckArgument(pvLeft, 1, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvTop, 2, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWidth, 3, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvHeight, 4, Utils._AddNumeric()) Then Goto Exit_Function + +Dim iArg As Integer, iWrong As Integer ' Check arguments values + iArg = 0 + If pvHeight < -1 Then + iArg = 4 : iWrong = pvHeight + ElseIf pvWidth < -1 Then + iArg = 3 : iWrong = pvWidth + ElseIf pvTop < -1 Then + iArg = 2 : iWrong = pvTop + ElseIf pvLeft < -1 Then + iArg = 1 : iWrong = pvLeft + End If + If iArg > 0 Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(iArg, iWrong)) + Goto Exit_Function + End If + +Dim iPosSize As Integer + iPosSize = 0 + If pvLeft >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.X + If pvTop >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.Y + If pvWidth > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.WIDTH + If pvHeight > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.HEIGHT + +Dim oWindow As Object + Set oWindow = _SelectWindow() + With oWindow + If Not IsNull(.Frame) Then + If Utils._hasUNOProperty(.Frame.ContainerWindow, "IsMaximized") Then ' Ignored when <= OO3.2 + .Frame.ContainerWindow.IsMaximized = False + .Frame.ContainerWindow.IsMinimized = False + End If + .Frame.ContainerWindow.setPosSize(pvLeft, pvTop, pvWidth, pvHeight, iPosSize) + MoveSize = True + End If + End With + +Exit_Function: + Utils._ResetCalledSub("MoveSize") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "MoveSize", Erl) + GoTo Exit_Function +End Function ' MoveSize V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenForm(Optional ByVal pvFormName As Variant _ + , Optional ByVal pvView As Variant _ + , Optional ByVal pvFilterName As Variant _ + , Optional ByVal pvWhereCondition As Variant _ + , Optional ByVal pvDataMode As Variant _ + , Optional ByVal pvWindowMode As Variant _ + , Optional ByVal pvOpenArgs As Variant _ + ) As Variant + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("OpenForm") + If IsMissing(pvFormName) Then Call _TraceArguments() + If IsMissing(pvView) Then pvView = acNormal + If IsMissing(pvFilterName) Then pvFilterName = "" + If IsMissing(pvWhereCondition) Then pvWhereCondition = "" + If IsMissing(pvDataMode) Then pvDataMode = acFormPropertySettings + If IsMissing(pvWindowMode) Then pvWindowMode = acWindowNormal + If IsMissing(pvOpenArgs) Then pvOpenArgs = "" + Set OpenForm = Nothing + If Not (Utils._CheckArgument(pvFormName, 1, vbString) _ + And Utils._CheckArgument(pvView, 2, Utils._AddNumeric(), Array(acNormal, acPreview, acDesign)) _ + And Utils._CheckArgument(pvFilterName, 3, vbString) _ + And Utils._CheckArgument(pvWhereCondition, 4, vbString) _ + And Utils._CheckArgument(pvDataMode, 5, Utils._AddNumeric(), Array(acFormAdd, acFormEdit, acFormPropertySettings, acFormReadOnly)) _ + And Utils._CheckArgument(pvWindowMode, 6, Utils._AddNumeric(), Array(acDialog, acHidden, acIcon, acWindowNormal)) _ + ) Then Goto Exit_Function + +Dim ofForm As Object, sWarning As String +Dim oDatabase As Object, oOpenForm As Object, bOpenMode As Boolean, oController As Object + + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + Set ofForm = Application.AllForms(pvFormName) + If ofForm.IsLoaded Then + sWarning = _GetLabel("ERR" & ERRFORMYETOPEN) + sWarning = Join(Split(sWarning, "%0"), ofForm._Name) + TraceLog(TRACEANY, "OpenForm: " & sWarning) + Set OpenForm = ofForm + Goto Exit_Function + End If +' Open the form + Select Case pvView + Case acNormal, acPreview: bOpenMode = False + Case acDesign : bOpenMode = True + End Select + Set oController = oDatabase.Document.CurrentController + Set oOpenForm = oController.loadComponent(com.sun.star.sdb.application.DatabaseObject.FORM, ofForm._Name, bOpenMode) + +' Apply the filters (FilterName) AND (WhereCondition) +Dim sFilter As String, oForm As Object, oFormsCollection As Object + If pvFilterName = "" And pvWhereCondition = "" Then + sFilter = "" + ElseIf pvFilterName = "" Or pvWhereCondition = "" Then + sFilter = pvFilterName & pvWhereCondition + Else + sFilter = "(" & pvFilterName & ") And (" & pvWhereCondition & ")" + End If + Set oFormsCollection = oOpenForm.DrawPage.Forms + If oFormsCollection.getCount() > 0 Then Set oForm = oFormsCollection.getByIndex(0) Else Set oForm = Nothing + If Not IsNull(oForm) Then + If sFilter <> "" Then + oForm.Filter = oDatabase._ReplaceSquareBrackets(sFilter) + oForm.ApplyFilter = True + oForm.reload() + ElseIf oForm.Filter <> "" Then ' If a filter has been set previously it must be removed + oForm.Filter = "" + oForm.ApplyFilter = False + oForm.reload() + End If + End If + +'Housekeeping + Set ofForm = Application.AllForms(pvFormName) ' Redone to reinitialize all properties of ofForm now FormName is open + With ofForm + If Not IsNull(.DatabaseForm) Then + Select Case pvDataMode + Case acFormAdd + .AllowAdditions = True + .AllowDeletions = False + .AllowEdits = False + Case acFormEdit + .AllowAdditions = True + .AllowDeletions = True + .AllowEdits = True + Case acFormReadOnly + .AllowAdditions = False + .AllowDeletions = False + .AllowEdits = False + Case acFormPropertySettings + End Select + End If + .Visible = ( pvWindowMode <> acHidden ) + ._OpenArgs = pvOpenArgs + 'To avoid AOO 3.4 bug See http://user.services.openoffice.org/en/forum/viewtopic.php?f=13&t=53751 + .Component.CurrentController.ViewSettings.ShowOnlineLayout = True + End With + + Set OpenForm = ofForm + +Exit_Function: + Utils._ResetCalledSub("OpenForm") + Set ofForm = Nothing + Set oOpenForm = Nothing + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenForm", Erl) + Set OpenForm = Nothing + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1) + Goto Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERROPENFORM, Utils._CalledSub(), 0, , pvFormName) + Set OpenForm = Nothing + Goto Exit_Function +End Function ' OpenForm V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenQuery(Optional ByVal pvQueryName As Variant _ + , Optional ByVal pvView As Variant _ + , Optional ByVal pvDataMode As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("OpenQuery") + If IsMissing(pvQueryName) Then Call _TraceArguments() + If IsMissing(pvView) Then pvView = acViewNormal + If IsMissing(pvDataMode) Then pvDataMode = acEdit + OpenQuery = DoCmd._OpenObject("Query", pvQueryName, pvView, pvDataMode) + +Exit_Function: + Utils._ResetCalledSub("OpenQuery") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenQuery", Erl) + GoTo Exit_Function +End Function ' OpenQuery + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenReport(Optional ByVal pvReportName As Variant _ + , Optional ByVal pvView As Variant _ + , Optional ByVal pvDataMode As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("OpenReport") + If IsMissing(pvReportName) Then Call _TraceArguments() + If IsMissing(pvView) Then pvView = acViewNormal + If IsMissing(pvDataMode) Then pvDataMode = acEdit + OpenReport = DoCmd._OpenObject("Report", pvReportName, pvView, pvDataMode) + +Exit_Function: + Utils._ResetCalledSub("OpenReport") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenReport", Erl) + GoTo Exit_Function +End Function ' OpenReport + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenSQL(Optional ByVal pvSQL As Variant _ + , Optional ByVal pvOption As Variant _ + ) As Boolean +' Return True if the execution of the SQL statement was successful +' SQL must contain a SELECT query +' pvOption can force pass through mode + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("OpenSQL") + + OpenSQL = False + If IsMissing(pvSQL) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSQL, 1, vbString) Then Goto Exit_Function +Const cstNull = -1 + If IsMissing(pvOption) Then + pvOption = cstNull + Else + If Not Utils._CheckArgument(pvOption, 2, Utils._AddNumeric(), dbSQLPassThrough) Then Goto Exit_Function + End If + + OpenSQL = Application._CurrentDb.OpenSQL(pvSQL, pvOption) + +Exit_Function: + Utils._ResetCalledSub("OpenSQL") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenSQL", Erl) + GoTo Exit_Function +End Function ' OpenSQL V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenTable(Optional ByVal pvTableName As Variant _ + , Optional ByVal pvView As Variant _ + , Optional ByVal pvDataMode As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("OpenTable") + If IsMissing(pvTableName) Then Call _TraceArguments() + If IsMissing(pvView) Then pvView = acViewNormal + If IsMissing(pvDataMode) Then pvDataMode = acEdit + OpenTable = DoCmd._OpenObject("Table", pvTableName, pvView, pvDataMode) + +Exit_Function: + Utils._ResetCalledSub("OpenTable") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenTable", Erl) + GoTo Exit_Function +End Function ' OpenTable + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OutputTo(ByVal pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + , ByVal Optional pvOutputFormat As Variant _ + , ByVal Optional pvOutputFile As Variant _ + , ByVal Optional pvAutoStart As Variant _ + , ByVal Optional pvTemplateFile As Variant _ + , ByVal Optional pvEncoding As Variant _ + , ByVal Optional pvQuality As Variant _ + ) As Boolean +REM https://wiki.openoffice.org/wiki/Framework/Article/Filter/FilterList_OOo_3_0 +REM https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options +REM https://msdn.microsoft.com/en-us/library/ms709353%28v=vs.85%29.aspx +'Supported: acFormatPDF, acFormatODT, acFormatDOC, acFormatHTML for forms +' acFormatHTML, acFormatODS, acFormatXLS, acFormatXLSX, acFormatTXT for tables and queries + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "OutputTo" + Utils._SetCalledSub(cstThisSub) + + OutputTo = False + + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), Array(acOutputTable, acOutputQuery, acOutputForm)) Then Goto Exit_Function + If IsMissing(pvObjectName) Then pvObjectName = "" + If Not Utils._CheckArgument(pvObjectName, 2, vbString) Then Goto Exit_Function + If IsMissing(pvOutputFormat) Then pvOutputFormat = "" + If Not Utils._CheckArgument(pvOutputFormat, 3, vbString) Then Goto Exit_Function + If pvOutputFormat <> "" Then + If Not Utils._CheckArgument(UCase(pvOutputFormat), 3, vbString, Array( _ + UCase(acFormatPDF), UCase(acFormatODT), UCase(acFormatDOC), UCase(acFormatHTML) _ + , UCase(acFormatODS), UCase(acFormatXLS), UCase(acFormatXLSX), UCase(acFormatTXT) _ + , "PDF", "ODT", "DOC", "HTML", "ODS", "XLS", "XLSX", "TXT", "CSV", "" _ + )) Then Goto Exit_Function ' A 2nd time to allow case unsensitivity + End If + If IsMissing(pvOutputFile) Then pvOutputFile = "" + If Not Utils._CheckArgument(pvOutputFile, 4, vbString) Then Goto Exit_Function + If IsMissing(pvAutoStart) Then pvAutoStart = False + If Not Utils._CheckArgument(pvAutoStart, 5, vbBoolean) Then Goto Exit_Function + If IsMissing(pvTemplateFile) Then pvTemplateFile = "" + If Not Utils._CheckArgument(pvTemplateFile, 6, vbString) Then Goto Exit_Function + If IsMissing(pvEncoding) Then pvEncoding = 0 + If Not Utils._CheckArgument(pvEncoding, 7, _AddNumeric()) Then Goto Exit_Function + If IsMissing(pvQuality) Then pvQuality = acExportQualityPrint + If Not Utils._CheckArgument(pvQuality, 7, _AddNumeric(), Array(acExportQualityPrint, acExportQualityScreen)) Then Goto Exit_Function + + If pvObjectType = acOutputTable Or pvObjectType = acOutputQuery Then + OutputTo = Application._CurrentDb().OutputTo( _ + pvObjectType _ + , pvObjectName _ + , pvOutputFormat _ + , pvOutputFile _ + , pvAutoStart _ + , pvTemplateFile _ + , pvEncoding _ + , pvQuality _ + ) + GoTo Exit_Function + End If + +Dim vWindow As Variant, sOutputFile As String, ofForm As Object, i As Integer, bFound As Boolean + 'Find applicable form + If pvObjectName = "" Then + vWindow = _SelectWindow() + If vWindow.WindowType <> acOutoutForm Then Goto Error_Action + Set ofForm = Application.Forms(vWindow._Name) + Else + bFound = False + For i = 0 To Application.Forms()._Count - 1 + Set ofForm = Application.Forms(i) + If UCase(ofForm._Name) = UCase(pvObjectName) Then + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Error_NotFound + End If + + 'Determine format and parameters +Dim sOutputFormat As String, sFilter As String, oFilterData As Object, oExport As Object, sSuffix As String + If pvOutputFormat = "" Then + sOutputFormat = _PromptFormat(Array("PDF", "ODT", "DOC", "HTML")) ' Prompt user for format + If sOutputFormat = "" Then Goto Exit_Function + Else + sOutputFormat = UCase(pvOutputFormat) + End If + Select Case sOutputFormat + Case UCase(acFormatPDF), "PDF" + sFilter = acFormatPDF + oFilterData = Array( _ + _MakePropertyValue ("ExportFormFields", False), _ + ) + sSuffix = "pdf" + Case UCase(acFormatDOC), "DOC" + sFilter = acFormatDOC + oFilterData = Array() + sSuffix = "doc" + Case UCase(acFormatODT), "ODT" + sFilter = acFormatODT + oFilterData = Array() + sSuffix = "odt" + Case UCase(acFormatHTML), "HTML" + sFilter = acFormatHTML + oFilterData = Array() + sSuffix = "html" + End Select + oExport = Array( _ + _MakePropertyValue("Overwrite", True), _ + _MakePropertyValue("FilterName", sFilter), _ + _MakePropertyValue("FilterData", oFilterData), _ + ) + + 'Determine output file + If pvOutputFile = "" Then ' Prompt file picker to user + sOutputFile = _PromptFilePicker(sSuffix) + If sOutputFile = "" Then Goto Exit_Function + Else + sOutputFile = pvOutputFile + End If + sOutputFile = ConvertToURL(sOutputFile) + + 'Create file + On Local Error Goto Error_File + ofForm.Component.storeToURL(sOutputFile, oExport) + On Local Error Goto Error_Function + + 'Launch application, if requested + If pvAutoStart Then Call _ShellExecute(sOutputFile) + + OutputTo = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Action: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_File: + TraceError(TRACEFATAL, ERRFILENOTCREATED, Utils._CalledSub(), 0, , sOutputFile) + GoTo Exit_Function +End Function ' OutputTo V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Quit(Optional ByVal pvSave As Variant) As Variant +' Quit the application +' Modified from Andrew Pitonyak's Base Macro Programming §5.8.1 + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Quit" + Utils._SetCalledSub(cstThisSub) + + If IsMissing(pvSave) Then pvSave = acQuitSaveAll + If Not Utils._CheckArgument(pvSave, 1, Utils._AddNumeric(), _ + Array(acQuitPrompt, acQuitSaveAll, acQuitSaveNone) _ + ) Then Goto Exit_Function + +Dim oDatabase As Object, oDoc As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + If Not IsNull(oDatabase) Then + Set oDoc = oDatabase.Document + Select Case pvSave + Case acQuitPrompt + If MsgBox(_GetLabel("QUIT"), vbYesNo + vbQuestion, _GetLabel("QUITSHORT")) = vbNo Then Exit Function + Case acQuitSaveNone + oDoc.setModified(False) + Case Else + End Select + If HasUnoInterfaces(oDoc, "com.sun.star.util.XCloseable") Then + If (oDoc.isModified) Then + If (oDoc.hasLocation AND (Not oDoc.isReadOnly)) Then + oDoc.store() + End If + End If + oDoc.close(true) + Else + oDoc.dispose() + End If + End If + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Set oDatabase = Nothing + Set oDoc = Nothing + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + Set OpenForm = Nothing + GoTo Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +End Function ' Quit V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub RunApp(Optional ByVal pvCommandLine As Variant) +' Convert to URL and execute the Command Line + + If _ErrorHandler() Then On Local Error Goto Error_Sub + + Utils._SetCalledSub("RunApp") + + If IsMissing(pvCommandLine) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvCommandLine, 1, vbString) Then Goto Exit_Sub + + _ShellExecute(ConvertToURL(pvCommandLine)) + +Exit_Sub: + Utils._ResetCalledSub("RunApp") + Exit Sub +Error_Sub: + TraceError(TRACEABORT, Err, "RunApp", Erl) + GoTo Exit_Sub +End Sub ' RunApp V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RunCommand(Optional pvCommand As Variant, Optional pbReturnCommand As Boolean) As Variant +' Execute command via DispatchHelper +' pbReturnCommand = internal parameter to only return the exact command string (always absent if uno prefix present in pvCommand) + + If _ErrorHandler() Then On Local Error Goto Exit_Function ' Avoid any abort +Const cstThisSub = "RunCommand" + Utils._SetCalledSub(cstThisSub) + +Dim iVBACommand As Integer, sOOCommand As String, sDispatch As String + If IsMissing(pvCommand) Then Call _TraceArguments() + If Not ( Utils._CheckArgument(pvCommand, 1, Utils._AddNumeric(vbString)) ) Then Goto Exit_Function + If IsMissing(pbReturnCommand) Then pbReturnCommand = False + + RunCommand = True + +Const cstUnoPrefix = ".uno:" + If VarType(pvCommand) = vbString Then + sOOCommand = pvCommand + iVBACommand = -1 + If _IsLeft(sOOCommand, cstUnoPrefix) Then + Call _DispatchCommand(sOOCommand) + Goto Exit_Function + End If + Else + sOOCommand = "" + iVBACommand = pvCommand + End If + + Select Case True + Case iVBACommand = acCmdAboutMicrosoftAccess Or UCase(sOOCommand) = "ABOUT" : sDispatch = "About" + Case iVBACommand = acCmdAboutOpenOffice Or UCase(sOOCommand) = "ABOUT" : sDispatch = "About" + Case iVBACommand = acCmdAboutLibreOffice Or UCase(sOOCommand) = "ABOUT" : sDispatch = "About" + Case UCase(sOOCommand) = "ACTIVEHELP" : sDispatch = "ActiveHelp" + Case UCase(sOOCommand) = "ADDDIRECT" : sDispatch = "AddDirect" + Case UCase(sOOCommand) = "ADDFIELD" : sDispatch = "AddField" + Case UCase(sOOCommand) = "AUTOCONTROLFOCUS" : sDispatch = "AutoControlFocus" + Case UCase(sOOCommand) = "AUTOFILTER" : sDispatch = "AutoFilter" + Case UCase(sOOCommand) = "AUTOPILOTADDRESSDATASOURCE" : sDispatch = "AutoPilotAddressDataSource" + Case UCase(sOOCommand) = "BASICBREAK" : sDispatch = "BasicBreak" + Case iVBACommand = acCmdVisualBasicEditor Or UCase(sOOCommand) = "BASICIDEAPPEAR" : sDispatch = "BasicIDEAppear" + Case UCase(sOOCommand) = "BASICSTOP" : sDispatch = "BasicStop" + Case iVBACommand = acCmdBringToFront Or UCase(sOOCommand) = "BRINGTOFRONT" : sDispatch = "BringToFront" + Case UCase(sOOCommand) = "CHECKBOX" : sDispatch = "CheckBox" + Case UCase(sOOCommand) = "CHOOSEMACRO" : sDispatch = "ChooseMacro" + Case iVBACommand = acCmdClose Or UCase(sOOCommand) = "CLOSEDOC" : sDispatch = "CloseDoc" + Case UCase(sOOCommand) = "CLOSEWIN" : sDispatch = "CloseWin" + Case iVBACommand = acCmdToolbarsCustomize Or UCase(sOOCommand) = "CONFIGUREDIALOG" : sDispatch = "ConfigureDialog" + Case UCase(sOOCommand) = "CONTROLPROPERTIES" : sDispatch = "ControlProperties" + Case iVBACommand = acCmdChangeToCommandButton Or UCase(sOOCommand) = "CONVERTTOBUTTON" : sDispatch = "ConvertToButton" + Case iVBACommand = acCmdChangeToCheckBox Or UCase(sOOCommand) = "CONVERTTOCHECKBOX" : sDispatch = "ConvertToCheckBox" + Case iVBACommand = acCmdChangeToComboBox Or UCase(sOOCommand) = "CONVERTTOCOMBO" : sDispatch = "ConvertToCombo" + Case UCase(sOOCommand) = "CONVERTTOCURRENCY" : sDispatch = "ConvertToCurrency" + Case UCase(sOOCommand) = "CONVERTTODATE" : sDispatch = "ConvertToDate" + Case iVBACommand = acCmdChangeToTextBox Or UCase(sOOCommand) = "CONVERTTOEDIT" : sDispatch = "ConvertToEdit" + Case UCase(sOOCommand) = "CONVERTTOFILECONTROL" : sDispatch = "ConvertToFileControl" + Case iVBACommand = acCmdChangeToLabel Or UCase(sOOCommand) = "CONVERTTOFIXED" : sDispatch = "ConvertToFixed" + Case UCase(sOOCommand) = "CONVERTTOFORMATTED" : sDispatch = "ConvertToFormatted" + Case UCase(sOOCommand) = "CONVERTTOGROUP" : sDispatch = "ConvertToGroup" + Case UCase(sOOCommand) = "CONVERTTOIMAGEBTN" : sDispatch = "ConvertToImageBtn" + Case iVBACommand = acCmdChangeToImage Or UCase(sOOCommand) = "CONVERTTOIMAGECONTROL" : sDispatch = "ConvertToImageControl" + Case iVBACommand = acCmdChangeToListBox Or UCase(sOOCommand) = "CONVERTTOLIST" : sDispatch = "ConvertToList" + Case UCase(sOOCommand) = "CONVERTTONAVIGATIONBAR" : sDispatch = "ConvertToNavigationBar" + Case UCase(sOOCommand) = "CONVERTTONUMERIC" : sDispatch = "ConvertToNumeric" + Case UCase(sOOCommand) = "CONVERTTOPATTERN" : sDispatch = "ConvertToPattern" + Case iVBACommand = acCmdChangeToOptionButton Or UCase(sOOCommand) = "CONVERTTORADIO" : sDispatch = "ConvertToRadio" + Case UCase(sOOCommand) = "CONVERTTOSCROLLBAR" : sDispatch = "ConvertToScrollBar" + Case UCase(sOOCommand) = "CONVERTTOSPINBUTTON" : sDispatch = "ConvertToSpinButton" + Case UCase(sOOCommand) = "CONVERTTOTIME" : sDispatch = "ConvertToTime" + Case iVBACommand = acCmdCopy Or UCase(sOOCommand) = "COPY" : sDispatch = "Copy" + Case UCase(sOOCommand) = "CURRENCYFIELD" : sDispatch = "CurrencyField" + Case iVBACommand = acCmdCut Or UCase(sOOCommand) = "CUT" : sDispatch = "Cut" + Case UCase(sOOCommand) = "DATEFIELD" : sDispatch = "DateField" + Case iVBACommand = acCmdCreateRelationship Or UCase(sOOCommand) = "DBADDRELATION " : sDispatch = "DBAddRelation " + Case UCase(sOOCommand) = "DBCONVERTTOVIEW " : sDispatch = "DBConvertToView " + Case iVBACommand = acCmdDelete Or UCase(sOOCommand) = "DBDELETE " : sDispatch = "DBDelete " + Case UCase(sOOCommand) = "DBDIRECTSQL " : sDispatch = "DBDirectSQL " + Case UCase(sOOCommand) = "DBDSADVANCEDSETTINGS " : sDispatch = "DBDSAdvancedSettings " + Case UCase(sOOCommand) = "DBDSCONNECTIONTYPE " : sDispatch = "DBDSConnectionType " + Case iVBACommand = acCmdDatabaseProperties Or UCase(sOOCommand) = "DBDSPROPERTIES " : sDispatch = "DBDSProperties " + Case UCase(sOOCommand) = "DBEDIT " : sDispatch = "DBEdit " + Case iVBACommand = acCmdSQLView Or UCase(sOOCommand) = "DBEDITSQLVIEW " : sDispatch = "DBEditSqlView " + Case iVBACommand = acCmdRemove Or UCase(sOOCommand) = "DBFORMDELETE " : sDispatch = "DBFormDelete " + Case iVBACommand = acCmdDesignView Or UCase(sOOCommand) = "DBFORMEDIT " : sDispatch = "DBFormEdit " + Case iVBACommand = acCmdFormView Or UCase(sOOCommand) = "DBFORMOPEN " : sDispatch = "DBFormOpen " + Case UCase(sOOCommand) = "DBFORMRENAME " : sDispatch = "DBFormRename " + Case iVBACommand = acCmdNewObjectForm Or UCase(sOOCommand) = "DBNEWFORM " : sDispatch = "DBNewForm " + Case UCase(sOOCommand) = "DBNEWFORMAUTOPILOT " : sDispatch = "DBNewFormAutoPilot " + Case UCase(sOOCommand) = "DBNEWQUERY " : sDispatch = "DBNewQuery " + Case UCase(sOOCommand) = "DBNEWQUERYAUTOPILOT " : sDispatch = "DBNewQueryAutoPilot " + Case UCase(sOOCommand) = "DBNEWQUERYSQL " : sDispatch = "DBNewQuerySql " + Case UCase(sOOCommand) = "DBNEWREPORT " : sDispatch = "DBNewReport " + Case UCase(sOOCommand) = "DBNEWREPORTAUTOPILOT " : sDispatch = "DBNewReportAutoPilot " + Case iVBACommand = acCmdNewObjectTable Or UCase(sOOCommand) = "DBNEWTABLE " : sDispatch = "DBNewTable " + Case UCase(sOOCommand) = "DBNEWTABLEAUTOPILOT " : sDispatch = "DBNewTableAutoPilot " + Case iVBACommand = acCmdNewObjectView Or UCase(sOOCommand) = "DBNEWVIEW " : sDispatch = "DBNewView " + Case UCase(sOOCommand) = "DBNEWVIEWSQL " : sDispatch = "DBNewViewSQL " + Case iVBACommand = acCmdOpenDatabase Or UCase(sOOCommand) = "DBOPEN " : sDispatch = "DBOpen " + Case iVBACommand = acCmdRemove Or UCase(sOOCommand) = "DBQUERYDELETE " : sDispatch = "DBQueryDelete " + Case iVBACommand = acCmdDesignView Or UCase(sOOCommand) = "DBQUERYEDIT " : sDispatch = "DBQueryEdit " + Case iVBACommand = acCmdNewObjectQuery Or UCase(sOOCommand) = "DBQUERYOPEN " : sDispatch = "DBQueryOpen " + Case UCase(sOOCommand) = "DBQUERYRENAME " : sDispatch = "DBQueryRename " + Case UCase(sOOCommand) = "DBREFRESHTABLES " : sDispatch = "DBRefreshTables " + Case iVBACommand = acCmdShowAllRelationships Or UCase(sOOCommand) = "DBRELATIONDESIGN " : sDispatch = "DBRelationDesign " + Case UCase(sOOCommand) = "DBRENAME " : sDispatch = "DBRename " + Case iVBACommand = acCmdRemove Or UCase(sOOCommand) = "DBREPORTDELETE " : sDispatch = "DBReportDelete " + Case iVBACommand = acCmdDesignView Or UCase(sOOCommand) = "DBREPORTEDIT " : sDispatch = "DBReportEdit " + Case iVBACommand = acCmdNewObjectReport Or UCase(sOOCommand) = "DBREPORTOPEN " : sDispatch = "DBReportOpen " + Case UCase(sOOCommand) = "DBREPORTRENAME " : sDispatch = "DBReportRename " + Case iVBACommand = acCmdSelectAll Or UCase(sOOCommand) = "DBSELECTALL " : sDispatch = "DBSelectAll " + Case UCase(sOOCommand) = "DBSHOWDOCINFOPREVIEW " : sDispatch = "DBShowDocInfoPreview " + Case UCase(sOOCommand) = "DBSHOWDOCPREVIEW " : sDispatch = "DBShowDocPreview " + Case iVBACommand = acCmdRemoveTable Or UCase(sOOCommand) = "DBTABLEDELETE " : sDispatch = "DBTableDelete " + Case iVBACommand = acCmdDesignView Or UCase(sOOCommand) = "DBTABLEEDIT " : sDispatch = "DBTableEdit " + Case UCase(sOOCommand) = "DBTABLEFILTER " : sDispatch = "DBTableFilter " + Case iVBACommand = acCmdOpenTable Or UCase(sOOCommand) = "DBTABLEOPEN " : sDispatch = "DBTableOpen " + Case iVBACommand = acCmdRename Or UCase(sOOCommand) = "DBTABLERENAME " : sDispatch = "DBTableRename " + Case UCase(sOOCommand) = "DBUSERADMIN " : sDispatch = "DBUserAdmin " + Case UCase(sOOCommand) = "DBVIEWFORMS " : sDispatch = "DBViewForms " + Case UCase(sOOCommand) = "DBVIEWQUERIES " : sDispatch = "DBViewQueries " + Case UCase(sOOCommand) = "DBVIEWREPORTS " : sDispatch = "DBViewReports " + Case UCase(sOOCommand) = "DBVIEWTABLES " : sDispatch = "DBViewTables " + Case iVBACommand = acCmdDelete Or UCase(sOOCommand) = "DELETE" : sDispatch = "Delete" + Case iVBACommand = acCmdDeleteRecord Or UCase(sOOCommand) = "DELETERECORD" : sDispatch = "DeleteRecord" + Case UCase(sOOCommand) = "DESIGNERDIALOG" : sDispatch = "DesignerDialog" + Case UCase(sOOCommand) = "EDIT" : sDispatch = "Edit" + Case UCase(sOOCommand) = "FIRSTRECORD" : sDispatch = "FirstRecord" + Case UCase(sOOCommand) = "FONTDIALOG" : sDispatch = "FontDialog" + Case UCase(sOOCommand) = "FONTHEIGHT" : sDispatch = "FontHeight" + Case UCase(sOOCommand) = "FORMATTEDFIELD" : sDispatch = "FormattedField" + Case UCase(sOOCommand) = "FORMFILTER" : sDispatch = "FormFilter" + Case iVBACommand = acCmdApplyFilterSort Or UCase(sOOCommand) = "FORMFILTERED" : sDispatch = "FormFiltered" + Case UCase(sOOCommand) = "FORMFILTEREXECUTE" : sDispatch = "FormFilterExecute" + Case UCase(sOOCommand) = "FORMFILTEREXIT" : sDispatch = "FormFilterExit" + Case UCase(sOOCommand) = "FORMFILTERNAVIGATOR" : sDispatch = "FormFilterNavigator" + Case UCase(sOOCommand) = "FORMPROPERTIES" : sDispatch = "FormProperties" + Case UCase(sOOCommand) = "FULLSCREEN" : sDispatch = "FullScreen" + Case UCase(sOOCommand) = "GALLERY" : sDispatch = "Gallery" + Case UCase(sOOCommand) = "GRID" : sDispatch = "Grid" + Case iVBACommand = acCmdSnapToGrid Or UCase(sOOCommand) = "GRIDUSE" : sDispatch = "GridUse" + Case iVBACommand = acCmdViewGrid Or UCase(sOOCommand) = "GRIDVISIBLE" : sDispatch = "GridVisible" + Case UCase(sOOCommand) = "GROUPBOX" : sDispatch = "GroupBox" + Case UCase(sOOCommand) = "HELPINDEX" : sDispatch = "HelpIndex" + Case UCase(sOOCommand) = "HELPSUPPORT" : sDispatch = "HelpSupport" + Case iVBACommand = acCmdInsertHyperlink Or UCase(sOOCommand) = "HYPERLINKDIALOG" : sDispatch = "HyperlinkDialog" + Case UCase(sOOCommand) = "IMAGEBUTTON" : sDispatch = "Imagebutton" + Case UCase(sOOCommand) = "IMAGECONTROL" : sDispatch = "ImageControl" + Case UCase(sOOCommand) = "LABEL" : sDispatch = "Label" + Case iVBACommand = acCmdMaximumRecords Or UCase(sOOCommand) = "LASTRECORD" : sDispatch = "LastRecord" + Case UCase(sOOCommand) = "LISTBOX" : sDispatch = "ListBox" + Case UCase(sOOCommand) = "MACRODIALOG" : sDispatch = "MacroDialog" + Case UCase(sOOCommand) = "MACROORGANIZER" : sDispatch = "MacroOrganizer" + Case UCase(sOOCommand) = "NAVIGATIONBAR" : sDispatch = "NavigationBar" + Case iVBACommand = acCmdObjectBrowser Or UCase(sOOCommand) = "NAVIGATOR" : sDispatch = "Navigator" + Case UCase(sOOCommand) = "NEWDOC" : sDispatch = "NewDoc" + Case UCase(sOOCommand) = "NEWRECORD" : sDispatch = "NewRecord" + Case UCase(sOOCommand) = "NEXTRECORD" : sDispatch = "NextRecord" + Case UCase(sOOCommand) = "NUMERICFIELD" : sDispatch = "NumericField" + Case UCase(sOOCommand) = "OPEN" : sDispatch = "Open" + Case UCase(sOOCommand) = "OPTIONSTREEDIALOG" : sDispatch = "OptionsTreeDialog" + Case UCase(sOOCommand) = "ORGANIZER" : sDispatch = "Organizer" + Case UCase(sOOCommand) = "PARAGRAPHDIALOG" : sDispatch = "ParagraphDialog" + Case iVBACommand = acCmdPaste Or UCase(sOOCommand) = "PASTE" : sDispatch = "Paste" + Case iVBACommand = acCmdPasteSpecial Or UCase(sOOCommand) = "PASTESPECIAL " : sDispatch = "PasteSpecial " + Case UCase(sOOCommand) = "PATTERNFIELD" : sDispatch = "PatternField" + Case UCase(sOOCommand) = "PREVRECORD" : sDispatch = "PrevRecord" + Case iVBACommand = acCmdPrint Or UCase(sOOCommand) = "PRINT" : sDispatch = "Print" + Case UCase(sOOCommand) = "PRINTDEFAULT" : sDispatch = "PrintDefault" + Case UCase(sOOCommand) = "PRINTERSETUP" : sDispatch = "PrinterSetup" + Case iVBACommand = acCmdPrintPreview Or UCase(sOOCommand) = "PRINTPREVIEW" : sDispatch = "PrintPreview" + Case UCase(sOOCommand) = "PUSHBUTTON" : sDispatch = "Pushbutton" + Case UCase(sOOCommand) = "QUIT" : sDispatch = "Quit" + Case UCase(sOOCommand) = "RADIOBUTTON" : sDispatch = "RadioButton" + Case iVBACommand = acCmdSaveRecord Or UCase(sOOCommand) = "RECSAVE" : sDispatch = "RecSave" + Case iVBACommand = acCmdFind Or UCase(sOOCommand) = "RECSEARCH" : sDispatch = "RecSearch" + Case iVBACommand = acCmdUndo Or UCase(sOOCommand) = "RECUNDO" : sDispatch = "RecUndo" + Case iVBACommand = acCmdRefresh Or UCase(sOOCommand) = "REFRESH" : sDispatch = "Refresh" + Case UCase(sOOCommand) = "RELOAD" : sDispatch = "Reload" + Case iVBACommand = acCmdRemoveFilterSort Or UCase(sOOCommand) = "REMOVEFILTERSORT" : sDispatch = "RemoveFilterSort" + Case iVBACommand = acCmdRunMacro Or UCase(sOOCommand) = "RUNMACRO" : sDispatch = "RunMacro" + Case iVBACommand = acCmdSave Or UCase(sOOCommand) = "SAVE" : sDispatch = "Save" + Case UCase(sOOCommand) = "SAVEALL" : sDispatch = "SaveAll" + Case iVBACommand = acCmdSaveAs Or UCase(sOOCommand) = "SAVEAS" : sDispatch = "SaveAs" + Case UCase(sOOCommand) = "SAVEBASICAS" : sDispatch = "SaveBasicAs" + Case UCase(sOOCommand) = "SCRIPTORGANIZER" : sDispatch = "ScriptOrganizer" + Case UCase(sOOCommand) = "SCROLLBAR" : sDispatch = "ScrollBar" + Case iVBACommand = acCmdFind Or UCase(sOOCommand) = "SEARCHDIALOG" : sDispatch = "SearchDialog" + Case iVBACommand = acCmdSelectAll Or UCase(sOOCommand) = "SELECTALL" : sDispatch = "SelectAll" + Case iVBACommand = acCmdSelectAllRecords Or UCase(sOOCommand) = "SELECTALL" : sDispatch = "SelectAll" + Case iVBACommand = acCmdSendToBack Or UCase(sOOCommand) = "SENDTOBACK" : sDispatch = "SendToBack" + Case UCase(sOOCommand) = "SHOWFMEXPLORER" : sDispatch = "ShowFmExplorer" + Case UCase(sOOCommand) = "SIDEBAR" : sDispatch = "Sidebar" + Case iVBACommand = acCmdSortDescending Or UCase(sOOCommand) = "SORTDOWN" : sDispatch = "SortDown" + Case iVBACommand = acCmdSortAscending Or UCase(sOOCommand) = "SORTUP" : sDispatch = "Sortup" + Case UCase(sOOCommand) = "SPINBUTTON" : sDispatch = "SpinButton" + Case UCase(sOOCommand) = "STATUSBARVISIBLE" : sDispatch = "StatusBarVisible" + Case UCase(sOOCommand) = "SWITCHCONTROLDESIGNMODE" : sDispatch = "SwitchControlDesignMode" + Case iVBACommand = acCmdTabOrder Or UCase(sOOCommand) = "TABDIALOG" : sDispatch = "TabDialog" + Case UCase(sOOCommand) = "USEWIZARDS" : sDispatch = "UseWizards" + Case UCase(sOOCommand) = "VERSIONDIALOG" : sDispatch = "VersionDialog" + Case UCase(sOOCommand) = "VIEWDATASOURCEBROWSER" : sDispatch = "ViewDataSourceBrowser" + Case iVBACommand = acCmdDatasheetView Or UCase(sOOCommand) = "VIEWFORMASGRID" : sDispatch = "ViewFormAsGrid" + Case iVBACommand = acCmdZoomSelection Or UCase(sOOCommand) = "ZOOM" : sDispatch = "Zoom" + Case Else + If iVBACommand >= 0 Then Goto Exit_Function + sDispatch = pvCommand + End Select + + If pbReturnCommand Then RunCommand = cstUnoPrefix & sDispatch Else Call _DispatchCommand(cstUnoPrefix & sDispatch) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + GoTo Exit_Function +End Function ' RunCommand V0.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RunSQL(Optional ByVal pvSQL As Variant _ + , Optional ByVal pvOption As Variant _ + ) As Boolean +' Return True if the execution of the SQL statement was successful +' SQL must contain an ACTION query + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Utils._SetCalledSub("RunSQL") + + RunSQL = False + If IsMissing(pvSQL) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvSQL, 1, vbString) Then Goto Exit_Function +Const cstNull = -1 + If IsMissing(pvOption) Then + pvOption = cstNull + Else + If Not Utils._CheckArgument(pvOption, 2, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + End If + + RunSQL = Application._CurrentDb.RunSQL(pvSQL, pvOption) + +Exit_Function: + Utils._ResetCalledSub("RunSQL") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "RunSQL", Erl) + GoTo Exit_Function +End Function ' RunSQL V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SelectObject( ByVal Optional pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + , ByVal Optional pvInDatabaseWindow As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "SelectObject" + Utils._SetCalledSub(cstThisSub) + + If IsMissing(pvObjectType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), _ + Array(acDiagram, acForm, acQuery, acTable, acReport, acBasicIDE, acDatabaseWindow, acDocument) _ + ) Then Goto Exit_Function + If IsMissing(pvObjectName) Then + Select Case pvObjectType + Case acForm, acQuery, acTable, acReport, acDocument : Call _TraceArguments() + Case Else + End Select + pvObjectName = "" + Else + If Not Utils._CheckArgument(pvObjectName, 2, vbString) Then Goto Exit_Function + End If + If Not IsMissing(pvInDatabaseWindow) Then + If Not Utils._CheckArgument(pvInDatabaseWindow, 3, vbBoolean, False) Then Goto Exit_Function + End If + +Dim oWindow As Object + Set oWindow = _SelectWindow(pvObjectType, pvObjectName) + If IsNull(oWindow.Frame) Then Goto Error_NotFound + With oWindow.Frame.ContainerWindow + If .isVisible() = False Then .setVisible(True) + .IsMinimized = False + .setFocus() + .setEnable(True) ' Added to try to bypass desynchro issue in Linux + .toFront() ' Added to force window change in Linux + End With + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' SelectObject V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SendObject(ByVal Optional pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + , ByVal Optional pvOutputFormat As Variant _ + , ByVal Optional pvTo As Variant _ + , ByVal Optional pvCc As Variant _ + , ByVal Optional pvBcc As Variant _ + , ByVal Optional pvSubject As Variant _ + , ByVal Optional pvMessageText As Variant _ + , ByVal Optional pvEditMessage As Variant _ + , ByVal Optional pvTemplateFile As Variant _ + ) As Boolean +'Supported: acFormatPDF, acFormatODT, acFormatDOC, acFormatHTML for forms +'To be prepared: acFormatCSV and acFormatODS for tables/queries ? + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("SendObject") + SendObject = False + + If IsMissing(pvObjectType) Then pvObjectType = acSendNoObject + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), Array(acSendNoObject, acSendForm)) Then Goto Exit_Function + If IsMissing(pvObjectName) Then pvObjectName = "" + If Not Utils._CheckArgument(pvObjectName, 2,vbString) Then Goto Exit_Function + If IsMissing(pvOutputFormat) Then pvOutputFormat = "" + If Not Utils._CheckArgument(pvOutputFormat, 3, vbString) Then Goto Exit_Function + If pvOutputFormat <> "" Then + If Not Utils._CheckArgument(UCase(pvOutputFormat), 3, vbString, Array( _ + UCase(acFormatPDF), UCase(acFormatODT), UCase(acFormatDOC), UCase(acFormatHTML) _ + , "PDF", "ODT", "DOC", "HTML", "" _ + )) Then Goto Exit_Function ' A 2nd time to allow case unsensitivity + End If + If IsMissing(pvTo) Then pvTo = "" + If Not Utils._CheckArgument(pvTo, 4, vbString) Then Goto Exit_Function + If IsMissing(pvCc) Then pvCc = "" + If Not Utils._CheckArgument(pvCc, 5, vbString) Then Goto Exit_Function + If IsMissing(pvBcc) Then pvBcc = "" + If Not Utils._CheckArgument(pvBcc, 6, vbString) Then Goto Exit_Function + If IsMissing(pvSubject) Then pvSubject = "" + If Not Utils._CheckArgument(pvSubject, 7, vbString) Then Goto Exit_Function + If IsMissing(pvMessageText) Then pvMessageText = "" + If Not Utils._CheckArgument(pvMessageText, 8, vbString) Then Goto Exit_Function + If IsMissing(pvEditMessage) Then pvEditMessage = True + If Not Utils._CheckArgument(pvEditMessage, 9, vbBoolean) Then Goto Exit_Function + If IsMissing(pvTemplateFile) Then pvTemplateFile = "" + If Not Utils._CheckArgument(pvTemplateFile,10, vbString, "") Then Goto Exit_Function + +Dim vTo() As Variant, vCc() As Variant, vBcc() As Variant, oWindow As Object +Dim sDirectory As String, sOutputFile As String, sSuffix As String, sOutputFormat As String +Const cstSemiColon = ";" + If pvTo <> "" Then vTo() = Split(pvTo, cstSemiColon) Else vTo() = Array() + If pvCc <> "" Then vCc() = Split(pvCc, cstSemiColon) Else vCc() = Array() + If pvBcc <> "" Then vBcc() = Split(pvBcc, cstSemiColon) Else vBcc() = Array() + Select Case True + Case pvObjectType = acSendNoObject And pvObjectName = "" + SendObject = _SendWithoutAttachment(vTo, vCc, vBcc, pvSubject, pvMessageText) + Case Else + If pvObjectType = acSendNoObject And pvObjectName <> "" Then + If Not FileExists(pvObjectName) Then Goto Error_File + sOutputFile = pvObjectName + Else ' OutputFile has to be created + If pvObjectType <> acSendNoObject And pvObjectName = "" Then + oWindow = _SelectWindow() + If oWindow.WindowType <> acSendForm Then Goto Error_Action + pvObjectType = acSendForm + pvObjectName = oWindow._Name + End If + sDirectory = Utils._getTempDirectoryURL() + If Right(sDirectory, 1) <> "/" Then sDirectory = sDirectory & "/" + If pvOutputFormat = "" Then + sOutputFormat = _PromptFormat(Array("PDF", "ODT", "DOC", "HTML")) ' Prompt user for format + If sOutputFormat = "" Then Goto Exit_Function + Else + sOutputFormat = UCase(pvOutputFormat) + End If + Select Case sOutputFormat + Case UCase(acFormatPDF), "PDF" : sSuffix = "pdf" + Case UCase(acFormatDOC), "DOC" : sSuffix = "doc" + Case UCase(acFormatODT), "ODT" : sSuffix = "odt" + Case UCase(acFormatHTML), "HTML" : sSuffix = "html" + End Select + sOutputFile = sDirectory & pvObjectName & "." & sSuffix + If Not OutputTo(pvObjectType, pvObjectName, sOutputFormat, sOutputFile, False) Then Goto Exit_Function + End If + SendObject = _SendWithAttachment(vTo, vCc, vBcc, pvSubject, Array(sOutputFile), pvMessageText, pvEditMessage) + End Select + +Exit_Function: + Utils._ResetCalledSub("SendObject") + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "SendObject", Erl) + GoTo Exit_Function +Error_Action: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0) + Goto Exit_Function +Error_File: + TraceError(TRACEFATAL, ERRFILEACCESS, Utils._CalledSub(), 0, , pvObjectName) + Goto Exit_Function +End Function ' SendObject V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SetHiddenAttribute(ByVal Optional pvObjectType As Variant _ + , ByVal Optional pvObjectName As Variant _ + , ByVal Optional pvHidden As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function + SetHiddenAttribute = False +Const cstThisSub = "SetHiddenAttribute" + Utils._SetCalledSub(cstThisSub) + + If IsMissing(pvObjectType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvObjectType, 1, Utils._AddNumeric(), _ + Array(acDiagram, acForm, acQuery, acTable, acReport, acBasicIDE, acDatabaseWindow), acDocument _ + ) Then Goto Exit_Function + If IsMissing(pvObjectName) Then + Select Case pvObjectType + Case acForm, acQuery, acTable, acReport, acDocument : Call _TraceArguments() + Case Else + End Select + pvObjectName = "" + Else + If Not Utils._CheckArgument(pvObjectName, 2, vbString) Then Goto Exit_Function + End If + If IsMissing(pvHidden) Then + pvHidden = True + Else + If Not Utils._CheckArgument(pvHidden, 3, vbBoolean) Then Goto Exit_Function + End If + +Dim oWindow As Object + Set oWindow = _SelectWindow(pvObjectType, pvObjectName) + If IsNull(oWindow.Frame) Then Goto Error_NotFound + oWindow.Frame.ContainerWindow.setVisible(Not pvHidden) + SetHiddenAttribute = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("OBJECT"), pvObjectName)) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' SetHiddenAttribute V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SetOrderBy( _ + ByVal Optional pvOrder As Variant _ + , ByVal Optional pvControlName As Variant _ + ) As Boolean +' Sort ann open table, query, form or subform (if pvControlName present) + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "SetOrderBy" + Utils._SetCalledSub(cstThisSub) + SetOrderBy = False + + If IsMissing(pvOrder) Then pvOrder = "" + If Not Utils._CheckArgument(pvOrder, 1, vbString) Then Goto Exit_Function + If IsMissing(pvControlName) Then pvControlName = "" + If Not Utils._CheckArgument(pvControlName, 1, vbString) Then Goto Exit_Function + +Dim sOrder As String, oWindow As Object, oDatabase As Object, oTarget As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + sOrder = oDatabase._ReplaceSquareBrackets(pvOrder) + + Set oWindow = _SelectWindow() + With oWindow + Select Case .WindowType + Case acForm + Set oTarget = _DatabaseForm(._Name, pvControlName) + Case acQuery, acTable + If pvControlName <> "" Then Goto Exit_Function + If IsNull(.Frame.Controller.FormOperations) Then Goto Error_NotApplicable + ' FormOperations returns <Null> in OpenOffice + Set oTarget = .Frame.Controller.FormOperations.Cursor + Case Else ' Ignore action + Goto Exit_Function + End Select + End With + + With oTarget + .Order = sOrder + .reload() + End With + SetOrderBy = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' SetOrderBy V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ShowAllrecords() As Boolean +' Removes any existing filter that exists on the current table, query or form + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "ShowAllRecords" + Utils._SetCalledSub(cstThisSub) + ShowAllRecords = False + +Dim oWindow As Object, oDatabase As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + Set oWindow = _SelectWindow() + Select Case oWindow.WindowType + Case acForm, acQuery, acTable + RunCommand(acCmdRemoveFilterSort) + ShowAllrecords = True + Case Else ' Ignore action + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' ShowAllrecords V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _CheckColumnType(pvFindWhat As Variant, vDataField As Variant) As Boolean +' Return true if both arguments of the same type +' vDataField is a ResultSet column + +Dim bFound As Boolean + bFound = False + With com.sun.star.sdbc.DataType + Select Case vDataField.Type + Case .DATE, .TIME, .TIMESTAMP + If VarType(pvFindWhat) = vbDate Then bFound = True + Case .TINYINT, .SMALLINT, .INTEGER, .BIGINT, .FLOAT, .REAL, .DOUBLE, .NUMERIC, .DECIMAL + If Utils._InList(VarType(pvFindWhat), Utils._AddNumeric()) Then bFound = True + Case .CHAR, .VARCHAR, .LONGVARCHAR + If VarType(pvFindWhat) = vbString Then bFound = True + Case Else + End Select + End With + + _CheckColumnType = bFound + +End Function ' _CheckColumnType V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Sub _ConvertDataDescriptor( ByRef poSource As Object _ + , ByVal piSourceRDBMS As Integer _ + , ByRef poTarget As Object _ + , ByRef poDatabase As Object _ + , ByVal Optional pbKey As Boolean _ + ) +' Convert source column descriptor to target descriptor +' If RDMSs identical, simply move property by property +' Otherwise +' - Use Type conversion tables (cfr. DataTypes By RDBMS.ods case study) +' - Select among synonyms the entry with the lowest Precision at least >= source Precision +' - Derive TypeName and Precision values + +Dim vTypesReference() As Variant, vTypes() As Variant, vTypeNames() As Variant +Dim i As Integer, iType As Integer, iTypeAlias As Integer +Dim iNbTypes As Integer, iBestFit As Integer, lFitPrecision As Long, lPrecision As Long + + On Local Error Goto Error_Sub + If IsMissing(pbKey) Then pbKey = False + + poTarget.Name = poSource.Name + poTarget.Description = poSource.Description + If Not pbKey Then + poTarget.ControlDefault = poSource.ControlDefault + poTarget.FormatKey = poSource.FormatKey + poTarget.HelpText = poSource.HelpText + poTarget.Hidden = poSource.Hidden + End If + poTarget.IsCurrency = poSource.IsCurrency + poTarget.IsNullable = poSource.IsNullable + poTarget.Scale = poSource.Scale + + If piSourceRDBMS = poDatabase._RDBMS Or poDatabase._RDBMS = DBMS_UNKNOWN Then + poTarget.Type = poSource.Type + poTarget.Precision = poSource.Precision + poTarget.TypeName = poSource.TypeName + Goto Exit_Sub + End If + + ' Search DataType compatibility + With poDatabase + ' Find source datatype entry in Reference array + iType = -1 + For i = 0 To UBound(._ColumnTypesReference) + If ._ColumnTypesReference(i) = poSource.Type Then + iType = i + Exit For + End If + Next i + If iType = -1 Then Goto Error_Compatibility + iTypeAlias = ._ColumnTypesAlias(iType) + ' Find best choice for the datatype of the target column + iNbTypes = UBound(._ColumnTypes) + iBestFit = -1 + lFitPrecision = -2 ' Some POSTGRES datatypes have a precision of -1 + For i = 0 To iNbTypes + If ._ColumnTypes(i) = iTypeAlias Then ' Minimal fit = correct datatype + lPrecision = ._ColumnPrecisions(i) + If iBestFit = -1 _ + Or (iBestFit > -1 And poSource.Precision > 0 And lPrecision >= poSource.Precision And lPrecision < lFitPrecision) _ + Or (iBestFit > -1 And poSource.Precision = 0 And lPrecision > lFitPrecision) Then ' First fit or better fit + iBestFit = i + lFitPrecision = lPrecision + End If + End If + Next i + If iBestFit = -1 Then Goto Error_Compatibility + poTarget.Type = iTypeAlias + poTarget.Precision = lFitPrecision + poTarget.TypeName = ._ColumnTypeNames(iBestFit) + End With + +Exit_Sub: + Exit Sub +Error_Compatibility: + TraceError(TRACEFATAL, ERRCOMPATIBILITY, Utils._CalledSub(), 0, 1, poSource.Name) + Goto Exit_Sub +Error_Sub: + TraceError(TRACEABORT, Err, "_ConvertDataDescriptor", Erl) + Goto Exit_Sub +End Sub ' ConvertDataDescriptor V1.6.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _DatabaseForm(psForm As String, psControl As String) +'Return DatabaseForm element of Form object (based on psForm which is known as a real form name) +'or of SubForm object (based on psControl which is checked for being a subform) + +Dim oForm As Object, oControl As Object, sControls() As String, iControlCount As Integer +Dim bFound As Boolean, i As Integer, sName As String + + Set oForm = Application.Forms(psForm) + If psControl <> "" Then ' Search subform + With oForm.DatabaseForm + iControlCount = .getCount() + bFound = False + If iControlCount > 0 Then + sControls() = .getElementNames() + sName = UCase(Utils._Trim(psControl)) + For i = 0 To iControlCount - 1 + If UCase(sControls(i)) = sName Then + bFound = True + Exit For + End If + Next i + End If + End With + If bFound Then sName = sControls(i) Else Goto Trace_NotFound + Set oControl = oForm.Controls(sName) + If oControl._SubType <> CTLSUBFORM Then Goto Trace_SubFormNotFound + Set _DatabaseForm = oControl.Form.DatabaseForm + Else + Set _DatabaseForm = oForm.DatabaseForm + End If + +Exit_Function: + Exit Function +Trace_NotFound: + TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(psControl, psForm)) + Goto Exit_Function +Trace_SubFormNotFound: + TraceError(TRACEFATAL, ERRSUBFORMNOTFOUND, Utils._CalledSub(), 0, , Array(psControl, psForm)) + Goto Exit_Function +End Function ' _DatabaseForm V1.2.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub _DispatchCommand(ByVal psCommand As String) +' Execute command given as argument - ".uno:" is presumed already present +Dim oDocument As Object, oDispatcher As Object, oArgs() As new com.sun.star.beans.PropertyValue, sTargetFrameName As String +Dim oResult As Variant +Dim sCommand As String + + Set oDocument = _SelectWindow().Frame + Set oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") + sTargetFrameName = "" + oResult = oDispatcher.executeDispatch(oDocument, psCommand, sTargetFrameName, 0, oArgs()) + +End Sub ' _DispatchCommand V1.3.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _getUpperShortcut(ByVal psShortcut As String, ByVal psLastComponent As String) As String +' Return "Forms!myForm" from "Forms!myForm!datField" and "datField" + + If Len(psShortcut) > Len(psLastComponent) Then + _getUpperShortcut = Split(psShortcut, "!" & Utils._Surround(psLastComponent))(0) + Else + _getUpperShortcut = psShortcut + End If + +End Function ' _getUpperShortcut + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _OpenObject(ByVal psObjectType As String _ + , ByVal pvObjectName As Variant _ + , ByVal pvView As Variant _ + , ByVal pvDataMode As Variant _ + ) As Boolean + + If _ErrorHandler() Then On Local Error Goto Error_Function + + _OpenObject = False + If Not (Utils._CheckArgument(pvObjectName, 1, vbString) _ + And Utils._CheckArgument(pvView, 2, Utils._AddNumeric(), Array(acViewNormal, acViewPreview, acViewDesign)) _ + And Utils._CheckArgument(pvDataMode, 3, Utils._AddNumeric(), Array(acEdit)) _ + ) Then Goto Exit_Function +Dim oDatabase As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + +Dim sObjects() As String, sObjectName As String, oController As Object, oObject As Object +Dim i As Integer, bFound As Boolean, lComponent As Long, oQuery As Object + + ' Check existence of object and find its exact (case-sensitive) name + Select Case psObjectType + Case "Table" + sObjects = oDatabase.Connection.getTables.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.TABLE + Case "Query" + sObjects = oDatabase.Connection.getQueries.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.QUERY + Case "Report" + sObjects = oDatabase.Document.getReportDocuments.ElementNames() + lComponent = com.sun.star.sdb.application.DatabaseObject.REPORT + End Select + bFound = False + For i = 0 To UBound(sObjects) + If UCase(pvObjectName) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + bFound = True + Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + + If psObjectType = "Query" Then ' Processing for action query + Set oQuery = Application._CurrentDb().QueryDefs(pvObjectName) + If oQuery.pType <> dbQSelect Then + _OpenObject = oQuery.Execute() + GoTo Exit_Function + End If + End If + Set oController = oDatabase.Document.CurrentController + Set oObject = oController.loadComponent(lComponent, sObjectName, ( pvView = acViewDesign )) + _OpenObject = True + +Exit_Function: + Set oObject = Nothing + Set oQuery = Nothing + Set oController = Nothing + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "OpenObject", Erl) + GoTo Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERROPENOBJECT, Utils._CalledSub(), 0, , Array(_GetLabel(psObjectType), pvObjectName)) + Goto Exit_Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0, 1) + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel(psObjectType), pvObjectName)) + Goto Exit_Function +End Function ' _OpenObject V0.8.9 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PromptFormat(ByVal pvList As Variant) As String +' Return user selection in Format dialog + +Dim oDialog As Object, iOKCancel As Integer, oControl As Object + + Set oDialog = CreateUnoDialog(Utils._GetDialogLib().dlgFormat) + oDialog.Title = _GetLabel("DLGFORMAT_TITLE") + + Set oControl = oDialog.Model.getByName("lblFormat") + oControl.Label = _GetLabel("DLGFORMAT_LBLFORMAT_LABEL") + oControl.HelpText = _GetLabel("DLGFORMAT_LBLFORMAT_HELP") + + Set oControl = oDialog.Model.getByName("cboFormat") + oControl.HelpText = _GetLabel("DLGFORMAT_LBLFORMAT_HELP") + + Set oControl = oDialog.Model.getByName("cmdOK") + oControl.Label = _GetLabel("DLGFORMAT_CMDOK_LABEL") + oControl.HelpText = _GetLabel("DLGFORMAT_CMDOK_HELP") + + Set oControl = oDialog.Model.getByName("cmdCancel") + oControl.Label = _GetLabel("DLGFORMAT_CMDCANCEL_LABEL") + oControl.HelpText = _GetLabel("DLGFORMAT_CMDCANCEL_HELP") + + Set oControl = oDialog.Model.getByName("cboFormat") + If UBound(pvList) >= 0 Then + oControl.Text = pvList(0) + oControl.StringItemList = pvList + Else + oControl.Text = "" + oControl.StringItemList = Array() + End If + + iOKCancel = oDialog.Execute() + Select Case iOKCancel + Case 1 ' OK + _PromptFormat = oControl.Text + Case 0 ' Cancel + _PromptFormat = "" + Case Else + End Select + oDialog.Dispose() + +End Function ' _PromptFormat V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _SelectWindow(Optional ByVal piWindowType As Integer, Optional ByVal psWindow As String) As Object +' No argument: find active window +' 2 arguments: find corresponding window +' Return a _Window object type describing the found window + +Dim oEnum As Object, oDesk As Object, oComp As Object, oFrame As Object, i As Integer +Dim bFound As Boolean, bActive As Boolean, sName As String, iType As Integer, sDocumentType As String +Dim sImplementation As String, vLocation() As Variant +Dim oWindow As _Window +Dim vPersistent As Variant, oForm As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function + + bActive = IsMissing(piWindowType) + If IsMissing(psWindow) Then psWindow = "" + Set oWindow.Frame = Nothing + oWindow.DocumentType = "" + If bActive Then + oWindow.WindowType = acDefault + oWindow._Name = "" + Else + oWindow.WindowType = piWindowType + Select Case piWindowType + Case acBasicIDE, acDatabaseWindow : oWindow._Name = "" + Case Else : oWindow._Name = psWindow + End Select + End If + iType = acDefault + sDocumentType = "" + + Set oDesk = CreateUnoService("com.sun.star.frame.Desktop") + Set oEnum = oDesk.Components().createEnumeration + Do While oEnum.hasMoreElements + Set oComp = oEnum.nextElement + If Utils._hasUNOProperty(oComp, "ImplementationName") Then sImplementation = oComp.ImplementationName Else sImplementation = "" + Select Case sImplementation + Case "com.sun.star.comp.basic.BasicIDE" + Set oFrame = oComp.CurrentController.Frame + iType = acBasicIDE + sName = "" + Case "com.sun.star.comp.dba.ODatabaseDocument" + Set oFrame = oComp.CurrentController.Frame + iType = acDatabaseWindow + sName = "" + Case "SwXTextDocument" + If HasUnoInterfaces(oComp, "com.sun.star.frame.XModule") Then + Select Case oComp.Identifier + Case "com.sun.star.sdb.FormDesign" ' Form + iType = acForm + Case "com.sun.star.sdb.TextReportDesign" ' Report + iType = acReport + Case "com.sun.star.text.TextDocument" ' Writer + vLocation = Split(oComp.getLocation(), "/") + If UBound(vLocation) >= 0 Then sName = Join(Split(vLocation(UBound(vLocation)), "%20"), " ") Else sName = "" + iType = acDocument + sDocumentType = docWriter + End Select + If iType = acForm Then ' Identify persistent Form name + vPersistent = Split(oComp.StringValue, "/") + sName = _GetHierarchicalName(vPersistent(UBound(vPersistent) - 1)) + ElseIf iType = acReport Then ' Identify Report name + For i = 0 To UBound(oComp.Args()) + If oComp.Args(i).Name = "DocumentTitle" Then + sName = oComp.Args(i).Value + Exit For + End If + Next i + End If + Set oFrame = oComp.CurrentController.Frame + End If + Case "org.openoffice.comp.dbu.ODatasourceBrowser" + Set oFrame = oComp.Frame + If Not IsEmpty(oComp.Selection) Then ' Empty for (F4) DatasourceBrowser !! + For i = 0 To UBound(oComp.Selection()) + If oComp.Selection(i).Name = "Command" Then + sName = oComp.Selection(i).Value + ElseIf oComp.Selection(i).Name = "CommandType" Then + Select Case oComp.selection(i).Value + Case com.sun.star.sdb.CommandType.TABLE + iType = acTable + Case com.sun.star.sdb.CommandType.QUERY + iType = acQuery + Case com.sun.star.sdb.CommandType.COMMAND + iType = acQuery ' SQL for future use ? + End Select + End If + Next i + ' Else ignore + End If + Case "org.openoffice.comp.dbu.OTableDesign", "org.openoffice.comp.dbu.OQueryDesign" ' Table or Query in Edit mode + If Not bActive Then + If UCase(Right(oComp.Title, Len(psWindow))) = UCase(psWindow) Then ' No rigorous mean found to identify Name + Set oFrame = oComp.Frame + Select Case sImplementation + Case "org.openoffice.comp.dbu.OTableDesign" : iType = acTable + Case "org.openoffice.comp.dbu.OQueryDesign" : iType = acQuery + End Select + sName = Right(oComp.Title, Len(psWindow)) + End If + Else + Set oFrame = Nothing + End If + Case "org.openoffice.comp.dbu.ORelationDesign" + Set oFrame = oComp.Frame + iType = acDiagram + sName = "" + Case "com.sun.star.comp.sfx2.BackingComp" ' Welcome screen + Set oFrame = oComp.Frame + iType = acWelcome + sName = "" + Case Else ' Other Calc, ..., whatever documents + If Utils._hasUNOProperty(oComp, "Location") Then + vLocation = Split(oComp.getLocation(), "/") + If UBound(vLocation) >= 0 Then sName = Join(Split(vLocation(UBound(vLocation)), "%20"), " ") Else sName = "" + iType = acDocument + If Utils._hasUNOProperty(oComp, "Identifier") Then + Select Case oComp.Identifier + Case "com.sun.star.sheet.SpreadsheetDocument" : sDocumentType = docCalc + Case "com.sun.star.presentation.PresentationDocument" : sDocumentType = docImpress + Case "com.sun.star.drawing.DrawingDocument" : sDocumentType = docDraw + Case "com.sun.star.formula.FormulaProperties" : sDocumentType = docMath + Case Else : sDocumentType = "" + End Select + End If + Set oFrame = oComp.CurrentController.Frame + End If + End Select + If bActive And Not IsNull(oFrame) Then + If oFrame.ContainerWindow.IsActive() Then + bFound = True + Exit Do + End If + ElseIf iType = piWindowType And UCase(sName) = UCase(psWindow) Then + bFound = True + Exit Do + End If + Loop + + If bFound Then + Set oWindow.Frame = oFrame + oWindow._Name = sName + oWindow.WindowType = iType + oWindow.DocumentType = sDocumentType + Else + Set oWindow.Frame = Nothing + End If + +Exit_Function: + Set _SelectWindow = oWindow + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SelectWindow", Erl) + GoTo Exit_Function +End Function ' _SelectWindow V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _SendWithAttachment( _ + ByVal pvRecipients() As Variant _ + , ByVal pvCcRecipients() As Variant _ + , ByVal pvBccRecipients() As Variant _ + , ByVal psSubject As String _ + , ByVal pvAttachments() As Variant _ + , ByVal pvBody As String _ + , ByVal pbEditMessage As Boolean _ + ) As Boolean + +' Send message with attachments + If _ErrorHandler() Then On Local Error Goto Error_Function + _SendWithAttachment = False + +Const cstWindows = 1 +Const cstLinux = 4 +Const cstSemiColon = ";" +Dim oServiceMail as Object, oMail As Object, oMessage As Object, vFlag As Variant +Dim vCc() As Variant, i As Integer, iOS As Integer, sProduct As String, bMailProvider As Boolean + + 'OPENOFFICE <= 3.6 and LIBREOFFICE have XSimple...Mail interface while OPENOFFICE >= 4.0 has XSystemMailProvider interface + sProduct = UCase(Utils._GetProductName()) + bMailProvider = ( Left(sProduct, 4) = "OPEN" And Left(_GetProductName("VERSION"), 3) >= "4.0" ) + + iOS = GetGuiType() + Select Case iOS + Case cstLinux + oServiceMail = createUnoService("com.sun.star.system.SimpleCommandMail") + Case cstWindows + If bMailProvider Then oServiceMail = createUnoService("com.sun.star.system.SystemMailProvider") _ + Else oServiceMail = createUnoService("com.sun.star.system.SimpleSystemMail") + Case Else + Goto Error_Mail + End Select + + If bMailProvider Then Set oMail = oServiceMail.queryMailClient() _ + Else Set oMail = oServiceMail.querySimpleMailClient() + If IsNull(oMail) Then Goto Error_Mail + + 'Reattribute Recipients >= 2nd to ccRecipients + If UBound(pvRecipients) <= 0 Then + If UBound(pvCcRecipients) >= 0 Then vCc = pvCcRecipients + Else + ReDim vCc(0 To UBound(pvRecipients) - 1 + UBound(pvCcRecipients) + 1) + For i = 0 To UBound(pvRecipients) - 1 + vCc(i) = pvRecipients(i + 1) + Next i + For i = UBound(pvRecipients) To UBound(vCc) + vCc(i) = pvCcRecipients(i - UBound(pvRecipients)) + Next i + End If + + If bMailProvider Then + Set oMessage = oMail.createMailMessage() + If UBound(pvRecipients) >= 0 Then oMessage.Recipient = pvRecipients(0) + If psSubject <> "" Then oMessage.Subject = psSubject + Select Case iOS ' Not published differences between com.sun.star.system.SimpleCommandMail and SimpleSystemMail + Case cstLinux + If UBound(vCc) >= 0 Then oMessage.CcRecipient = Array(Join(vCc, cstSemiColon)) + If UBound(pvBccRecipients) >= 0 Then oMessage.BccRecipient = Array(Join(pvBccRecipients, cstSemiColon)) + Case cstWindows + If UBound(vCc) >= 0 Then oMessage.CcRecipient = vCc + If UBound(pvBccRecipients) >= 0 Then oMessage.BccRecipient = pvBccRecipients + End Select + If UBound(pvAttachments) >= 0 Then oMessage.Attachement = pvAttachments + If pvBody <> "" Then oMessage.Body = pvBody + If pbEditMessage Then + vFlag = com.sun.star.system.MailClientFlags.DEFAULTS + Else + vFlag = com.sun.star.system.MailClientFlags.NO_USER_INTERFACE + End If + oMail.sendMailMessage(oMessage, vFlag) + Else + Set oMessage = oMail.createSimpleMailMessage() ' Body NOT SUPPORTED ! + If UBound(pvRecipients) >= 0 Then oMessage.setRecipient(pvRecipients(0)) + If psSubject <> "" Then oMessage.setSubject(psSubject) + Select Case iOS + Case cstLinux + If UBound(vCc) >= 0 Then oMessage.setCcRecipient(Array(Join(vCc, cstSemiColon))) + If UBound(pvBccRecipients) >= 0 Then oMessage.setBccRecipient(Array(Join(pvBccRecipients, cstSemiColon))) + Case cstWindows + If UBound(vCc) >= 0 Then oMessage.setCcRecipient(vCc) + If UBound(pvBccRecipients) >= 0 Then oMessage.setBccRecipient(pvBccRecipients) + End Select + If UBound(pvAttachments) >= 0 Then oMessage.setAttachement(pvAttachments) + If pbEditMessage Then + vFlag = com.sun.star.system.SimpleMailClientFlags.DEFAULTS + Else + vFlag = com.sun.star.system.SimpleMailClientFlags.NO_USER_INTERFACE + End If + oMail.sendSimpleMailMessage(oMessage, vFlag) + End If + + _SendWithAttachment = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "_SendWithAttachment", Erl) + Goto Exit_Function +Error_Mail: + TraceError(TRACEFATAL, ERRSENDMAIL, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' _SendWithAttachment V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _SendWithoutAttachment(ByVal pvTo As Variant _ + , ByVal pvCc As Variant _ + , ByVal pvBcc As Variant _ + , ByVal psSubject As String _ + , ByVal psBody As String _ + ) As Boolean +'Send simple message with mailto: syntax +Dim sMailTo As String, sTo As String, sCc As String, sBcc As String, oDispatch As Object +Const cstComma = "," + + If _ErrorHandler() Then On Local Error Goto Error_Function + + If UBound(pvTo) >= 0 Then sTo = Trim(Join(pvTo, cstComma)) Else sTo = "" + If UBound(pvCc) >= 0 Then sCc = Trim(Join(pvCc, cstComma)) Else sCc = "" + If UBound(pvBcc) >= 0 Then sBcc = Trim(Join(pvBcc, cstComma)) Else sBcc = "" + + sMailTo = "mailto:" _ + & sTo & "?" _ + & Iif(sCc = "", "", "cc=" & sCc & "&") _ + & Iif(sBcc = "", "", "bcc=" & sBcc & "&") _ + & Iif(psSubject = "", "", "subject=" & psSubject & "&") _ + & Iif(psBody = "", "", "body=" & psBody & "&") + If Right(sMailTo, 1) = "&" Or Right(sMailTo, 1) = "?" Then sMailTo = Left(sMailTo, Len(sMailTo) - 1) + sMailTo = ConvertToUrl(sMailTo) + + oDispatch = createUnoService( "com.sun.star.frame.DispatchHelper") + oDispatch.executeDispatch(StarDesktop, sMailTo, "", 0, Array()) + + _SendWithoutAttachment = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "_SendWithoutAttachments", Erl) + _SendWithoutAttachment = False + Goto Exit_Function +End Function ' _SendWithoutAttachment V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub _ShellExecute(sCommand As String) +' Execute shell command + +Dim oShell As Object + Set oShell = createUnoService("com.sun.star.system.SystemShellExecute") + oShell.execute(sCommand, "" , com.sun.star.system.SystemShellExecuteFlags.DEFAULTS) + +End Sub ' _ShellExecute V0.8.5 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Event.xba b/wizards/source/access2base/Event.xba new file mode 100644 index 000000000..eb5f23019 --- /dev/null +++ b/wizards/source/access2base/Event.xba @@ -0,0 +1,493 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Event" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be EVENT +Private _EventSource As Object +Private _EventType As String +Private _EventName As String +Private _SubComponentName As String +Private _SubComponentType As Long +Private _ContextShortcut As String +Private _ButtonLeft As Boolean ' com.sun.star.awt.MouseButton.XXX +Private _ButtonRight As Boolean +Private _ButtonMiddle As Boolean +Private _XPos As Variant ' Null or Long +Private _YPos As Variant ' Null or Long +Private _ClickCount As Long +Private _KeyCode As Integer ' com.sun.star.awt.Key.XXX +Private _KeyChar As String +Private _KeyFunction As Integer ' com.sun.star.awt.KeyFunction.XXX +Private _KeyAlt As Boolean +Private _KeyCtrl As Boolean +Private _KeyShift As Boolean +Private _FocusChangeTemporary As Boolean ' False if user action in same window +Private _RowChangeAction As Long ' com.sun.star.sdb.RowChangeAction.XXX +Private _Recommendation As String ' "IGNORE" or "" + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJEVENT + _EventSource = Nothing + _EventType = "" + _EventName = "" + _SubComponentName = "" + _SubComponentType = -1 + _ContextShortcut = "" + _ButtonLeft = False ' See com.sun.star.awt.MouseButton.XXX + _ButtonRight = False + _ButtonMiddle = False + _XPos = Null + _YPos = Null + _ClickCount = 0 + _KeyCode = 0 + _KeyChar = "" + _KeyFunction = com.sun.star.awt.KeyFunction.DONTKNOW + _KeyAlt = False + _KeyCtrl = False + _KeyShift = False + _FocusChangeTemporary = False + _RowChangeAction = 0 + _Recommendation = "" +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ButtonLeft() As Variant + ButtonLeft = _PropertyGet("ButtonLeft") +End Property ' ButtonLeft (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ButtonMiddle() As Variant + ButtonMiddle = _PropertyGet("ButtonMiddle") +End Property ' ButtonMiddle (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ButtonRight() As Variant + ButtonRight = _PropertyGet("ButtonRight") +End Property ' ButtonRight (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ClickCount() As Variant + ClickCount = _PropertyGet("ClickCount") +End Property ' ClickCount (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ContextShortcut() As Variant + ContextShortcut = _PropertyGet("ContextShortcut") +End Property ' ContextShortcut (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get EventName() As Variant + EventName = _PropertyGet("EventName") +End Property ' EventName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get EventSource() As Variant + EventSource = _PropertyGet("EventSource") +End Property ' EventSource (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get EventType() As Variant + EventType = _PropertyGet("EventType") +End Property ' EventType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FocusChangeTemporary() As Variant + FocusChangeTemporary = _PropertyGet("FocusChangeTemporary") +End Property ' FocusChangeTemporary (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyAlt() As Variant + KeyAlt = _PropertyGet("KeyAlt") +End Property ' KeyAlt (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyChar() As Variant + KeyChar = _PropertyGet("KeyChar") +End Property ' KeyChar (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyCode() As Variant + KeyCode = _PropertyGet("KeyCode") +End Property ' KeyCode (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyCtrl() As Variant + KeyCtrl = _PropertyGet("KeyCtrl") +End Property ' KeyCtrl (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyFunction() As Variant + KeyFunction = _PropertyGet("KeyFunction") +End Property ' KeyFunction (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get KeyShift() As Variant + KeyShift = _PropertyGet("KeyShift") +End Property ' KeyShift (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Recommendation() As Variant + Recommendation = _PropertyGet("Recommendation") +End Property ' Recommendation (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RowChangeAction() As Variant + RowChangeAction = _PropertyGet("RowChangeAction") +End Property ' RowChangeAction (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Source() As Variant +' Return the object having fired the event: Form, Control or SubForm +' Else return the root Database object + Source = _PropertyGet("Source") +End Function ' Source (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SubComponentName() As String + SubComponentName = _PropertyGet("SubComponentName") +End Property ' SubComponentName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SubComponentType() As Long + SubComponentType = _PropertyGet("SubComponentType") +End Property ' SubComponentType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get XPos() As Variant + XPos = _PropertyGet("XPos") +End Property ' XPos (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get YPos() As Variant + YPos = _PropertyGet("YPos") +End Property ' YPos (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Form.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Form.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _Initialize(poEvent As Object) + +Dim oObject As Object, i As Integer +Dim sShortcut As String, sAddShortcut As String, sArray() As String +Dim sImplementation As String, oSelection As Object +Dim iCurrentDoc As Integer, oDoc As Object +Dim vPersistent As Variant +Const cstDatabaseForm = "com.sun.star.comp.forms.ODatabaseForm" + + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set oObject = poEvent.Source + _EventSource = oObject + sArray = Split(Utils._getUNOTypeName(poEvent), ".") + _EventType = UCase(sArray(UBound(sArray))) + If Utils._hasUNOProperty(poEvent, "EventName") Then _EventName = poEvent.EventName + + Select Case _EventType + Case "DOCUMENTEVENT" + 'SubComponent processing + Select Case UCase(_EventName) + Case UCase("OnSubComponentClosed"), UCase("OnSubComponentOpened") + Set oSelection = poEvent.ViewController.getSelection()(0) + _SubComponentName = oSelection.Name + With com.sun.star.sdb.application.DatabaseObject + Select Case oSelection.Type + Case .TABLE : _SubComponentType = acTable + Case .QUERY : _SubComponentType = acQuery + Case .FORM : _SubComponentType = acForm + Case .REPORT : _SubComponentType = acReport + Case Else + End Select + End With + Case Else + End Select + Case "EVENTOBJECT" + Case "ACTIONEVENT" + Case "FOCUSEVENT" + _FocusChangeTemporary = poEvent.Temporary + Case "ITEMEVENT" + Case "INPUTEVENT", "KEYEVENT" + _KeyCode = poEvent.KeyCode + _KeyChar = poEvent.KeyChar + _KeyFunction = poEvent.KeyFunc + _KeyAlt = Utils._BitShift(poEvent.Modifiers, com.sun.star.awt.KeyModifier.MOD2) + _KeyCtrl = Utils._BitShift(poEvent.Modifiers, com.sun.star.awt.KeyModifier.MOD1) + _KeyShift = Utils._BitShift(poEvent.Modifiers, com.sun.star.awt.KeyModifier.SHIFT) + Case "MOUSEEVENT" + _ButtonLeft = Utils._BitShift(poEvent.Buttons, com.sun.star.awt.MouseButton.LEFT) + _ButtonRight = Utils._BitShift(poEvent.Buttons, com.sun.star.awt.MouseButton.RIGHT) + _ButtonMiddle = Utils._BitShift(poEvent.Buttons, com.sun.star.awt.MouseButton.MIDDLE) + _XPos = poEvent.X + _YPos = poEvent.Y + _ClickCount = poEvent.ClickCount + Case "ROWCHANGEEVENT" + _RowChangeAction = poEvent.Action + Case "TEXTEVENT" + Case "ADJUSTMENTEVENT", "DOCKINGEVENT", "ENDDOCKINGEVENT", "ENDPOPUPMODEEVENT", "ENHANCEDMOUSEEVENT" _ + , "MENUEVENT", "PAINTEVENT", "SPINEVENT", "VCLCONTAINEREVENT", "WINDOWEVENT" + Goto Exit_Function + Case Else + Goto Exit_Function + End Select + + ' Evaluate ContextShortcut + sShortcut = "" + sImplementation = Utils._ImplementationName(oObject) + + Select Case True + Case sImplementation = "stardiv.Toolkit.UnoDialogControl" ' Dialog + _ContextShortcut = "Dialogs!" & _EventSource.Model.Name + Goto Exit_Function + Case Left(sImplementation, 16) = "stardiv.Toolkit." ' Control in Dialog + _ContextShortcut = "Dialogs!" & _EventSource.Context.Model.Name _ + & "!" & _EventSource.Model.Name + Goto Exit_Function + Case Else + End Select + + iCurrentDoc = _A2B_.CurrentDocIndex(, False) + If iCurrentDoc < 0 Then Goto Exit_Function + Set oDoc = _A2B_.CurrentDocument(iCurrentDoc) + + ' To manage 2x triggers of "Before record action" form event + If _EventType = "ROWCHANGEEVENT" And sImplementation <> "com.sun.star.comp.forms.ODatabaseForm" Then _Recommendation = "IGNORE" + + Do While sImplementation <> "SwXTextDocument" + sAddShortcut = "" + Select Case sImplementation + Case "com.sun.star.comp.forms.OFormsCollection" ' Do nothing + Case Else + If Utils._hasUNOProperty(oObject, "Model") Then + If oObject.Model.Name <> "MainForm" And oObject.Model.Name <> "Form" Then sAddShortcut = Utils._Surround(oObject.Model.Name) + ElseIf Utils._hasUNOProperty(oObject, "Name") Then + If oObject.Name <> "MainForm" And oObject.Name <> "Form" Then sAddShortcut = Utils._Surround(oObject.Name) + End If + If sAddShortcut <> "" Then + If sImplementation = cstDatabaseForm And oDoc.DbConnect = DBCONNECTBASE Then sAddShortcut = sAddShortcut & ".Form" + sShortcut = sAddShortcut & Iif(Len(sShortcut) > 0, "!" & sShortcut, "") + End If + End Select + Select Case True + Case Utils._hasUNOProperty(oObject, "Model") + Set oObject = oObject.Model.Parent + Case Utils._hasUNOProperty(oObject, "Parent") + Set oObject = oObject.Parent + Case Else + Goto Exit_Function + End Select + sImplementation = Utils._ImplementationName(oObject) + Loop + ' Add Forms! prefix + Select Case oDoc.DbConnect + Case DBCONNECTBASE + vPersistent = Split(oObject.StringValue, "/") + sAddShortcut = Utils._Surround(_GetHierarchicalName(vPersistent(UBound(vPersistent) - 1))) + sShortcut = "Forms!" & sAddShortcut & "!" & sShortcut + Case DBCONNECTFORM + sShortcut = "Forms!0!" & sShortcut + End Select + + sArray = Split(sShortcut, "!") + ' If presence of "Forms!myform!myform.Form", eliminate 2nd element + ' Eliminate anyway blanco subcomponents (e.g. Forms!!myForm) + If UBound(sArray) >= 2 Then + If UCase(sArray(1)) & ".FORM" = UCase(sArray(2)) Then sArray(1) = "" + sArray = Utils._TrimArray(sArray) + End If + ' If first element ends with .Form, remove suffix + If UBound(sArray) >= 1 Then + If Len(sArray(1)) > 5 And Right(sArray(1), 5) = ".Form" Then sArray(1) = left(sArray(1), Len(sArray(1)) - 5) + sShortcut = Join(sArray, "!") + End If + If Len(sShortcut) >= 2 Then + If Right(sShortcut, 1) = "!" Then + _ContextShortcut = Left(sShortcut, Len(sShortcut) - 1) + Else + _ContextShortcut = sShortcut + End If + End If + +Exit_Function: + Exit Sub +Error_Function: + TraceError(TRACEWARNING, Err, "Event.Initialize", Erl) + GoTo Exit_Function +End Sub ' _Initialize V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + +Dim sSubComponentName As String, sSubComponentType As String + sSubComponentName = Iif(_SubComponentType > -1, "SubComponentName", "") + sSubComponentType = Iif(_SubComponentType > -1, "SubComponentType", "") +Dim sXPos As String, sYPos As String + sXPos = Iif(IsNull(_XPos), "", "XPos") + sYPos = Iif(IsNull(_YPos), "", "YPos") + + _PropertiesList = Utils._TrimArray(Array( _ + "ButtonLeft", "ButtonRight", "ButtonMiddle", "ClickCount" _ + , "ContextShortcut", "EventName", "EventType", "FocusChangeTemporary", _ + , "KeyAlt", "KeyChar", "KeyCode", "KeyCtrl", "KeyFunction", "KeyShift" _ + , "ObjectType", "Recommendation", "RowChangeAction", "Source" _ + , sSubComponentName, sSubComponentType, sXPos, sYPos _ + )) + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Event.get" & psProperty) + + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("ButtonLeft") + _PropertyGet = _ButtonLeft + Case UCase("ButtonMiddle") + _PropertyGet = _ButtonMiddle + Case UCase("ButtonRight") + _PropertyGet = _ButtonRight + Case UCase("ClickCount") + _PropertyGet = _ClickCount + Case UCase("ContextShortcut") + _PropertyGet = _ContextShortcut + Case UCase("FocusChangeTemporary") + _PropertyGet = _FocusChangeTemporary + Case UCase("EventName") + _PropertyGet = _EventName + Case UCase("EventSource") + _PropertyGet = _EventSource + Case UCase("EventType") + _PropertyGet = _EventType + Case UCase("KeyAlt") + _PropertyGet = _KeyAlt + Case UCase("KeyChar") + _PropertyGet = _KeyChar + Case UCase("KeyCode") + _PropertyGet = _KeyCode + Case UCase("KeyCtrl") + _PropertyGet = _KeyCtrl + Case UCase("KeyFunction") + _PropertyGet = _KeyFunction + Case UCase("KeyShift") + _PropertyGet = _KeyShift + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Recommendation") + _PropertyGet = _Recommendation + Case UCase("RowChangeAction") + _PropertyGet = _RowChangeAction + Case UCase("Source") + If _ContextShortcut = "" Then + _PropertyGet = _EventSource + Else + _PropertyGet = getObject(_ContextShortcut) + End If + Case UCase("SubComponentName") + _PropertyGet = _SubComponentName + Case UCase("SubComponentType") + _PropertyGet = _SubComponentType + Case UCase("XPos") + If IsNull(_XPos) Then Goto Trace_Error + _PropertyGet = _XPos + Case UCase("YPos") + If IsNull(_YPos) Then Goto Trace_Error + _PropertyGet = _YPos + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Event.get" & psProperty) + Exit Function +Trace_Error: + ' Errors are not displayed to avoid display infinite cycling + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, False, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Event._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet V1.1.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Field.xba b/wizards/source/access2base/Field.xba new file mode 100644 index 000000000..1fe2f185e --- /dev/null +++ b/wizards/source/access2base/Field.xba @@ -0,0 +1,923 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Field" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be FIELD +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _Precision As Long +Private _ParentName As String +Private _ParentType As String +Private _ParentDatabase As Object +Private _ParentRecordset As Object +Private _DefaultValue As String +Private _DefaultValueSet As Boolean +Private Column As Object ' com.sun.star.sdb.OTableColumnWrapper + ' or org.openoffice.comp.dbaccess.OQueryColumn + ' or com.sun.star.sdb.ODataColumn + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJFIELD + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _ParentName = "" + _ParentType = "" + _DefaultValue = "" + _DefaultValueSet = False + Set Column = Nothing +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get DataType() As Long ' AOO/LibO type + DataType = _PropertyGet("DataType") +End Property ' DataType (get) + +Property Get DataUpdatable() As Boolean + DataUpdatable = _PropertyGet("DataUpdatable") +End Property ' DataUpdatable (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get DbType() As Long ' MSAccess type + DbType = _PropertyGet("DbType") +End Property ' DbType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get DefaultValue() As Variant + DefaultValue = _PropertyGet("DefaultValue") +End Property ' DefaultValue (get) + +Property Let DefaultValue(ByVal pvDefaultValue As Variant) + Call _PropertySet("DefaultValue", pvDefaultValue) +End Property ' DefaultValue (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Description() As Variant + Description = _PropertyGet("Description") +End Property ' Description (get) + +Property Let Description(ByVal pvDescription As Variant) + Call _PropertySet("Description", pvDescription) +End Property ' Description (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FieldSize() As Long + FieldSize = _PropertyGet("FieldSize") +End Property ' FieldSize (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Size() As Long + Size = _PropertyGet("Size") +End Property ' Size (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SourceField() As String + SourceField = _PropertyGet("SourceField") +End Property ' SourceField (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get SourceTable() As String + SourceTable = _PropertyGet("SourceTable") +End Property ' SourceTable (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get TypeName() As String + TypeName = _PropertyGet("TypeName") +End Property ' TypeName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Value() As Variant + Value = _PropertyGet("Value") +End Property ' Value (get) + +Property Let Value(ByVal pvValue As Variant) + Call _PropertySet("Value", pvValue) +End Property ' Value (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AppendChunk(ByRef Optional pvValue As Variant) As Boolean +' Store a chunk of string or binary characters into the current field, presumably a large object (CLOB or BLOB) + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Field.AppendChunk" + Utils._SetCalledSub(cstThisSub) + AppendChunk = False + + If IsMissing(pvValue) Then Call _TraceArguments() + + If _ParentType <> OBJRECORDSET Then Goto Trace_Error ' Not on table- or querydefs ... ! + If Not Column.IsWritable Then Goto Trace_Error_Updatable + If Column.IsReadOnly Then Goto Trace_Error_Updatable + If _ParentDatabase.Recordsets(_ParentName)._EditMode = dbEditNone Then Goto Trace_Error_Update + +Dim iChunkType As Integer + + With com.sun.star.sdbc.DataType + Select Case Column.Type ' DOES NOT WORK FOR CHARACTER TYPES +' Case .CHAR, .VARCHAR, .LONGVARCHAR, .CLOB +' iChunkType = vbString + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB, .CHAR ' .CHAR added for Sqlite3 + iChunkType = vbByte + Case Else + Goto Trace_Error + End Select + End With + + AppendChunk = _ParentRecordset._AppendChunk(_Name, pvValue, iChunkType) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error_Update: + TraceError(TRACEFATAL, ERRUPDATESEQUENCE, Utils._CalledSub(), 0, 1) + _PropertySet = False + Goto Exit_Function +Trace_Error_Updatable: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0, 1) + _PropertySet = False + Goto Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' AppendChunk V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function GetChunk(ByVal Optional pvOffset As Variant, ByVal Optional pvBytes As Variant) As Variant +' Get a chunk of string or binary characters from the current field, presumably a large object (CLOB or BLOB) + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Field.GetChunk" + Utils._SetCalledSub(cstThisSub) + +Dim oValue As Object, bNullable As Boolean, bNull As Boolean, vValue() As Variant +Dim lLength As Long, lOffset As Long, lValue As Long + + If IsMissing(pvOffset) Or IsMissing(pvBytes) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvOffset, 1, _AddNumeric()) Then Goto Exit_Function + If pvOffset < 0 Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvOffset)) + Goto Exit_Function + End If + If Not Utils._CheckArgument(pvBytes, 2, _AddNumeric()) Then Goto Exit_Function + If pvBytes < 0 Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(2, pvBytes)) + Goto Exit_Function + End If + + bNullable = ( Column.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE ) + bNull = False + GetChunk = Null + vValue = Array() + With com.sun.star.sdbc.DataType + Select Case Column.Type ' DOES NOT WORK FOR CHARACTER TYPES +' Case .CHAR, .VARCHAR, .LONGVARCHAR +' Set oValue = Column.getCharacterStream() +' Case .CLOB +' Set oValue = Column.getClob.getCharacterStream() + Case .BINARY, .VARBINARY, .LONGVARBINARY + Set oValue = Column.getBinaryStream() + Case .BLOB + Set oValue = Column.getBlob.getBinaryStream() + Case Else + Goto Trace_Error + End Select + If bNullable Then bNull = Column.wasNull() + If Not bNull Then + lOffset = CLng(pvOffset) + If lOffset > 0 Then oValue.skipBytes(lOffset) + lValue = oValue.readBytes(vValue, pvBytes) + End If + oValue.closeInput() + End With + GetChunk = vValue + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , cstThisSub) + Goto Exit_Function +Trace_Argument: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(iArg, pvIndex)) + Set vForms = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' GetChunk V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + +Const cstThisSub = "Field.getProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub(cstThisSub) + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + +Const cstThisSub = "Field.hasProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Utils._ResetCalledSub(cstThisSub) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String, sName As String +Const cstThisSub = "Field.Properties" + Utils._SetCalledSub(cstThisSub) + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + sName = _ParentType & "/" & _ParentName & "/" & _Name + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + Set vProperty._ParentDatabase = _ParentDatabase + End If + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ReadAllBytes(ByVal Optional pvFile As Variant) As Boolean +' Read the whole content of a file into Long Binary Field object + +Const cstThisSub = "Field.ReadAllBytes" + Utils._SetCalledSub(cstThisSub) + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + ReadAllBytes = _ReadAll(pvFile, "ReadAllBytes") + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ReadAllBytes + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ReadAllText(ByVal Optional pvFile As Variant) As Boolean +' Read the whole content of a file into a Long Char Field object + +Const cstThisSub = "Field.ReadAllText" + Utils._SetCalledSub(cstThisSub) + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + ReadAllText = _ReadAll(pvFile, "ReadAllText") + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ReadAllText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK +Const cstThisSub = "Field.setProperty" + Utils._SetCalledSub(cstThisSub) + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub(cstThisSub) +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function WriteAllBytes(ByVal Optional pvFile As Variant) As Boolean +' Write the whole content of a Long Binary Field object to a file + +Const cstThisSub = "Field.WriteAllBytes" + Utils._SetCalledSub(cstThisSub) + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + WriteAllBytes = _WriteAll(pvFile, "WriteAllBytes") + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' WriteAllBytes + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function WriteAllText(ByVal Optional pvFile As Variant) As Boolean +' Write the whole content of a Long Char Field object to a file + +Const cstThisSub = "Field.WriteAllText" + Utils._SetCalledSub(cstThisSub) + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + WriteAllText = _WriteAll(pvFile, "WriteAllText") + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' WriteAllText + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + Select Case _ParentType + Case OBJTABLEDEF + _PropertiesList =Array("DataType", "dbType", "DefaultValue" _ + , "Description", "Name", "ObjectType", "Size", "SourceField", "SourceTable" _ + , "TypeName" _ + ) + Case OBJQUERYDEF + _PropertiesList = Array("DataType", "dbType", "DefaultValue" _ + , "Description", "Name", "ObjectType", "Size", "SourceField", "SourceTable" _ + , "TypeName" _ + ) + Case OBJRECORDSET + _PropertiesList = Array("DataType", "DataUpdatable", "dbType", "DefaultValue" _ + , "Description" , "FieldSize", "Name", "ObjectType" _ + , "Size", "SourceTable", "TypeName", "Value" _ + ) + End Select + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "Field.get" & psProperty + Utils._SetCalledSub(cstThisSub) + + If Not hasProperty(psProperty) Then Goto Trace_Error + +Dim bCond1 As Boolean, bCond2 As Boolean, vValue As Variant, oValue As Object, sValue As String +Dim oSize As Object, lSize As Long, bNullable As Boolean, bNull As Boolean +Const cstMaxBinlength = 2 * 65535 + + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("DataType") + _PropertyGet = Column.Type + Case UCase("DbType") + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .BIT : _PropertyGet = dbBoolean + Case .TINYINT : _PropertyGet = dbInteger + Case .SMALLINT : _PropertyGet = dbLong + Case .INTEGER : _PropertyGet = dbLong + Case .BIGINT : _PropertyGet = dbBigInt + Case .FLOAT : _PropertyGet = dbFloat + Case .REAL : _PropertyGet = dbSingle + Case .DOUBLE : _PropertyGet = dbDouble + Case .NUMERIC : _PropertyGet = dbNumeric + Case .DECIMAL : _PropertyGet = dbDecimal + Case .CHAR : _PropertyGet = dbChar + Case .VARCHAR : _PropertyGet = dbText + Case .LONGVARCHAR : _PropertyGet = dbMemo + Case .CLOB : _PropertyGet = dbMemo + Case .DATE : _PropertyGet = dbDate + Case .TIME : _PropertyGet = dbTime + Case .TIMESTAMP : _PropertyGet = dbTimeStamp + Case .BINARY : _PropertyGet = dbBinary + Case .VARBINARY : _PropertyGet = dbVarBinary + Case .LONGVARBINARY : _PropertyGet = dbLongBinary + Case .BLOB : _PropertyGet = dbLongBinary + Case .BOOLEAN : _PropertyGet = dbBoolean + Case Else : _PropertyGet = dbUndefined + End Select + End With + Case UCase("DataUpdatable") + If Utils._hasUNOProperty(Column, "IsWritable") Then + _PropertyGet = Column.IsWritable + ElseIf Utils._hasUNOProperty(Column, "IsReadOnly") Then + _PropertyGet = Not Column.IsReadOnly + ElseIf Utils._hasUNOProperty(Column, "IsDefinitelyWritable") Then + _PropertyGet = Column.IsDefinitelyWritable + Else + _PropertyGet = False + End If + If Utils._hasUNOProperty(Column, "IsAutoIncrement") Then + If Column.IsAutoIncrement Then _PropertyGet = False ' Forces False if auto-increment (MSAccess) + End If + Case UCase("DefaultValue") + ' default value buffered to avoid multiple calls + If Not _DefaultValueSet Then + If Utils._hasUNOProperty(Column, "DefaultValue") Then ' Default value in database set via SQL statement + _DefaultValue = Column.DefaultValue + ElseIf Utils._hasUNOProperty(Column, "ControlDefault") Then ' Default value set in Base via table edition + If IsEmpty(Column.ControlDefault) Then _DefaultValue = "" Else _DefaultValue = Column.ControlDefault + Else + _DefaultValue = "" + End If + _DefaultValueSet = True + End If + _PropertyGet = _DefaultValue + Case UCase("Description") + bCond1 = Utils._hasUNOProperty(Column, "Description") + bCond2 = Utils._hasUNOProperty(Column, "HelpText") + Select Case True + Case ( bCond1 And bCond2 ) + If IsEmpty(Column.HelpText) Then _PropertyGet = Column.Description Else _PropertyGet = Column.HelpText + Case ( bCond1 And ( Not bCond2 ) ) + _PropertyGet = Column.Description + Case ( ( Not bCond1 ) And bCond2 ) + _PropertyGet = Column.HelpText + Case Else + _PropertyGet = "" + End Select + Case UCase("FieldSize") + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .VARCHAR, .LONGVARCHAR, .CLOB + Set oSize = Column.getCharacterStream + Case .LONGVARBINARY, .VARBINARY, .BINARY, .BLOB + Set oSize = Column.getBinaryStream + Case Else + Set oSize = Nothing + End Select + End With + If Not IsNull(oSize) Then + bNullable = ( Column.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE ) + If bNullable Then + If Column.wasNull() Then _PropertyGet = 0 Else _PropertyGet = CLng(oSize.getLength()) + Else + _PropertyGet = CLng(oSize.getLength()) + End If + oSize.closeInput() + Else + _PropertyGet = EMPTY + End If + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Size") + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .LONGVARCHAR, .LONGVARBINARY, .VARBINARY, .BINARY, .BLOB, .CLOB + _PropertyGet = 0 ' Always 0 (MSAccess) + Case Else + If Utils._hasUNOProperty(Column, "Precision") Then _PropertyGet = Column.Precision Else _PropertyGet = 0 + End Select + End With + Case UCase("SourceField") + Select Case _ParentType + Case OBJTABLEDEF + _PropertyGet = _Name + Case OBJQUERYDEF ' RealName = not documented ?!? + If Utils._hasUNOProperty(Column, "RealName") Then _PropertyGet = Column.RealName Else _PropertyGet = _Name + End Select + Case UCase("SourceTable") + Select Case _ParentType + Case OBJTABLEDEF + _PropertyGet = _ParentName + Case OBJQUERYDEF, OBJRECORDSET + _PropertyGet = Column.TableName + End Select + Case UCase("TypeName") + _PropertyGet = Column.TypeName + Case UCase("Value") + bNullable = ( Column.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE ) + bNull = False + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .BIT, .BOOLEAN : vValue = Column.getBoolean() ' vbBoolean + Case .TINYINT : vValue = Column.getShort() ' vbInteger + Case .SMALLINT, .INTEGER: vValue = Column.getInt() ' vbLong + Case .BIGINT : vValue = Column.getLong() ' vbBigint + Case .FLOAT : vValue = Column.getFloat() ' vbSingle + Case .REAL, .DOUBLE : vValue = Column.getDouble() ' vbDouble + Case .NUMERIC, .DECIMAL + If Utils._hasUNOProperty(Column, "Scale") Then + If Column.Scale > 0 Then + vValue = Column.getDouble() + Else ' Try Long otherwise Double (CDec not implemented anymore in LO ?!?) + On Local Error Resume Next ' Avoid overflow error + ' CLng checks local decimal point, getString does not ! + sValue = Join(Split(Column.getString(), "."), Utils._DecimalPoint()) + vValue = CLng(sValue) + If Err <> 0 Then + vValue = CDbl(sValue) + Err.Clear + On Local Error Goto Error_Function + End If + End If + Else + vValue = CDbl(Column.getString()) + End If + Case .CHAR : vValue = Column.getString() + Case .VARCHAR : vValue = Column.getString() ' vbString + Case .LONGVARCHAR, .CLOB + Set oValue = Column.getCharacterStream() + If bNullable Then bNull = Column.wasNull() + If Not bNull Then + lSize = CLng(oValue.getLength()) + oValue.closeInput() + vValue = Column.getString() ' vbString + Else + oValue.closeInput() + End If + Case .DATE : Set oValue = Column.getDate() ' vbObject with members VarType Unsigned Short = 18 + If bNullable Then bNull = Column.wasNull() + If Not bNull Then vValue = DateSerial(CInt(oValue.Year), CInt(oValue.Month), CInt(oValue.Day)) + Case .TIME : Set oValue = Column.getTime() ' vbObject with members VarType Unsigned Short = 18 + If bNullable Then bNull = Column.wasNull() + If Not bNull Then vValue = TimeSerial(oValue.Hours, oValue.Minutes, oValue.Seconds)', oValue.HundredthSeconds) + Case .TIMESTAMP : Set oValue = Column.getTimeStamp() + If bNullable Then bNull = Column.wasNull() + If Not bNull Then vValue = DateSerial(CInt(oValue.Year), CInt(oValue.Month), CInt(oValue.Day)) _ + + TimeSerial(oValue.Hours, oValue.Minutes, oValue.Seconds)', oValue.HundredthSeconds) + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + Set oValue = Column.getBinaryStream() + If bNullable Then bNull = Column.wasNull() + If Not bNull Then + lSize = CLng(oValue.getLength()) ' vbLong => equivalent to FieldSize + If lSize > cstMaxBinlength Then Goto Trace_Length + vValue = Array() + oValue.readBytes(vValue, lSize) + End If + oValue.closeInput() + Case Else + vValue = Column.getString() 'GIVE STRING A TRY + If IsNumeric(vValue) Then vValue = Val(vValue) 'Required when type = "", sometimes numeric fields are returned as strings (query/MSAccess) + End Select + If bNullable Then + If Column.wasNull() Then vValue = Null 'getXXX must precede wasNull() + End If + End With + _PropertyGet = vValue + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Length: + TraceError(TRACEFATAL, ERROVERFLOW, Utils._CalledSub(), 0, , Array(lSize, "GetChunk")) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean +' Return True if property setting OK + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "Field.set" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertySet = True +Dim iArgNr As Integer, vTemp As Variant +Dim oParent As Object + + Select Case UCase(_A2B_.CalledSub) + Case UCase("setProperty") : iArgNr = 3 + Case UCase("Field.setProperty") : iArgNr = 2 + Case UCase(cstThisSub) : iArgNr = 1 + End Select + + If Not hasProperty(psProperty) Then Goto Trace_Error + + Select Case UCase(psProperty) + Case UCase("DefaultValue") + If _ParentType <> OBJTABLEDEF Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(Column, "ControlDefault") Then ' Default value set in Base via table edition + Column.ControlDefault = pvValue + _DefaultValue = pvValue + _DefaultValueSet = True + End If + Case UCase("Description") + If _ParentType <> OBJTABLEDEF Then Goto Trace_Error + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + Column.HelpText = pvValue + Case UCase("Value") + If _ParentType <> OBJRECORDSET Then Goto Trace_Error ' Not on table- or querydefs ... ! + If Not Column.IsWritable Then Goto Trace_Error_Updatable + If Column.IsReadOnly Then Goto Trace_Error_Updatable + If _ParentDatabase.Recordsets(_ParentName)._EditMode = dbEditNone Then Goto Trace_Error_Update + With com.sun.star.sdbc.DataType + If IsNull(pvValue) Then + If Column.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE Then Column.updateNull() Else Goto Trace_Null + Else + Select Case Column.Type + Case .BIT, .BOOLEAN + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + Column.updateBoolean(pvValue) + Case .TINYINT + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < -128 Or pvValue > +127 Then Goto Trace_Error_Value + Column.updateShort(CInt(pvValue)) + Case .SMALLINT + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < -32768 Or pvValue > 32767 Then Goto trace_Error_Value + Column.updateInt(CLng(pvValue)) + Case .INTEGER + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < -2147483648 Or pvValue > 2147483647 Then Goto trace_Error_Value + Column.updateInt(CLng(pvValue)) + Case .BIGINT + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + Column.updateLong(pvValue) ' No proper type conversion for HYPER data type + Case .FLOAT + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Abs(pvValue) < 3.402823E38 And Abs(pvValue) > 1.401298E-45 Then Column.updateFloat(CSng(pvValue)) Else Goto trace_Error_Value + Case .REAL, .DOUBLE + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + 'If Abs(pvValue) < 1.79769313486232E308 And Abs(pvValue) > 4.94065645841247E-307 Then Column.updateDouble(CDbl(pvValue)) Else Goto trace_Error_Value + Column.updateDouble(CDbl(pvValue)) + Case .NUMERIC, .DECIMAL + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(Column, "Scale") Then + If Column.Scale > 0 Then + 'If Abs(pvValue) < 1.79769313486232E308 And Abs(pvValue) > 4.94065645841247E-307 Then Column.updateDouble(CDbl(pvValue)) Else Goto trace_Error_Value + Column.updateDouble(CDbl(pvValue)) + Else + Column.updateString(CStr(pvValue)) + End If + Else + Column.updateString(CStr(pvValue)) + End If + Case .CHAR, .VARCHAR, .LONGVARCHAR, .CLOB + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If _Precision > 0 And Len(pvValue) > _Precision Then Goto Trace_Error_Length + Column.updateString(pvValue) ' vbString + Case .DATE + If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value + vTemp = New com.sun.star.util.Date + With vTemp + .Day = Day(pvValue) + .Month = Month(pvValue) + .Year = Year(pvValue) + End With + Column.updateDate(vTemp) + Case .TIME + If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value + vTemp = New com.sun.star.util.Time + With vTemp + .Hours = Hour(pvValue) + .Minutes = Minute(pvValue) + .Seconds = Second(pvValue) + '.HundredthSeconds = 0 ' replaced with Long nanoSeconds in LO 4.1 ?? + End With + Column.updateTime(vTemp) + Case .TIMESTAMP + If Not Utils._CheckArgument(pvValue, iArgNr, vbDate, , False) Then Goto Trace_Error_Value + vTemp = New com.sun.star.util.DateTime + With vTemp + .Day = Day(pvValue) + .Month = Month(pvValue) + .Year = Year(pvValue) + .Hours = Hour(pvValue) + .Minutes = Minute(pvValue) + .Seconds = Second(pvValue) + '.HundredthSeconds = 0 + End With + Column.updateTimestamp(vTemp) + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + If Not IsArray(pvValue) Then Goto Trace_Error_Value + If UBound(pvValue) < LBound(pvValue) Then Goto Trace_Error_Value + If Not Utils._CheckArgument(pvValue(LBound(pvValue)), iArgNr, vbInteger, , False) Then Goto Trace_Error_Value + Column.updateBytes(pvValue) + Case Else + Goto trace_Error + End Select + End If + End With + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Trace_Null: + TraceError(TRACEFATAL, ERRNOTNULLABLE, Utils._CalledSub(), 0, 1, _Name) + _PropertySet = False + Goto Exit_Function +Trace_Error_Update: + TraceError(TRACEFATAL, ERRUPDATESEQUENCE, Utils._CalledSub(), 0, 1) + _PropertySet = False + Goto Exit_Function +Trace_Error_Updatable: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0, 1) + _PropertySet = False + Goto Exit_Function +Trace_Error_Length: + TraceError(TRACEFATAL, ERROVERFLOW, Utils._CalledSub(), 0, , Array(Len(pvValue), "AppendChunk")) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ReadAll(ByVal psFile As String, ByVal psMethod As String) As Boolean +' Write the whole content of a file into a stream object + + If _ErrorHandler() Then On Local Error Goto Error_Function + _ReadAll = False + + If _ParentType <> OBJRECORDSET Then Goto Trace_Error ' Not on table- or querydefs ... ! + If Not Column.IsWritable Then Goto Trace_Error_Updatable + If Column.IsReadOnly Then Goto Trace_Error_Updatable + If _ParentDatabase.Recordsets(_ParentName)._EditMode = dbEditNone Then Goto Trace_Error_Update + +Dim sFile As String, oSimpleFileAccess As Object, sMethod As String, oStream As Object +Dim lFileLength As Long, sBuffer As String, sMemo As String, iFile As Integer +Const cstMaxLength = 64000 + sFile = ConvertToURL(psFile) + + oSimpleFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") + If Not oSimpleFileAccess.exists(sFile) Then Goto Trace_File + + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + If psMethod <> "ReadAllBytes" Then Goto Trace_Error + Set oStream = oSimpleFileAccess.openFileRead(sFile) + lFileLength = oStream.getLength() + If lFileLength = 0 Then Goto Trace_File + Column.updateBinaryStream(oStream, lFileLength) + oStream.closeInput() + Case .VARCHAR, .LONGVARCHAR, .CLOB + If psMethod <> "ReadAllText" Then Goto Trace_Error + sMemo = "" + lFileLength = 0 + iFile = FreeFile() + Open sFile For Input Access Read Shared As iFile + Do While Not Eof(iFile) + Line Input #iFile, sBuffer + lFileLength = lFileLength + Len(sBuffer) + 1 + If lFileLength > cstMaxLength Then Exit Do + sMemo = sMemo & sBuffer & vbNewLine + Loop + If lFileLength = 0 Or lFileLength > cstMaxLength Then + Close #iFile + Goto Trace_File + End If + sMemo = Left(sMemo, lFileLength - 1) + Column.updateString(sMemo) + 'Column.updateCharacterStream(oStream, lFileLength) ' DOES NOT WORK ?!? + Case Else + Goto Trace_Error + End Select + End With + + _ReadAll = True + +Exit_Function: + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , psMethod) + Goto Exit_Function +Trace_File: + TraceError(TRACEFATAL, ERRFILEACCESS, Utils._CalledSub(), 0, , sFile) + If Not IsNull(oStream) Then oStream.closeInput() + Goto Exit_Function +Trace_Error_Update: + TraceError(TRACEFATAL, ERRUPDATESEQUENCE, Utils._CalledSub(), 0, 1) + If Not IsNull(oStream) Then oStream.closeInput() + Goto Exit_Function +Trace_Error_Updatable: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0, 1) + If Not IsNull(oStream) Then oStream.closeInput() + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, _CalledSub, Erl) + GoTo Exit_Function +End Function ' ReadAll + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _WriteAll(ByVal psFile As String, ByVal psMethod As String) As Boolean +' Write the whole content of a stream object to a file + + If _ErrorHandler() Then On Local Error Goto Error_Function + _WriteAll = False + +Dim sFile As String, oSimpleFileAccess As Object, sMethod As String, oStream As Object + sFile = ConvertToURL(psFile) + + oSimpleFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") + With com.sun.star.sdbc.DataType + Select Case Column.Type + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + If psMethod <> "WriteAllBytes" Then Goto Trace_Error + Set oStream = Column.getBinaryStream() + Case .VARCHAR, .LONGVARCHAR, .CLOB + If psMethod <> "WriteAllText" Then Goto Trace_Error + Set oStream = Column.getCharacterStream() + Case Else + Goto Trace_Error + End Select + End With + + If Column.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE Then + If Column.wasNull() Then Goto Trace_Null + End If + If oStream.getLength() = 0 Then Goto Trace_Null + On Local Error Goto Trace_File + If oSimpleFileAccess.exists(sFile) Then oSimpleFileAccess.kill(sFile) + oSimpleFileAccess.writeFile(sFile, oStream) + On Local Error Goto Error_Function + oStream.closeInput() + + _WriteAll = True + +Exit_Function: + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, , psMethod) + Goto Exit_Function +Trace_File: + TraceError(TRACEFATAL, ERRFILEACCESS, Utils._CalledSub(), 0, , sFile) + If Not IsNull(oStream) Then oStream.closeInput() + Goto Exit_Function +Trace_Null: + TraceError(TRACEFATAL, ERRFIELDNULL, _CalledSub, 0) + If Not IsNull(oStream) Then oStream.closeInput() + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, _CalledSub, Erl) + GoTo Exit_Function +End Function ' WriteAll + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Form.xba b/wizards/source/access2base/Form.xba new file mode 100644 index 000000000..df18feb34 --- /dev/null +++ b/wizards/source/access2base/Form.xba @@ -0,0 +1,1129 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Form" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be FORM +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Shortcut As String +Private _Name As String +Private _DocEntry As Integer ' Doc- and DbContainer entries in Root structure +Private _DbEntry As Integer +Private _MainForms As Variant +Private _PersistentName As String +Private _IsLoaded As Boolean +Private _OpenArgs As Variant +Private _OrderBy As String +Public Component As Object ' com.sun.star.text.TextDocument +Public ContainerWindow As Object ' (No name) +Public FormsCollection As Object ' com.sun.star.form.OFormsCollection +Public DatabaseForm As Object ' com.sun.star.form.component.DataForm and com.sun.star.sdb.ResultSet (a.o.) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJFORM + Set _This = Nothing + Set _Parent = Nothing + _Shortcut = "" + _Name = "" + _DocEntry = -1 + _DbEntry = -1 + _MainForms = Array() + _PersistentName = "" + _IsLoaded = False + _OpenArgs = "" + _OrderBy = "" + Set Component = Nothing + Set ContainerWindow = Nothing + Set FormsCollection = Nothing + Set DatabaseForm = Nothing +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() +Dim ofForm As Object + If Not IsLoaded(True) Then + If Not IsNull(DatabaseForm) Then DatabaseForm.Dispose() + End If + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowAdditions() As Variant + AllowAdditions = _PropertyGet("AllowAdditions") +End Property ' AllowAdditions (get) + +Property Let AllowAdditions(ByVal pvValue As Variant) + Call _PropertySet("AllowAdditions", pvValue) +End Property ' AllowAdditions (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowDeletions() As Variant + AllowDeletions = _PropertyGet("AllowDeletions") +End Property ' AllowDeletions (get) + +Property Let AllowDeletions(ByVal pvValue As Variant) + Call _PropertySet("AllowDeletions", pvValue) +End Property ' AllowDeletions (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowEdits() As Variant + AllowEdits = _PropertyGet("AllowEdits") +End Property ' AllowEdits (get) + +Property Let AllowEdits(ByVal pvValue As Variant) + Call _PropertySet("AllowEdits", pvValue) +End Property ' AllowEdits (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Bookmark() As Variant + Bookmark = _PropertyGet("Bookmark") +End Property ' Bookmark (get) + +Property Let Bookmark(ByVal pvValue As Variant) + Call _PropertySet("Bookmark", pvValue) +End Property ' Bookmark (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Caption() As Variant + Caption = _PropertyGet("Caption") +End Property ' Caption (get) + +Property Let Caption(ByVal pvValue As Variant) + Call _PropertySet("Caption", pvValue) +End Property ' Caption (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get CurrentRecord() As Variant + CurrentRecord = _PropertyGet("CurrentRecord") +End Property ' CurrentRecord (get) + +Property Let CurrentRecord(ByVal pvValue As Variant) + Call _PropertySet("CurrentRecord", pvValue) +End Property ' CurrentRecord (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Filter() As Variant + Filter = _PropertyGet("Filter") +End Property ' Filter (get) + +Property Let Filter(ByVal pvValue As Variant) + Call _PropertySet("Filter", pvValue) +End Property ' Filter (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FilterOn() As Variant + FilterOn = _PropertyGet("FilterOn") +End Property ' FilterOn (get) + +Property Let FilterOn(ByVal pvValue As Variant) + Call _PropertySet("FilterOn", pvValue) +End Property ' FilterOn (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Height() As Variant + Height = _PropertyGet("Height") +End Property ' Height (get) + +Property Let Height(ByVal pvValue As Variant) + Call _PropertySet("Height", pvValue) +End Property ' Height (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Function IsLoaded(ByVal Optional pbForce As Boolean) As Boolean +'Return True if form open +'pbForce = True forbids bypass on value of _IsLoaded + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Form.getIsLoaded") + If IsMissing(pbForce) Then pbForce = False + If ( Not pbForce ) And _IsLoaded Then ' For performance reasons, a form object, once detected as loaded, is presumed remaining loaded. Except if pbForce = True + IsLoaded = True + Goto Exit_Function + End If + IsLoaded = False + +Dim oDoc As Object, oDatabase As Object, oEnum As Object, oDesk As Object, oComp As Object, vPersistent As Variant +Dim i As Integer + Set oDoc = _A2B_.CurrentDocument() + Select Case oDoc.DbConnect + Case DBCONNECTBASE + Set oDesk = CreateUnoService("com.sun.star.frame.Desktop") + Set oEnum = oDesk.Components().createEnumeration + Do While oEnum.hasMoreElements ' Search in all open components if one corresponds with current form + oComp = oEnum.nextElement + If _hasUNOProperty(oComp, "Identifier") Then + If oComp.Identifier = "com.sun.star.sdb.FormDesign" Then + vPersistent = Split(oComp.StringValue, "/") + If vPersistent(UBound(vPersistent) - 1) = _PersistentName Then + _IsLoaded = True + Set Component = oComp + Exit Do + End If + End If + End If + Loop + Case DBCONNECTFORM + Set Component = oDoc.Document ' Form + _IsLoaded = True ' Interactive form always loaded by design + End Select + Set oComp = Nothing + IsLoaded = _IsLoaded + +Exit_Function: + Utils._ResetCalledSub("Form.getIsLoaded") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Form.getIsLoaded", Erl) + GoTo Exit_Function +End Function ' IsLoaded V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveCursorMove() As Variant + OnApproveCursorMove = _PropertyGet("OnApproveCursorMove") +End Property ' OnApproveCursorMove (get) + +Property Let OnApproveCursorMove(ByVal pvValue As Variant) + Call _PropertySet("OnApproveCursorMove", pvValue) +End Property ' OnApproveCursorMove (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveParameter() As Variant + OnApproveParameter = _PropertyGet("OnApproveParameter") +End Property ' OnApproveParameter (get) + +Property Let OnApproveParameter(ByVal pvValue As Variant) + Call _PropertySet("OnApproveParameter", pvValue) + +End Property ' OnApproveParameter (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveReset() As Variant + OnApproveReset = _PropertyGet("OnApproveReset") +End Property ' OnApproveReset (get) + +Property Let OnApproveReset(ByVal pvValue As Variant) + Call _PropertySet("OnApproveReset", pvValue) +End Property ' OnApproveReset (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveRowChange() As Variant + OnApproveRowChange = _PropertyGet("OnApproveRowChange") +End Property ' OnApproveRowChange (get) + +Property Let OnApproveRowChange(ByVal pvValue As Variant) + Call _PropertySet("OnApproveRowChange", pvValue) +End Property ' OnApproveRowChange (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveSubmit() As Variant + OnApproveSubmit = _PropertyGet("OnApproveSubmit") +End Property ' OnApproveSubmit (get) + +Property Let OnApproveSubmit(ByVal pvValue As Variant) + Call _PropertySet("OnApproveSubmit", pvValue) +End Property ' OnApproveSubmit (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnConfirmDelete() As Variant + OnConfirmDelete = _PropertyGet("OnConfirmDelete") +End Property ' OnConfirmDelete (get) + +Property Let OnConfirmDelete(ByVal pvValue As Variant) + Call _PropertySet("OnConfirmDelete", pvValue) +End Property ' OnConfirmDelete (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnCursorMoved() As Variant + OnCursorMoved = _PropertyGet("OnCursorMoved") +End Property ' OnCursorMoved (get) + +Property Let OnCursorMoved(ByVal pvValue As Variant) + Call _PropertySet("OnCursorMoved", pvValue) +End Property ' OnCursorMoved (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnErrorOccurred() As Variant + OnErrorOccurred = _PropertyGet("OnErrorOccurred") +End Property ' OnErrorOccurred (get) + +Property Let OnErrorOccurred(ByVal pvValue As Variant) + Call _PropertySet("OnErrorOccurred", pvValue) +End Property ' OnErrorOccurred (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnLoaded() As Variant + OnLoaded = _PropertyGet("OnLoaded") +End Property ' OnLoaded (get) + +Property Let OnLoaded(ByVal pvValue As Variant) + Call _PropertySet("OnLoaded", pvValue) +End Property ' OnLoaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnReloaded() As Variant + OnReloaded = _PropertyGet("OnReloaded") +End Property ' OnReloaded (get) + +Property Let OnReloaded(ByVal pvValue As Variant) + Call _PropertySet("OnReloaded", pvValue) +End Property ' OnReloaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnReloading() As Variant + OnReloading = _PropertyGet("OnReloading") +End Property ' OnReloading (get) + +Property Let OnReloading(ByVal pvValue As Variant) + Call _PropertySet("OnReloading", pvValue) +End Property ' OnReloading (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnResetted() As Variant + OnResetted = _PropertyGet("OnResetted") +End Property ' OnResetted (get) + +Property Let OnResetted(ByVal pvValue As Variant) + Call _PropertySet("OnResetted", pvValue) +End Property ' OnResetted (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnRowChanged() As Variant + OnRowChanged = _PropertyGet("OnRowChanged") +End Property ' OnRowChanged (get) + +Property Let OnRowChanged(ByVal pvValue As Variant) + Call _PropertySet("OnRowChanged", pvValue) +End Property ' OnRowChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnloaded() As Variant + OnUnloaded = _PropertyGet("OnUnloaded") +End Property ' OnUnloaded (get) + +Property Let OnUnloaded(ByVal pvValue As Variant) + Call _PropertySet("OnUnloaded", pvValue) +End Property ' OnUnloaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnloading() As Variant + OnUnloading = _PropertyGet("OnUnloading") +End Property ' OnUnloading (get) + +Property Let OnUnloading(ByVal pvValue As Variant) + Call _PropertySet("OnUnloading", pvValue) +End Property ' OnUnloading (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OpenArgs() As Variant + OpenArgs = _PropertyGet("OpenArgs") +End Property ' OpenArgs (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OrderBy() As Variant + OrderBy = _PropertyGet("OrderBy") +End Property ' OrderBy (get) V1.2.0 + +Property Let OrderBy(ByVal pvValue As Variant) + Call _PropertySet("OrderBy", pvValue) +End Property ' OrderBy (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OrderByOn() As Variant + OrderByOn = _PropertyGet("OrderByOn") +End Property ' OrderByOn (get) V1.2.0 + +Property Let OrderByOn(ByVal pvValue As Variant) + Call _PropertySet("OrderByOn", pvValue) +End Property ' OrderByOn (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OptionGroup(ByVal Optional pvGroupName As Variant) As Variant +' Return either an error or an object of type OPTIONGROUP based on its name + +Const cstThisSub = "Form.OptionGroup" +Dim ogGroup As Object + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvGroupName) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set ogGroup = _OptionGroup(pvGroupName, CTLPARENTISFORM, Component, FormsCollection) + If Not IsNull(ogGroup) Then + ogGroup._DocEntry = _DocEntry + ogGroup._DbEntry = _DbEntry + End If + Set OptionGroup = ogGroup + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, Form.OptionGroup, Erl) + GoTo Exit_Function +End Function ' OptionGroup V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Parent() As Object + Parent = _Parent +End Function ' Parent (get) V6.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Recordset() As Object + Recordset = _PropertyGet("Recordset") +End Property ' Recordset (get) V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RecordSource() As Variant + RecordSource = _PropertyGet("RecordSource") +End Property ' RecordSource (get) + +Property Let RecordSource(ByVal pvValue As Variant) + Call _PropertySet("RecordSource", pvValue) +End Property ' RecordSource (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Visible() As Variant + Visible = _PropertyGet("Visible") +End Property ' Visible (get) + +Property Let Visible(ByVal pvValue As Variant) + Call _PropertySet("Visible", pvValue) +End Property ' Visible (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Width() As Variant + Width = _PropertyGet("Width") +End Property ' Width (get) + +Property Let Width(ByVal pvValue As Variant) + Call _PropertySet("Width", pvValue) +End Property ' Width (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function mClose() As Variant +' Close the form + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Form.Close") + mClose = False +Dim oDatabase As Object, oController As Object + Set oDatabase = Application._CurrentDb() + If oDatabase._DbConnect <> DBCONNECTBASE Then Goto Error_NotApplicable + + Set oController = oDatabase.Document.getFormDocuments.getByHierarchicalName(_Name) + oController.close() + Dispose() + mClose = True + +Exit_Function: + Utils._ResetCalledSub("Form.Close") + Exit Function +Error_NotApplicable: + TraceError(TRACEFATAL, ERRMETHOD, Utils._CalledSub(), 0, 1, cstThisSub) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Form.Close", Erl) + GoTo Exit_Function +End Function ' Close + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Return a Control object with name or index = pvIndex + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Form.Controls") + +Dim ocControl As Variant, iControlCount As Integer +Dim oCounter As Variant, sControls() As Variant, i As Integer, bFound As Boolean, sIndex As String +Dim j As Integer, iCount As Integer, sName As String, iAddCount As Integer +Dim oDatabaseForm As Object, iCtlCount As Integer + + Set ocControl = Nothing + If Not IsLoaded Then Goto Trace_Error_NotOpen + 'Count number of controls thru the forms collection + iControlCount = 0 + + iCount = FormsCollection.Count + For i = 0 To iCount - 1 + If i = 0 Then Set oDatabaseForm = DatabaseForm Else Set oDatabaseForm = FormsCollection.getByIndex(i) + If Not IsNull(oDatabaseForm) Then iControlCount = iControlCount + oDatabaseForm.getCount() + Next i + + If IsMissing(pvIndex) Then ' No argument, return Collection pseudo-object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLCONTROLS + Set oCounter._Parent = _This + oCounter._Count = iControlCount + Set Controls = oCounter + Goto Exit_Function + End If + + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + + ' Start building the ocControl object + ' Determine exact name + + sName = "" + Select Case VarType(pvIndex) + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + If pvIndex < 0 Or pvIndex > iControlCount - 1 Then Goto Trace_Error_Index + iAddCount = 0 + For i = 0 To iCount - 1 + If i = 0 Then Set oDatabaseForm = DatabaseForm Else Set oDatabaseForm = FormsCollection.getByIndex(i) + If Not IsNull(oDatabaseForm) Then + iCtlCount = oDatabaseForm.getCount() + If pvIndex >= iAddCount And pvIndex <= iAddcount + iCtlCount - 1 Then + sName = oDatabaseForm.ElementNames(pvIndex - iAddCount) + Exit For + End If + iAddCount = iAddcount +iCtlCount + End If + Next i + Case vbString ' Check control name validity (non case sensitive) + sIndex = UCase(Utils._Trim(pvIndex)) + bFound = False + For i = 0 To iCount - 1 + If i = 0 Then Set oDatabaseForm = DatabaseForm Else Set oDatabaseForm = FormsCollection.getByIndex(i) + If Not IsNull(oDatabaseForm) Then + sControls() = oDatabaseForm.getElementNames() + For j = 0 To UBound(sControls) + If UCase(sControls(j)) = sIndex Then + sName = sControls(j) + bFound = True + Exit For + End If + Next j + If bFound Then Exit For + End If + Next i + If Not bFound Then Goto Trace_NotFound + End Select + + 'Initialize a new Control object + Set ocControl = New Control + With ocControl + Set ._This = ocControl + Set ._Parent = _This + ._ParentType = CTLPARENTISFORM + ._Name = sName + ._Shortcut = _Shortcut & "!" & Utils._Surround(sName) + If IsNull(oDatabaseForm) Then ._MainForm = "" Else ._MainForm = oDatabaseForm.Name + Set .ControlModel = oDatabaseForm.getByName(sName) + ._ImplementationName = .ControlModel.getImplementationName() + ._FormComponent = Component + If Utils._hasUNOProperty(.ControlModel, "ClassId") Then ._ClassId = .ControlModel.ClassId + If ._ClassId > 0 And ._ClassId <> acHiddenControl Then + Set .ControlView = Component.CurrentController.getControl(.ControlModel) + End If + + ._Initialize() + ._DocEntry = _DocEntry + ._DbEntry = _DbEntry + End With + Set Controls = ocControl + +Exit_Function: + Utils._ResetCalledSub("Form.Controls") + Exit Function +Trace_Error_NotOpen: + TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, , _Name) + Set Controls = Nothing + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set Controls = Nothing + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(pvIndex, pvIndex)) + Set Controls = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Form.Controls", Erl) + Set Controls = Nothing + GoTo Exit_Function +End Function ' Controls + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentDb() As Object +' Returns Database object related to current form + +Const cstThisSub = "Form.CurrentDb" + Utils._SetCalledSub(cstThisSub) + + Set CurrentDb = Application._CurrentDb(_DocEntry, _DbEntry) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' CurrentDb V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Form.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Form.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Move( ByVal Optional pvLeft As Variant _ + , ByVal Optional pvTop As Variant _ + , ByVal Optional pvWidth As Variant _ + , ByVal Optional pvHeight As Variant _ + ) As Variant +' Execute Move method + Utils._SetCalledSub("Form.Move") + If _ErrorHandler() Then On Local Error Goto Error_Function + Move = False +Dim iArgNr As Integer + Select Case UCase(_A2B_.CalledSub) + Case UCase("Move") : iArgNr = 1 + Case UCase("Form.Move") : iArgNr = 0 + End Select + If IsMissing(pvLeft) Then pvLeft = -1 + If IsMissing(pvTop) Then pvTop = -1 + If IsMissing(pvWidth) Then pvWidth = -1 + If IsMissing(pvHeight) Then pvHeight = -1 + If Not Utils._CheckArgument(pvLeft, iArgNr + 1, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvTop, iArgNr + 2, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWidth, iArgNr + 3, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvHeight, iArgNr + 4, Utils._AddNumeric()) Then Goto Exit_Function + +Dim iArg As Integer, iWrong As Integer ' Check arguments values + iArg = 0 + If pvHeight < -1 Then + iArg = 4 : iWrong = pvHeight + ElseIf pvWidth < -1 Then + iArg = 3 : iWrong = pvWidth + ElseIf pvTop < -1 Then + iArg = 2 : iWrong = pvTop + ElseIf pvLeft < -1 Then + iArg = 1 : iWrong = pvLeft + End If + If iArg > 0 Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(iArgNr + iArg, iWrong)) + Goto Exit_Function + End If + +Dim iPosSize As Integer + iPosSize = 0 + If pvLeft >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.X + If pvTop >= 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.Y + If pvWidth > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.WIDTH + If pvHeight > 0 Then iPosSize = iPosSize + com.sun.star.awt.PosSize.HEIGHT + If iPosSize > 0 Then + If Utils._hasUNOProperty(ContainerWindow, "IsMaximized") Then ' Ignored when <= OO3.2 + ContainerWindow.IsMaximized = False + ContainerWindow.IsMinimized = False + End If + ContainerWindow.setPosSize(pvLeft, pvTop, pvWidth, pvHeight, iPosSize) + End If + Move = True + +Exit_Function: + Utils._ResetCalledSub("Form.Move") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Form.Move", Erl) + GoTo Exit_Function +End Function ' Move + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Refresh() As Boolean +' Refresh data with its most recent value in the database in a form or subform + Utils._SetCalledSub("Form.Refresh") + If _ErrorHandler() Then On Local Error Goto Error_Function + Refresh = False + +Dim oSet As Object + Set oSet = DatabaseForm.createResultSet() + If Not IsNull(oSet) Then + oSet.refreshRow() + Refresh = True + End If + +Exit_Function: + Set oSet = Nothing + Utils._ResetCalledSub("Form.Refresh") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm.Refresh", Erl) + GoTo Exit_Function +End Function ' Refresh + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Requery() As Boolean +' Refresh data displayed in a form, subform, combobox or listbox + Utils._SetCalledSub("Form.Requery") + If _ErrorHandler() Then On Local Error Goto Error_Function + Requery = False + + DatabaseForm.reload() + Requery = True + +Exit_Function: + Utils._ResetCalledSub("Form.Requery") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Form.Requery", Erl) + GoTo Exit_Function +End Function ' Requery + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFocus() As Boolean +' Execute setFocus method +Const cstThisSub = "Form.setFocus" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + setFocus = False + + With ContainerWindow + If .isVisible() = False Then .setVisible(True) + .IsMinimized = False + .setFocus() + .setEnable(True) ' Added to try to bypass desynchro issue in Linux + .toFront() ' Added to force window change in Linux + End With + setFocus = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + Goto Exit_Function +End Function ' setFocus V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("Form.setProperty") + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub("Form.setProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetListener(ByVal psProperty As String) As String +' Return the X...Listener corresponding with the property in argument + + Select Case UCase(psProperty) + Case UCase("OnApproveCursorMove") + _GetListener = "XRowSetApproveListener" + Case UCase("OnApproveParameter") + _GetListener = "XDatabaseParameterListener" + Case UCase("OnApproveReset"), UCase("OnResetted") + _GetListener = "XResetListener" + Case UCase("OnApproveRowChange") + _GetListener = "XRowSetApproveListener" + Case UCase("OnApproveSubmit") + _GetListener = "XSubmitListener" + Case UCase("OnConfirmDelete") + _GetListener = "XConfirmDeleteListener" + Case UCase("OnCursorMoved"), UCase("OnRowChanged") + _GetListener = "XRowSetListener" + Case UCase("OnErrorOccurred") + _GetListener = "XSQLErrorListener" + Case UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnUnloaded"), UCase("OnUnloading") + _GetListener = "XLoadListener" + End Select + +End Function ' _GetListener V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _Initialize(psName As String) +' Set pointers to UNO objects + +Dim oDoc As Object, oDatabase As Object + If _ErrorHandler() Then On Local Error Goto Trace_Error + _Name = psName + _Shortcut = "Forms!" & Utils._Surround(psName) + Set oDoc = _A2B_.CurrentDocument() + If oDoc.DbConnect = DBCONNECTBASE Then _PersistentName = oDoc.Document.getFormDocuments().getByHierarchicalName(psName).PersistentName + If IsLoaded Then + Select Case oDoc.DbConnect + Case DBCONNECTBASE + If Not IsNull(Component.CurrentController) Then ' A form opened then closed afterwards keeps a Component attribute + Set ContainerWindow = Component.CurrentController.Frame.ContainerWindow + Set FormsCollection = Component.getDrawPage.Forms + If FormsCollection.Count = 0 Then + Set DatabaseForm = Nothing + Else + 'Only first member of the collection can be reached with A2B + 'Compliant with MSAccess which has 1 datasource by form, while LO might have many + _MainForms = FormsCollection.ElementNames() + Set DatabaseForm = FormsCollection.getByIndex(0) + End If + End If + Case DBCONNECTFORM + Set ContainerWindow = oDoc.Document.CurrentController.Frame.ContainerWindow + Set FormsCollection = oDoc.Document.getDrawPage.Forms + Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + With oDatabase + Set DatabaseForm = .Form + If IsNull(.Connection) Then + Set .Connection = DatabaseForm.ActiveConnection + If Not IsNull(.Connection) Then + Set .MetaData = .Connection.MetaData + oDatabase._ReadOnly = .Connection.isReadOnly() + End If + End If + End With + End Select + If IsNull(DatabaseForm) Then _OrderBy = "" Else _OrderBy = DatabaseForm.Order + Else + Set Component = Nothing + Set ContainerWindow = Nothing + Set DatabaseForm = Nothing + End If + +Exit_Sub: + Exit Sub +Trace_Error: + TraceError(TRACEABORT, Err, "Form.Initialize", Erl) + Goto Exit_Sub +Trace_Internal_Error: + TraceError(TRACEABORT, ERRFORMNOTIDENTIFIED, Utils._CalledSub(), 0, , _Name) + Goto Exit_Sub +End Sub ' _Initialize V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + If _IsLoaded Then + _PropertiesList = Array("AllowAdditions", "AllowDeletions", "AllowEdits", "Bookmark" _ + , "Caption", "CurrentRecord", "Filter", "FilterOn", "Height", "IsLoaded" _ + , "Name", "ObjectType", "OnApproveCursorMove", "OnApproveParameter" _ + , "OnApproveReset", "OnApproveRowChange", "OnApproveSubmit", "OnConfirmDelete" _ + , "OnCursorMoved", "OnErrorOccurred", "OnLoaded", "OnReloaded", "OnReloading" _ + , "OnResetted", "OnRowChanged", "OnUnloaded", "OnUnloading", "OpenArgs" _ + , "OrderBy", "OrderByOn", "RecordSource", "Visible", "Width" _ + ) ' Recordset removed + Else + _PropertiesList = Array("IsLoaded", "Name" _ + ) + End If + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Form.get" & psProperty) + +'Execute +Dim oDatabase As Object, vBookmark As Variant +Dim i As Integer, oObject As Object + + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("Name"), UCase("IsLoaded") + Case Else : If Not IsLoaded Then Goto Trace_Error_Form + End Select + + Select Case UCase(psProperty) + Case UCase("AllowAdditions") + If IsNull(DatabaseForm) Then _PropertyGet = False Else _PropertyGet = DatabaseForm.AllowInserts + Case UCase("AllowDeletions") + If IsNull(DatabaseForm) Then _PropertyGet = False Else _PropertyGet = DatabaseForm.AllowDeletes + Case UCase("AllowEdits") + If IsNull(DatabaseForm) Then _PropertyGet = False Else _PropertyGet = DatabaseForm.AllowUpdates + Case UCase("Bookmark") + If IsNull(DatabaseForm) Then + _PropertyGet = 0 + Else + On Local Error Resume Next ' Disable error handler because bookmarking does not always react well in events ... + If DatabaseForm.IsBookmarkable Then vBookmark = DatabaseForm.getBookmark() Else vBookmark = Nothing + If _ErrorHandler() Then On Local Error Goto Error_Function Else On Local Error Goto 0 + If IsNull(vBookmark) Then Goto Trace_Error + _PropertyGet = vBookmark + End If + Case UCase("Caption") + Set odatabase = Application._CurrentDb(_DocEntry, _DbEntry) + Select Case oDatabase._DbConnect + Case DBCONNECTFORM : _PropertyGet = oDatabase.Document.CurrentController.Frame.Title + Case DBCONNECTBASE : _PropertyGet = Component.CurrentController.Frame.Title + End Select + Case UCase("CurrentRecord") + If IsNull(DatabaseForm) Then _PropertyGet = 0 Else _PropertyGet = DatabaseForm.Row + Case UCase("Filter") + If IsNull(DatabaseForm) Then _PropertyGet = "" Else _PropertyGet = DatabaseForm.Filter + Case UCase("FilterOn") + If IsNull(DatabaseForm) Then _PropertyGet = False Else _PropertyGet = DatabaseForm.ApplyFilter + Case UCase("Height") + _PropertyGet = ContainerWindow.getPosSize().Height + Case UCase("IsLoaded") ' Only for indirect access from property object + _PropertyGet = IsLoaded + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("OnApproveCursorMove"), UCase("OnApproveParameter"), UCase("OnApproveReset"), UCase("OnApproveRowChange") _ + , UCase("OnApproveSubmit"), UCase("OnConfirmDelete"), UCase("OnCursorMoved"), UCase("OnErrorOccurred") _ + , UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnResetted"), UCase("OnRowChanged") _ + , UCase("OnUnloaded"), UCase("OnUnloading") + If IsNull(DatabaseForm) Then _PropertyGet = "" Else _PropertyGet = Utils._GetEventScriptCode(DatabaseForm, psProperty, _Name, True) + Case UCase("OpenArgs") + _PropertyGet = _OpenArgs + Case UCase("OrderBy") + _PropertyGet = _OrderBy + Case UCase("OrderByOn") + If IsNull(DatabaseForm) Then _PropertyGet = False Else _PropertyGet = ( DatabaseForm.Order <> "" ) + Case UCase("Recordset") + If IsNull(DatabaseForm) Then Goto Trace_Error + If DatabaseForm.Command = "" Then Goto Trace_Error ' No underlying data ?? + Set oObject = New Recordset + With DatabaseForm + oObject._This = oObject + oObject._CommandType = .CommandType + oObject._Command = .Command + oObject._ParentName = _Name + oObject._ParentType = _Type + Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + Set oObject._ParentDatabase = oDatabase + Set oObject._ParentDatabase.Connection = .ActiveConnection + oObject._ForwardOnly = ( .ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY ) + oObject._PassThrough = ( .EscapeProcessing = False ) + oObject._ReadOnly = ( .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY ) + Call oObject._Initialize() + End With + With oDatabase + .RecordsetMax = .RecordsetMax + 1 + oObject._Name = Format(.RecordsetMax, "0000000") + .RecordsetsColl.Add(oObject, UCase(oObject._Name)) + End With + If Not ( oObject._BOF And oObject._EOF ) Then oObject.MoveFirst() ' Do nothing if resultset empty + Set _PropertyGet = oObject + Case UCase("RecordSource") + If IsNull(DatabaseForm) Then _PropertyGet = "" Else _PropertyGet = DatabaseForm.Command + Case UCase("Visible") + _PropertyGet = ContainerWindow.IsVisible() + Case UCase("Width") + _PropertyGet = ContainerWindow.getPosSize().Width + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Form.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Error_Form: + TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, 1, _Name) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Form._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + + Utils._SetCalledSub("Form.set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +'Execute +Dim iArgNr As Integer, i As Integer +Dim oDatabase As Object + + If _Isleft(_A2B_.CalledSub, "Form.") Then iArgNr = 1 Else iArgNr = 2 + If Not IsLoaded Then Goto Trace_Error_Form + + Select Case UCase(psProperty) + Case UCase("AllowAdditions") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.AllowInserts = pvValue + DatabaseForm.reload() + Case UCase("AllowDeletions") + If Not Utils._CheckArgument(pvValue,iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.AllowDeletes = pvValue + DatabaseForm.reload() + Case UCase("AllowEdits") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.AllowUpdates = pvValue + DatabaseForm.reload() + Case UCase("Bookmark") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(vbObject), , False) Then Goto Trace_Error_Value + If IsNull(pvValue) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.MoveToBookmark(pvValue) + Case UCase("Caption") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + Select Case oDatabase._DbConnect + Case DBCONNECTFORM : oDatabase.Document.CurrentController.Frame.Title = pvValue + Case DBCONNECTBASE : Component.CurrentController.Frame.Title = pvValue + End Select + Case UCase("CurrentRecord") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 1 Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.absolute(pvValue) + Case UCase("Filter") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.Filter = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + Case UCase("FilterOn") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.ApplyFilter = pvValue + DatabaseForm.reload() + Case UCase("Height") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ContainerWindow, "IsMaximized") Then ' Ignored when <= OO3.2 + ContainerWindow.IsMaximized = False + ContainerWindow.IsMinimized = False + End If + ContainerWindow.setPosSize(0, 0, 0, pvValue, com.sun.star.awt.PosSize.HEIGHT) + Case UCase("OnApproveCursorMove"), UCase("OnApproveParameter"), UCase("OnApproveReset"), UCase("OnApproveRowChange") _ + , UCase("OnApproveSubmit"), UCase("OnConfirmDelete"), UCase("OnCursorMoved"), UCase("OnErrorOccurred") _ + , UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnResetted"), UCase("OnRowChanged") _ + , UCase("OnUnloaded"), UCase("OnUnloading") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + If Not Utils._RegisterEventScript(DatabaseForm _ + , psProperty _ + , _GetListener(psProperty) _ + , pvValue, _Name, True _ + ) Then GoTo Trace_Error + Case UCase("OrderBy") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + _OrderBy = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + Case UCase("OrderByOn") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + If pvValue Then DatabaseForm.Order = _OrderBy Else DatabaseForm.Order = "" + DatabaseForm.reload() + Case UCase("RecordSource") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If IsNull(DatabaseForm) Then Goto Trace_Error + DatabaseForm.Command = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + DatabaseForm.CommandType = com.sun.star.sdb.CommandType.COMMAND + DatabaseForm.Filter = "" + DatabaseForm.reload() + Case UCase("Visible") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + ContainerWindow.setVisible(pvValue) + Case UCase("Width") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric()) Then Goto Trace_Error_Value + If Utils._hasUNOProperty(ContainerWindow, "IsMaximized") Then ' Ignored when <= OO3.2 + ContainerWindow.IsMaximized = False + ContainerWindow.IsMinimized = False + End If + ContainerWindow.setPosSize(0, 0, pvValue, 0, com.sun.star.awt.PosSize.WIDTH) + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Form.set" & psProperty) + Exit Function +Trace_Error_Form: + TraceError(TRACEFATAL, ERRFORMNOTOPEN, Utils._CalledSub(), 0, 1, _Name) + _PropertySet = False + Goto Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Form._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/L10N.xba b/wizards/source/access2base/L10N.xba new file mode 100644 index 000000000..ef11f6f3e --- /dev/null +++ b/wizards/source/access2base/L10N.xba @@ -0,0 +1,540 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="L10N" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function _GetLabel(ByVal psShortlabel As String, Optional ByVal psLocale As String) As String +' Return the localized label corresponding with ShortLabel + + If IsMissing(psLocale) Then psLocale = UCase(Left(_A2B_.Locale, 2)) Else psLocale = UCase(psLocale) + On Local Error Goto Error_Function + If Not Utils._InList(psLocale, Array( _ + "EN", "FR", "ES", "DE" _ + )) Then psLocale = "DEFAULT" ' If list incomplete a recursive call will be provided anyway + +Dim sLocal As String + sLocal = psShortLabel + Select Case psLocale + Case "EN", "DEFAULT" + Select Case UCase(psShortlabel) + Case "ERR" & ERRDBNOTCONNECTED : sLocal = "No active connection to a database found" + Case "ERR" & ERRMISSINGARGUMENTS : sLocal = "Arguments are missing or are not initialized" + Case "ERR" & ERRWRONGARGUMENT : sLocal = "Argument nr. %0 [Value = '%1'] is invalid" + Case "ERR" & ERRMAINFORM : sLocal = "Document '%0' does not contain any form" + Case "ERR" & ERRFORMNOTIDENTIFIED : sLocal = "Form '%0' not identified in database Forms set" + Case "ERR" & ERRFORMNOTFOUND : sLocal = "Form '%0' not found" + Case "ERR" & ERRFORMNOTOPEN : sLocal = "Form '%0' is currently not open" + Case "ERR" & ERRDFUNCTION : sLocal = "DFunction execution failed, SQL=%0" + Case "ERR" & ERROPENFORM : sLocal = "Form '%0' could not be opened" + Case "ERR" & ERRPROPERTY : sLocal = "Property '%0' not applicable in this context" + Case "ERR" & ERRPROPERTYVALUE : sLocal = "Value '%0' is invalid for property '%1'" + Case "ERR" & ERRINDEXVALUE : sLocal = "Out of array range or incorrect array size for property '%0'" + Case "ERR" & ERRCOLLECTION : sLocal = "Out of array range" + Case "ERR" & ERRPROPERTYNOTARRAY : sLocal = "Argument nr.%0 should be an array" + Case "ERR" & ERRCONTROLNOTFOUND : sLocal = "Control '%0' not found in parent (form, grid or dialog) '%1'" + Case "ERR" & ERRNOACTIVEFORM : sLocal = "No active form or control found" + Case "ERR" & ERRDATABASEFORM : sLocal = "Form '%0' has no underlying dataset" + Case "ERR" & ERRFOCUSINGRID : sLocal = "Control '%0' not found in gridcontrol '%1'" + Case "ERR" & ERRNOGRIDINFORM : sLocal = "No gridcontrol found in form '%0'" + Case "ERR" & ERRFINDRECORD : sLocal = "FindNext() must be preceded by a successful FindRecord(...) call" + Case "ERR" & ERRSQLSTATEMENT : sLocal = "SQL Error, SQL statement = '%0'" + Case "ERR" & ERROBJECTNOTFOUND : sLocal = "%0 '%1' not found" + Case "ERR" & ERROPENOBJECT : sLocal = "%0 '%1' could not be opened" + Case "ERR" & ERRCLOSEOBJECT : sLocal = "%0 '%1' could not be closed" + Case "ERR" & ERRACTION : sLocal = "Action not applicable in this context" + Case "ERR" & ERRSENDMAIL : sLocal = "Mail service could not be activated" + Case "ERR" & ERRFORMYETOPEN : sLocal = "Form %0 is already open" + Case "ERR" & ERRMETHOD : sLocal = "Method '%0' not applicable in this context" + Case "ERR" & ERRPROPERTYINIT : sLocal = "Property '%0' applicable but not initialized" + Case "ERR" & ERRFILENOTCREATED : sLocal = "File '%0' could not be created" + Case "ERR" & ERRDIALOGNOTFOUND : sLocal = "Dialog '%0' not found in the currently loaded libraries" + Case "ERR" & ERRDIALOGUNDEFINED : sLocal = "Dialog unknown" + Case "ERR" & ERRDIALOGSTARTED : sLocal = "Dialog already started" + Case "ERR" & ERRDIALOGNOTSTARTED : sLocal = "Dialog '%0' not active" + Case "ERR" & ERRRECORDSETNODATA : sLocal = "Recordset delivered no data. Action on current record rejected" + Case "ERR" & ERRRECORDSETCLOSED : sLocal = "Recordset has been closed. Recordset action rejected" + Case "ERR" & ERRRECORDSETRANGE : sLocal = "Current record out of range" + Case "ERR" & ERRRECORDSETFORWARD : sLocal = "Action rejected in a forward-only or not bookmarkable recordset" + Case "ERR" & ERRFIELDNULL : sLocal = "Field is null or empty. Action rejected" + Case "ERR" & ERRFILEACCESS : sLocal = "File access error on file '%0'" + Case "ERR" & ERROVERFLOW : sLocal = "Field length (%0) exceeds maximum length. Use the '%1' method instead" + Case "ERR" & ERRNOTACTIONQUERY : sLocal = "Query '%0' is not an action query" + Case "ERR" & ERRNOTUPDATABLE : sLocal = "Database, recordset or field is read only" + Case "ERR" & ERRUPDATESEQUENCE : sLocal = "Recordset update sequence error" + Case "ERR" & ERRNOTNULLABLE : sLocal = "Field '%0' must not contain a NULL value" + Case "ERR" & ERRROWDELETED : sLocal = "Current row has been deleted by another process or user" + Case "ERR" & ERRRECORDSETCLONE : sLocal = "Cloning a cloned Recordset is forbidden" + Case "ERR" & ERRQUERYDEFDELETED : sLocal = "Pre-existing query '%0' has been deleted" + Case "ERR" & ERRTABLEDEFDELETED : sLocal = "Pre-existing table '%0' has been deleted" + Case "ERR" & ERRTABLECREATION : sLocal = "Table '%0' could not be created" + Case "ERR" & ERRFIELDCREATION : sLocal = "Field '%0' could not be created" + Case "ERR" & ERRSUBFORMNOTFOUND : sLocal = "Subform '%0' not found in parent form '%1'" + Case "ERR" & ERRWINDOW : sLocal = "Current window is not a document" + Case "ERR" & ERRCOMPATIBILITY : sLocal = "Field '%0' could not be converted due to incompatibility of field types between the respective database systems" + Case "ERR" & ERRPRECISION : sLocal = "Field '%0' could not be loaded in record #%1 due to capacity shortage" + Case "ERR" & ERRMODULENOTFOUND : sLocal = "Module '%0' not found in the currently loaded libraries" + Case "ERR" & ERRPROCEDURENOTFOUND : sLocal = "Procedure '%0' not found in module '%1'" + '---------------------------------------------------------------------------------------------------------------------- + Case "OBJECT" : sLocal = "Object" + Case "TABLE" : sLocal = "Table" + Case "QUERY" : slocal = "Query" + Case "FORM" : sLocal = "Form" + Case "REPORT" : sLocal = "Report" + Case "RECORDSET" : sLocal = "Recordset" + Case "FIELD" : sLocal = "Field" + Case "TEMPVAR" : sLocal = "Temporary variable" + Case "COMMANDBAR" : sLocal = "Command bar" + Case "COMMANDBARCONTROL" : sLocal = "Command bar control" + '---------------------------------------------------------------------------------------------------------------------- + Case "ERR#" : sLocal = "Error #" + Case "ERROCCUR" : sLocal = "occurred" + Case "ERRLINE" : sLocal = "at line" + Case "ERRIN" : sLocal = "in" + Case "CALLTO" : sLocal = "a call to function" + Case "SAVECONSOLE" : sLocal = "Save console" + Case "SAVECONSOLEENTRIES" : sLocal = "The console entries have been saved successfully." + Case "QUITSHORT" : sLocal = "Quit" + Case "QUIT" : sLocal = "Do you really want to quit the application ? Changed data will be saved." + Case "ENTERING" : sLocal = "Entering" + Case "EXITING" : sLocal = "Exiting" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGTRACE_HELP" : sLocal = "Manage the console buffer and its entries" + Case "DLGTRACE_TITLE" : sLocal = "Console" + Case "DLGTRACE_LBLENTRIES_HELP" : sLocal = "Clear the list and resize the circular buffer" + Case "DLGTRACE_LBLENTRIES_LABEL" : sLocal = "Set max number of entries" + Case "DLGTRACE_TXTTRACELOG_HELP" : sLocal = "Text can be selected, copied, ..." + Case "DLGTRACE_TXTTRACELOG_TEXT" : sLocal = "--- Log file is empty ---" + Case "DLGTRACE_CMDCANCEL_HELP" : sLocal = "Cancel and close the dialog" + Case "DLGTRACE_CMDCANCEL_LABEL" : sLocal = "Cancel" + Case "DLGTRACE_LBLCLEAR_HELP" : sLocal = "Clear the list" + Case "DLGTRACE_LBLCLEAR_LABEL" : sLocal = "Clear the list" + Case "DLGTRACE_LBLMINLEVEL_HELP" : sLocal = "Register only logging requests above given level" + Case "DLGTRACE_LBLMINLEVEL_LABEL" : sLocal = "Set minimal trace level" + Case "DLGTRACE_CMDOK_HELP" : sLocal = "Validate" + Case "DLGTRACE_CMDOK_LABEL" : sLocal = "OK" + Case "DLGTRACE_CMDDUMP_HELP" : sLocal = "Choose a file and dump the actual list content in it" + Case "DLGTRACE_CMDDUMP_LABEL" : sLocal = "Dump to file" + Case "DLGTRACE_LBLNBENTRIES_HELP" : sLocal = "Actual size of list" + Case "DLGTRACE_LBLNBENTRIES_LABEL" : sLocal = "Actual number of entries:" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGFORMAT_HELP" : sLocal = "Export the form" + Case "DLGFORMAT_TITLE" : sLocal = "OutputTo" + Case "DLGFORMAT_LBLFORMAT_HELP" : sLocal = "Format in which the form should be exported" + Case "DLGFORMAT_LBLFORMAT_LABEL" : sLocal = "Select the output format" + Case "DLGFORMAT_CMDOK_HELP" : sLocal = "Validate your choice" + Case "DLGFORMAT_CMDOK_LABEL" : sLocal = "OK" + Case "DLGFORMAT_CMDCANCEL_HELP" : sLocal = "Cancel and close the dialog" + Case "DLGFORMAT_CMDCANCEL_LABEL" : sLocal = "Cancel" + '---------------------------------------------------------------------------------------------------------------------- + Case Else : sLocal = "" + End Select + Case "FR" + Select Case UCase(psShortlabel) + Case "ERR" & ERRDBNOTCONNECTED : sLocal = "Pas de connexion active trouvée à une banque de données" + Case "ERR" & ERRMISSINGARGUMENTS : sLocal = "Des arguments sont manquants ou non initialisés" + Case "ERR" & ERRWRONGARGUMENT : sLocal = "L'argument n° %0 [Valeur = '%1'] n'est pas valable" + Case "ERR" & ERRMAINFORM : sLocal = "Le document '%0' ne contient aucun formulaire" + Case "ERR" & ERRFORMNOTIDENTIFIED : sLocal = "Le formulaire '%0' n'a pas pu être identifié parmi l'ensemble des formulaires de la Database" + Case "ERR" & ERRFORMNOTFOUND : sLocal = "Formulaire '%0' non trouvé" + Case "ERR" & ERRFORMNOTOPEN : sLocal = "Le formulaire '%0' n'est actuellement pas ouvert" + Case "ERR" & ERRDFUNCTION : sLocal = "L'exécution de la ""fonction database"" a échoué, SQL=%0" + Case "ERR" & ERROPENFORM : sLocal = "Le formulaire '%0' n'a pas pu être ouvert" + Case "ERR" & ERRPROPERTY : sLocal = "La propriété '%0' n'est pas applicable dans ce contexte" + Case "ERR" & ERRPROPERTYVALUE : sLocal = "La valeur '%0' est invalide pour la propriété '%1'" + Case "ERR" & ERRINDEXVALUE : sLocal = "Indice invalide ou dimension erronée du tableau pour la propriété '%0'" + Case "ERR" & ERRCOLLECTION : sLocal = "Indice de tableau invalide" + Case "ERR" & ERRPROPERTYNOTARRAY : sLocal = "L'argument n°%0 doit être un tableau" + Case "ERR" & ERRCONTROLNOTFOUND : sLocal = "Contrôle '%0' non trouvé dans le parent (formulaire, contrôle de table ou dialogue) '%1'" + Case "ERR" & ERRNOACTIVEFORM : sLocal = "Pas de formulaire ou de contrôle actif" + Case "ERR" & ERRDATABASEFORM : sLocal = "Le formulaire '%0' n'a pas de données sous-jacentes" + Case "ERR" & ERRFOCUSINGRID : sLocal = "Contrôle '%0' non trouvé dans le contrôle de table '%1'" + Case "ERR" & ERRNOGRIDINFORM : sLocal = "Aucun contrôle de table trouvé dans le formulaire '%0'" + Case "ERR" & ERRFINDRECORD : sLocal = "FindNext() doit être précédé par un appel réussi à FindRecord(...)" + Case "ERR" & ERRSQLSTATEMENT : sLocal = "Erreur SQL, instruction SQL = '%0'" + Case "ERR" & ERROBJECTNOTFOUND : sLocal = "%0 '%1' non trouvé(e)" + Case "ERR" & ERROPENOBJECT : sLocal = "%0 '%1': ouverture en échec" + Case "ERR" & ERRCLOSEOBJECT : sLocal = "%0 '%1': fermeture en échec" + Case "ERR" & ERRACTION : sLocal = "Action non applicable dans ce contexte" + Case "ERR" & ERRSENDMAIL : sLocal = "Le service de messagerie n'a pas pu être activé" + Case "ERR" & ERRFORMYETOPEN : sLocal = "Le formulaire %0 est déjà ouvert" + Case "ERR" & ERRMETHOD : sLocal = "La méthode '%0' n'est pas applicable dans ce contexte" + Case "ERR" & ERRPROPERTYINIT : sLocal = "Propriété '%0' applicable mais non initialisée" + Case "ERR" & ERRFILENOTCREATED : sLocal = "Erreur de création du fichier '%0'" + Case "ERR" & ERRDIALOGNOTFOUND : sLocal = "Dialogue '%0' introuvable dans les librairies chargées actuellement" + Case "ERR" & ERRDIALOGUNDEFINED : sLocal = "Boîte de dialogue inconnue" + Case "ERR" & ERRDIALOGSTARTED : sLocal = "Dialogue déjà initialisé précédemment" + Case "ERR" & ERRDIALOGNOTSTARTED : sLocal = "Dialogue '%0' non initialisé" + Case "ERR" & ERRRECORDSETNODATA : sLocal = "Recordset n'a pas fourni de données. Toute action sur les enregistrements est rejetée" + Case "ERR" & ERRRECORDSETCLOSED : sLocal = "Recordset a été clôturé. Action sur l'enregistrement courant est rejetée" + Case "ERR" & ERRRECORDSETRANGE : sLocal = "L'enregistrement courant est hors cadre" + Case "ERR" & ERRRECORDSETFORWARD : sLocal = "Action rejetée car recordset lisible seulement vers l'avant ou n'acceptant pas de signets" + Case "ERR" & ERRFIELDNULL : sLocal = "Champ nul ou vide. Action rejetée" + Case "ERR" & ERRFILEACCESS : sLocal = "Erreur d'accès au fichier '%0'" + Case "ERR" & ERROVERFLOW : sLocal = "La longueur du champ (%0) dépasse la taille maximale autorisée. Utiliser de préférence la méthode '%1'" + Case "ERR" & ERRNOTACTIONQUERY : sLocal = "La requête '%0' n'est pas une requête d'action" + Case "ERR" & ERRNOTUPDATABLE : sLocal = "La banque de données, le recordset ou le champ sont en lecture seulement" + Case "ERR" & ERRUPDATESEQUENCE : sLocal = "Erreur de séquence lors de la mise à jour d'un Recordset" + Case "ERR" & ERRNOTNULLABLE : sLocal = "Le champ '%0' ne peut pas recevoir une valeur NULLe" + Case "ERR" & ERRROWDELETED : sLocal = "L'enregistrement courant a été effacé par un autre processus ou un autre utilisateur" + Case "ERR" & ERRRECORDSETCLONE : sLocal = "Le clonage d'un Recordset cloné est interdit" + Case "ERR" & ERRQUERYDEFDELETED : sLocal = "La requête existante '%0' a été supprimée" + Case "ERR" & ERRTABLEDEFDELETED : sLocal = "La table existante '%0' a été supprimée" + Case "ERR" & ERRTABLECREATION : sLocal = "La table '%0' n'a pas pu être créée" + Case "ERR" & ERRFIELDCREATION : sLocal = "Le champ '%0' n'a pas pu être créé" + Case "ERR" & ERRSUBFORMNOTFOUND : sLocal = "Sous-formulaire '%0' non trouvé dans le formulaire parent '%1'" + Case "ERR" & ERRWINDOW : sLocal = "La fenêtre courante n'est pas un document" + Case "ERR" & ERRCOMPATIBILITY : sLocal = "Le champ '%0' n'a pas pu être converti à cause d'une incompatibilité entre les types de champs supportés par les systèmes de bases de données respectifs" + Case "ERR" & ERRPRECISION : sLocal = "Le champ '%0' n'a pas pu être chargé dans l'enregistrement #%1 par manque de capacité" + Case "ERR" & ERRMODULENOTFOUND : sLocal = "Le module '%0' est introuvable dans les librairies chargées actuellement" + Case "ERR" & ERRPROCEDURENOTFOUND : sLocal = "La procédure '%0' est introuvable dans le module '%1'" + '---------------------------------------------------------------------------------------------------------------------- + Case "OBJECT" : sLocal = "Objet" + Case "TABLE" : sLocal = "Table" + Case "QUERY" : slocal = "Requête" + Case "FORM" : sLocal = "Formulaire" + Case "REPORT" : sLocal = "Rapport" + Case "RECORDSET" : sLocal = "Recordset" + Case "FIELD" : sLocal = "Champ" + Case "TEMPVAR" : sLocal = "Variable temporaire" + Case "COMMANDBAR" : sLocal = "Barre de commande" + Case "COMMANDBARCONTROL" : sLocal = "Elément de barre de commande" + '---------------------------------------------------------------------------------------------------------------------- + Case "ERR#" : sLocal = "L'erreur #" + Case "ERROCCUR" : sLocal = "s'est produite" + Case "ERRLINE" : sLocal = "à la ligne" + Case "ERRIN" : sLocal = "dans" + Case "CALLTO" : sLocal = "un appel à la fonction" + Case "SAVECONSOLE" : sLocal = "Sauver console" + Case "SAVECONSOLEENTRIES" : sLocal = "Les entrées de la console ont été sauvées avec succès." + Case "QUITSHORT" : sLocal = "Quitter" + Case "QUIT" : sLocal = "Voulez-vous réellement quitter l'application ? Les données modifiées seront sauvées." + Case "ENTERING" : sLocal = "Entrée dans" + Case "EXITING" : sLocal = "Sortie de" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGTRACE_HELP" : sLocal = "Gestion du tampon de la console et toutes ses entrées" + Case "DLGTRACE_TITLE" : sLocal = "Console" + Case "DLGTRACE_LBLENTRIES_HELP" : sLocal = "Effacer la liste et redimensionner le tampon circulaire" + Case "DLGTRACE_LBLENTRIES_LABEL" : sLocal = "Définir le nombre maximum d'entrées" + Case "DLGTRACE_TXTTRACELOG_HELP" : sLocal = "Le texte peut être sélectionné, copié, ..." + Case "DLGTRACE_TXTTRACELOG_TEXT" : sLocal = "--- Le fichier journal est vide ---" + Case "DLGTRACE_CMDCANCEL_HELP" : sLocal = "Annuler et fermer la boîte de dialogue" + Case "DLGTRACE_CMDCANCEL_LABEL" : sLocal = "Annuler" + Case "DLGTRACE_LBLCLEAR_HELP" : sLocal = "Effacer la liste" + Case "DLGTRACE_LBLCLEAR_LABEL" : sLocal = "Effacer la liste" + Case "DLGTRACE_LBLMINLEVEL_HELP" : sLocal = "N'enregistrer que les demandes de journalisation à partir du niveau indiqué" + Case "DLGTRACE_LBLMINLEVEL_LABEL" : sLocal = "Définir le niveau minimal d'enregistrement" + Case "DLGTRACE_CMDOK_HELP" : sLocal = "Valider" + Case "DLGTRACE_CMDOK_LABEL" : sLocal = "OK" + Case "DLGTRACE_CMDDUMP_HELP" : sLocal = "Sélectionner un fichier et y vider le contenu actuel des traces enregistrées" + Case "DLGTRACE_CMDDUMP_LABEL" : sLocal = "Vider dans fichier" + Case "DLGTRACE_LBLNBENTRIES_HELP" : sLocal = "Taille actuelle de la liste" + Case "DLGTRACE_LBLNBENTRIES_LABEL" : sLocal = "Nombre actuel d'entrées:" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGFORMAT_HELP" : sLocal = "Exporter le formulaire" + Case "DLGFORMAT_TITLE" : sLocal = "OutputTo" + Case "DLGFORMAT_LBLFORMAT_HELP" : sLocal = "Format dans lequel le formulaire sera exporté" + Case "DLGFORMAT_LBLFORMAT_LABEL" : sLocal = "Selectionner le format de sortie" + Case "DLGFORMAT_CMDOK_HELP" : sLocal = "Valider votre choix" + Case "DLGFORMAT_CMDOK_LABEL" : sLocal = "OK" + Case "DLGFORMAT_CMDCANCEL_HELP" : sLocal = "Annuler et fermer la boîte de dialogue" + Case "DLGFORMAT_CMDCANCEL_LABEL" : sLocal = "Annuler" + '---------------------------------------------------------------------------------------------------------------------- + Case Else : sLocal = _Getlabel(psShortLabel, "DEFAULT") + End Select +'******************************************************** +'Translated by Iñigo Zuluaga +'******************************************************** + Case "ES" '(España) + Select Case UCase(psShortlabel) + Case "ERR" & ERRDBNOTCONNECTED : sLocal = "No se ha encontrado una conexión activa a una base de datos" + Case "ERR" & ERRMISSINGARGUMENTS : sLocal = "Faltan argumentos o no están inicializados" + Case "ERR" & ERRWRONGARGUMENT : sLocal = "El argumento nr. %0 [Value = '%1'] no es válido" + Case "ERR" & ERRMAINFORM : sLocal = "El documento '%0' no contiene ningún formulario" + Case "ERR" & ERRFORMNOTIDENTIFIED : sLocal = "No se ha identificado el formulario '%0' en el conjunto de formularios de la base de datos" + Case "ERR" & ERRFORMNOTFOUND : sLocal = "No se ha encontrado el formulario '%0'" + Case "ERR" & ERRFORMNOTOPEN : sLocal = "El formulario '%0' no está abierto" + Case "ERR" & ERRDFUNCTION : sLocal = "La ejecución de DFunction falló, SQL=%0" + Case "ERR" & ERROPENFORM : sLocal = "El formulario '%0' no se puede abrir" + Case "ERR" & ERRPROPERTY : sLocal = "La propiedad '%0' no es aplicable en este contexto" + Case "ERR" & ERRPROPERTYVALUE : sLocal = "El valor '%0' es inválido para la propiedad '%1'" + Case "ERR" & ERRINDEXVALUE : sLocal = "Fuera del rango de la matriz o tamaño incorrecto de la matriz para la propiedad '%0'" + Case "ERR" & ERRCOLLECTION : sLocal = "Fuera del rango de la matriz" + Case "ERR" & ERRPROPERTYNOTARRAY : sLocal = "El argumento nr.%0 debería ser una matriz" + Case "ERR" & ERRCONTROLNOTFOUND : sLocal = "El control '%0' not found in parent (formulario, control de tabla or diálogo) '%1'" + Case "ERR" & ERRNOACTIVEFORM : sLocal = "No se ha encontrado un formulario o control activo" + Case "ERR" & ERRDATABASEFORM : sLocal = "El formulario '%0' no tiene datos subyacentes" + Case "ERR" & ERRFOCUSINGRID : sLocal = "No se ha encontrado el control '%0' en el control de tabla '%1'" + Case "ERR" & ERRNOGRIDINFORM : sLocal = "No se ha encontrado un control de tabla en el formulario '%0'" + Case "ERR" & ERRFINDRECORD : sLocal = "FindNext() tiene que ser precedido por una llamada exitosa de FindRecord(...)" + Case "ERR" & ERRSQLSTATEMENT : sLocal = "Error SQL, instrución SQL = '%0'" + Case "ERR" & ERROBJECTNOTFOUND : sLocal = "%0 '%1' no encontrado" + Case "ERR" & ERROPENOBJECT : sLocal = "%0 '%1' no se puede abrir" + Case "ERR" & ERRCLOSEOBJECT : sLocal = "%0 '%1' no se puede abrir" + Case "ERR" & ERRACTION : sLocal = "Acción no aplicable en este contexto" + Case "ERR" & ERRSENDMAIL : sLocal = "No se puede activar el servicio de correo" + Case "ERR" & ERRFORMYETOPEN : sLocal = "El formulario %0 ya está abierto" + Case "ERR" & ERRMETHOD : sLocal = "El método '%0' no es aplicable en este contexto" + Case "ERR" & ERRPROPERTYINIT : sLocal = "Propiedad '%0' aplicable pero no inicializada" + Case "ERR" & ERRFILENOTCREATED : sLocal = "No se ha podido crear el archivo '%0'" + Case "ERR" & ERRDIALOGNOTFOUND : sLocal = "No se ha encontrado el diálogo '%0' en las bibliotecas cargadas actualmente" + Case "ERR" & ERRDIALOGUNDEFINED : sLocal = "Diálogo desconocido" + Case "ERR" & ERRDIALOGSTARTED : sLocal = "El diálogo ya está iniciado" + Case "ERR" & ERRDIALOGNOTSTARTED : sLocal = "El diálogo '%0' no está activo" + Case "ERR" & ERRRECORDSETNODATA : sLocal = "El Recordset no suministra datos. La acción en el registro actual rechazada" + Case "ERR" & ERRRECORDSETCLOSED : sLocal = "El recorset se ha cerrado. Acción con el Recordset rechazada" + Case "ERR" & ERRRECORDSETRANGE : sLocal = "Registro actual fuera de rango" + Case "ERR" & ERRRECORDSETFORWARD : sLocal = "Acción rechazada en un recorset legible sólo hacia adelante o que no admita marcadores" + Case "ERR" & ERRFIELDNULL : sLocal = "El campo es nulo o vacío. Acción rechazada" + Case "ERR" & ERRFILEACCESS : sLocal = "Error durante el acceso al archivo '%0'" + Case "ERR" & ERROVERFLOW : sLocal = "La longitud del campo (%0) excede la longitud máxima. Reemplazar por el método '%1'" + Case "ERR" & ERRNOTACTIONQUERY : sLocal = "La consulta '%0' no es una consulta de acción" + Case "ERR" & ERRNOTUPDATABLE : sLocal = "La base de datos, el Recordset o el Campo es de sólo lectura" + Case "ERR" & ERRUPDATESEQUENCE : sLocal = "Error durante la secuencia de actualización del Recordset" + Case "ERR" & ERRNOTNULLABLE : sLocal = "El campo '%0' no puede contener un valor NULL" + Case "ERR" & ERRROWDELETED : sLocal = "La fila actual ha sido borrada por otro proceso o usuario" + Case "ERR" & ERRRECORDSETCLONE : sLocal = "No se puede clonar un Recordset clonado" + Case "ERR" & ERRQUERYDEFDELETED : sLocal = "Se ha borrado la consulta pre-existente '%0'" + Case "ERR" & ERRTABLEDEFDELETED : sLocal = "Se ha borrado la tabla pre-existente '%0'" + Case "ERR" & ERRTABLECREATION : sLocal = "No se ha podido crear la Tabla '%0'" + Case "ERR" & ERRFIELDCREATION : sLocal = "No se ha podido crear el campo '%0'" + Case "ERR" & ERRSUBFORMNOTFOUND : sLocal = "No se ha encontrado el Subformulario '%0' en el subformulario padre '%1'" + Case "ERR" & ERRWINDOW : sLocal = "La ventana actual no es un documento" + Case "ERR" & ERRCOMPATIBILITY : sLocal = "El campo '%0' no se ha convertido debido a una incompatibilidad de los tipos de campo soportados entre las dos bases de datos" + Case "ERR" & ERRPRECISION : sLocal = "El campo '%0' no se ha cargado en el registro #%1 por falta de capacidad" + Case "ERR" & ERRMODULENOTFOUND : sLocal = "Module '%0' not found in the currently loaded libraries" + Case "ERR" & ERRPROCEDURENOTFOUND : sLocal = "Procedure '%0' not found in module '%1'" + '---------------------------------------------------------------------------------------------------------------------- + Case "OBJECT" : sLocal = "Objeto" + Case "TABLE" : sLocal = "Tabla" + Case "QUERY" : slocal = "Consulta" + Case "FORM" : sLocal = "Formulario" + Case "REPORT" : sLocal = "Informe" + Case "RECORDSET" : sLocal = "Recordset" + Case "FIELD" : sLocal = "Campo" + Case "TEMPVAR" : sLocal = "Variable temporal" + Case "COMMANDBAR" : sLocal = "Barra de comandos" + Case "COMMANDBARCONTROL" : sLocal = "Control de barra de comandos" + '---------------------------------------------------------------------------------------------------------------------- + Case "ERR#" : sLocal = "Error #" + Case "ERROCCUR" : sLocal = "ocurrido" + Case "ERRLINE" : sLocal = "en línea" + Case "ERRIN" : sLocal = "en" + Case "CALLTO" : sLocal = "una llamada a la función" + Case "SAVECONSOLE" : sLocal = "Guardar consola" + Case "SAVECONSOLEENTRIES" : sLocal = "Las entradas de la consola han sido guardadas correctamente." + Case "QUITSHORT" : sLocal = "Cerrar" + Case "QUIT" : sLocal = "Quieres realmente cerrar la aplicación? los datos cambiados se guardarán." + Case "ENTERING" : sLocal = "Entrando" + Case "EXITING" : sLocal = "Saliendo" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGTRACE_HELP" : sLocal = "Gestión del buffer de la consola y sus entradas" + Case "DLGTRACE_TITLE" : sLocal = "Consola" + Case "DLGTRACE_LBLENTRIES_HELP" : sLocal = "Limpiar la lista y redimensionar el buffer circular" + Case "DLGTRACE_LBLENTRIES_LABEL" : sLocal = "Definir el número máximo de entradas" + Case "DLGTRACE_TXTTRACELOG_HELP" : sLocal = "El texto puede ser seleccionado, copiado, ..." + Case "DLGTRACE_TXTTRACELOG_TEXT" : sLocal = "--- El archivo Histórico está vacío ---" + Case "DLGTRACE_CMDCANCEL_HELP" : sLocal = "Cancelar y cerrar el diálogo" + Case "DLGTRACE_CMDCANCEL_LABEL" : sLocal = "Cancelar" + Case "DLGTRACE_LBLCLEAR_HELP" : sLocal = "Limpiar la lista" + Case "DLGTRACE_LBLCLEAR_LABEL" : sLocal = "Limpiar la lista" + Case "DLGTRACE_LBLMINLEVEL_HELP" : sLocal = "No registrar más que las peticiones de registro a partir de un nivel indicado" + Case "DLGTRACE_LBLMINLEVEL_LABEL" : sLocal = "Definir el nivel mínimo de registro" + Case "DLGTRACE_CMDOK_HELP" : sLocal = "Validar" + Case "DLGTRACE_CMDOK_LABEL" : sLocal = "Aceptar" + Case "DLGTRACE_CMDDUMP_HELP" : sLocal = "Elegir un archivo y guardar en él el contenido de la lista actual" + Case "DLGTRACE_CMDDUMP_LABEL" : sLocal = "Guardar en a archivo" + Case "DLGTRACE_LBLNBENTRIES_HELP" : sLocal = "Tamaño actual de la lista" + Case "DLGTRACE_LBLNBENTRIES_LABEL" : sLocal = "Numero actual de entradas:" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGFORMAT_HELP" : sLocal = "Exportar el formulario" + Case "DLGFORMAT_TITLE" : sLocal = "Exportar como" + Case "DLGFORMAT_LBLFORMAT_HELP" : sLocal = "Formato en el que será ser exportado el formulario" + Case "DLGFORMAT_LBLFORMAT_LABEL" : sLocal = "Seleccionar el formato de salida" + Case "DLGFORMAT_CMDOK_HELP" : sLocal = "Validar su elección" + Case "DLGFORMAT_CMDOK_LABEL" : sLocal = "Aceptar" + Case "DLGFORMAT_CMDCANCEL_HELP" : sLocal = "Cancelar y cerrar el diálogo" + Case "DLGFORMAT_CMDCANCEL_LABEL" : sLocal = "Cancelar" + '---------------------------------------------------------------------------------------------------------------------- + Case Else : sLocal = _Getlabel(psShortLabel, "DEFAULT") + End Select +'******************************************************** +'Translated by Gisbert Friege +'******************************************************** + Case "DE" + Select Case UCase(psShortlabel) + Case "ERR" & ERRDBNOTCONNECTED : sLocal = "Keine aktive Verbindung zu einer Datenbank gefunden" + Case "ERR" & ERRMISSINGARGUMENTS : sLocal = "Argumente fehlen oder sind nicht initialisiert" + Case "ERR" & ERRWRONGARGUMENT : sLocal = "Argument Nr. %0 [Wert = '%1'] ist ungültig" + Case "ERR" & ERRMAINFORM : sLocal = "Dokument '%0' enthält kein Formular" + Case "ERR" & ERRFORMNOTIDENTIFIED : sLocal = "Formular '%0' nicht bei den Datenbank-Formularen erkannt" + Case "ERR" & ERRFORMNOTFOUND : sLocal = "Formular '%0' nicht gefunden" + Case "ERR" & ERRFORMNOTOPEN : sLocal = "Formular '%0' ist zur Zeit nicht offen" + Case "ERR" & ERRDFUNCTION : sLocal = "DFunction Ausführung misslungen, SQL=%0" + Case "ERR" & ERROPENFORM : sLocal = "Formular '%0' konnte nicht geöffnet werden" + Case "ERR" & ERRPROPERTY : sLocal = "Eigenschaft '%0' in diesem Kontext nicht anwendbar" + Case "ERR" & ERRPROPERTYVALUE : sLocal = "Wert '%0' ist ungültig für die Eigenschaft '%1'" + Case "ERR" & ERRINDEXVALUE : sLocal = "Außerhalb des Array-Bereichs oder falsche Array-Größe für Eigenschaft '%0'" + Case "ERR" & ERRCOLLECTION : sLocal = "Außerhalb des Array-Bereichs" + Case "ERR" & ERRPROPERTYNOTARRAY : sLocal = "Argument Nr.%0 sollte ein Array sein" + Case "ERR" & ERRCONTROLNOTFOUND : sLocal = "Steuerelement '%0' nicht gefunden in parent (Formular, Tabelle oder Dialog) '%1'" + Case "ERR" & ERRNOACTIVEFORM : sLocal = "Kein aktives Formular oder Steuerelement gefunden" + Case "ERR" & ERRDATABASEFORM : sLocal = "Formular '%0' basiert nicht auf einem Datensatz" + Case "ERR" & ERRFOCUSINGRID : sLocal = "Steuerelement '%0' im Tabellen-Steuerelement '%1' nicht gefunden" + Case "ERR" & ERRNOGRIDINFORM : sLocal = "Kein Tabellen-Steuerelement im Formular '%0' gefunden" + Case "ERR" & ERRFINDRECORD : sLocal = "Bei FindNext() muss ein erfolgreicher FindRecord(...)-Aufruf vorhergehen" + Case "ERR" & ERRSQLSTATEMENT : sLocal = "SQL Error, SQL statement = '%0'" + Case "ERR" & ERROBJECTNOTFOUND : sLocal = "%0 '%1' nicht gefunden" + Case "ERR" & ERROPENOBJECT : sLocal = "%0 '%1' konnte nicht geöffnet werden" + Case "ERR" & ERRCLOSEOBJECT : sLocal = "%0 '%1' konnte nicht geschlossen werden" + Case "ERR" & ERRACTION : sLocal = "Aktion in diesem Kontext nicht anwendbar" + Case "ERR" & ERRSENDMAIL : sLocal = "Email-Dienst konnte nicht aktiviert werden" + Case "ERR" & ERRFORMYETOPEN : sLocal = "Formular %0 ist schon offen" + Case "ERR" & ERRMETHOD : sLocal = "Methode '%0' in diesem Kontext nicht anwendbar" + Case "ERR" & ERRPROPERTYINIT : sLocal = "Eigenschaft '%0' anwendbar aber nicht initialisiert" + Case "ERR" & ERRFILENOTCREATED : sLocal = "Datei '%0' konnte nicht erzeugt werden" + Case "ERR" & ERRDIALOGNOTFOUND : sLocal = "Dialog '%0' nicht in den aktuell geladenen Bibliotheken gefunden" + Case "ERR" & ERRDIALOGUNDEFINED : sLocal = "Dialog unbekannt" + Case "ERR" & ERRDIALOGSTARTED : sLocal = "Dialog schon gestartet" + Case "ERR" & ERRDIALOGNOTSTARTED : sLocal = "Dialog '%0' nicht aktiv" + Case "ERR" & ERRRECORDSETNODATA : sLocal = "Datensatz ergab keine Daten. Aktion auf aktuellem Datensatz verweigert" + Case "ERR" & ERRRECORDSETCLOSED : sLocal = "Datensatz wurde geschlossen. Datensatz-Aktion verweigert" + Case "ERR" & ERRRECORDSETRANGE : sLocal = "Aktueller Datensatz außerhalb des Bereichs" + Case "ERR" & ERRRECORDSETFORWARD : sLocal = "Aktion verweigert auf einem nur vorwärts lesbaren oder keine Textmarken unterstützenden Datensatz" + Case "ERR" & ERRFIELDNULL : sLocal = "Feld ist null oder leer. Aktion verweigert" + Case "ERR" & ERRFILEACCESS : sLocal = "Dateizugriffs-Fehler bei Datei '%0'" + Case "ERR" & ERROVERFLOW : sLocal = "Feldlänge (%0) überschreitet die maximale Länge. Verwende stattdessen die Methode '%1'" + Case "ERR" & ERRNOTACTIONQUERY : sLocal = "Abfrage '%0' ist keine Aktionsabfrage" + Case "ERR" & ERRNOTUPDATABLE : sLocal = "Datenbank, Datensatz oder Feld kann nur gelesen werden" + Case "ERR" & ERRUPDATESEQUENCE : sLocal = "Datensatz-Update Folgefehler" + Case "ERR" & ERRNOTNULLABLE : sLocal = "Feld '%0' darf keinen NULL-Wert haben" + Case "ERR" & ERRROWDELETED : sLocal = "Aktuelle Zeile wurde durch einen anderen Prozess oder Benutzer gelösch" + Case "ERR" & ERRRECORDSETCLONE : sLocal = "Ein geklonter Datensatz kann nicht geklont werden" + Case "ERR" & ERRQUERYDEFDELETED : sLocal = "Bereits vorhandene Abfrage '%0' wurde gelöscht" + Case "ERR" & ERRTABLEDEFDELETED : sLocal = "Bereits vorhandene Tabelle '%0' wurde gelöscht" + Case "ERR" & ERRTABLECREATION : sLocal = "Tabelle '%0' konnte nicht erzeugt werden" + Case "ERR" & ERRFIELDCREATION : sLocal = "Feld '%0' konnte nicht erzeugt werden" + Case "ERR" & ERRSUBFORMNOTFOUND : sLocal = "Unterformular '%0' nicht im Eltern-Formular '%1 gefunden" + Case "ERR" & ERRWINDOW : sLocal = "Aktuelles Fenster ist kein Dokument" + Case "ERR" & ERRCOMPATIBILITY : sLocal = "Feld '%0' konnte wegen inkompatibler Feldtypen der Datenbanksysteme nicht konvertiert werden" + Case "ERR" & ERRPRECISION : sLocal = "Feld '%0' konnte wegen fehlender Speicherkapazität nicht in den Datensatz #%1 geladen werden" + Case "ERR" & ERRMODULENOTFOUND : sLocal = "Modul '%0' nicht gefunden in den aktuell geladen Bibliotheken" + Case "ERR" & ERRPROCEDURENOTFOUND : sLocal = "Prozedur '%0' im Modul '%1' nicht gefunden" + '---------------------------------------------------------------------------------------------------------------------- + Case "OBJECT" : sLocal = "Objekt" + Case "TABLE" : sLocal = "Tabelle" + Case "QUERY" : slocal = "Abfrage" + Case "FORM" : sLocal = "Formular" + Case "REPORT" : sLocal = "Report" + Case "RECORDSET" : sLocal = "Datensatz" + Case "FIELD" : sLocal = "Feld" + Case "TEMPVAR" : sLocal = "Temporäre Variable" + Case "COMMANDBAR" : sLocal = "Befehlsleiste" + Case "COMMANDBARCONTROL" : sLocal = "Befehlsleisten-Steuerelement" + '---------------------------------------------------------------------------------------------------------------------- + Case "ERR#" : sLocal = "Error #" + Case "ERROCCUR" : sLocal = "aufgetreten" + Case "ERRLINE" : sLocal = "in Zeile" + Case "ERRIN" : sLocal = "in" + Case "CALLTO" : sLocal = "ein Funktionsaufruf" + Case "SAVECONSOLE" : sLocal = "Konsoleneingaben sichern" + Case "SAVECONSOLEENTRIES" : sLocal = "Die Konsoleneingaben wurden erfolgreich gesichert." + Case "QUITSHORT" : sLocal = "Beenden" + Case "QUIT" : sLocal = "Wollen Sie wirklich die Anwendung beenden? Geänderte Daten werden gesichert." + Case "ENTERING" : sLocal = "Beginne mit" + Case "EXITING" : sLocal = "Verlasse" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGTRACE_HELP" : sLocal = "Verwalte den Konsolenpuffer und seine Eingaben" + Case "DLGTRACE_TITLE" : sLocal = "Konsole" + Case "DLGTRACE_LBLENTRIES_HELP" : sLocal = "Leere die Liste und ändere die Größe des Umlaufpuffers" + Case "DLGTRACE_LBLENTRIES_LABEL" : sLocal = "Setze maximale Anzahl von Eingaben" + Case "DLGTRACE_TXTTRACELOG_HELP" : sLocal = "Text kann ausgewählt, kopiert, ... werden" + Case "DLGTRACE_TXTTRACELOG_TEXT" : sLocal = "--- Log Datei ist leer ---" + Case "DLGTRACE_CMDCANCEL_HELP" : sLocal = "Abbrechen und den Dialog schließen" + Case "DLGTRACE_CMDCANCEL_LABEL" : sLocal = "Abbrechen" + Case "DLGTRACE_LBLCLEAR_HELP" : sLocal = "Leere die Liste" + Case "DLGTRACE_LBLCLEAR_LABEL" : sLocal = "Leere die Liste" + Case "DLGTRACE_LBLMINLEVEL_HELP" : sLocal = "Registriere nur Logging-Anfragen oberhalb des gegebenen Levels" + Case "DLGTRACE_LBLMINLEVEL_LABEL" : sLocal = "Setze minimalen Fehlerbehandlungs-Level" + Case "DLGTRACE_CMDOK_HELP" : sLocal = "Übernehmen" + Case "DLGTRACE_CMDOK_LABEL" : sLocal = "OK" + Case "DLGTRACE_CMDDUMP_HELP" : sLocal = "Wähle eine Datei und speichere darin den aktuellen Listeninhalt" + Case "DLGTRACE_CMDDUMP_LABEL" : sLocal = "Ausgabe in Datei" + Case "DLGTRACE_LBLNBENTRIES_HELP" : sLocal = "Aktuelle Länge der Liste" + Case "DLGTRACE_LBLNBENTRIES_LABEL" : sLocal = "Aktuelle Anzahl von Einträgen:" + '---------------------------------------------------------------------------------------------------------------------- + Case "DLGFORMAT_HELP" : sLocal = "Exportiere das Formular" + Case "DLGFORMAT_TITLE" : sLocal = "Export" + Case "DLGFORMAT_LBLFORMAT_HELP" : sLocal = "Format, in dem das Formular exportiert werden soll" + Case "DLGFORMAT_LBLFORMAT_LABEL" : sLocal = "Wähle das Ausgabe-Format" + Case "DLGFORMAT_CMDOK_HELP" : sLocal = "Auswahl übernehmen" + Case "DLGFORMAT_CMDOK_LABEL" : sLocal = "OK" + Case "DLGFORMAT_CMDCANCEL_HELP" : sLocal = "Abbrechen und den Dialog schließen" + Case "DLGFORMAT_CMDCANCEL_LABEL" : sLocal = "Abbrechen" + '---------------------------------------------------------------------------------------------------------------------- + Case Else : sLocal = _Getlabel(psShortLabel, "DEFAULT") + End Select +REM ******************************************************************************************************************************************* +REM *** *** +REM *** ANY OTHER LANGUAGE TO BE INSERTED HERE *** +REM *** *** +REM ******************************************************************************************************************************************* + Case Else + sLocal = _Getlabel(psShortLabel, "DEFAULT") + End Select + +Exit_Function: + _Getlabel = sLocal + Exit Function +Error_Function: + sLocal = psShortLabel + GoTo Exit_Function +End Function ' GetLabel V0.8.9 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetLabelArray(ByVal pvShortlabel As Variant, Optional ByVal psLocale As String) As Variant +' Return the localized label corresponding with the ShortLabel array of strings + + If IsMissing(psLocale) Then psLocale = UCase(Left(_GetLocale(), 2)) Else psLocale = UCase(psLocale) + On Local Error Goto Error_Function + +Dim vLocal() As Variant, i As integer + vLocal = Array() + + If Not IsArray(pvShortLabel) Then + vLocal = _GetLabel(pvShortLabel, psLocale) + Goto Exit_Function + End If + + ReDim vLocal(LBound(pvShortLabel) To UBound(pvShortlabel)) + For i = LBound(pvShortLabel) To UBound(pvShortlabel) + vLocal(i) = _GetLabel(pvShortLabel(i), psLocale) + Next i + +Exit_Function: + _GetlabelArray = vLocal() + Exit Function +Error_Function: + vLocal = Array() + GoTo Exit_Function +End Function ' GetLabelArray V0.8.9 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetLocale() as String +'Return OO localization +'Derived from Tools library + +Dim oLocale as Object + oLocale = _GetRegistryKeyContent("org.openoffice.Setup/L10N") + _GetLocale = oLocale.getByName("ooLocale") +End Function ' GetLocale V0.8.9 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Methods.xba b/wizards/source/access2base/Methods.xba new file mode 100644 index 000000000..7f809c6c1 --- /dev/null +++ b/wizards/source/access2base/Methods.xba @@ -0,0 +1,300 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Methods" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AddItem(Optional pvBox As Variant, ByVal Optional pvItem As Variant, ByVal Optional pvIndex) As Boolean +' Add an item in a Listbox + + Utils._SetCalledSub("AddItem") + If _ErrorHandler() Then On Local Error Goto Error_Function + + If IsMissing(pvBox) Or IsMissing(pvItem) Then Call _TraceArguments() + If IsMissing(pvIndex) Then pvIndex = -1 + If Not Utils._CheckArgument(pvBox, 1, Array(CTLLISTBOX, CTLCOMBOBOX)) Then Goto Exit_Function + + AddItem = pvBox.AddItem(pvItem, pvIndex) + +Exit_Function: + Utils._ResetCalledSub("AddItem") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "AddItem", Erl) + AddItem = False + GoTo Exit_Function +End Function ' AddItem V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(Optional pvObject As Variant, ByVal Optional pvProperty As Variant) As Boolean +' Return True if pvObject has a valid property called pvProperty (case-insensitive comparison !) + +Dim vPropertiesList As Variant + + Utils._SetCalledSub("hasProperty") + If IsMissing(pvObject) Or IsMissing(pvProperty) Then Call _TraceArguments() + + hasProperty = False + If Not Utils._CheckArgument(pvObject, 1, Array(OBJCOLLECTION, OBJFORM, OBJSUBFORM, OBJCONTROL, OBJOPTIONGROUP, OBJEVENT _ + , OBJPROPERTY, OBJDATABASE, OBJQUERYDEF, OBJTABLEDEF, OBJRECORDSET _ + )) Then Goto Exit_Function + If Not Utils._CheckArgument(pvProperty, 2, vbString) Then Goto Exit_Function + + hasProperty = pvObject.hasProperty(pvProperty) + +Exit_Function: + Utils._ResetCalledSub("hasProperty") + Exit Function +End Function ' hasProperty V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Move(Optional pvObject As Object _ + , ByVal Optional pvLeft As Variant _ + , ByVal Optional pvTop As Variant _ + , ByVal Optional pvWidth As Variant _ + , ByVal Optional pvHeight As Variant _ + ) As Variant +' Execute Move method + Utils._SetCalledSub("Move") + If IsMissing(pvObject) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + Move = False + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJDIALOG)) Then Goto Exit_Function + If IsMissing(pvLeft) Then Call _TraceArguments() + If IsMissing(pvTop) Then pvTop = -1 + If IsMissing(pvWidth) Then pvWidth = -1 + If IsMissing(pvHeight) Then pvHeight = -1 + + Move = pvObject.Move(pvLeft, pvTop, pvWidth, pvHeight) + +Exit_Function: + Utils._ResetCalledSub("Move") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Move", Erl) + GoTo Exit_Function +End Function ' Move V.0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenHelpFile() +' Open the help file from the Help menu (IDE only) +Const cstHelpFile = "http://www.access2base.com/access2base.html" + + On Local Error Resume Next + Call _ShellExecute(cstHelpFile) + +End Function ' OpenHelpFile V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(Optional pvObject As Variant, ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperties As Variant, oCounter As Variant, opProperty As Variant +Dim vPropertiesList() As Variant + + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments() + Utils._SetCalledSub("Properties") + + Set vProperties = Nothing + If Not Utils._CheckArgument(pvObject, 1, Array(OBJCOLLECTION, OBJFORM, OBJSUBFORM, OBJCONTROL, OBJOPTIONGROUP, OBJEVENT _ + , OBJPROPERTY, OBJDATABASE, OBJQUERYDEF, OBJTABLEDEF, OBJRECORDSET _ + )) Then Goto Exit_Function + + If IsMissing(pvIndex) Then vProperties = pvObject.Properties Else vProperties = pvObject.Properties(pvIndex) + +Exit_Function: + Set Properties = vProperties + Utils._ResetCalledSub("Properties") + Exit Function +End Function ' Properties V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Refresh(Optional pvObject As Variant) As Boolean +' Refresh data with its most recent value in the database in a form or subform + Utils._SetCalledSub("Refresh") + If IsMissing(pvObject) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + Refresh = False + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + + Refresh = pvObject.Refresh() + +Exit_Function: + Utils._ResetCalledSub("Refresh") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Refresh", Erl) + GoTo Exit_Function +End Function ' Refresh V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function RemoveItem(Optional pvBox As Variant,ByVal Optional pvIndex) As Boolean +' Remove an item from a Listbox +' Index may be a string value or an index-position + + Utils._SetCalledSub("RemoveItem") + If _ErrorHandler() Then On Local Error Goto Error_Function + + If IsMissing(pvBox) Or IsMissing(pvIndex) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvBox, 1, Array(CTLLISTBOX, CTLCOMBOBOX)) Then Goto Exit_Function + + RemoveItem = pvBox.RemoveItem(pvIndex) + +Exit_Function: + Utils._ResetCalledSub("RemoveItem") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "RemoveItem", Erl) + RemoveItem = False + GoTo Exit_Function +End Function ' RemoveItem V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Requery(Optional pvObject As Variant) As Boolean +' Refresh data displayed in a form, subform, combobox or listbox + Utils._SetCalledSub("Requery") + If IsMissing(pvObject) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJCONTROL, OBJSUBFORM)) Then Goto Exit_Function + + Requery = pvObject.Requery() + +Exit_Function: + Utils._ResetCalledSub("Requery") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Requery", Erl) + GoTo Exit_Function +End Function ' Requery V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function SetFocus(Optional pvObject As Variant) As Boolean +' Execute SetFocus method + Utils._SetCalledSub("setFocus") + If IsMissing(pvObject) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJCONTROL)) Then Goto Exit_Function + + SetFocus = pvObject.setFocus() + +Exit_Function: + Utils._ResetCalledSub("SetFocus") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SetFocus", Erl) + Goto Exit_Function +Error_Grid: + TraceError(TRACEFATAL, ERRFOCUSINGRID, Utils._CalledSub(), 0, 1, Array(pvObject._Name, ocGrid._Name)) + Goto Exit_Function +End Function ' SetFocus V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _OptionGroup(ByVal pvGroupName As Variant _ + , ByVal psParentType As String _ + , poComponent As Object _ + , poParent As Object _ + ) As Variant +' Return either an error or an object of type OPTIONGROUP based on its name + + If IsMissing(pvGroupName) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + Set _OptionGroup = Nothing + + If Not Utils._CheckArgument(pvGroupName, 1, vbString) Then Goto Exit_Function + +Dim ogGroup As Variant, i As Integer, j As Integer, bFound As Boolean +Dim vOptionButtons() As Variant, sGroupName As String +Dim lXY() As Long, iIndex() As Integer ' Two indexes X-Y coordinates +Dim oView As Object, oDatabaseForm As Object, vControls As Variant + +Const cstPixels = 10 ' Tolerance on coordinates when drawn approximately + + bFound = False + Select Case psParentType + Case CTLPARENTISFORM + 'poParent is a forms collection, find the appropriate database form + For i = 0 To poParent.Count - 1 + Set oDatabaseForm = poParent.getByIndex(i) + If Not IsNull(oDatabaseForm) Then + For j = 0 To oDatabaseForm.GroupCount - 1 ' Does a group with the right name exist ? + oDatabaseForm.getGroup(j, vOptionButtons, sGroupName) + If UCase(sGroupName) = UCase(Utils._Trim(pvGroupName)) Then + bFound = True + Exit For + End If + Next j + If bFound Then Exit For + End If + If bFound Then Exit For + Next i + Case CTLPARENTISSUBFORM + 'poParent is already a database form + Set oDatabaseForm = poParent + For j = 0 To oDatabaseForm.GroupCount - 1 ' Does a group with the right name exist ? + oDatabaseForm.getGroup(j, vOptionButtons, sGroupName) + If UCase(sGroupName) = UCase(Utils._Trim(pvGroupName)) Then + bFound = True + Exit For + End If + Next j + End Select + + If bFound Then + + ogGroup = New Optiongroup + ogGroup._This = ogGroup + ogGroup._Name = sGroupName + ogGroup._ButtonsGroup = vOptionButtons + ogGroup._Count = UBound(vOptionButtons) + 1 + ogGroup._ParentType = psParentType + ogGroup._MainForm = oDatabaseForm.Name + Set ogGroup._ParentComponent = poComponent + + ReDim lXY(1, ogGroup._Count - 1) + ReDim iIndex(ogGroup._Count - 1) + For i = 0 To ogGroup._Count - 1 ' Find the position of each radiobutton + Set oView = poComponent.CurrentController.getControl(ogGroup._ButtonsGroup(i)) + lXY(0, i) = oView.PosSize.X + lXY(1, i) = oView.PosSize.Y + Next i + For i = 0 To ogGroup._Count - 1 ' Sort them on XY coordinates + If i = 0 Then + iIndex(0) = 0 + Else + iIndex(i) = i + For j = i - 1 To 0 Step -1 + If lXY(1, i) - lXY(1, j) < - cstPixels Or ( Abs(lXY(1, i) - lXY(1, j)) <= cstPixels And lXY(0, i) - lXY(0, j) < - cstPixels ) Then + iIndex(i) = iIndex(j) + iIndex(j) = iIndex(j) + 1 + End If + Next j + End If + Next i + ogGroup._ButtonsIndex = iIndex() + + Set _OptionGroup = ogGroup + + Else + + Set _OptionGroup = Nothing + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvGroupName)) + + End If + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err,"_OptionGroup", Erl) + GoTo Exit_Function +End Function ' _OptionGroup V1.1.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Module.xba b/wizards/source/access2base/Module.xba new file mode 100644 index 000000000..d3095d645 --- /dev/null +++ b/wizards/source/access2base/Module.xba @@ -0,0 +1,722 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be MODULE +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _Library As Object ' com.sun.star.container.XNameAccess +Private _LibraryName As String +Private _Storage As String ' GLOBAL or DOCUMENT +Private _Script As String ' Full script (string with vbLf's) +Private _Lines As Variant ' Array of script lines +Private _CountOfLines As Long +Private _ProcsParsed As Boolean ' To test before use of proc arrays +Private _ProcNames() As Variant ' All procedure names +Private _ProcDecPositions() As Variant ' All procedure declarations +Private _ProcEndPositions() As Variant ' All end procedure statements +Private _ProcTypes() As Variant ' One of the vbext_pk_* constants + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJMODULE + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + Set _Library = Nothing + _LibraryName = "" + _Storage = "" + _Script = "" + _Lines = Array() + _CountOfLines = 0 + _ProcsParsed = False + _ProcNames = Array() + _ProcDecPositions = Array() + _ProcEndPositions = Array() +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get CountOfDeclarationLines() As Long + CountOfDeclarationLines = _PropertyGet("CountOfDeclarationLines") +End Property ' CountOfDeclarationLines (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get CountOfLines() As Long + CountOfLines = _PropertyGet("CountOfLines") +End Property ' CountOfLines (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Lines(Optional ByVal pvLine As Variant, Optional ByVal pvNumLines As Variant) As String +' Returns a string containing the contents of a specified line or lines in a standard module or a class module + +Const cstThisSub = "Module.Lines" + Utils._SetCalledSub(cstThisSub) + +Dim sLines As String, lLine As Long + sLines = "" + + If IsMissing(pvLine) Or IsMissing(pvNumLines) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvLine, 1, _AddNumeric()) Then GoTo Exit_Function + If Not Utils._CheckArgument(pvNumLines, 1, _AddNumeric()) Then GoTo Exit_Function + + lLine = pvLine + Do While lLine < _CountOfLines And lLine < pvLine + pvNumLines + sLines = sLines & _Lines(lLine - 1) & vbLf + lLine = lLine + 1 + Loop + If Len(sLines) > 0 Then sLines = Left(sLines, Len(sLines) - 1) + +Exit_Function: + Lines = sLines + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Lines + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ProcBodyLine(Optional ByVal pvProc As Variant, Optional ByVal pvProcType As Variant) As Long +' Return the number of the line at which the body of a specified procedure begins + +Const cstThisSub = "Module.ProcBodyLine" + Utils._SetCalledSub(cstThisSub) + +Dim iIndex As Integer + + If IsMissing(pvProc) Or IsMissing(pvProcType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvProc, 1, vbString) Then GoTo Exit_Function + If Not Utils._CheckArgument(pvProcType, 2, _AddNumeric()) Then GoTo Exit_Function + + iIndex = _FindProcIndex(pvProc, pvProcType) + If iIndex >= 0 Then ProcBodyLine = _LineOfPosition(_ProcDecPositions(iIndex)) Else ProcBodyLine = iIndex + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ProcBodyline + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ProcCountLines(Optional ByVal pvProc As Variant, Optional ByVal pvProcType As Variant) As Long +' Return the number of lines in the specified procedure + +Const cstThisSub = "Module.ProcCountLines" + Utils._SetCalledSub(cstThisSub) + +Dim iIndex As Integer, lStart As Long, lEnd As Long + + If IsMissing(pvProc) Or IsMissing(pvProcType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvProc, 1, vbString) Then GoTo Exit_Function + If Not Utils._CheckArgument(pvProcType, 2, _AddNumeric()) Then GoTo Exit_Function + + iIndex = _FindProcIndex(pvProc, pvProcType) + lStart = ProcStartLine(pvProc, pvProcType) + lEnd = _LineOfPosition(_ProcEndPositions(iIndex)) + ProcCountLines = lEnd - lStart + 1 + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ProcCountLines + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ProcOfLine(Optional ByVal pvLine As Variant, Optional ByRef pvProcType As Variant) As String +' Return the name and type of the procedure containing line pvLine + +Const cstThisSub = "Module.ProcOfLine" + Utils._SetCalledSub(cstThisSub) + +Dim sProcedure As String, iProc As Integer, lLineDec As Long, lLineEnd As Long + + If IsMissing(pvLine) Or IsMissing(pvProcType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvLine, 1, _AddNumeric()) Then GoTo Exit_Function + If Not Utils._CheckArgument(pvProcType, 2, _AddNumeric()) Then GoTo Exit_Function + + If Not _ProcsParsed Then _ParseProcs() + + sProcedure = "" + For iProc = 0 To UBound(_ProcNames) + lLineEnd = _LineOfPosition(_ProcEndPositions(iProc)) + If pvLine <= lLineEnd Then + lLineDec = _LineOfPosition(_ProcDecPositions(iProc)) + If pvLine < lLineDec Then ' Line between 2 procedures + sProcedure = "" + Else + sProcedure = _ProcNames(iProc) + pvProcType = _ProcTypes(iProc) + End If + Exit For + End If + Next iProc + +Exit_Function: + ProcOfLine = sProcedure + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ProcOfline + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function ProcStartLine(Optional ByVal pvProc As Variant, Optional ByVal pvProcType As Variant) As Long +' Return the number of the line at which the specified procedure begins + +Const cstThisSub = "Module.ProcStartLine" + Utils._SetCalledSub(cstThisSub) + +Dim lLine As Long, lIndex As Long, sLine As String + + If IsMissing(pvProc) Or IsMissing(pvProcType) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvProc, 1, vbString) Then GoTo Exit_Function + If Not Utils._CheckArgument(pvProcType, 2, _AddNumeric()) Then GoTo Exit_Function + + lLine = ProcBodyLine(pvProc, pvProcType) + ' Search baclIndexward for comment lines + lIndex = lLine - 1 + Do While lIndex > 0 + sLine = _Trim(_Lines(lIndex - 1)) + If UCase(Left(sLine, 4)) = "REM " Or Left(sLine, 1) = "'" Then + lLine = lIndex + Else + Exit Do + End If + lIndex = lIndex - 1 + Loop + + ProcStartLine = lLine + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' ProcStartLine + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Const cstThisSub = "Module.Properties" + Utils._SetCalledSub(cstThisSub) + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get pType() As String + pType = _PropertyGet("Type") +End Property ' Type (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Find(Optional ByVal pvTarget As Variant _ + , Optional ByRef pvStartLine As Variant _ + , Optional ByRef pvStartColumn As Variant _ + , Optional ByRef pvEndLine As Variant _ + , Optional ByRef pvEndColumn As Variant _ + , Optional ByVal pvWholeWord As Boolean _ + , Optional ByVal pvMatchCase As Boolean _ + , Optional ByVal pvPatternSearch As Boolean _ + ) As Boolean +' Finds specified text in the module +' xxLine and xxColumn arguments are mainly to return the position of the found string +' If they are initialized but nonsense, the function returns False + +Const cstThisSub = "Module.Find" + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + +Dim bFound As Boolean, lPosition As Long, lStartLine As Long, lStartColumn As Long, lStartPosition As Long +Dim lEndLine As Long, lEndColumn As Long, lEndPosition As Long +Dim sMatch As String, vOptions As Variant, sPattern As String +Dim i As Integer, sSpecChar As String + +Const cstSpecialCharacters = "\[^$.|?*+()" + + bFound = False + + If IsMissing(pvTarget) Or IsMissing(pvStartLine) Or IsMissing(pvStartColumn) Or IsMissing(pvEndLine) Or IsMissing(pvEndColumn) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvTarget, 1, vbString) Then GoTo Exit_Function + If Len(pvTarget) = 0 Then GoTo Exit_Function + If Not IsEmpty(pvStartLine) Then + If Not Utils._CheckArgument(pvStartLine, 2, _AddNumeric()) Then GoTo Exit_Function + End If + If Not IsEmpty(pvStartColumn) Then + If Not Utils._CheckArgument(pvStartColumn, 3, _AddNumeric()) Then GoTo Exit_Function + End If + If Not IsEmpty(pvEndLine) Then + If Not Utils._CheckArgument(pvEndLine, 4, _AddNumeric()) Then GoTo Exit_Function + End If + If Not IsEmpty(pvEndColumn) Then + If Not Utils._CheckArgument(pvEndColumn, 5, _AddNumeric()) Then GoTo Exit_Function + End If + If IsMissing(pvWholeWord) Then pvWholeWord = False + If Not Utils._CheckArgument(pvWholeWord, 6, vbBoolean) Then GoTo Exit_Function + If IsMissing(pvMatchCase) Then pvMatchCase = False + If Not Utils._CheckArgument(pvMatchCase, 7, vbBoolean) Then GoTo Exit_Function + If IsMissing(pvPatternSearch) Then pvPatternSearch = False + If Not Utils._CheckArgument(pvPatternSearch, 8, vbBoolean) Then GoTo Exit_Function + + ' Initialize starting values + If IsEmpty(pvStartLine) Then lStartLine = 1 Else lStartLine = pvStartLine + If lStartLine <= 0 Or lStartLine > UBound(_Lines) + 1 Then GoTo Exit_Function + If IsEmpty(pvStartColumn) Then lStartColumn = 1 Else lStartColumn = pvStartColumn + If lStartColumn <= 0 Then GoTo Exit_Function + If lStartColumn > 1 And lStartColumn > Len(_Lines(lStartLine + 1)) Then GoTo Exit_Function + lStartPosition = _PositionOfLine(lStartline) + lStartColumn - 1 + If IsEmpty(pvEndLine) Then lEndLine = UBound(_Lines) + 1 Else lEndLine = pvEndLine + If lEndLine < lStartLine Or lEndLine > UBound(_Lines) + 1 Then GoTo Exit_Function + If IsEmpty(pvEndColumn) Then lEndColumn = Len(_Lines(lEndLine - 1)) Else lEndColumn = pvEndColumn + If lEndColumn < 0 Then GoTo Exit_Function + If lEndColumn = 0 Then lEndColumn = 1 + If lEndColumn > Len(_Lines(lEndLine - 1)) + 1 Then GoTo Exit_Function + lEndPosition = _PositionOfLine(lEndline) + lEndColumn - 1 + + If pvMatchCase Then + Set vOptions = _A2B_.SearchOptions + vOptions.transliterateFlags = 0 + End If + + ' Define pattern to search for + sPattern = pvTarget + ' Protect special characters in regular expressions + For i = 1 To Len(cstSpecialCharacters) + sSpecChar = Mid(cstSpecialCharacters, i, 1) + sPattern = Replace(sPattern, sSpecChar, "\" & sSpecChar) + Next i + If pvPatternSearch Then sPattern = Replace(Replace(sPattern, "\*", ".*"), "\?", ".") + If pvWholeWord Then sPattern = "\b" & sPattern & "\b" + + lPosition = lStartPosition + sMatch = Utils._RegexSearch(_Script, sPattern, lPosition) + ' Re-establish default options for later searches + If pvMatchCase Then vOptions.transliterateFlags = com.sun.star.i18n.TransliterationModules.IGNORE_CASE + + ' Found within requested bounds ? + If sMatch <> "" And lPosition >= lStartPosition And lPosition <= lEndPosition Then + pvStartLine = _LineOfPosition(lPosition) + pvStartColumn = lPosition - _PositionOfLine(pvStartLine) + 1 + pvEndLine = _LineOfPosition(lPosition + Len(sMatch) - 1) + If pvEndLine > pvStartLine Then + pvEndColumn = lPosition + Len(sMatch) - 1 - _PositionOfLine(pvEndLine) + Else + pvEndColumn = pvStartColumn + Len(sMatch) - 1 + End If + bFound = True + End If + +Exit_Function: + Find = bFound + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Module.Find", Erl) + bFound = False + GoTo Exit_Function +End Function ' Find + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + +Const cstThisSub = "Module.Properties" + + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub(cstThisSub) + +End Function ' getProperty + +REM --------------------------------Mid(a._Script, iCtl, 25)--------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + +Const cstThisSub = "Module.hasProperty" + + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Utils._ResetCalledSub(cstThisSub) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _BeginStatement(ByVal plStart As Long) As Long +' Return the position in _Script of the beginning of the current statement as defined by plStart + +Dim sProc As String, iProc As Integer, iType As Integer +Dim lPosition As Long, lPrevious As Long, sFind As String + + sProc = ProcOfLine(_LineOfPosition(plStart), iType) + iProc = _FindProcIndex(sProc, iType) + If iProc < 0 Then lPosition = 1 Else lPosition = _ProcDecPositions(iProc) + + sFind = "Any" + Do While lPosition < plStart And sFind <> "" + lPrevious = lPosition + sFind = _FindPattern("%^\w", lPosition) + If sFind = "" Then Exit Do + Loop + + _BeginStatement = lPrevious + +End Function ' _EndStatement + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _EndStatement(ByVal plStart As Long) As Long +' Return the position in _Script of the end of the current statement as defined by plStart +' plStart is assumed not to be in the middle of a comment or a string + +Dim sMatch As String, lPosition As Long + lPosition = plStart + sMatch = _FindPattern("%$", lPosition) + _EndStatement = lPosition + +End Function ' _EndStatement + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _FindPattern(ByVal psPattern As Variant, Optional ByRef plStart As Long) As String +' Find first occurrence of any of the patterns in |-delimited string psPattern +' Special escapes +' - for word breaks: "%B" (f.i. for searching "END%BFUNCTION") +' - for statement start: "%^" (f.i. for searching "%^END%BFUNCTION"). Necessarily first 2 characters of pattern +' - for statement end: "%$". Pattern should not contain anything else +' If quoted string searched, pattern should start and end with a double quote +' Return "" if none found, otherwise returns the matching string +' plStart = start position of _Script to search (starts at 1) +' In output plStart contains the first position of the matching string or is left unchanged +' To search again the same or another pattern => plStart = plStart + Len(matching string) +' Comments and strings are skipped + +' Common patterns +Const cstComment = "('|\bREM\b)[^\n]*$" +Const cstString = """[^""\n]*""" +Const cstBeginStatement = "(^|:|\bthen\b|\belse\b|\n)[ \t]*" +Const cstEndStatement = "[ \t]*($|:|\bthen\b|\belse\b|\n)" +Const cstContinuation = "[ \t]_\n" +Const cstWordBreak = "\b[ \t]+(_\n[ \t]*)?\b" +Const cstAlt = "|" + +Dim sRegex As String, lStart As Long, bContinue As Boolean, sMatch As String +Dim bEndStatement As Boolean, bQuote As Boolean + + If psPattern = "%$" Then + sRegex = cstEndStatement + Else + sRegex = psPattern + If Left(psPattern, 2) = "%^" Then sRegex = cstBeginStatement & Right(sRegex, Len(sregex) - 2) + sregex = Replace(sregex, "%B", cstWordBreak) + End If + ' Add all to ignore patterns to regex. If pattern = quoted string do not add cstString + If Len(psPattern) > 2 And Left(psPattern, 1) = """" And Right(psPattern, 1) = """" Then + bQuote = True + sRegex = sRegex & cstAlt & cstComment & cstAlt & cstContinuation + Else + bQuote = False + sRegex = sRegex & cstAlt & cstComment & cstAlt & cstString & cstAlt & cstContinuation + End If + + If IsMissing(plStart) Then plStart = 1 + lStart = plStart + + bContinue = True + Do While bContinue + bEndStatement = False + sMatch = Utils._RegexSearch(_Script, sRegex, lStart) + Select Case True + Case sMatch = "" + bContinue = False + Case Left(sMatch, 1) = "'" + bEndStatement = True + Case Left(sMatch, 1) = """" + If bQuote Then + plStart = lStart + bContinue = False + End If + Case Left(smatch, 1) = ":" Or Left(sMatch, 1) = vbLf + If psPattern = "%$" Then + bEndStatement = True + Else + bContinue = False + plStart = lStart + 1 + sMatch = Right(sMatch, Len(sMatch) - 1) + End If + Case UCase(Left(sMatch, 4)) = "REM " Or UCase(Left(sMatch, 4)) = "REM" & vbTab Or UCase(Left(sMatch, 4)) = "REM" & vbNewLine + bEndStatement = True + Case UCase(Left(sMatch, 4)) = "THEN" Or UCase(Left(sMatch, 4)) = "ELSE" + If psPattern = "%$" Then + bEndStatement = True + Else + bContinue = False + plStart = lStart + 4 + sMatch = Right(sMatch, Len(sMatch) - 4) + End If + Case sMatch = " _" & vbLf + Case Else ' Found + plStart = lStart + bContinue = False + End Select + If bEndStatement And psPattern = "%$" Then + bContinue = False + plStart = lStart - 1 + sMatch = "" + End If + lStart = lStart + Len(sMatch) + Loop + + _FindPattern = sMatch + +End Function ' _FindPattern + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _FindProcIndex(ByVal psProc As String, ByVal piType As Integer) As Integer +' Return index of entry in _Procnames corresponding with pvProc + +Dim i As Integer, iIndex As Integer + + If Not _ProcsParsed Then _ParseProcs + + iIndex = -1 + For i = 0 To UBound(_ProcNames) + If UCase(psProc) = UCase(_ProcNames(i)) And piType = _ProcTypes(i) Then + iIndex = i + Exit For + End If + Next i + If iIndex < 0 Then TraceError(TRACEFATAL, ERRPROCEDURENOTFOUND, Utils._CalledSub(), 0, , Array(psProc, _Name)) + +Exit_Function: + _FindProcIndex = iIndex + Exit Function +End Function ' _FindProcIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _Initialize() + + _Script = Replace(_Script, vbCr, "") + _Lines = Split(_Script, vbLf) + _CountOfLines = UBound(_Lines) + 1 + +End Sub ' _Initialize + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _LineOfPosition(ByVal plPosition) As Long +' Return the line number of a position in _Script + +Dim lLine As Long, lLength As Long + ' Start counting from start or end depending on how close position is + If plPosition <= Len(_Script) / 2 Then + lLength = 0 + For lLine = 0 To UBound(_Lines) + lLength = lLength + Len(_Lines(lLine)) + 1 ' + 1 for line feed + If lLength >= plPosition Then + _LineOfPosition = lLine + 1 + Exit Function + End If + Next lLine + Else + If Right(_Script, 1) = vbLf Then lLength = Len(_Script) + 1 Else lLength = Len(_Script) + For lLine = UBound(_Lines) To 0 Step -1 + lLength = lLength - Len(_Lines(lLine)) - 1 ' - 1 for line feed + If lLength <= plPosition Then + _LineOfPosition = lLine + 1 + Exit Function + End If + Next lLine + End If + +End Function ' _LineOfPosition + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub _ParseProcs() +' Fills the Proc arrays: name, start and end position +' Executed at first request needing this processing + +Dim lPosition As Long, iProc As Integer, sDecProc As String, sEndProc As String, sNameProc As String, sType As String +Const cstDeclaration = "%^(private%B|public%B)?\b(property%Bget|property%Blet|property%Bset|function|sub)\b" +Const cstEnd = "%^end%B(property|function|sub)\b" +Const cstName = "\w*" '"[A-Za-z_][A-Za-z_0-9]*" + + If _ProcsParsed Then Exit Sub ' Do not redo if already done + _ProcNames = Array() + _ProcDecPositions = Array() + _ProcEndPositions = Array() + _ProcTypes = Array() + + lPosition = 1 + iProc = -1 + sDecProc = "???" + Do While sDecProc <> "" + ' Identify Function/Sub declaration string + sDecProc = _FindPattern(cstDeclaration, lPosition) + If sDecProc <> "" Then + iProc = iProc + 1 + ReDim Preserve _ProcNames(0 To iProc) + ReDim Preserve _ProcDecPositions(0 To iProc) + ReDim Preserve _ProcEndPositions(0 To iProc) + ReDim Preserve _ProcTypes(0 To iProc) + _ProcDecPositions(iProc) = lPosition + lPosition = lPosition + Len(sDecProc) + ' Identify procedure type + Select Case True + Case InStr(UCase(sDecProc), "FUNCTION") > 0 : _ProcTypes(iProc) = vbext_pk_Proc + Case InStr(UCase(sDecProc), "SUB") > 0 : _ProcTypes(iProc) = vbext_pk_Proc + Case InStr(UCase(sDecProc), "GET") > 0 : _ProcTypes(iProc) = vbext_pk_Get + Case InStr(UCase(sDecProc), "LET") > 0 : _ProcTypes(iProc) = vbext_pk_Let + Case InStr(UCase(sDecProc), "SET") > 0 : _ProcTypes(iProc) = vbext_pk_Set + End Select + ' Identify name of Function/Sub + sNameProc = _FindPattern(cstName, lPosition) + If sNameProc = "" Then Exit Do ' Should never happen + _ProcNames(iProc) = sNameProc + lPosition = lPosition + Len(sNameProc) + ' Identify End statement + sEndProc = _FindPattern(cstEnd, lPosition) + If sEndProc = "" Then Exit Do ' Should never happen + _ProcEndPositions(iProc) = lPosition + lPosition = lPosition + Len(sEndProc) + End If + Loop + + _ProcsParsed = True + +End Sub + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PositionOfLine(ByVal plLine) As Long +' Return the position of the first character of the given line in _Script + +Dim lLine As Long, lPosition As Long + ' Start counting from start or end depending on how close line is + If plLine <= (UBound(_Lines) + 1) / 2 Then + lPosition = 0 + For lLine = 0 To plLine - 1 + lPosition = lPosition + 1 ' + 1 for line feed + If lLine < plLine - 1 Then lPosition = lPosition + Len(_Lines(lLine)) + Next lLine + Else + lPosition = Len(_Script) + 2 ' Anticipate an ending null-string and a line feed + For lLine = UBound(_Lines) To plLine - 1 Step -1 + lPosition = lPosition - Len(_Lines(lLine)) - 1 ' - 1 for line feed + Next lLine + End If + + _PositionOfLine = lPosition + +End Function ' _LineOfPosition + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + _PropertiesList = Array("CountOfDeclarationLines", "CountOfLines", "Name", "ObjectType", "Type") + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + +Dim cstThisSub As String +Const cstDot = "." + +Dim sText As String + + If _ErrorHandler() Then On Local Error Goto Error_Function + cstThisSub = "Module.get" & psProperty + Utils._SetCalledSub(cstThisSub) + _PropertyGet = Null + + Select Case UCase(psProperty) + Case UCase("CountOfDeclarationLines") + If Not _ProcsParsed Then _ParseProcs() + If UBound(_ProcNames) >= 0 Then + _PropertyGet = ProcStartLine(_ProcNames(0), _ProcTypes(0)) - 1 + Else + _PropertyGet = _CountOfLines + End If + Case UCase("CountOfLines") + _PropertyGet = _CountOfLines + Case UCase("Name") + _PropertyGet = _Storage & cstDot & _LibraryName & cstDot & _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Type") + ' Find option statement before any procedure declaration + sText = _FindPattern("%^option%Bclassmodule\b|\bfunction\b|\bsub\b|\bproperty\b") + If UCase(Left(sText, 6)) = "OPTION" Then _PropertyGet = acClassModule Else _PropertyGet = acStandardModule + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Module._PropertyGet", Erl) + _PropertyGet = Null + GoTo Exit_Function +End Function ' _PropertyGet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/OptionGroup.xba b/wizards/source/access2base/OptionGroup.xba new file mode 100644 index 000000000..f4b749ef6 --- /dev/null +++ b/wizards/source/access2base/OptionGroup.xba @@ -0,0 +1,315 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="OptionGroup" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be FORM +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _ParentType As String +Private _ParentComponent As Object +Private _MainForm As String +Private _DocEntry As Integer +Private _DbEntry As Integer +Private _ButtonsGroup() As Variant +Private _ButtonsIndex() As Variant +Private _Count As Long + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJOPTIONGROUP + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _ParentType = "" + _ParentComponent = Nothing + _DocEntry = -1 + _DbEntry = -1 + _ButtonsGroup = Array() + _ButtonsIndex = Array() + _Count = 0 +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Count() As Variant + Count = _PropertyGet("Count") +End Property ' Count (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Value() As Variant + Value = _PropertyGet("Value") +End Property ' Value (get) + +Property Let Value(ByVal pvValue As Variant) + Call _PropertySet("Value", pvValue) +End Property ' Value (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Return a Control object with name or index = pvIndex + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("OptionGroup.Controls") + +Dim ocControl As Variant, iArgNr As Integer, i As Integer +Dim oCounter As Object + + Set ocControl = Nothing + + If IsMissing(pvIndex) Then ' No argument, return Collection object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLCONTROLS + Set oCounter._Parent = _This + oCounter._Count = _Count + Set Controls = oCounter + Goto Exit_Function + End If + + If _IsLeft(_A2B_.CalledSub, "OptionGroup.") Then iArgNr = 1 Else iArgNr = 2 + If Not Utils._CheckArgument(pvIndex, iArgNr, Utils._AddNumeric()) Then Goto Exit_Function + If pvIndex < 0 Or pvIndex > _Count - 1 Then Goto Trace_Error_Index + + ' Start building the ocControl object + ' Determine exact name + Set ocControl = New Control + Set ocControl._This = ocControl + Set ocControl._Parent = _This + ocControl._ParentType = CTLPARENTISGROUP + + ocControl._Shortcut = "" + For i = 0 To _Count - 1 + If _ButtonsIndex(i) = pvIndex Then + Set ocControl.ControlModel = _ButtonsGroup(i) + Select Case _ParentType + Case CTLPARENTISDIALOG : ocControl._Name = _ButtonsGroup(i).Name + Case Else : ocControl._Name = _Name ' OptionGroup and individual radio buttons share the same name + End Select + ocControl._ImplementationName = ocControl.ControlModel.getImplementationName() + Exit For + End If + Next i + ocControl._FormComponent = _ParentComponent + ocControl._ClassId = acRadioButton + Select Case _ParentType + Case CTLPARENTISDIALOG : Set ocControl.ControlView = _ParentComponent.getControl(ocControl._Name) + Case Else : Set ocControl.ControlView = _ParentComponent.CurrentController.getControl(ocControl.ControlModel) + End Select + + ocControl._Initialize() + ocControl._DocEntry = _DocEntry + ocControl._DbEntry = _DbEntry + Set Controls = ocControl + +Exit_Function: + Utils._ResetCalledSub("OptionGroup.Controls") + Exit Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set Controls = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "OptionGroup.Controls", Erl) + Set Controls = Nothing + GoTo Exit_Function +End Function ' Controls + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("OptionGroup.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("OptionGroup.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("OptionGroup.setProperty") + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub("OptionGroup.setProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + _PropertiesList = Array("Count", "Name", "ObjectType", "Value") + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("OptionGroup.get" & psProperty) + +'Execute +Dim oDatabase As Object, vBookmark As Variant +Dim iValue As Integer, i As Integer + _PropertyGet = EMPTY + Select Case UCase(psProperty) + Case UCase("Count") + _PropertyGet = _Count + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Value") + iValue = -1 + For i = 0 To _Count - 1 ' Find the selected RadioButton + If _ButtonsGroup(i).State = 1 Then + iValue = _ButtonsIndex(i) + Exit For + End If + Next i + _PropertyGet = iValue + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("OptionGroup.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "OptionGroup._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + + Utils._SetCalledSub("OptionGroup.set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +'Execute +Dim i As Integer, iRadioIndex As Integer, oModel As Object, iArgNr As Integer + + If _IsLeft(_A2B_.CalledSub, "OptionGroup.") Then iArgNr = 1 Else iArgNr = 2 + Select Case UCase(psProperty) + Case UCase("Value") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 0 Or pvValue > _Count - 1 Then Goto Trace_Error_Value + For i = 0 To _Count - 1 + _ButtonsGroup(i).State = 0 + If _ButtonsIndex(i) = pvValue Then iRadioIndex = i + Next i + _ButtonsGroup(iRadioIndex).State = 1 + Set oModel = _ButtonsGroup(iRadioIndex) + If Utils._hasUNOProperty(oModel, "DataField") Then + If Not IsNull(oModel.Datafield) And Not IsEmpty(oModel.Datafield) Then + If oModel.Datafield <> "" And Utils._hasUNOMethod(oModel, "commit") Then oModel.commit() ' f.i. checkboxes have no commit method ?? [PASTIM] + End If + End If + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("OptionGroup.set" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "OptionGroup._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/PropertiesGet.xba b/wizards/source/access2base/PropertiesGet.xba new file mode 100644 index 000000000..332eaaa2e --- /dev/null +++ b/wizards/source/access2base/PropertiesGet.xba @@ -0,0 +1,1120 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="PropertiesGet" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getAbsolutePosition(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getAbsolutePosition") + getAbsolutePosition = PropertiesGet._getProperty(pvObject, "AbsolutePosition") +End Function ' getAbsolutePosition + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getAllowAdditions(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getAllowAdditions") + getAllowAdditions = PropertiesGet._getProperty(pvObject, "AllowAdditions") +End Function ' getAllowAdditions + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getAllowDeletions(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getAllowDeletions") + getAllowDeletions = PropertiesGet._getProperty(pvObject, "AllowDeletions") +End Function ' getAllowDeletions + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getAllowEdits(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getAllowEdits") + getAllowEdits = PropertiesGet._getProperty(pvObject, "AllowEdits") +End Function ' getAllowEdits + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBackColor(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBackColor") + getBackColor = PropertiesGet._getProperty(pvObject, "BackColor") +End Function ' getBackColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBeginGroup(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBeginGroup") + getBeginGroup = PropertiesGet._getProperty(pvObject, "BeginGroup") +End Function ' getBeginGroup + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBOF(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBOF") + getBOF = PropertiesGet._getProperty(pvObject, "BOF") +End Function ' getBOF + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBookmark(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBookmark") + getBookmark = PropertiesGet._getProperty(pvObject, "Bookmark") +End Function ' getBookmark + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBookmarkable(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBookmarkable") + getBookmarkable = PropertiesGet._getProperty(pvObject, "Bookmarkable") +End Function ' getBookmarkable + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBorderColor(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBorderColor") + getBorderColor = PropertiesGet._getProperty(pvObject, "BorderColor") +End Function ' getBorderColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBorderStyle(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBorderStyle") + getBorderStyle = PropertiesGet._getProperty(pvObject, "BorderStyle") +End Function ' getBorderStyle + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getBuiltIn(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getBuiltIn") + getBuiltIn = PropertiesGet._getProperty(pvObject, "BuiltIn") +End Function ' getBuiltIn + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getButtonLeft(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getButtonLeft") + getButtonLeft = PropertiesGet._getProperty(pvObject, "ButtonLeft") +End Function ' getButtonLeft + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getButtonMiddle(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getButtonMiddle") + getButtonMiddle = PropertiesGet._getProperty(pvObject, "ButtonMiddle") +End Function ' getButtonMiddle + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getButtonRight(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getButtonRight") + getButtonRight = PropertiesGet._getProperty(pvObject, "ButtonRight") +End Function ' getButtonRight + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getCancel(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getCancel") + getCancel = PropertiesGet._getProperty(pvObject, "Cancel") +End Function ' getCancel + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getCaption(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getCaption") + getCaption = PropertiesGet._getProperty(pvObject, "Caption") +End Function ' getCaption + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getClickCount(Optional pvObject As Variant) As Long + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getClickCount") + getClickCount = PropertiesGet._getProperty(pvObject, "ClickCount") +End Function ' getClickCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getContextShortcut(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getContextShortcut") + getContextShortcut = PropertiesGet._getProperty(pvObject, "ContextShortcut") +End Function ' getContextShortcut + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getControlSource(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getControlSource") + getControlSource = PropertiesGet._getProperty(pvObject, "ControlSource") +End Function ' getControlSource + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getControlTipText(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getControlTipText") + getControlTipText = PropertiesGet._getProperty(pvObject, "ControlTipText") +End Function ' getControlTipText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getControlType(Optional pvObject As Variant) As Integer + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getControlType") + getControlType = PropertiesGet._getProperty(pvObject, "ControlType") +End Function ' getControlType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getCount(Optional pvObject As Variant) As Integer + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getCount") + getCount = PropertiesGet._getProperty(pvObject, "Count") +End Function ' getCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getCurrentRecord(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getCurrentRecord") + getCurrentRecord = PropertiesGet._getProperty(pvObject, "CurrentRecord") +End Function ' getCurrentRecord + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getDataType(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getDataType") + getDataType = PropertiesGet._getProperty(pvObject, "DataType") +End Function ' getDataType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getDbType(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getDbType") + getDbType = PropertiesGet._getProperty(pvObject, "DbType") +End Function ' getDbType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getDefault(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getDefault") + getDefault = PropertiesGet._getProperty(pvObject, "Default") +End Function ' getDefault + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getDefaultValue(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getDefaultValue") + getDefaultValue = PropertiesGet._getProperty(pvObject, "DefaultValue") +End Function ' getDefaultValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getDescription(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getDescription") + getDescription = PropertiesGet._getProperty(pvObject, "Description") +End Function ' getDescription + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getEditMode(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getEditMode") + getEditMode = PropertiesGet._getProperty(pvObject, "EditMode") +End Function ' getEditMode + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getEnabled(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getEnabled") + getEnabled = PropertiesGet._getProperty(pvObject, "Enabled") +End Function ' getEnabled + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getEOF(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getEOF") + getEOF = PropertiesGet._getProperty(pvObject, "EOF") +End Function ' getEOF + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getEventName(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getEventName") + getEventName = PropertiesGet._getProperty(pvObject, "EventName") +End Function ' getEventName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getEventType(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getEventType") + getEventType = PropertiesGet._getProperty(pvObject, "EventType") +End Function ' getEventType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFieldSize(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFieldSize") + getFieldSize = PropertiesGet._getProperty(pvObject, "FieldSize") +End Function ' getFieldSize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFilter(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFilter") + getFilter = PropertiesGet._getProperty(pvObject, "Filter") +End Function ' getFilter + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFilterOn(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFilterOn") + getFilterOn = PropertiesGet._getProperty(pvObject, "FilterOn") +End Function ' getFilterOn + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFocusChangeTemporary(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFocusChangeTemporary") + getFocusChangeTemporary = PropertiesGet._getProperty(pvObject, "FocusChangeTemporary") +End Function ' getFocusChangeTemporary + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontBold(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontBold") + getFontBold = PropertiesGet._getProperty(pvObject, "FontBold") +End Function ' getFontBold + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontItalic(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontItalic") + getFontItalic = PropertiesGet._getProperty(pvObject, "FontItalic") +End Function ' getFontItalic + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontName(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontName") + getFontName = PropertiesGet._getProperty(pvObject, "FontName") +End Function ' getFontName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontSize(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontSize") + getFontSize = PropertiesGet._getProperty(pvObject, "FontSize") +End Function ' getFontSize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontUnderline(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontUnderline") + getFontUnderline = PropertiesGet._getProperty(pvObject, "FontUnderline") +End Function ' getFontUnderline + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFontWeight(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFontWeight") + getFontWeight = PropertiesGet._getProperty(pvObject, "FontWeight") +End Function ' getFontWeight + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getForm(Optional pvObject As Variant) As Variant ' Return Subform pseudo + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getForm") + getForm = PropertiesGet._getProperty(pvObject, "Form") +End Function ' getForm + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getFormat(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getFormat") + getFormat = PropertiesGet._getProperty(pvObject, "Format") +End Function ' getFormat + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getHeight(Optional pvObject As Variant) As Long + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getHeight") + getHeight = PropertiesGet._getProperty(pvObject, "Height") +End Function ' getHeight + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getForeColor(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getForeColor") + getForeColor = PropertiesGet._getProperty(pvObject, "ForeColor") +End Function ' getForeColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getIsLoaded(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getIsLoaded") + getIsLoaded = PropertiesGet._getProperty(pvObject, "IsLoaded") +End Function ' getIsLoaded + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getItemData(Optional pvObject As Variant, ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getItemData") + If IsMissing(pvIndex) Then + getItemData = PropertiesGet._getProperty(pvObject, "ItemData") + Else + getItemData = PropertiesGet._getProperty(pvObject, "ItemData", pvIndex) + End If +End Function ' getItemData + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyAlt(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyAlt") + getKeyAlt = PropertiesGet._getProperty(pvObject, "KeyAlt") +End Function ' getKeyAlt + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyChar(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyChar") + getKeyChar = PropertiesGet._getProperty(pvObject, "KeyChar") +End Function ' getKeyChar + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyCode(Optional pvObject As Variant) As Integer + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyCode") + getKeyCode = PropertiesGet._getProperty(pvObject, "KeyCode") +End Function ' getKeyCode + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyCtrl(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyCtrl") + getKeyCtrl = PropertiesGet._getProperty(pvObject, "KeyCtrl") +End Function ' getKeyCtrl + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyFunction(Optional pvObject As Variant) As Integer + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyFunction") + getKeyFunction = PropertiesGet._getProperty(pvObject, "KeyFunction") +End Function ' getKeyFunction + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getKeyShift(pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getKeyShift") + getKeyShift = PropertiesGet._getProperty(pvObject, "KeyShift") +End Function ' getKeyShift + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getLinkChildFields(Optional pvObject As Variant, ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getLinkChildFields") + If IsMissing(pvObject) Then + getLinkChildFields = PropertiesGet._getProperty(pvObject, "LinkChildFields") + Else + getLinkChildFields = PropertiesGet._getProperty(pvObject, "LinkChildFields", pvIndex) + End If +End Function ' getLinkChildFields + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getLinkMasterFields(Optional pvObject As Variant, ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getLinkMasterFields") + If IsMissing(pvIndex) Then + getLinkMasterFields = PropertiesGet._getProperty(pvObject, "LinkMasterFields") + Else + getLinkMasterFields = PropertiesGet._getProperty(pvObject, "LinkMasterFields", pvIndex) + End If +End Function ' getLinkMasterFields + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getListCount(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getListCount") + getListCount = PropertiesGet._getProperty(pvObject, "ListCount") +End Function ' getListCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getListIndex(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getListIndex") + getListIndex = PropertiesGet._getProperty(pvObject, "ListIndex") +End Function ' getListIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getLocked(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getLocked") + getLocked = PropertiesGet._getProperty(pvObject, "Locked") +End Function ' getLocked + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getMultiSelect(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getMultiSelect") + getMultiSelect = PropertiesGet._getProperty(pvObject, "MultiSelect") +End Function ' getMultiSelect + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getName(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getName") + getName = PropertiesGet._getProperty(pvObject, "Name") +End Function ' getName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getObjectType(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getObjectType") + getObjectType = PropertiesGet._getProperty(pvObject, "ObjectType") +End Function ' getObjectType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getOpenArgs(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getOpenArgs") + getOpenArgs = PropertiesGet._getProperty(pvObject, "OpenArgs") +End Function ' getOpenArgs + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getOptionGroup(Optional pvObject As Variant, pvName As variant) As Variant +' Return an OptionGroup object based on its name + + Utils._SetCalledSub("getOptionGroup") + If IsMissing(pvObject) Or IsMissing(pvName) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + + If Not Utils._CheckArgument(pvObject, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + If Not Utils._CheckArgument(pvName, 2, vbString) Then Goto Exit_Function + + getOptionGroup = pvObject.OptionGroup(pvName) + +Exit_Function: + Utils._ResetCalledSub("getOptionGroup") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "getOptionGroup", Erl) + GoTo Exit_Function +End Function ' getOptionGroup V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getOptionValue(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getOptionValue") + getOptionValue = PropertiesGet._getProperty(pvObject, "OptionValue") +End Function ' getOptionValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getOrderBy(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getOrderBy") + getOrderBy = PropertiesGet._getProperty(pvObject, "OrderBy") +End Function ' getOrderBy + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getOrderByOn(Optional pvObject As Variant) As Boolean + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getOrderByOn") + getOrderByOn = PropertiesGet._getProperty(pvObject, "OrderByOn") +End Function ' getOrderByOn + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getPage(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getPage") + getPage = PropertiesGet._getProperty(pvObject, "Page") +End Function ' getPage V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getParent(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getParent") + getParent = PropertiesGet._getProperty(pvObject, "Parent") +End Function ' getParent V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional pvItem As Variant, Optional ByVal pvProperty As Variant, ByVal Optional pvIndex As Variant) As Variant +' Return property value of object pvItem, and psProperty property name + Utils._SetCalledSub("getProperty") + If IsMissing(pvItem) Then Call _TraceArguments() + If IsMissing(pvProperty) Then Call _TraceArguments() + If IsMissing(pvIndex) Then getProperty = PropertiesGet._getProperty(pvItem, pvProperty) Else getProperty = PropertiesGet._getProperty(pvItem, pvProperty, pvIndex) + Utils._ResetCalledSub("getProperty") +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRecommendation(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRecommendation") + getRecommendation = PropertiesGet._getProperty(pvObject, "Recommendation") +End Function ' getRecommendation + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRecordCount(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRecordCount") + getRecordCount = PropertiesGet._getProperty(pvObject, "RecordCount") +End Function ' getRecordCount + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRecordset(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRecordset") + getRecordset = PropertiesGet._getProperty(pvObject, "Recordset") +End Function ' getRecordset V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRecordSource(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRecordSource") + getRecordSource = PropertiesGet._getProperty(pvObject, "RecordSource") +End Function ' getRecordSource + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRequired(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRequired") + getRequired = PropertiesGet._getProperty(pvObject, "Required") +End Function ' getRequired + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRowChangeAction(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRowChangeAction") + getRowChangeAction = PropertiesGet._getProperty(pvObject, "RowChangeAction") +End Function ' getRowChangeAction + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRowSource(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRowSource") + getRowSource = PropertiesGet._getProperty(pvObject, "RowSource") +End Function ' getRowSource + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getRowSourceType(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getRowSourceType") + getRowSourceType = PropertiesGet._getProperty(pvObject, "RowSourceType") +End Function ' getRowSourceType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSelected(Optional pvObject As Variant, ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSelected") + If IsMissing(pvIndex) Then + getSelected = PropertiesGet._getProperty(pvObject, "Selected") + Else + getSelected = PropertiesGet._getProperty(pvObject, "Selected", pvIndex) + End If +End Function ' getSelected + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSize(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSize") + getSize = PropertiesGet._getProperty(pvObject, "Size") +End Function ' getSize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSource(Optional pvObject As Variant) As String + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSource") + getSource = PropertiesGet._getProperty(pvObject, "Source") +End Function ' getSource V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSourceField(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSourceField") + getSourceField = PropertiesGet._getProperty(pvObject, "SourceField") +End Function ' getSourceField + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSourceTable(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSourceTable") + getSourceTable = PropertiesGet._getProperty(pvObject, "SourceTable") +End Function ' getSourceTable + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSpecialEffect(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSpecialEffect") + getSpecialEffect = PropertiesGet._getProperty(pvObject, "SpecialEffect") +End Function ' getSpecialEffect + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSubType(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSubType") + getSubType = PropertiesGet._getProperty(pvObject, "SubType") +End Function ' getSubType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSubComponentName(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSubComponentName") + getSubComponentName = PropertiesGet._getProperty(pvObject, "SubComponentName") +End Function ' getSubComponentName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getSubComponentType(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getSubComponentType") + getSubComponentType = PropertiesGet._getProperty(pvObject, "SubComponentType") +End Function ' getSubComponentType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTabIndex(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTabIndex") + getTabIndex = PropertiesGet._getProperty(pvObject, "TabIndex") +End Function ' getTabIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTabStop(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTabStop") + getTabStop = PropertiesGet._getProperty(pvObject, "TabStop") +End Function ' getTabStop + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTag(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTag") + getTag = PropertiesGet._getProperty(pvObject, "Tag") +End Function ' getTag + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getText(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getText") + getText = PropertiesGet._getProperty(pvObject, "Text") +End Function ' getText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTextAlign(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTextAlign") + getTextAlign = PropertiesGet._getProperty(pvObject, "TextAlign") +End Function ' getTextAlign + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTooltipText(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTooltipText") + getTooltipText = PropertiesGet._getProperty(pvObject, "TooltipText") +End Function ' getTooltipText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTripleState(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTripleState") + getTripleState = PropertiesGet._getProperty(pvObject, "TripleState") +End Function ' getTripleState + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getTypeName(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getTypeName") + getTypeName = PropertiesGet._getProperty(pvObject, "TypeName") +End Function ' getTypeName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getVisible(Optional pvObject As Variant) As Variant + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getVisible") + getVisible = PropertiesGet._getProperty(pvObject, "Visible") +End Function ' getVisible + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getWidth(Optional pvObject As Variant) As Long + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getWdth") + getWidth = PropertiesGet._getProperty(pvObject, "Width") +End Function ' getWidth + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getXPos(Optional pvObject As Variant) As Long + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getXPos") + getXPos = PropertiesGet._getProperty(pvObject, "XPos") +End Function ' getXPos + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getYPos(Optional pvObject As Variant) As Long + If IsMissing(pvObject) Or IsEmpty(pvObject) Then Call _TraceArguments("getYPos") + getYPos = PropertiesGet._getProperty(pvObject, "YPos") +End Function ' getYPos + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function _getProperty(pvItem As Variant, ByVal psProperty As String, ByVal Optional pvIndex As Variant) As Variant +' Return property value of the psProperty property name within object pvItem + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("get" & psProperty) + _getProperty = Nothing + +'pvItem must be an object and have the requested property + If Not Utils._CheckArgument(pvItem, 1, vbObject) Then Goto Exit_Function + If Not PropertiesGet._hasProperty(pvItem._Type, pvItem._PropertiesList(), psProperty) Then Goto Trace_Error +'Check Index argument + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 3, Utils._AddNumeric()) Then Goto Exit_Function + End If +'Execute + Select Case UCase(psProperty) + Case UCase("AbsolutePosition") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.AbsolutePosition + Case UCase("AllowAdditions") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.AllowAdditions + Case UCase("AllowDeletions") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.AllowDeletions + Case UCase("AllowEdits") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.AllowEdits + Case UCase("BackColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.BackColor + Case UCase("BeginGroup") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + _getProperty = pvItem.BeginGroup + Case UCase("BOF") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.BOF + Case UCase("Bookmark") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJRECORDSET)) Then Goto Exit_Function + _getProperty = pvItem.Bookmark + Case UCase("Bookmarkable") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.Bookmarkable + Case UCase("BorderColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.BorderColor + Case UCase("BorderStyle") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.BorderStyle + Case UCase("BuiltIn") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCOMMANDBAR, OBJCOMMANDBARCONTROL)) Then Goto Exit_Function + _getProperty = pvItem.BuiltIn + Case UCase("ButtonLeft") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.ButtonLeft + Case UCase("ButtonMiddle") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.ButtonMiddle + Case UCase("ButtonRight") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.ButtonRight + Case UCase("Cancel") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Cancel + Case UCase("Caption") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG, OBJCONTROL, OBJCOMMANDBARCONTROL)) Then Goto Exit_Function + _getProperty = pvItem.Caption + Case UCase("ClickCount") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.ClickCount + Case UCase("ContextShortcut") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.ContextShortcut + Case UCase("ControlSource") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ControlSource + Case UCase("ControlTipText") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ControlTipText + Case UCase("ControlType") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ControlType + Case UCase("Count") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCOLLECTION,OBJOPTIONGROUP)) Then Goto Exit_Function + _getProperty = pvItem.Count + Case UCase("CurrentRecord") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.CurrentRecord + Case UCase("DataType") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.DataType + Case UCase("DbType") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.DbType + Case UCase("Default") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Default + Case UCase("DefaultValue") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCONTROL, OBJFIELD)) Then Goto Exit_Function + _getProperty = pvItem.DefaultValue + Case UCase("Description") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.Description + Case UCase("EditMode") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.EditMode + Case UCase("Enabled") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Enabled + Case UCase("EOF") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.EOF + Case UCase("EventName") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.EventName + Case UCase("EventType") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.EventType + Case UCase("FieldSize") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.FieldSize + Case UCase("Filter") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM, OBJRECORDSET)) Then Goto Exit_Function + _getProperty = pvItem.Filter + Case UCase("FilterOn") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.FilterOn + Case UCase("FocusChangeTemporary") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.FocusChangeTemporary + Case UCase("FontBold") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontBold + Case UCase("FontItalic") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontItalic + Case UCase("FontName") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontName + Case UCase("FontSize") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontSize + Case UCase("FontUnderline") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontUnderline + Case UCase("FontWeight") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.FontWeight + Case UCase("ForeColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ForeColor + Case UCase("Form") + If Not Utils._CheckArgument(pvItem, 1, CTLSUBFORM) Then Goto Exit_Function + _getProperty = pvItem.Form + Case UCase("Format") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Format + Case UCase("Height") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG)) Then Goto Exit_Function + _getProperty = pvItem.Height + Case UCase("Index") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Index + Case UCase("IsLoaded") + If Not Utils._CheckArgument(pvItem, 1, OBJFORM) Then Goto Exit_Function + _getProperty = pvItem.IsLoaded + Case UCase("ItemData") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + If IsMissing(pvIndex) Then _getProperty = pvItem.ItemData Else _getProperty = pvItem.ItemData(pvIndex) + Case UCase("KeyAlt") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyAlt + Case UCase("KeyChar") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyChar + Case UCase("KeyCode") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyCode + Case UCase("KeyCtrl") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyCtrl + Case UCase("KeyFunction") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyFunction + Case UCase("KeyShift") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.KeyShift + Case UCase("LinkChildFields") + If Not Utils._CheckArgument(pvItem, 1, OBJSUBFORM) Then Goto Exit_Function + If IsMissing(pvIndex) Then _getProperty = pvItem.LinkChildFields Else _getProperty = pvItem.LinkChildFields(pvIndex) + Case UCase("LinkMasterFields") + If Not Utils._CheckArgument(pvItem, 1, OBJSUBFORM) Then Goto Exit_Function + If IsMissing(pvIndex) Then _getProperty = pvItem.LinkMasterFields Else _getProperty = pvItem.LinkMasterFields(pvIndex) + Case UCase("ListCount") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ListCount + Case UCase("ListIndex") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.ListIndex + Case UCase("Locked") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + If IsNull(pvItem.Locked) Then Goto Trace_Error + _ge ExitProperty = pvItem.Locked + Case UCase("MultiSelect") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.MultiSelect + Case UCase("Name") + If Not Utils._CheckArgument(pvItem, 1, _ + Array(OBJFORM, OBJSUBFORM, OBJCONTROL, OBJOPTIONGROUP, OBJPROPERTY, OBJDIALOG, OBJTABLEDEF, OBJRECORDSET, OBJFIELD, OBJTEMPVAR, OBJCOMMANDBAR) _ + ) Then Goto Exit_Function + _getProperty = pvItem.Name + Case UCase("ObjectType") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJDATABASE, OBJCOLLECTION, OBJFORM, OBJDIALOG, OBJSUBFORM, OBJCONTROL _ + , OBJEVENT, OBJOPTIONGROUP, OBJPROPERTY, OBJRECORDSET, OBJTABLEDEF, OBJFIELD, OBJTEMPVAR _ + , OBJCOMMANDBAR, OBJCOMMANDBARCONTROL) _ + ) Then Goto Exit_Function + _getProperty = pvItem.ObjectType + Case UCase("OnAction") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + _getProperty = pvItem.OnAction + Case UCase("OpenArgs") + If Not Utils._CheckArgument(pvItem, 1, OBJFORM) Then Goto Exit_Function + _getProperty = pvItem.OpenArgs + Case UCase("OptionValue") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.OptionValue + Case UCase("OrderBy") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.OrderBy + Case UCase("OrderByOn") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.OrderByOn + Case UCase("Page") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJDIALOG, OBJCONTROL)) Then Goto Exit_Function + _getProperty = pvItem.Page + Case UCase("Parent") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJSUBFORM, OBJCONTROL, OBJCOMMANDBARCONTROL)) Then Goto Exit_Function + _getProperty = pvItem.Parent + Case UCase("Recommendation") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.Recommendation + Case UCase("RecordCount") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + _getProperty = pvItem.RecordCount + Case UCase("Recordset") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.Recordset + Case UCase("RecordSource") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + _getProperty = pvItem.RecordSource + Case UCase("Required") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Required + Case UCase("RowChangeAction") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.RowChangeAction + Case UCase("RowSource") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.RowSource + Case UCase("RowSourceType") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.RowSourceType + Case UCase("Selected") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + If IsMissing(pvIndex) Then _getProperty = pvItem.Selected Else _getProperty = pvItem.Selected(pvIndex) + Case UCase("Size") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.Size + Case UCase("Source") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.Source + Case UCase("SourceTable") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.SourceTable + Case UCase("SourceField") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.SourceField + Case UCase("SpecialEffect") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.SpecialEffect + Case UCase("SubComponentName") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.SubComponentName + Case UCase("SubComponentType") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + _getProperty = pvItem.SubComponentType + Case UCase("SubType") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.SubType + Case UCase("TabIndex") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.TabIndex + Case UCase("TabStop") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.TabStop + Case UCase("Tag") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Tag + Case UCase("Text") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.Text + Case UCase("TextAlign") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.TextAlign + Case UCase("TooltipText") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + _getProperty = pvItem.TooltipText + Case UCase("TripleState") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + _getProperty = pvItem.TripleState + Case UCase("TypeName") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + _getProperty = pvItem.TypeName + Case UCase("Value") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCONTROL, OBJOPTIONGROUP, OBJPROPERTY, OBJFIELD, OBJTEMPVAR)) Then Goto Exit_Function + _getProperty = pvItem.Value + Case UCase("Visible") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG, OBJCONTROL, OBJCOMMANDBAR, OBJCOMMANDBARCONTROL)) Then Goto Exit_Function + _getProperty = pvItem.Visible + Case UCase("Width") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG)) Then Goto Exit_Function + _getProperty = pvItem.Width + Case UCase("XPos") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + If IsNull(pvItem.XPos) Then Goto Trace_Error + _getProperty = pvItem.XPos + Case UCase("YPos") + If Not Utils._CheckArgument(pvItem, 1, OBJEVENT) Then Goto Exit_Function + If IsNull(pvItem.YPos) Then Goto Trace_Error + _getProperty = pvItem.YPos + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _getProperty = Nothing + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _getProperty = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "_getProperty", Erl) + _getProperty = Nothing + GoTo Exit_Function +End Function ' _getProperty V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _hasProperty(ByVal psObject As String, ByVal pvPropertiesList() As Variant, ByVal pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) +' Generic hasProperty function called from all class modules + +Dim sObject As String + sObject = Utils._PCase(psObject) + Utils._SetCalledSub(sObject & ".hasProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + + _hasProperty = False + If Not Utils._CheckArgument(pvProperty, 1, vbString) Then Goto Exit_Function + + _hasProperty = Utils._InList(pvProperty, pvPropertiesList(), , True) + +Exit_Function: + Utils._ResetCalledSub(sObject & ".hasProperty") + Exit Function +End Function ' _hasProperty + +REM ------------------------------------------------------------------------------------------------------------------------ +Public Function _ParentObject(psShortcut As String) As Object +' Return parent object from shortcut as a string + +Dim sParent As String, vParent() As Variant, iBound As Integer + vParent = Split(psShortcut, "!") + iBound = UBound(vParent) - 1 + ReDim Preserve vParent(0 To iBound) ' Remove last element + sParent = Join(vParent, "!") + + 'Remove ".Form" if present +Const cstForm = ".FORM" + Set _ParentObject = Nothing + If Len(sParent) > Len(cstForm) Then + If UCase(Right(sParent, Len(cstForm))) = cstForm Then + Set _ParentObject = getValue(sParent) + Else + Set _ParentObject = getObject(sParent) + End If + End If + +End Function ' _ParentObject V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _Properties(ByVal psObject As String _ + , ByRef pvParent As Object _ + , ByVal pvPropertiesList() As Variant _ + , ByVal Optional pvIndex As Variant _ + ) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise +' Generic function called from Properties methods stored in classes + +Dim vProperties As Variant, oCounter As Object, opProperty As Object +Dim iArgNr As Integer, iLen As Integer + + Utils._SetCalledSub(psObject & ".Properties") + + vProperties = Null + + If IsMissing(pvIndex) Then ' Call without index argument prepares a Collection object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLPROPERTIES + Set oCounter._Parent = pvParent + oCounter._Count = UBound(pvPropertiesList) + 1 + Set vProperties = oCounter + Else + iLen = Len(psObject) + 1 + If Len(_A2B_.CalledSub) > iLen Then + If Left(_A2B_.CalledSub, iLen) = psObject & "." Then iArgNr = 1 Else iArgNr = 2 + End If + If Not Utils._CheckArgument(pvIndex, iArgNr, Utils._AddNumeric()) Then Goto Exit_Function + If pvIndex < LBound(pvPropertiesList) Or pvIndex > UBound(pvPropertiesList) Then + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Else + Set opProperty = New Property + Set opProperty._This = opProperty + opProperty._Name = pvPropertiesList(pvIndex) + opProperty._Value = Null + Set vProperties = opProperty + End If + End If + +Exit_Function: + Set _Properties = vProperties + Utils._ResetCalledSub(psObject & ".Properties") + Exit Function +End Function ' _Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _PropertiesList(pvObject As Variant) As Variant +' Return an array of strings containing the list of valid properties of pvObject + +Dim vProperties As Variant +Dim vPropertiesList As Variant, bPropertiesList() As Boolean, sPropertiesList() As String +Dim i As Integer, j As Integer, iCount As Integer + + Set vProperties = Nothing + Select Case pvObject._Type + Case OBJCOLLECTION, OBJPROPERTY, OBJFORM, OBJEVENT, OBJSUBFORM, OBJCONTROL, OBJOPTIONGROUP _ + , OBJDATABASE, OBJTABLEDEF, OBJQUERYDEF, OBJDIALOG, OBJFIELD, OBJRECORDSET, OBJTEMPVAR _ + , OBJCOMMANDBAR, OBJCOMMANDBARCONTROL + vPropertiesList = pvObject._PropertiesList() + Case Else + End Select + +Exit_Function: + Set _PropertiesList = vPropertiesList + Exit Function +End Function ' PropertiesList V0.9.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/PropertiesSet.xba b/wizards/source/access2base/PropertiesSet.xba new file mode 100644 index 000000000..100806bea --- /dev/null +++ b/wizards/source/access2base/PropertiesSet.xba @@ -0,0 +1,577 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="PropertiesSet" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setAbsolutePosition(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setAbsolutePosition") + setAbsolutePosition = PropertiesSet._setProperty(pvObject, "AbsolutePosition", pvValue) +End Function ' setAbsolutePosition + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setAllowAdditions(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setAllowAdditions") + setAllowAdditions = PropertiesSet._setProperty(pvObject, "AllowAdditions", pvValue) +End Function ' setAllowAdditions + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setAllowDeletions(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setAllowDeletions") + setAllowDeletions = PropertiesSet._setProperty(pvObject, "AllowDeletions", pvValue) +End Function ' setAllowDeletions + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setAllowEdits(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setAllowEdits") + setAllowEdits = PropertiesSet._setProperty(pvObject, "AllowEdits", pvValue) +End Function ' setAllowEdits + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setBackColor(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setBackColor") + setBackColor = PropertiesSet._setProperty(pvObject, "BackColor", pvValue) +End Function ' setBackColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setBookmark(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setBookmark") + setBookmark = PropertiesSet._setProperty(pvObject, "Bookmark", pvValue) +End Function ' setBookmark + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setBorderColor (Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setBorderColor") + setBorderColor = PropertiesSet._setProperty(pvObject, "BorderColor", pvValue) +End Function ' setBorderColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setBorderStyle(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setBorderStyle") + setBorderStyle = PropertiesSet._setProperty(pvObject, "BorderStyle", pvValue) +End Function ' setBorderStyle + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setCancel(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setCancel") + setCancel = PropertiesSet._setProperty(pvObject, "Cancel", pvValue) +End Function ' setCancel + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setCaption(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setCaption") + setCaption = PropertiesSet._setProperty(pvObject, "Caption", pvValue) +End Function ' setCaption + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setControlTipText(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setControlTipText") + setControlTipText = PropertiesSet._setProperty(pvObject, "ControlTipText", pvValue) +End Function ' setControlTipText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setCurrentRecord(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setCurrentRecord") + setCurrentRecord = PropertiesSet._setProperty(pvObject, "CurrentRecord", pvValue) +End Function ' setCurrentRecord + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setDefault(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setDefault") + setDefault = PropertiesSet._setProperty(pvObject, "Default", pvValue) +End Function ' setDefault + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setDefaultValue(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setDefaultValue") + setDefaultValue = PropertiesSet._setProperty(pvObject, "DefaultValue", pvValue) +End Function ' setDefaultValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setDescription(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setDescription") + setDescription = PropertiesSet._setProperty(pvObject, "Description", pvValue) +End Function ' setDescription + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setEnabled(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setEnabled") + setEnabled = PropertiesSet._setProperty(pvObject, "Enabled", pvValue) +End Function ' setEnabled + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFilter(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFilter") + setFilter = PropertiesSet._setProperty(pvObject, "Filter", pvValue) +End Function ' setFilter + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFilterOn(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFilterOn") + setFilterOn = PropertiesSet._setProperty(pvObject, "FilterOn", pvValue) +End Function ' setFilterOn + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontBold(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontBold") + setFontBold = PropertiesSet._setProperty(pvObject, "FontBold", pvValue) +End Function ' setFontBold + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontItalic(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontItalic") + setFontItalic = PropertiesSet._setProperty(pvObject, "FontItalic", pvValue) +End Function ' setFontItalic + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontName(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontName") + setFontName = PropertiesSet._setProperty(pvObject, "FontName", pvValue) +End Function ' setFontName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontSize(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontSize") + setFontSize = PropertiesSet._setProperty(pvObject, "FontSize", pvValue) +End Function ' setFontSize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontUnderline(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontUnderline") + setFontUnderline = PropertiesSet._setProperty(pvObject, "FontUnderline", pvValue) +End Function ' setFontUnderline + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setFontWeight(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setFontWeight") + setFontWeight = PropertiesSet._setProperty(pvObject, "FontWeight", pvValue) +End Function ' setFontWeight + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setForeColor(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setForeColor") + setForeColor = PropertiesSet._setProperty(pvObject, "ForeColor", pvValue) +End Function ' setForeColor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setHeight(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setHeight") + setHeight = PropertiesSet._setProperty(pvObject, "Height", pvValue) +End Function ' setHeight + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setListIndex(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setListIndex") + setListIndex = PropertiesSet._setProperty(pvObject, "ListIndex", pvValue) +End Function ' setListIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setLocked(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setLocked") + setLocked = PropertiesSet._setProperty(pvObject, "Locked", pvValue) +End Function ' setLocked + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setMultiSelect(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setMultiSelect") + setMultiSelect = PropertiesSet._setProperty(pvObject, "MultiSelect", pvValue) +End Function ' setMultiSelect + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setOnAction(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setOnAction") + setOnAction = PropertiesSet._setProperty(pvObject, "OnAction", pvValue) +End Function ' setOnAction + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setOptionValue(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setOptionValue") + setOptionValue = PropertiesSet._setProperty(pvObject, "OptionValue", pvValue) +End Function ' setOptionValue + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setOrderBy(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setOrderBy") + setOrderBy = PropertiesSet._setProperty(pvObject, "OrderBy", pvValue) +End Function ' setOrderBy + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setOrderByOn(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setOrderByOn") + setOrderByOn = PropertiesSet._setProperty(pvObject, "OrderByOn", pvValue) +End Function ' setOrderByOn + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setPage(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setPage") + setPage = PropertiesSet._setProperty(pvObject, "Page", pvValue) +End Function ' setPage V0.9.1 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(Optional pvItem As Variant, ByVal Optional psProperty As String, ByVal Optional pvValue As Variant, ByVal Optional pvIndex As Variant) As Variant +' Return True if property setting OK + Utils._SetCalledSub("setProperty") + If IsMissing(pvItem) Or IsMissing(psProperty) Or IsMissing(pvValue) Or IsEmpty(pvItem) Then Call _TraceArguments() + If IsMissing(pvIndex) Then + setProperty = PropertiesSet._setProperty(pvItem, psProperty, pvValue) + Else + setProperty = PropertiesSet._setProperty(pvItem, psProperty, pvValue, pvIndex) + End If + Utils._ResetCalledSub("setProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setRecordSource(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setRecordSource") + setRecordSource = PropertiesSet._setProperty(pvObject, "RecordSource", pvValue) +End Function ' setRecordSource + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setRequired(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setRequired") + setRequired = PropertiesSet._setProperty(pvObject, "Required", pvValue) +End Function ' setRequired + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setRowSource(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setRowSource") + setRowSource = PropertiesSet._setProperty(pvObject, "RowSource", pvValue) +End Function ' setRowSource + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setRowSourceType(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setRowSourceType") + setRowSourceType = PropertiesSet._setProperty(pvObject, "RowSourceType", pvValue) +End Function ' setRowSourceType + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setSelected(Optional pvObject As Variant, ByVal Optional pvValue As Variant, ByVal Optional pvIndex As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Then Call _TraceArguments("setSelected") + If IsEmpty(pvObject) Then Call _TraceArguments("setSelected") + If IsMissing(pvIndex) Then + setSelected = PropertiesSet._setProperty(pvObject, "Selected", pvValue) + Else + setSelected = PropertiesSet._setProperty(pvObject, "Selected", pvValue, pvIndex) + End If +End Function ' setSelected + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setSelLength(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setSelLength") + setSelLength = PropertiesSet._setProperty(pvObject, "SelLength", pvValue) +End Function ' setSelLength + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setSelStart(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setSelStart") + setSelStart = PropertiesSet._setProperty(pvObject, "SelStart", pvValue) +End Function ' setSelStart + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setSelText(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setSelText") + setSelText = PropertiesSet._setProperty(pvObject, "SelText", pvValue) +End Function ' setSelText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setSpecialEffect(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setSpecialEffect") + setSpecialEffect = PropertiesSet._setProperty(pvObject, "SpecialEffect", pvValue) +End Function ' setSpecialEffect + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTabIndex(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTabIndex") + setTabIndex = PropertiesSet._setProperty(pvObject, "TabIndex", pvValue) +End Function ' setTabIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTabStop(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTabStop") + setTabStop = PropertiesSet._setProperty(pvObject, "TabStop", pvValue) +End Function ' setTabStop + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTag(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTag") + setTag = PropertiesSet._setProperty(pvObject, "Tag", pvValue) +End Function ' setTag + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTextAlign(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTextAlign") + setTextAlign = PropertiesSet._setProperty(pvObject, "TextAlign", pvValue) +End Function ' setTextAlign + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTooltipText(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTooltipText") + setTooltipText = PropertiesSet._setProperty(pvObject, "TooltipText", pvValue) +End Function ' setTooltipText + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setTripleState(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setTripleState") + setTripleState = PropertiesSet._setProperty(pvObject, "TripleState", pvValue) +End Function ' setTripleState + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setVisible(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms and controls + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setVisible") + setVisible = PropertiesSet._setProperty(pvObject, "Visible", pvValue) +End Function ' setVisible + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setWidth(Optional pvObject As Variant, ByVal Optional pvValue As Variant) As Boolean +' Only for open forms + If IsMissing(pvObject) Or IsMissing(pvValue) Or IsEmpty(pvObject) Then Call _TraceArguments("setWidth") + setWidth = PropertiesSet._setProperty(pvObject, "Width", pvValue) +End Function ' setWidth + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private Function _CheckProperty(pvObject As Object, ByVal psProperty As String) As Boolean +' Return False if psProperty not within the PropertyValues set of pvItem + +Dim i As Integer, oPropertyValues As Variant, oProperty As Variant + oPropertyValues = pvObject.PropertyValues + + For i = LBound(oPropertyValues) To UBound(oPropertyValues) + oProperty = oPropertyValues(i) + If UCase(oProperty.Name) = UCase(psProperty) Then + _CheckProperty = True + Exit Function + End If + Next i + + _CheckProperty = False + Exit Function + +End Function ' CheckProperty V0.7.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _setProperty(pvItem As Variant, ByVal psProperty As String, ByVal pvValue As Variant, ByVal Optional pvIndex As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + +'pvItem must be an object and have the requested property + If Not Utils._CheckArgument(pvItem, 1, vbObject) Then Goto Exit_Function +'Check Index argument + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 4, Utils._AddNumeric()) Then Goto Exit_Function + End If +'Execute +Dim iArgNr As Integer, lFormat As Long +Dim i As Integer, iCount As Integer, iSelectedItems() As Integer, bListboxBound As Boolean +Dim odbDatabase As Object, vNames As Variant, bFound As Boolean, sName As String, oModel As Object +Dim ocButton As Variant, iRadioIndex As Integer + _setProperty = True + If _A2B_.CalledSub = "setProperty" Then iArgNr = 3 Else iArgNr = 2 + If Not PropertiesGet._hasProperty(pvItem._Type, pvItem._PropertiesList(), psProperty) Then Goto Trace_Error_Control + Select Case UCase(psProperty) + Case UCase("AbsolutePosition") + If Not Utils._CheckArgument(pvItem, 1, OBJRECORDSET) Then Goto Exit_Function + pvItem.AbsolutePosition = pvValue + Case UCase("AllowAdditions") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.AllowAdditions = pvValue + Case UCase("AllowDeletions") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.AllowDeletions = pvValue + Case UCase("AllowEdits") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.AllowEdits = pvValue + Case UCase("BackColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.BackColor = pvValue + Case UCase("Bookmark") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJRECORDSET)) Then Goto Exit_Function + pvItem.Bookmark = pvValue + Case UCase("BorderColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.BorderColor = pvValue + Case UCase("BorderStyle") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.BorderColor = pvValue + Case UCase("Cancel") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Cancel = pvValue + Case UCase("Caption") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG, OBJCONTROL)) Then Goto Exit_Function + pvItem.Caption = pvValue + Case UCase("ControlTipText") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.ControlTipText = pvValue + Case UCase("CurrentRecord") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.CurrentRecord = pvValue + Case UCase("Default") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Default = pvValue + Case UCase("DefaultValue") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCONTROL, OBJFIELD)) Then Goto Exit_Function + pvItem.DefaultValue = pvValue + Case UCase("Description") + If Not Utils._CheckArgument(pvItem, 1, OBJFIELD) Then Goto Exit_Function + pvItem.DefaultValue = pvValue + Case UCase("Enabled") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Enabled = pvValue + Case UCase("Filter") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM, OBJRECORDSET)) Then Goto Exit_Function + pvItem.Filter = pvValue + Case UCase("FilterOn") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.FilterOn = pvValue + Case UCase("FontBold") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontBold = pvValue + Case UCase("FontItalic") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontItalic = pvValue + Case UCase("FontName") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontName = pvValue + Case UCase("FontSize") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontSize = pvValue + Case UCase("FontUnderline") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontUnderline = pvValue + Case UCase("FontWeight") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.FontWeight = pvValue + Case UCase("ForeColor") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.ForeColor = pvValue + Case UCase("Height") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG)) Then Goto Exit_Function + pvItem.Height = pvValue + Case UCase("ListIndex") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.ListIndex = pvValue + Case UCase("Locked") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Locked = pvValue + Case UCase("MultiSelect") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.MultiSelect = pvValue + Case UCase("OnAction") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + pvItem.OnAction = pvValue + Case UCase("OptionValue") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.OptionValue = pvValue + Case UCase("OrderBy") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.OrderBy = pvValue + Case UCase("OrderByOn") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.OrderByOn = pvValue + Case UCase("Page") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJDIALOG, OBJCONTROL)) Then Goto Exit_Function + pvItem.Page = pvValue + Case UCase("RecordSource") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJSUBFORM)) Then Goto Exit_Function + pvItem.RecordSource = pvValue + Case UCase("Required") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Required = pvValue + Case UCase("RowSource") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.RowSource = pvValue + Case UCase("RowSourceType") ' Refresh done when RowSource changes, not RowSourceType + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.RowSourceType = pvValue + Case UCase("Selected") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + If IsMissing(pvIndex) Then pvItem.Selected = pvValue Else pvItem.SelectedI(pvValue, pvIndex) + Case UCase("SelLength") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.SelLength = pvValue + Case UCase("SelStart") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.SelStart = pvValue + Case UCase("SelText") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.SelText = pvValue + Case UCase("SpecialEffect") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.SpecialEffect = pvValue + Case UCase("TabIndex") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.TabIndex = pvValue + Case UCase("TabStop") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.TabStop = pvValue + Case UCase("Tag") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.Tag = pvValue + Case UCase("TextAlign") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.TextAlign = pvValue + Case UCase("TooltipText") + If Not Utils._CheckArgument(pvItem, 1, OBJCOMMANDBARCONTROL) Then Goto Exit_Function + pvItem.TooltipText = pvValue + Case UCase("TripleState") + If Not Utils._CheckArgument(pvItem, 1, OBJCONTROL) Then Goto Exit_Function + pvItem.TripleState = pvValue + Case UCase("Value") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJCONTROL, OBJOPTIONGROUP, OBJFIELD, OBJTEMPVAR)) Then Goto Exit_Function + pvItem.Value = pvValue + Case UCase("Visible") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG, OBJCONTROL, OBJCOMMANDBAR, OBJCOMMANDBARCONTROL)) Then Goto Exit_Function + pvItem.Visible = pvValue + Case UCase("Width") + If Not Utils._CheckArgument(pvItem, 1, Array(OBJFORM, OBJDIALOG)) Then Goto Exit_Function + pvItem.Width = pvValue + Case Else + Goto Trace_Error_Control + End Select + +Exit_Function: + Utils._ResetCalledSub("set" & psProperty) + Exit Function +Trace_Error_Form: + TraceError(TRACEFATAL, ERRFORMNOTFOUND, Utils._CalledSub(), 0, 1, pvItem._Name) + _setProperty = False + Goto Exit_Function +Trace_Error_Control: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _setProperty = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _setProperty = False + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _setProperty = Nothing + Goto Exit_Function +Trace_Error_Array: + TraceError(TRACEFATAL, ERRPROPERTYNOTARRAY, Utils._CalledSub(), 0, 1, iArgNr) + _setProperty = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "_setProperty", Erl) + GoTo Exit_Function +End Function ' _setProperty V0.9.1 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Property.xba b/wizards/source/access2base/Property.xba new file mode 100644 index 000000000..8b881c284 --- /dev/null +++ b/wizards/source/access2base/Property.xba @@ -0,0 +1,152 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Property" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be PROPERTY +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _Value As Variant +Private _ParentDatabase As Object + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJPROPERTY + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _Value = Null +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Value() As Variant + Value = _PropertyGet("Value") +End Property ' Value (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("Property.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("Property.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + _PropertiesList = Array("Name", "ObjectType", "Value") +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("Property.get" & psProperty) + _PropertyGet = Nothing + + Select Case UCase(psProperty) + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Value") + _PropertyGet = _Value + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("Property.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "Property._PropertyGet", Erl) + _PropertyGet = Nothing + GoTo Exit_Function +End Function ' _PropertyGet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Python.xba b/wizards/source/access2base/Python.xba new file mode 100644 index 000000000..94a442159 --- /dev/null +++ b/wizards/source/access2base/Python.xba @@ -0,0 +1,613 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Python" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub DebugPrint(ParamArray pvArgs() As Variant) + +'Print arguments unconditionally in console +'Arguments are separated by a TAB (simulated by spaces) +'Some pvArgs might be missing: a TAB is still generated + +Dim vVarTypes() As Variant, i As Integer +Const cstTab = 5 + On Local Error Goto Exit_Sub ' Never interrupt processing + Utils._SetCalledSub("DebugPrint") + vVarTypes = Utils._AddNumeric(Array(vbEmpty, vbNull, vbDate, vbString, vbBoolean, vbObject, vbVariant, vbByte, vbArray + vbByte)) + + If UBound(pvArgs) >= 0 Then + For i = 0 To UBound(pvArgs) + If Not Utils._CheckArgument(pvArgs(i), i + 1, vVarTypes(), , False) Then pvArgs(i) = "[TYPE?]" + Next i + End If + +Dim sOutput As String, sArg As String + sOutput = "" + For i = 0 To UBound(pvArgs) + sArg = Replace(Utils._CStr(pvArgs(i), _A2B_.DebugPrintShort), "\;", ";") + ' Add argument to output + If i = 0 Then + sOutput = sArg + Else + sOutput = sOutput & Space(cstTab - (Len(sOutput) Mod cstTab)) & sArg + End If + Next i + + TraceLog(TRACEANY, sOutput, False) + +Exit_Sub: + Utils._ResetCalledSub("DebugPrint") + Exit Sub +End Sub ' DebugPrint V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PYTHON WRAPPERS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PythonEventsWrapper(Optional poEvent As Variant) As Variant +' Python wrapper when Application.Events() method is invoked +' The ParamArray mechanism empties UNO objects when they are member of the arguments list +' As a workaround, the Application.Events function is executed directly + + If _ErrorHandler() Then On Local Error GoTo Exit_Function ' Do never interrupt + PythonEventsWrapper = Null + +Dim vReturn As Variant, vArray As Variant +Const cstObject = 1 + + vReturn = Application.Events(poEvent) + vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type) + + PythonEventsWrapper = vArray + +Exit_Function: + Exit Function +End Function ' PythonEventsWrapper V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PythonWrapper(ByVal pvCallType As Variant _ + , ByVal pvObject As Variant _ + , ByVal pvScript As Variant _ + , ParamArray pvArgs() As Variant _ + ) As Variant +' Called from Python to apply +' - on object with entry pvObject in PythonCache +' Conventionally: -1 = Application +' -2 = DoCmd +' - a script pvScript which type is described by pvCallType +' - with arguments pvArgs(0)... (max. 8 for object methods) +' The value returned by the method/property is encapsulated in an array +' [0] => 0 = scalar or array returned by the method +' => 1 = basic object returned by the method +' => 2 = a null value +' [1] => the object reference or the returned value (complemented with arguments passed by reference, if any) or Null +' [2] => the object type or Null +' [3] => the object name, if any +' or, when pvCallType == vbUNO, as the UNO object returned by the property + +Dim vReturn As Variant, vArray As Variant +Dim vObject As Variant, sScript As String, sModule As String +Dim i As Integer, iNbArgs As Integer, vArg As Variant, vArgs() As Variant + +Const cstApplication = -1, cstDoCmd = -2 +Const cstScalar = 0, cstObject = 1, cstNull = 2, cstUNO = 3 + +'Conventional special values +Const cstNoArgs = "+++NOARGS+++", cstSymEmpty = "+++EMPTY+++", cstSymNull = "+++NULL+++", cstSymMissing = "+++MISSING+++" + +'https://support.office.com/en-us/article/CallByName-fonction-49ce9475-c315-4f13-8d35-e98cfe98729a +'Determines the pvCallType +Const vbGet = 2, vbLet = 4, vbMethod = 1, vbSet = 8, vbUNO = 16 + + If _ErrorHandler() Then On Local Error GoTo Error_Function + PythonWrapper = Null + + 'Reinterpret arguments one by one into vArgs, examine iso-dates and conventional NoArgs/Empty/Null values + iNbArgs = -1 + vArgs = Array() + If UBound(pvArgs) >= 0 Then + For i = 0 To UBound(pvArgs) + vArg = pvArgs(i) + If i = 0 And VarType(vArg) = vbString Then + If vArg = cstNoArgs Then Exit For + End If + If VarType(vArg) = vbString Then + If vArg = cstSymEmpty Then + vArg = Empty + ElseIf vArg = cstSymNull Then + vArg = Null + ElseIf vArg = cstSymMissing Then + Exit For ' Next arguments must be missing also + Else + vArg = _CDate(vArg) + End If + End If + iNbArgs = iNbArgs + 1 + ReDim Preserve vArgs(iNbArgs) + vArgs(iNbArgs) = vArg + Next i + End If + + 'Check pvObject + Select Case pvObject ' Always numeric + Case cstApplication + sModule = "Application" + Select Case pvScript + Case "AllDialogs" : If iNbArgs < 0 Then vReturn = Application.AllDialogs() Else vReturn = Application.AllDialogs(vArgs(0)) + Case "AllForms" : If iNbArgs < 0 Then vReturn = Application.AllForms() Else vReturn = Application.AllForms(vArgs(0)) + Case "AllModules" : If iNbArgs < 0 Then vReturn = Application.AllModules() Else vReturn = Application.AllModules(vArgs(0)) + Case "CloseConnection" + vReturn = Application.CloseConnection() + Case "CommandBars" : If iNbArgs < 0 Then vReturn = Application.CommandBars() Else vReturn = Application.CommandBars(vArgs(0)) + Case "CurrentDb" : vReturn = Application.CurrentDb() + Case "CurrentUser" : vReturn = Application.CurrentUser() + Case "DAvg" : vReturn = Application.DAvg(vArgs(0), vArgs(1), vArgs(2)) + Case "DCount" : vReturn = Application.DCount(vArgs(0), vArgs(1), vArgs(2)) + Case "DLookup" : vReturn = Application.DLookup(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case "DMax" : vReturn = Application.DMax(vArgs(0), vArgs(1), vArgs(2)) + Case "DMin" : vReturn = Application.DMin(vArgs(0), vArgs(1), vArgs(2)) + Case "DStDev" : vReturn = Application.DStDev(vArgs(0), vArgs(1), vArgs(2)) + Case "DStDevP" : vReturn = Application.DStDevP(vArgs(0), vArgs(1), vArgs(2)) + Case "DSum" : vReturn = Application.DSum(vArgs(0), vArgs(1), vArgs(2)) + Case "DVar" : vReturn = Application.DVar(vArgs(0), vArgs(1), vArgs(2)) + Case "DVarP" : vReturn = Application.DVarP(vArgs(0), vArgs(1), vArgs(2)) + Case "Forms" : If iNbArgs < 0 Then vReturn = Application.Forms() Else vReturn = Application.Forms(vArgs(0)) + Case "getObject" : vReturn = Application.getObject(vArgs(0)) + Case "getValue" : vReturn = Application.getValue(vArgs(0)) + Case "HtmlEncode" : vReturn = Application.HtmlEncode(vArgs(0), vArgs(1)) + Case "OpenDatabase" : vReturn = Application.OpenDatabase(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case "ProductCode" : vReturn = Application.ProductCode() + Case "setValue" : vReturn = Application.setValue(vArgs(0), vArgs(1)) + Case "SysCmd" : vReturn = Application.SysCmd(vArgs(0), vArgs(1), vARgs(2)) + Case "TempVars" : If iNbArgs < 0 Then vReturn = Application.TempVars() Else vReturn = Application.TempVars(vArgs(0)) + Case "Version" : vReturn = Application.Version() + Case Else + GoTo Error_Proc + End Select + Case cstDoCmd + sModule = "DoCmd" + Select Case pvScript + Case "ApplyFilter" : vReturn = DoCmd.ApplyFilter(vArgs(0), vArgs(1), vArgs(2)) + Case "Close" : vReturn = DoCmd.mClose(vArgs(0), vArgs(1), vArgs(2)) + Case "CopyObject" : vReturn = DoCmd.CopyObject(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case "FindNext" : vReturn = DoCmd.FindNext() + Case "FindRecord" : vReturn = DoCmd.FindRecord(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) + Case "GetHiddenAttribute" + vReturn = DoCmd.GetHiddenAttribute(vArgs(0), vArgs(1)) + Case "GoToControl" : vReturn = DoCmd.GoToControl(vArgs(0)) + Case "GoToRecord" : vReturn = DoCmd.GoToRecord(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case "Maximize" : vReturn = DoCmd.Maximize() + Case "Minimize" : vReturn = DoCmd.Minimize() + Case "MoveSize" : vReturn = DoCmd.MoveSize(vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case "OpenForm" : vReturn = DoCmd.OpenForm(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) + Case "OpenQuery" : vReturn = DoCmd.OpenQuery(vArgs(0), vArgs(1), vArgs(2)) + Case "OpenReport" : vReturn = DoCmd.OpenReport(vArgs(0), vArgs(1)) + Case "OpenSQL" : vReturn = DoCmd.OpenSQL(vArgs(0), vArgs(1)) + Case "OpenTable" : vReturn = DoCmd.OpenTable(vArgs(0), vArgs(1), vArgs(2)) + Case "OutputTo" : vReturn = DoCmd.OutputTo(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7)) + Case "Quit" : _A2B_.CalledSub = "Quit" : GoTo Error_Action + Case "RunApp" : vReturn = DoCmd.RunApp(vArgs(0)) + Case "RunCommand" : vReturn = DoCmd.RunCommand(vArgs(0)) + Case "RunSQL" : vReturn = DoCmd.RunSQL(vArgs(0), vArgs(1)) + Case "SelectObject" : vReturn = DoCmd.SelectObject(vArgs(0), vArgs(1), vArgs(2)) + Case "SendObject" : vReturn = DoCmd.SendObject(vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7), vArgs(8), vArgs(9)) + Case "SetHiddenAttribute" + vReturn = DoCmd.SetHiddenAttribute(vArgs(0), vArgs(1), vArgs(2)) + Case "SetOrderBy" : vReturn = DoCmd.SetOrderBy(vArgs(0), vArgs(1)) + Case "ShowAllRecords" + vReturn = DoCmd.ShowAllRecords() + Case Else + GoTo Error_Proc + End Select + Case Else + ' Locate targeted object + If pvObject > UBound(_A2B_.PythonCache) Or pvObject < 0 Then GoTo Error_Object + Set vObject = _A2B_.PythonCache(pvObject) + If IsNull(vObject) Then + If pvScript = "Dispose" Then GoTo Exit_Function Else GoTo Error_Object + End If + ' Preprocessing + sScript = pvScript + sModule = vObject._Type + Select Case sScript + Case "Add" + If vObject._Type = "COLLECTION" And vObject._CollType = COLLTABLEDEFS Then vArgs = Array(_A2B_.PythonCache(vArgs(0))) + Case "Close" + sSCript = "mClose" + Case "Type" + sScript = "pType" + Case Else + End Select + ' Execute method + Select Case UBound(vArgs) ' Dirty but ... CallByName does not support an array of arguments or return values + Case -1 + If pvCallType = vbUNO Then + With vObject + Select Case sScript ' List all properties that should be called directly (UNO) + Case "BoundField" : vReturn = .BoundField + Case "Column" : vReturn = .Column + Case "Connection" : vReturn = .Connection + case "ContainerWindow" : vReturn = .ContainerWindow + Case "ControlModel" : vReturn = .ControlModel + Case "ControlView" : vReturn = .ControlView + Case "DatabaseForm" : vReturn = .DatabaseForm + Case "Document" : vReturn = .Document + Case "FormsCollection" : vReturn = .FormsCollection + Case "LabelControl" : vReturn = .LabelControl + Case "MetaData" : vReturn = .MetaData + Case "ParentComponent" : vReturn = .ParentComponent + Case "Query" : vReturn = .Query + Case "RowSet" : vReturn = .RowSet + Case "Table" : vReturn = .Table + Case "UnoDialog" : vReturn = .UnoDialog + Case Else + End Select + End With + ElseIf sScript = "ItemData" Then ' List all properties that should be called directly (arrays not supported by CallByName) + vReturn = vObject.ItemData + ElseIf sScript = "LinkChildFields" Then + vReturn = vObject.LinkChildFields + ElseIf sScript = "LinkMasterFields" Then + vReturn = vObject.LinkMasterFields + ElseIf sScript = "OpenArgs" Then + vReturn = vObject.OpenArgs + ElseIf sScript = "Selected" Then + vReturn = vObject.Selected + ElseIf sScript = "Value" Then + vReturn = vObject.Value + Else + vReturn = CallByName(vObject, sScript, pvCallType) + End If + Case 0 + Select Case sScript + Case "AppendChunk" ' Arg is a vector, not supported by CallByName + vReturn = vObject.GetChunk(vArgs(0), vArgs(1)) + Case "GetRows" ' Returns an array, not supported by CallByName + vReturn = vObject.GetRows(vArgs(0), True) ' Force iso dates + Case Else + vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0)) + End Select + Case 1 + Select Case sScript + Case "GetChunk" ' Returns a vector, not supported by CallByName + vReturn = vObject.GetChunk(vArgs(0), vArgs(1)) + Case Else + vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1)) + End Select + Case 2 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2)) + Case 3 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3)) + Case 4 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4)) + Case 5 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5)) + Case 6 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6)) + Case 7 : vReturn = CallByName(vObject, sScript, pvCallType, vArgs(0), vArgs(1), vArgs(2), vArgs(3), vArgs(4), vArgs(5), vArgs(6), vArgs(7)) + End Select + ' Postprocessing + Select Case pvScript + Case "Close", "Dispose", "Terminate" + Set _A2B_.PythonCache(pvObject) = Nothing + Case "Move", "MoveFirst", "MoveLast", "MoveNext", "MovePrevious" ' Pass the new BOF, EOF values (binary format) + If vObject._Type = "RECORDSET" Then + vReturn = (Iif(vObject.BOF, 1, 0) * 2 + Iif(vObject.EOF, 1, 0)) * Iif(vReturn, 1, -1) + End If + Case "Find" ' Store in array the arguments passed by reference + If vObject._Type = "MODULE" And vReturn = True Then + vReturn = Array(vReturn, vArgs(1), vArgs(2), vArgs(3), vArgs(4)) + End If + Case "ProcOfLine" ' Store in array the arguments passed by reference + vReturn = Array(vReturn, vArgs(1)) + Case Else + End Select + End Select + + ' Structure the returned array + If pvCallType = vbUNO Then + vArray = vReturn + Else + If IsNull(vReturn) Then + vArray = Array(cstNull, Null, Null) + ElseIf IsObject(vReturn) Then + Select Case vReturn._Type + Case "COLLECTION", "COMMANDBARCONTROL", "EVENT" + vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type) + Case Else + vArray = Array(cstObject, _A2B_.AddPython(vReturn), vReturn._Type, vReturn.Name) + End Select + Else + If VarType(vReturn) = vbDate Then + vArray = Array(cstScalar, _CStr(vReturn), Null) + ElseIf VarType(vReturn) = vbBigint Then ' Could happen for big integer database fields + vArray = Array(cstScalar, CLng(vReturn), Null) + Else + vArray = Array(cstScalar, vReturn, Null) + End If + End If + End If + + PythonWrapper = vArray + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "PythonWrapper", Erl) + GoTo Exit_Function +Error_Object: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, "Python Wrapper (" & pvScript & ")", 0, , Array(_GetLabel("OBJECT"), "#" & pvObject)) + GoTo Exit_Function +Error_Action: + TraceError(TRACEFATAL, ERRACTION, Utils._CalledSub(), 0) + GoTo Exit_Function +Error_Proc: + TraceError(TRACEFATAL, ERRPROCEDURENOTFOUND, "Python Wrapper", 0, , Array(pvScript, sModule)) + GoTo Exit_Function +End Function ' PythonWrapper V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PYTHON HELPER FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyConvertFromUrl(ByVal pvFile As Variant) As String +' Convenient function to have common conversions of filenames from/to url notations both in Python and Basic + + On Local Error GoTo Exit_Function + PyConvertFromUrl = "" + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + + PyConvertFromUrl = ConvertFromUrl(pvFile) + +Exit_Function: + Exit Function +End Function ' PyConvertFromUrl V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyConvertToUrl(ByVal pvFile As Variant) As String +' Convenient function to have common conversions of filenames from/to url notations both in Python and Basic + + On Local Error GoTo Exit_Function + PyConvertToUrl = "" + If Not Utils._CheckArgument(pvFile, 1, vbString) Then Goto Exit_Function + + PyConvertToUrl = ConvertToUrl(pvFile) + +Exit_Function: + Exit Function +End Function ' PyConvertToUrl V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyCreateUnoService(ByVal pvService As Variant) As Variant +' Convenient function to create a UNO service in Python + + On Local Error GoTo Exit_Function + Set PyCreateUnoService = Nothing + If Not Utils._CheckArgument(pvService, 1, vbString) Then Goto Exit_Function + + Set PyCreateUnoService = CreateUnoService(pvService) + +Exit_Function: + Exit Function +End Function ' PyCreateUnoService V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyDateAdd(ByVal pvAdd As Variant _ + , ByVal pvCount As Variant _ + , ByVal pvDate As Variant _ + ) As Variant +' Convenient shortcut to useful and easy-to-use Basic date functions + +Dim vDate As Variant, vNewDate As Variant + On Local Error GoTo Exit_Function + PyDateAdd = Null + + If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvCount, 2, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvDate, 3, vbString) Then Goto Exit_Function + + vDate = _CDate(pvDate) + vNewDate = DateAdd(pvAdd, pvCount, vDate) + If VarType(vNewDate) = vbDate Then PyDateAdd = _CStr(vNewDate) Else PyDateAdd = vNewDate + +Exit_Function: + Exit Function +End Function ' PyDateAdd V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyDateDiff(ByVal pvAdd As Variant _ + , ByVal pvDate1 As Variant _ + , ByVal pvDate2 As Variant _ + , ByVal pvWeekStart As Variant _ + , ByVal pvYearStart As Variant _ + ) As Variant +' Convenient shortcut to useful and easy-to-use Basic date functions + +Dim vDate1 As Variant, vDate2 As Variant + On Local Error GoTo Exit_Function + PyDateDiff = Null + + If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvDate1, 2, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvDate2, 3, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWeekStart, 4, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWeekStart, 5, Utils._AddNumeric()) Then Goto Exit_Function + + vDate1 = _CDate(pvDate1) + vDate2 = _CDate(pvDate2) + PyDateDiff = DateDiff(pvAdd, vDate1, vDate2, pvWeekStart, pvYearStart) + +Exit_Function: + Exit Function +End Function ' PyDateDiff V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyDatePart(ByVal pvAdd As Variant _ + , ByVal pvDate As Variant _ + , ByVal pvWeekStart As Variant _ + , ByVal pvYearStart As Variant _ + ) As Variant +' Convenient shortcut to useful and easy-to-use Basic date functions + +Dim vDate As Variant + On Local Error GoTo Exit_Function + PyDatePart = Null + + If Not Utils._CheckArgument(pvAdd, 1, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvDate, 2, vbString) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWeekStart, 3, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvWeekStart, 4, Utils._AddNumeric()) Then Goto Exit_Function + + vDate = _CDate(pvDate) + PyDatePart = DatePart(pvAdd, vDate, pvWeekStart, pvYearStart) + +Exit_Function: + Exit Function +End Function ' PyDatePart V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyDateValue(ByVal pvDate As Variant) As Variant +' Convenient shortcut to useful and easy-to-use Basic date functions + +Dim vDate As Variant + On Local Error GoTo Exit_Function + PyDateValue = Null + If Not Utils._CheckArgument(pvDate, 1, vbString) Then Goto Exit_Function + + vDate = DateValue(pvDate) + If VarType(vDate) = vbDate Then PyDateValue = _CStr(vDate) Else PyDateValue = vDate + +Exit_Function: + Exit Function +End Function ' PyDateValue V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyFormat(ByVal pvValue As Variant, pvFormat As Variant) As String +' Convenient function to format numbers or dates + + On Local Error GoTo Exit_Function + PyFormat = "" + If Not Utils._CheckArgument(pvValue, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + pvValue = _CDate(pvValue) + If IsEmpty(pvFormat) Then + PyFormat = Str(pvValue) + Else + If Not Utils._CheckArgument(pvFormat, 2, vbString) Then Goto Exit_Function + PyFormat = Format(pvValue, pvFormat) + End If + +Exit_Function: + Exit Function +End Function ' PyFormat V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyGetGUIType() As Variant + + PyGetGUIType = GetGUIType() + +End Function ' PyGetGUIType V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyGetSystemTicks() As Variant + + PyGetSystemTicks = GetSystemTicks() + +End Function ' PyGetSystemTicks V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyGlobalScope(ByVal pvLib As Variant) As Variant + + Select Case pvLib + Case "Basic" + PyGlobalScope = GlobalScope.BasicLibraries() + Case "Dialog" + PyGlobalScope = GlobalScope.DialogLibraries() + Case Else + End Select + +End Function ' PyGlobalScope V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyInputBox(ByVal pvText As Variant _ + , ByVal pvTitle As Variant _ + , ByVal pvDefault As Variant _ + , ByVal pvXPos As Variant _ + , ByVal pvYPos As Variant _ + ) As Variant +' Convenient function to open input box from Python + + On Local Error GoTo Exit_Function + PyInputBox = Null + + If Not Utils._CheckArgument(pvText, 1, vbString) Then Goto Exit_Function + If IsEmpty(pvTitle) Then pvTitle = "" + If Not Utils._CheckArgument(pvTitle, 2, vbString) Then Goto Exit_Function + If IsEmpty(pvDefault) Then pvDefault = "" + If Not Utils._CheckArgument(pvDefault, 3, vbString) Then Goto Exit_Function + + If IsEmpty(pvXPos) Or IsEmpty(pvYPos) Then + PyInputBox = InputBox(pvText, pvTitle, pvDefault) + Else + If Not Utils._CheckArgument(pvXPos, 4, Utils._AddNumeric()) Then Goto Exit_Function + If Not Utils._CheckArgument(pvYPos, 5, Utils._AddNumeric()) Then Goto Exit_Function + PyInputBox = InputBox(pvText, pvTitle, pvDefault, pvXPos, pvYPos) + End If + +Exit_Function: + Exit Function +End Function ' PyInputBox V6.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyMsgBox(ByVal pvText As Variant _ + , ByVal pvType As Variant _ + , ByVal pvDialogTitle As Variant _ + ) As Variant +' Convenient function to open message box from Python + + On Local Error GoTo Exit_Function + PyMsgBox = Null + + If Not Utils._CheckArgument(pvText, 1, vbString) Then Goto Exit_Function + If IsEmpty(pvType) Then pvType = 0 + If Not Utils._CheckArgument(pvType, 2, Utils._AddNumeric()) Then Goto Exit_Function + If IsEmpty(pvDialogTitle) Then + PyMsgBox = MsgBox(pvText, pvType) + Else + If Not Utils._CheckArgument(pvDialogTitle, 3, vbString) Then Goto Exit_Function + PyMsgBox = MsgBox(pvText, pvType, pvDialogTitle) + End If + +Exit_Function: + Exit Function +End Function ' PyMsgBox V6.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function PyTimer() As Long +' Convenient function to call Timer from Python + + PyTimer = Timer + +End Function ' PyTimer V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _CDate(ByVal pvValue As Variant) As Variant +' Return a Date type if iso date, otherwise return input + +Dim vValue As Variant + vValue = pvValue + If VarType(pvValue) = vbString Then + If pvValue <> "" And IsDate(pvValue) Then vValue = CDate(pvValue) ' IsDate("") gives True !? + End If + _CDate = vValue + +End Function + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Recordset.xba b/wizards/source/access2base/Recordset.xba new file mode 100644 index 000000000..094bba000 --- /dev/null +++ b/wizards/source/access2base/Recordset.xba @@ -0,0 +1,1268 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Recordset" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be RECORDSET +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String ' Unique, generated +Private _Fields() As Variant +Private _ParentName As String +Private _ParentType As String +Private _ParentDatabase As Object +Private _ForwardOnly As Boolean +Private _PassThrough As Boolean +Private _ReadOnly As Boolean +Private _CommandType As Long +Private _Command As String +Private _DataSet As Boolean ' True if execute() successful +Private _BOF As Boolean +Private _EOF As Boolean +Private _Filter As String +Private _EditMode As Integer ' dbEditxxx constants +Private _BookmarkBeforeNew As Variant +Private _BookmarkLastModified As Variant +Private _IsClone As Boolean +Private _ManageChunks As Variant ' Array of ChunkDescriptors +Private RowSet As Object ' com.sun.star.comp.dba.ORowSet + +Type ChunkDescriptor + ChunksRequested As Boolean + FieldName As String + ChunkType As Integer ' vbString or vbByte + FileName As String + FileHandler As Object +End Type + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJRECORDSET + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _Fields = Array() + _ParentName = "" + Set _ParentDatabase = Nothing + _ParentType = "" + _ForwardOnly = False + _PassThrough = False + _ReadOnly = False + _CommandType = 0 + _Command = "" + _DataSet = False + _BOF = True + _EOF = True + _Filter = "" + _EditMode = dbEditNone + _BookmarkBeforeNew = Null + _BookmarkLastModified = Null + _IsClone = False + Set _ManageChunks = Array() + Set RowSet = Nothing +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + mClose() +End Sub + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AbsolutePosition() As Variant + AbsolutePosition = _PropertyGet("AbsolutePosition") +End Property ' AbsolutePosition (get) + +Property Let AbsolutePosition(ByVal pvValue As Variant) + Call _PropertySet("AbsolutePosition", pvValue) +End Property ' AbsolutePosition (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get BOF() As Boolean + BOF = _PropertyGet("BOF") +End Property ' BOF (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Bookmark() As Variant + Bookmark = _PropertyGet("Bookmark") +End Property ' Bookmark (get) + +Property Let Bookmark(ByVal pvValue As Variant) + Call _PropertySet("Bookmark", pvValue) +End Property ' Bookmark (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Bookmarkable() As Boolean + Bookmarkable = _PropertyGet("Bookmarkable") +End Property ' Bookmarkable (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get EOF() As Boolean + EOF = _PropertyGet("EOF") +End Property ' EOF (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get EditMode() As Integer + EditMode = _PropertyGet("EditMode") +End Property ' EditMode (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Filter() As Variant + Filter = _PropertyGet("Filter") +End Property ' Filter (get) + +Property Let Filter(ByVal pvValue As Variant) + Call _PropertySet("Filter", pvValue) +End Property ' Filter (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get LastModified() As Variant +' DO NOT PUBLISH + LastModified = _PropertyGet("LastModified") +End Property ' LastModified (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RecordCount() As Long + RecordCount = _PropertyGet("RecordCount") +End Property ' RecordCount (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AddNew() As Boolean +' Initiates the creation of a new record + +Const cstThisSub = "Recordset.AddNew" +Dim i As Integer, iFieldsCount As Integer, oField As Object +Dim sDefault As String, oColumn As Object +Dim iValue As Integer, lValue As Long, sgValue As Single, dbValue As Double, dValue As Date +Dim vTemp As Variant + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + AddNew = False + + With RowSet + 'Is inserting a new row allowed ? + If _ForwardOnly Or _ReadOnly Then Goto Error_NoUpdate + If Not .CanUpdateInsertedRows Then Goto Error_NoUpdate + If Not .IsBookmarkable Then Goto Error_NoUpdate + If _EditMode <> dbEditNone Then CancelUpdate() + If _BOF And _EOF Then ' Records before first or after last do not have a bookmark + _BookmarkBeforeNew = "_BOF_" + ElseIf .isBeforeFirst() Then + _BookmarkBeforeNew = "_BOF_" + ElseIf .isAfterLast() Then + _BookmarkBeforeNew = "_EOF_" + Else + _BookmarkBeforeNew = .getBookmark() + End If + + .moveToInsertRow() + + 'Set all fields to their default value + iFieldsCount = Fields().Count + On Local Error Resume Next ' Do not stop if default setting fails + For i = 0 To iFieldsCount - 1 + Set oField = Fields(i) + Set oColumn = oField.Column + sDefault = oField.DefaultValue + If sDefault = "" Then ' No default value + If oColumn.IsNullable = com.sun.star.sdbc.ColumnValue.NULLABLE Then oColumn.updateNull() + Else + With com.sun.star.sdbc.DataType + Select Case oColumn.Type + Case .BIT, .BOOLEAN + If sDefault = "1" Then oColumn.updateBoolean(True) Else oColumn.updateBoolean(False) + Case .TINYINT + iValue = CInt(sDefault) + If iValue >= -128 And iValue <= +127 Then oColumn.updateShort(iValue) + Case .SMALLINT + lValue = CLng(sDefault) + If lValue >= -32768 And lValue <= 32767 Then oColumn.updateInt(lValue) + Case .INTEGER + lValue = CLng(sDefault) + If lValue >= -2147483648 And lValue <= 2147483647 Then oColumn.updateInt(lValue) + Case .BIGINT + lValue = CLng(sDefault) + Column.updateLong(lValue) ' No proper type conversion for HYPER data type + Case .FLOAT + sgValue = CSng(sDefault) + If Abs(sgValue) < 3.402823E38 And Abs(sgValue) > 1.401298E-45 Then oColumn.updateFloat(sgValue) + Case .REAL, .DOUBLE + dbValue = CDbl(sDefault) + 'If Abs(dbValue) < 1.79769313486232E308 And Abs(dbValue) > 4.94065645841247E-307 Then oColumn.updateDouble(dbValue) + oColumn.updateDouble(dbValue) + Case .NUMERIC, .DECIMAL + dbValue = CDbl(sDefault) + If Utils._hasUNOProperty(Column, "Scale") Then + If Column.Scale > 0 Then + 'If Abs(dbValue) < 1.79769313486232E308 And Abs(dbValue) > 4.94065645841247E-307 Then oColumn.updateDouble(dbValue) + oColumn.updateDouble(dbValue) + Else + oColumn.updateString(sDefault) + End If + Else + oColumn.updateString(sDefault) + End If + Case .CHAR, .VARCHAR, .LONGVARCHAR + oColumn.updateString(sDefault) ' vbString + Case .DATE + dValue = DateValue(sDefault) + vTemp = New com.sun.star.util.Date + With vTemp + .Day = Day(dValue) + .Month = Month(dValue) + .Year = Year(dValue) + End With + oColumn.updateDate(vTemp) + Case .TIME + dValue = TimeValue(sDefault) + vTemp = New com.sun.star.util.Time + With vTemp + .Hours = Hour(dValue) + .Minutes = Minute(dValue) + .Seconds = Second(dValue) + '.HundredthSeconds = 0 + End With + oColumn.updateTime(vTemp) + Case .TIMESTAMP + dValue = DateValue(sDefault) + vTemp = New com.sun.star.util.DateTime + With vTemp + .Day = Day(dValue) + .Month = Month(dValue) + .Year = Year(dValue) + .Hours = Hour(dValue) + .Minutes = Minute(dValue) + .Seconds = Second(dValue) + '.HundredthSeconds = 0 + End With + oColumn.updateTimestamp(vTemp) +' Case .BINARY, .VARBINARY, .LONGVARBINARY + ' Case .BLOB +' Case .CLOB + Case Else + End Select + End With + End If + Next i + End With + If _ErrorHandler() Then On Local Error Goto Error_Function Else On Local Error Goto 0 + + _EditMode = dbEditAdd + AddNew = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' AddNew + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CancelUpdate() As Boolean +' Cancel any edit action + +Const cstThisSub = "Recordset.CancelUpdate" + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + CancelUpdate = False + + With RowSet + Select Case _EditMode + Case dbEditNone + Case dbEditAdd + _AppendChunkClose(True) + If Not IsNull(_BookmarkBeforeNew) Then + Select Case _BookmarkBeforeNew + Case "_BOF_" : .beforeFirst() + Case "_EOF_" : .afterLast() + Case Else : .moveToBookmark(_BookmarkBeforeNew) + End Select + End If + Case dbEditInProgress + .cancelRowUpdates() + _AppendChunkClose(True) + End Select + End With + + _EditMode = dbEditNone + _BookmarkBeforeNew = Null + _BookmarkLastModified = Null + CancelUpdate = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' CancelUpdate + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Clone() As Object +' Duplicate an existing recordset + +Const cstThisSub = "Recordset.Clone" + +Const cstNull = -1 +Dim iType As Integer, iOptions As Integer, iLockEdit As Integer + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + Set Clone = Nothing + + If _IsClone Then Goto Error_Clone + If _ForwardOnly Then iType = dbOpenForwardOnly Else iType = cstNull + If _PassThrough Then iOptions = dbSQLPassThrough Else iOptions = cstNull + iLockEdit = dbReadOnly ' Always read-only + + Set Clone = OpenRecordset(iType, iOptions, iLockEdit, True) + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_Clone: + TraceError(TRACEFATAL, ERRRECORDSETCLONE, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Clone + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function mClose(ByVal Optional pbRemove As Boolean) As Variant +' Dispose UNO objects +' If pbRemove = True, remove recordset from Recordsets collection + +Const cstThisSub = "Recordset.Close" +Dim i As Integer + + If _ErrorHandler() Then On Local Error Goto Exit_Function ' Do not stop execution + Utils._SetCalledSub(cstThisSub) + If Not IsNull(RowSet) Then + RowSet.close() + RowSet.dispose() + End If + _ForwardOnly = False + _PassThrough = False + _ReadOnly = False + _CommandType = 0 + _Command = "" + _ParentName = "" + _ParentType = "" + _DataSet = False + _BOF = True + _EOF = True + _Filter = "" + _EditMode = dbEditNone + _BookmarkBeforeNew = Null + _BookmarkLastModified = Null + _IsClone = False + For i = 0 To UBound(_Fields) + If Not IsNull(_Fields(i)) Then + _Fields(i).Dispose() + Set _Fields(i) = Nothing + End If + Next i + _Fields = Array() + Set RowSet = Nothing + If IsMissing(pbRemove) Then pbRemove = True + If pbRemove Then _ParentDatabase.RecordsetsColl.Remove(_Name) + Set _ParentDatabase = Nothing + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Close + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Delete() As Boolean +' Deletes the current record + +Const cstThisSub = "Recordset.Delete" + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + Delete = False + + 'Is deleting a row allowed ? + If _ForwardOnly Or _ReadOnly Then Goto Error_NoUpdate + If _EditMode <> dbEditNone Then + CancelUpdate() + Goto Error_Sequence + End If + If RowSet.rowDeleted() Then Goto Error_RowDeleted + + RowSet.deleteRow() + Delete = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Error_RowDeleted: + TraceError(TRACEFATAL, ERRROWDELETED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Sequence: + TraceError(TRACEFATAL, ERRUPDATESEQUENCE, Utils._CalledSub(), 0, 1) + Goto Exit_Function +End Function ' Delete + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Edit() As Boolean +' Updates the current record + +Const cstThisSub = "Recordset.Edit" + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + Edit = False + + 'Is updating a row allowed ? + If _ForwardOnly Or _ReadOnly Then Goto Error_NoUpdate + If _EditMode <> dbEditNone Then CancelUpdate() + If RowSet.rowDeleted() Then Goto Error_RowDeleted + + _EditMode = dbEditInProgress + Edit = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Error_RowDeleted: + TraceError(TRACEFATAL, ERRROWDELETED, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Edit + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Fields(ByVal Optional pvIndex As variant) As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Recordset.Fields" + Utils._SetCalledSub(cstThisSub) + + Set Fields = Nothing + If Not IsMissing(pvIndex) Then + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + End If + +Dim sObjects() As String, sObjectName As String, oObject As Object +Dim i As Integer, oFields As Object, iIndex As Integer + + ' No argument, return a collection + If IsMissing(pvIndex) Then + Set oObject = New Collect + Set oObject._This = oObject + oObject._CollType = COLLFIELDS + Set oObject._Parent = _This + oObject._Count = RowSet.getColumns().Count + Goto Exit_Function + End If + + Set oFields = RowSet.getColumns() + sObjects = oFields.ElementNames() + + ' Argument is the field name + If VarType(pvIndex) = vbString Then + iIndex = -1 + ' Check existence of object and find its exact (case-sensitive) name + For i = 0 To UBound(sObjects) + If UCase(pvIndex) = UCase(sObjects(i)) Then + sObjectName = sObjects(i) + iIndex = i + Exit For + End If + Next i + If iIndex < 0 Then Goto Trace_NotFound + ' Argument is numeric + Else + If pvIndex < 0 Or pvIndex > UBound(sObjects) Then Goto Trace_IndexError + sObjectName = sObjects(pvIndex) + iIndex = pvIndex + End If + + ' Check if field object already buffered in _Fields() array + If UBound(_Fields) < 0 Then ' Initialize _Fields + ReDim _Fields(0 To UBound(sObjects)) + For i = 0 To UBound(sObjects) + Set _Fields(i) = Nothing + Next i + End If + If Not IsNull(_Fields(iIndex)) Then + Set oObject = _Fields(iIndex) + ' Otherwise create new field object + Else + Set oObject = New Field + Set oObject._This = oObject + oObject._Name = sObjectName + Set oObject.Column = oFields.getByName(sObjectName) + If Utils._hasUNOProperty(oObject.Column, "Precision") Then oObject._Precision = oObject.Column.Precision + oObject._ParentName = _Name + oObject._ParentType = _Type + Set oObject._ParentDatabase = _ParentDatabase + Set oObject._ParentRecordset = _This + Set _Fields(iIndex) = oObject + End If + +Exit_Function: + Set Fields = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERROBJECTNOTFOUND, Utils._CalledSub(), 0, , Array(_GetLabel("FIELD"), pvIndex)) + Goto Exit_Function +Trace_IndexError: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Fields + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + +Const cstThisSub = "Recordset.getProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub(cstThisSub) + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function GetRows(ByVal Optional pvNumRows As variant, ByVal Optional pbStrDate As Boolean) As Variant +' UNPUBLISHED - pbStrDate = True forces all dates to be converted into strings + + If _ErrorHandler() Then On Local Error Goto Error_Function +Const cstThisSub = "Recordset.GetRows" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pbStrDate) Then pbStrDate = False + +Dim vMatrix() As Variant, lSize As Long, iNumFields As Integer, i As Integer + vMatrix() = Array() + If IsMissing(pvNumRows) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvNumRows, 1, Utils._AddNumeric()) Then Goto Exit_Function + If pvNumRows < 1 Then Goto Trace_Error + If IsNull(RowSet) Then Goto Trace_Closed + If Not _DataSet Then Goto Exit_Function + + If _EditMode <> dbEditNone Then CancelUpdate() + + If _EOF Then Goto Exit_Function + + lSize = -1 + iNumFields = RowSet.getColumns().Count - 1 + If iNumFields < 0 Then Goto Exit_Function + + ReDim vMatrix(0 To iNumFields, 0 To pvNumRows - 1) + + Do While Not _EOF And lSize < pvNumRows - 1 + lSize = lSize + 1 + For i = 0 To iNumFields + vMatrix(i, lSize) = Utils._getResultSetColumnValue(RowSet, i + 1) + If pbStrDate And IsDate(vMatrix(i, lSize)) Then vMatrix(i, lSize) = _CStr(vMatrix(i, lSize)) + Next i + _Move("NEXT") + Loop + If lSize < pvNumRows - 1 Then ' Resize to number of fetched records + ReDim Preserve vMatrix(0 To iNumFields, 0 To lSize) + End If + +Exit_Function: + GetRows() = vMatrix() + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Trace_Error: + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, , Array(1, pvNumRows)) + Set Controls = Nothing + Goto Exit_Function +Trace_Closed: + TraceError(TRACEFATAL, ERRRECORDSETCLOSED, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' GetRows V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + +Const cstThisSub = "Recordset.hasProperty" + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Utils._ResetCalledSub(cstThisSub) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Move(ByVal Optional pvRelative As Variant, ByVal Optional pvBookmark As variant) As Boolean +' Move record pointer Relative rows vs. bookmark or current record + + If IsMissing(pvRelative) Then Call _TraceArguments() + If Not Utils._CheckArgument(pvRelative, 1, Utils._AddNumeric()) Then Goto Exit_Function + + If IsMissing(pvBookmark) Then Move = _Move(pvRelative) Else Move = _Move(pvRelative, pvBookmark) + +Exit_Function: + Exit Function +End Function ' Move + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function MoveFirst() As Boolean + MoveFirst = _Move("First") +End Function ' MoveFirst + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function MoveLast() As Boolean + MoveLast = _Move("Last") +End Function ' MoveLast + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function MoveNext() As Boolean + MoveNext = _Move("Next") +End Function ' MoveNext + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function MovePrevious() As Boolean + MovePrevious = _Move("Previous") +End Function ' MovePrevious + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OpenRecordset(ByVal Optional pvType As Variant _ + , ByVal Optional pvOptions As Variant _ + , ByVal Optional pvLockEdit As Variant _ + , ByVal Optional pbClone As Boolean) As Object +'Return a Recordset object based on current recordset object with filter addition + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = Utils._PCase(_Type) & ".OpenRecordset" + Utils._SetCalledSub(cstThisSub) + Set OpenRecordset = Nothing +Const cstNull = -1 + +Dim oObject As Object + Set oObject = Nothing + If IsMissing(pvType) Then + pvType = cstNull + Else + If Not Utils._CheckArgument(pvType, 1, Utils._AddNumeric(), Array(cstNull, dbOpenForwardOnly)) Then Goto Exit_Function + End If + If IsMissing(pvOptions) Then + pvOptions = cstNull + Else + If Not Utils._CheckArgument(pvOptions, 2, Utils._AddNumeric(), Array(cstNull, dbSQLPassThrough)) Then Goto Exit_Function + End If + If IsMissing(pvLockEdit) Then + pvLockEdit = cstNull + Else + If Not Utils._CheckArgument(pvLockEdit, 3, Utils._AddNumeric(), Array(cstNull, dbReadOnly)) Then Goto Exit_Function + End If + If IsMissing(pbClone) Then pbClone = False ' pbClone is a not published argument + + Set oObject = New Recordset + With oObject + ._CommandType = _CommandType + ._Command = _Command + ._ParentName = _Name + ._ParentType = _Type + Set ._ParentDatabase = _ParentDatabase + Set ._This = oObject + ._ForwardOnly = ( pvType = dbOpenForwardOnly ) + ._PassThrough = ( pvOptions = dbSQLPassThrough ) + ._ReadOnly = ( (pvLockEdit = dbReadOnly) Or _ReadOnly ) + Select Case True + Case pbClone : Call ._Initialize(, RowSet) + Case _Filter <> "" : Call ._Initialize(_Filter) + Case Else : Call ._Initialize() + End Select + End With + With _ParentDatabase + .RecordsetMax = .RecordsetMax + 1 + oObject._Name = Format(.RecordsetMax, "0000000") + .RecordsetsColl.Add(oObject, UCase(oObject._Name)) + End With + + If Not ( oObject._BOF And oObject._EOF ) Then oObject.MoveFirst() ' Do nothing if resultset empty + +Exit_Function: + Set OpenRecordset = oObject + Set oObject = Nothing + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + GoTo Exit_Function +End Function ' OpenRecordset + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Const cstThisSub = "Recordset.Properties" + Utils._SetCalledSub(cstThisSub) +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + Set vProperty._ParentDatabase = _ParentDatabase + +Exit_Function: + Set Properties = vProperty + Utils._ResetCalledSub(cstThisSub) + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK +Const cstThisSub = "Recordset.setProperty" + Utils._SetCalledSub(cstThisSub) + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub(cstThisSub) +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Update() As Boolean +' Finalize the updates of the current record + +Const cstThisSub = "Recordset.Update" + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub(cstThisSub) + Update = False + + 'Is updating a row allowed ? + If _ForwardOnly Or _ReadOnly Then Goto Error_NoUpdate + With RowSet + If .rowDeleted() Then Goto Error_RowDeleted + Select Case _EditMode + Case dbEditNone + Goto Trace_Error_Update + Case dbEditAdd + _AppendChunkClose(False) + If .IsNew And .IsModified Then .insertRow() + _BookmarkLastModified = .getBookmark() + If Not IsNull(_BookmarkBeforeNew) Then + Select Case _BookmarkBeforeNew + Case "_BOF_" : .beforeFirst() + Case "_EOF_" : .afterLast() + Case Else : .moveToBookmark(_BookmarkBeforeNew) + End Select + End If + Case dbEditInProgress + _AppendChunkClose(False) + If .IsModified Then + .updateRow() + _BookmarkLastModified = .getBookmark() + End If + End Select + End With + _EditMode = dbEditNone + Update = True + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +Error_NoUpdate: + TraceError(TRACEFATAL, ERRNOTUPDATABLE, Utils._CalledSub(), 0) + Goto Exit_Function +Trace_Error_Update: + TraceError(TRACEFATAL, ERRUPDATESEQUENCE, Utils._CalledSub(), 0, 1) + Goto Exit_Function +Error_RowDeleted: + TraceError(TRACEFATAL, ERRROWDELETED, Utils._CalledSub(), 0) + Goto Exit_Function +End Function ' Update + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _AppendChunk(ByVal psFieldName As String, ByRef pvChunk As Variant, piChunkType) As Boolean +' Write chunk at the end of the file dedicated to the given field + + If _ErrorHandler() Then On Local Error GoTo Error_Function +Dim oFileAccess As Object +Dim i As Integer, oChunk As Object, iChunk As Integer + + ' Do nothing if chunk meaningless + _AppendChunk = False + If IsNull(pvChunk) Then GoTo Exit_Function + If IsArray(pvChunk) Then + If UBound(pvChunk) < LBound(pvChunk) Then GoTo Exit_Function ' Empty array + End If + + ' Find or create relevant chunk entry + iChunk = -1 + For i = 0 To UBound(_ManageChunks) + Set oChunk = _ManageChunks(i) + If oChunk.FieldName = psFieldName Then + iChunk = i + Exit For + End If + Next i + If iChunk = -1 Then + _AppendChunkInit(psFieldName) + iChunk = UBound(_ManageChunks) + End If + + Set oChunk = _ManageChunks(iChunk) + With oChunk + If Not .ChunksRequested Then ' First chunk + .ChunksRequested = True + .ChunkType = piChunkType + .FileName = Utils._GetRandomFileName(_Name) + Set oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") + .FileHandler = oFileAccess.openFileWrite(.FileName) + End If + .FileHandler.writeBytes(pvChunk) + End With + _AppendChunk = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Recordset._AppendChunk", Erl) + GoTo Exit_Function +End Function ' AppendChunk V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _AppendChunkClose(ByVal pbCancel As Boolean) As Boolean +' Stores file content to database field(s) +' Called from Update() [pbCancel = False] or CancelUpdate() [pbCancel = True] + + If _ErrorHandler() Then On Local Error GoTo Error_Function +Dim oFileAccess As Object, oStream As Object, lFileLength As Long, oField As Object +Dim i As Integer, oChunk As Object + + _AppendChunkClose = False + For i = 0 To UBound(_ManageChunks) + Set oChunk = _ManageChunks(i) + With oChunk + If Not .ChunksRequested Then GoTo Exit_Function + If IsNull(.FileHandler) Then GoTo Exit_Function + .Filehandler.closeOutput + Set oFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess") + ' Copy file to field + If Not pbCancel Then + Set oStream = oFileAccess.openFileRead(.FileName) + lFileLength = oStream.getLength() + If lFileLength > 0 Then + Set oField = RowSet.getColumns.getByName(.FieldName) + Select Case .ChunkType + Case vbByte + oField.updateBinaryStream(oStream, lFileLength) +' Case vbString ' DOES NOT WORK FOR CHARACTER TYPES +' oField.updateCharacterStream(oStream, lFileLength) + End Select + End If + oStream.closeInput() + End If + If oFileAccess.exists(.FileName) Then oFileAccess.kill(.FileName) + End With + Next i + Set _ManageChunks = Array() + _AppendChunkClose = True + +Exit_Function: + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "Recordset._AppendChunkClose", Erl) + GoTo Exit_Function +End Function ' AppendChunkClose V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _AppendChunkInit(psFieldName As String) As Boolean +' Initialize chunks manager + +Dim iSize As Integer + iSize = UBound(_ManageChunks) + 1 + ReDim Preserve _ManageChunks(0 To iSize) + Set _ManageChunks(iSize) = New ChunkDescriptor + With _ManageChunks(iSize) + .ChunksRequested = False + .FieldName = psFieldName + .FileName = "" + Set .FileHandler = Nothing + End With + +End Function ' AppendChunkInit V1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _Initialize(ByVal Optional pvFilter As Variant, Optional poRowSet As Object) +' Initialize new recordset + + If _Command = "" Then Exit Sub + + If _ErrorHandler() Then On Local Error Goto Error_Sub + If IsMissing(pvFilter) Then pvFilter = "" + If Not IsMissing(poRowSet) Then ' Clone + Set RowSet = poRowSet.createResultSet() + _IsClone = True + RowSet.last() ' Solves bookmark desynchro when parent bookmark is used ?!? + Else + Set RowSet = CreateUnoService("com.sun.star.sdb.RowSet") + _IsClone = False + With RowSet + If IsNull(.ActiveConnection) Then Set .ActiveConnection = _ParentDatabase.Connection + .CommandType = _CommandType + .Command = _Command + If _ForwardOnly Then .ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY _ + Else .ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE + If _PassThrough Then .EscapeProcessing = False _ + Else .EscapeProcessing = True + If _ReadOnly Then + .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY + .TransactionIsolation = com.sun.star.sdbc.TransactionIsolation.READ_UNCOMMITTED ' Dirty read + Else + .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE + .TransactionIsolation = com.sun.star.sdbc.TransactionIsolation.READ_COMMITTED + End If + End With + + If Not IsMissing(pvFilter) Then ' Filter must be set before execute() + If pvFilter <> "" Then + RowSet.Filter = pvFilter + RowSet.ApplyFilter = True + End If + End If + On Local Error Goto SQL_Error + RowSet.execute() + On Local Error Goto Error_Sub + End If + _DataSet = True +'If the Recordset contains no records, the BOF and EOF properties are True, and there is no current record. + _BOF = ( RowSet.IsRowCountFinal And RowSet.RowCount = 0 ) + _EOF = _BOF + +Exit_Sub: + Exit Sub +SQL_Error: + TraceError(TRACEFATAL, ERRSQLSTATEMENT, Utils._CalledSub(), 0, , _Command) + Goto Exit_Sub +Error_Sub: + TraceError(TRACEABORT, Err, "Recordset._Initialize", Erl) + GoTo Exit_Sub +End Sub ' _Initialize + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _Move(pvTarget As Variant, ByVal Optional pvBookmark As Variant, ByVal Optional pbAbsolute As Boolean) As Boolean +'Move to the first, last, next, or previous record in a specified Recordset object and make that record the current record. + +Dim cstThisSub As String + cstThisSub = "Recordset.Move" & Iif(VarType(pvTarget) = vbString, pvTarget, "") + Utils._SetCalledSub(cstThisSub) + If _ErrorHandler() Then On Local Error Goto Error_Function + + If IsNull(RowSet) Then Goto Trace_Closed + If Not _DataSet Then Goto Trace_NoData + If _BOF And _EOF Then Goto Trace_NoData + _Move = False + CancelUpdate() ' Any Move cancels all updates, even Move(0) ! + +Dim l As Long, lRow As Long + With RowSet + Select Case VarType(pvTarget) + Case vbString + Select Case UCase(pvTarget) + Case "FIRST" + If _ForwardOnly Then + If Not ( .isBeforeFirst() Or .isFirst() ) Then + Goto Trace_Forward + Else + .next() + End If + Else + .first() + End If + Case "LAST" + If _ForwardOnly Then + If .isAfterLast() Then Goto Trace_Forward + Do While Not ( .isRowCountFinal And .Row = .RowCount ) ' isLast() = True after reading of first records chunk + .next() + Loop + Else + .last() + End If + Case "NEXT" + If _EOF Then Goto Trace_OutOfRange + .next() + Case "PREVIOUS" + If _ForwardOnly Then Goto Trace_Forward + If _BOF Then Goto Trace_OutOfRange + .previous() + End Select + Case Else ' Relative or absolute move + If IsMissing(pbAbsolute) Then pbAbsolute = False ' Relative move is default + If _ForwardOnly And pvTarget < 0 then Goto Trace_Forward + If IsMissing(pvBookmark) Then + If pvTarget = 0 Then Goto Exit_Function ' Do nothing + If _ForwardOnly Then + If pbAbsolute Then lRow = .getRow() Else lRow = 0 + For l = 1 To pvTarget - lRow + If .isAfterLast() Then Exit For + .next() + Next l + Else + If pbAbsolute Then .absolute(pvTarget) Else .relative(pvTarget) + End If + Else ' Move is always relative when bookmark argument present + If _ForwardOnly Then Goto Trace_Forward + If pvTarget = 0 Then + .moveToBookmark(pvBookmark) + Else + .moveRelativeToBookmark(pvBookmark, pvTarget) + End If + End If + End Select + + _BOF = .isBeforeFirst() ' https://forum.openoffice.org/en/forum/viewtopic.php?f=47&t=76640 + _EOF = .isAfterlast() + If _BOF Or _EOF Then + _Move = False + Else + If .rowDeleted() Then Goto Error_RowDeleted + If .rowUpdated() Then .refreshRow() + _Move = True + End If + End With + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Exit_Close: ' Force close of recordset when error raised + mClose() + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Close +Trace_Forward: + TraceError(TRACEFATAL, ERRRECORDSETFORWARD, Utils._CalledSub(), 0) + Goto Exit_Close +Trace_NoData: + TraceError(TRACEFATAL, ERRRECORDSETNODATA, Utils._CalledSub(), 0) + Goto Exit_Close +Trace_OutOfRange: + TraceError(TRACEFATAL, ERRRECORDSETRANGE, Utils._CalledSub(), 0) + Goto Exit_Close +Error_RowDeleted: + TraceError(TRACEFATAL, ERRROWDELETED, Utils._CalledSub(), 0) + Goto Exit_Function +Trace_Closed: + TraceError(TRACEFATAL, ERRRECORDSETCLOSED, Utils._CalledSub(), 0) + Goto Exit_Close +End Function ' Move + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + _PropertiesList = Array("AbsolutePosition", "BOF", "Bookmarkable", "Bookmark", "EditMode" _ + , "EOF", "Filter", "LastModified", "Name", "ObjectType" , "RecordCount" _ + ) + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function +Dim cstThisSub As String + cstThisSub = "Recordset.get" + Utils._SetCalledSub(cstThisSub & psProperty) + + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("AbsolutePosition") + If IsNull(RowSet) Then Goto Trace_Closed + With RowSet + Select Case True + Case _BOF And _EOF : _PropertyGet = -1 + Case .isBeforeFirst() Or .isAfterLast() : _PropertyGet = -1 + Case Else : _PropertyGet = .getRow() ' Not getRow() - 1 as MSAccess requires + End Select + End With + Case UCase("BOF") + If IsNull(RowSet) Then Goto Trace_Closed + Select Case True + Case _BOF And _EOF : _PropertyGet = True + Case RowSet.isBeforeFirst() : _PropertyGet = True + Case Else : _PropertyGet = False + End Select + Case UCase("Bookmarkable") + If IsNull(RowSet) Then Goto Trace_Closed + If _ForwardOnly Then _PropertyGet = False Else _PropertyGet = RowSet.IsBookmarkable + Case UCase("Bookmark") + If IsNull(RowSet) Then Goto Trace_Closed + If RowSet.IsBookmarkable And Not _ForwardOnly Then + If _BOF Or _EOF Then _PropertyGet = Null Else _PropertyGet = RowSet.getBookmark() + Else + _PropertyGet = Null + If _ForwardOnly Then Goto Trace_Forward + End If + Case UCase("EditMode") + If IsNull(RowSet) Then Goto Trace_Closed + _PropertyGet = _EditMode + Case UCase("EOF") + If IsNull(RowSet) Then Goto Trace_Closed + Select Case True + Case _BOF And _EOF : _PropertyGet = True + Case RowSet.isAfterLast() : _PropertyGet = True + Case Else : _PropertyGet = False + End Select + Case UCase("Filter") + If IsNull(RowSet) Then Goto Trace_Closed + _PropertyGet = RowSet.Filter + Case UCase("LastModified") + If IsNull(RowSet) Then Goto Trace_Closed + If RowSet.IsBookmarkable And Not _ForwardOnly Then + _PropertyGet = _BookmarkLastModified + Else + _PropertyGet = Null + If _ForwardOnly Then Goto Trace_Forward + End If + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("RecordCount") + If IsNull(RowSet) Then Goto Trace_Closed + _PropertyGet = RowSet.RowCount + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, , psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Forward: + TraceError(TRACEFATAL, ERRRECORDSETFORWARD, Utils._CalledSub(), 0) + Goto Exit_Function +Trace_Closed: + TraceError(TRACEFATAL, ERRRECORDSETCLOSED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub & "._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + +Dim cstThisSub As String + cstThisSub = "Recordset.set" + Utils._SetCalledSub(cstThisSub & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +'Execute +Dim iArgNr As Integer +Dim oObject As Object + + If _IsLeft(_A2B_.CalledSub, "Recordset.") Then iArgNr = 1 Else iArgNr = 2 + Select Case UCase(psProperty) + Case UCase("AbsolutePosition") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + If pvValue < 1 Then Goto Trace_Error_Value + _Move(pvValue, , True) + Case UCase("Bookmark") + If IsNull(RowSet) Then Goto Trace_Closed + _Move(0, pvValue) + Case UCase("Filter") + If IsNull(RowSet) Then Goto Trace_Closed + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + _Filter = _ParentDatabase._ReplaceSquareBrackets(pvValue) + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub(cstThisSub & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Trace_Closed: + TraceError(TRACEFATAL, ERRRECORDSETCLOSED, Utils._CalledSub(), 0) + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, Utils._CalledSub(), Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Root_.xba b/wizards/source/access2base/Root_.xba new file mode 100644 index 000000000..73f743278 --- /dev/null +++ b/wizards/source/access2base/Root_.xba @@ -0,0 +1,311 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Root_" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- FOR INTERNAL USE ONLY --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private ErrorHandler As Boolean +Private MinimalTraceLevel As Integer +Private TraceLogs() As Variant +Private TraceLogCount As Integer +Private TraceLogLast As Integer +Private TraceLogMaxEntries As Integer +Private LastErrorCode As Integer +Private LastErrorLevel As String +Private ErrorText As String +Private ErrorLongText As String +Private CalledSub As String +Private DebugPrintShort As Boolean +Private Introspection As Object ' com.sun.star.beans.Introspection +Private VersionNumber As String ' Actual Access2Base version number +Private Locale As String +Private ExcludeA2B As Boolean +Private TextSearch As Object +Private SearchOptions As Variant +Private FindRecord As Object +Private StatusBar As Object +Private Dialogs As Object ' Collection +Private TempVars As Object ' Collection +Private CurrentDoc() As Variant ' Array of document containers - [0] = Base document, [1 ... N] = other documents +Private PythonCache() As Variant ' Array of objects created in Python scripts + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + VersionNumber = Access2Base_Version + ErrorHandler = True + MinimalTraceLevel = 0 + TraceLogs() = Array() + TraceLogCount = 0 + TraceLogLast = 0 + TraceLogMaxEntries = 0 + LastErrorCode = 0 + LastErrorLevel = "" + ErrorText = "" + ErrorLongText = "" + CalledSub = "" + DebugPrintShort = True + Locale = L10N._GetLocale() + ExcludeA2B = True + Set Introspection = CreateUnoService("com.sun.star.beans.Introspection") + Set TextSearch = CreateUnoService("com.sun.star.util.TextSearch") + SearchOptions = New com.sun.star.util.SearchOptions + With SearchOptions + .algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP + .searchFlag = 0 + .transliterateFlags = com.sun.star.i18n.TransliterationModules.IGNORE_CASE + End With + Set FindRecord = Nothing + Set StatusBar = Nothing + Set Dialogs = New Collection + Set TempVars = New Collection + CurrentDoc = Array() + ReDim CurrentDoc(0 To 0) + Set CurrentDoc(0) = Nothing + PythonCache = Array() +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function AddPython(ByRef pvObject As Variant) As Long +' Store the object as a new entry in PythonCache and return its entry number + +Dim lVars As Long, vObject As Variant + + lVars = UBound(PythonCache) + 1 + ReDim Preserve PythonCache(0 To lVars) + PythonCache(lVars) = pvObject + + AddPython = lVars + +End Function ' AddPython V6.4 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub CloseConnection() +' Close all connections established by current document to free memory. +' - if Base document => close the one concerned database connection +' - if non-Base documents => close the connections of each individual standalone form + +Dim i As Integer, iCurrentDoc As Integer +Dim vDbContainer As Variant, vDbContainers() As Variant, vDocContainer As Variant + + If ErrorHandler Then On Local Error Goto Error_Sub + + If Not IsArray(CurrentDoc) Then Goto Exit_Sub + If UBound(CurrentDoc) < 0 Then Goto Exit_Sub + iCurrentDoc = CurrentDocIndex( , False) ' False prevents error raising if not found + If iCurrentDoc < 0 Then GoTo Exit_Sub ' If not found ignore + + vDocContainer = CurrentDocument(iCurrentDoc) + With vDocContainer + If Not .Active Then GoTo Exit_Sub ' e.g. if multiple calls to CloseConnection() + For i = 0 To UBound(.DbContainers) + If Not IsNull(.DbContainers(i).Database) Then + .DbContainers(i).Database.Dispose() + Set .DbContainers(i).Database = Nothing + End If + TraceLog(TRACEANY, UCase(CalledSub) & " " & .URL & Iif(i = 0, "", " Form=" & .DbContainers(i).FormName), False) + Set .DbContainers(i) = Nothing + Next i + .DbContainers = Array() + .URL = "" + .DbConnect = 0 + .Active = False + Set .Document = Nothing + End With + CurrentDoc(iCurrentDoc) = vDocContainer + +Exit_Sub: + Exit Sub +Error_Sub: + TraceError(TRACEABORT, Err, CalledSub, Erl, False) ' No error message addressed to the user, only stored in console + GoTo Exit_Sub +End Sub ' CloseConnection + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentDb() As Object +' Returns _A2B_.CurrentDocument().Database as an object to allow access to its properties + +Dim iCurrentDoc As Integer + + Set CurrentDb = Nothing + + If Not IsArray(CurrentDoc) Then Goto Exit_Function + If UBound(CurrentDoc) < 0 Then Goto Exit_Function + iCurrentDoc = CurrentDocIndex(, False) ' False = no abort + If iCurrentDoc >= 0 Then + If UBound(CurrentDoc(iCurrentDoc).DbContainers) >= 0 Then Set CurrentDb = CurrentDoc(iCurrentDoc).DbContainers(0).Database + End If + +Exit_Function: + Exit Function +End Function ' CurrentDb + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentDocIndex(Optional pvURL As Variant, Optional pbAbort As Variant) As Integer +' Returns the entry in CurrentDoc(...) referring to the current document + +Dim i As Integer, bFound As Boolean, sURL As String +Const cstBase = "com.sun.star.comp.dba.ODatabaseDocument" + + bFound = False + CurrentDocIndex = -1 + + If Not IsArray(CurrentDoc) Then Goto Trace_Error + If UBound(CurrentDoc) < 0 Then Goto Trace_Error + For i = 1 To UBound(CurrentDoc) ' [0] reserved to database .odb document + If IsMissing(pvURL) Then ' Not on 1 single line ?!? + If Utils._hasUNOProperty(ThisComponent, "URL") Then + sURL = ThisComponent.URL + Else + Exit For ' f.i. ThisComponent = Basic IDE ... + End If + Else + sURL = pvURL ' To support the SelectObject action + End If + If CurrentDoc(i).Active And CurrentDoc(i).URL = sURL Then + CurrentDocIndex = i + bFound = True + Exit For + End If + Next i + + If Not bFound Then + If IsNull(CurrentDoc(0)) Then GoTo Trace_Error + With CurrentDoc(0) + If Not .Active Then GoTo Trace_Error + If IsNull(.Document) Then GoTo Trace_Error + End With + CurrentDocIndex = 0 + End If + +Exit_Function: + Exit Function +Trace_Error: + If IsMissing(pbAbort) Then pbAbort = True + If pbAbort Then TraceError(TRACEABORT, ERRDBNOTCONNECTED, Utils._CalledSub(), 0, 1) Else CurrentDocIndex = -1 + Goto Exit_Function +End Function ' CurrentDocIndex + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function CurrentDocument(ByVal Optional piDocIndex As Integer) As Variant +' Returns the CurrentDoc(...) referring to the current document or to the argument + +Dim iDocIndex As Integer + If IsMissing(piDocIndex) Then iDocIndex = CurrentDocIndex(, False) Else iDocIndex = piDocIndex + If iDocIndex >= 0 And iDocIndex <= UBound(CurrentDoc) Then Set CurrentDocument = CurrentDoc(iDocIndex) Else Set CurrentDocument = Nothing + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dump() +' For debugging purposes +Dim i As Integer, j As Integer, vCurrentDoc As Variant + On Local Error Resume Next + + DebugPrint "Version", VersionNumber + DebugPrint "TraceLevel", MinimalTraceLevel + DebugPrint "TraceCount", TraceLogCount + DebugPrint "CalledSub", CalledSub + If IsArray(CurrentDoc) Then + For i = 0 To UBound(CurrentDoc) + vCurrentDoc = CurrentDoc(i) + If Not IsNull(vCurrentDoc) Then + DebugPrint i, "URL", vCurrentDoc.URL + For j = 0 To UBound(vCurrentDoc.DbContainers) + DebugPrint i, j, "Form", vCurrentDoc.DbContainers(j).FormName + DebugPrint i, j, "Database", vCurrentDoc.DbContainers(j).Database.Title + Next j + End If + Next i + End If + +End Sub + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasItem(psCollType As String, ByVal psName As String) As Boolean +' Return True if psName if in the collection + +Dim oItem As Object + On Local Error Goto Error_Function ' Whatever ErrorHandler ! + + hasItem = True + Select Case psCollType + Case COLLALLDIALOGS + Set oItem = Dialogs.Item(UCase(psName)) + Case COLLTEMPVARS + Set oItem = TempVars.Item(UCase(psName)) + Case Else + hasItem = False + End Select + +Exit_Function: + Exit Function +Error_Function: ' Item by key aborted + hasItem = False + GoTo Exit_Function +End Function ' hasItem + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CurrentDb(ByVal Optional piDocEntry As Integer, ByVal Optional piDbEntry As Integer) As Variant +REM Without arguments same as CurrentDb() except that it generates an error if database not connected (internal use) +REM With 2 arguments return the corresponding entry in Root + +Dim odbDatabase As Variant + If IsMissing(piDocEntry) Then + Set odbDatabase = CurrentDb() + Else + If Not IsArray(CurrentDoc) Then Goto Trace_Error + If piDocEntry < 0 Or piDbEntry < 0 Then Goto Trace_Error + If piDocEntry > UBound(CurrentDoc) Then Goto Trace_Error + If piDbEntry > UBound(CurrentDoc(piDocEntry).DbContainers) Then Goto Trace_Error + Set odbDatabase = CurrentDoc(piDocEntry).DbContainers(piDbEntry).Database + End If + If IsNull(odbDatabase) Then GoTo Trace_Error + +Exit_Function: + Set _CurrentDb = odbDatabase + Exit Function +Trace_Error: + TraceError(TRACEABORT, ERRDBNOTCONNECTED, Utils._CalledSub(), 0, 1) + Goto Exit_Function +End Function ' _CurrentDb + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/SubForm.xba b/wizards/source/access2base/SubForm.xba new file mode 100644 index 000000000..d905a9836 --- /dev/null +++ b/wizards/source/access2base/SubForm.xba @@ -0,0 +1,757 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="SubForm" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be SUBFORM +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Shortcut As String +Private _Name As String +Private _MainForm As String +Private _DocEntry As Integer +Private _DbEntry As Integer +Private _OrderBy As String +Public ParentComponent As Object ' com.sun.star.text.TextDocument +Public DatabaseForm As Object ' com.sun.star.form.component.DataForm and com.sun.star.sdb.ResultSet (a.o.) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJSUBFORM + Set _This = Nothing + Set _Parent = Nothing + _Shortcut = "" + _Name = "" + _MainForm = "" + _DocEntry = -1 + _DbEntry = -1 + _OrderBy = "" + Set ParentComponent = Nothing + Set DatabaseForm = Nothing +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowAdditions() As Variant + AllowAdditions = _PropertyGet("AllowAdditions") +End Property ' AllowAdditions (get) + +Property Let AllowAdditions(ByVal pvValue As Variant) + Call _PropertySet("AllowAdditions", pvValue) +End Property ' AllowAdditions (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowDeletions() As Variant + AllowDeletions = _PropertyGet("AllowDeletions") +End Property ' AllowDeletions (get) + +Property Let AllowDeletions(ByVal pvValue As Variant) + Call _PropertySet("AllowDeletions", pvValue) +End Property ' AllowDeletions (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get AllowEdits() As Variant + AllowEdits = _PropertyGet("AllowEdits") +End Property ' AllowEdits (get) + +Property Let AllowEdits(ByVal pvValue As Variant) + Call _PropertySet("AllowEdits", pvValue) +End Property ' AllowEdits (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get CurrentRecord() As Variant + CurrentRecord = _PropertyGet("CurrentRecord") +End Property ' CurrentRecord (get) + +Property Let CurrentRecord(ByVal pvValue As Variant) + Call _PropertySet("CurrentRecord", pvValue) +End Property ' CurrentRecord (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Filter() As Variant + Filter = _PropertyGet("Filter") +End Property ' Filter (get) + +Property Let Filter(ByVal pvValue As Variant) + Call _PropertySet("Filter", pvValue) +End Property ' Filter (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get FilterOn() As Variant + FilterOn = _PropertyGet("FilterOn") +End Property ' FilterOn (get) + +Property Let FilterOn(ByVal pvValue As Variant) + Call _PropertySet("FilterOn", pvValue) +End Property ' FilterOn (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get LinkChildFields(ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvIndex) Then LinkChildFields = _PropertyGet("LinkChildFields") Else LinkChildFields = _PropertyGet("LinkChildFields", pvIndex) +End Property ' LinkChildFields (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get LinkMasterFields(ByVal Optional pvIndex As Variant) As Variant + If IsMissing(pvIndex) Then LinkMasterFields = _PropertyGet("LinkMasterFields") Else LinkMasterFields = _PropertyGet("LinkMasterFields", pvIndex) +End Property ' LinkMasterFields (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +Public Function pName() As String ' For compatibility with < V0.9.0 + pName = _PropertyGet("Name") +End Function ' pName (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveCursorMove() As Variant + OnApproveCursorMove = _PropertyGet("OnApproveCursorMove") +End Property ' OnApproveCursorMove (get) + +Property Let OnApproveCursorMove(ByVal pvValue As Variant) + Call _PropertySet("OnApproveCursorMove", pvValue) +End Property ' OnApproveCursorMove (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveParameter() As Variant + OnApproveParameter = _PropertyGet("OnApproveParameter") +End Property ' OnApproveParameter (get) + +Property Let OnApproveParameter(ByVal pvValue As Variant) + Call _PropertySet("OnApproveParameter", pvValue) +End Property ' OnApproveParameter (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveReset() As Variant + OnApproveReset = _PropertyGet("OnApproveReset") +End Property ' OnApproveReset (get) + +Property Let OnApproveReset(ByVal pvValue As Variant) + Call _PropertySet("OnApproveReset", pvValue) +End Property ' OnApproveReset (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveRowChange() As Variant + OnApproveRowChange = _PropertyGet("OnApproveRowChange") +End Property ' OnApproveRowChange (get) + +Property Let OnApproveRowChange(ByVal pvValue As Variant) + Call _PropertySet("OnApproveRowChange", pvValue) +End Property ' OnApproveRowChange (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnApproveSubmit() As Variant + OnApproveSubmit = _PropertyGet("OnApproveSubmit") +End Property ' OnApproveSubmit (get) + +Property Let OnApproveSubmit(ByVal pvValue As Variant) + Call _PropertySet("OnApproveSubmit", pvValue) +End Property ' OnApproveSubmit (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnConfirmDelete() As Variant + OnConfirmDelete = _PropertyGet("OnConfirmDelete") +End Property ' OnConfirmDelete (get) + +Property Let OnConfirmDelete(ByVal pvValue As Variant) + Call _PropertySet("OnConfirmDelete", pvValue) +End Property ' OnConfirmDelete (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnCursorMoved() As Variant + OnCursorMoved = _PropertyGet("OnCursorMoved") +End Property ' OnCursorMoved (get) + +Property Let OnCursorMoved(ByVal pvValue As Variant) + Call _PropertySet("OnCursorMoved", pvValue) +End Property ' OnCursorMoved (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnErrorOccurred() As Variant + OnErrorOccurred = _PropertyGet("OnErrorOccurred") +End Property ' OnErrorOccurred (get) + +Property Let OnErrorOccurred(ByVal pvValue As Variant) + Call _PropertySet("OnErrorOccurred", pvValue) +End Property ' OnErrorOccurred (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnLoaded() As Variant + OnLoaded = _PropertyGet("OnLoaded") +End Property ' OnLoaded (get) + +Property Let OnLoaded(ByVal pvValue As Variant) + Call _PropertySet("OnLoaded", pvValue) +End Property ' OnLoaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnReloaded() As Variant + OnReloaded = _PropertyGet("OnReloaded") +End Property ' OnReloaded (get) + +Property Let OnReloaded(ByVal pvValue As Variant) + Call _PropertySet("OnReloaded", pvValue) +End Property ' OnReloaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnReloading() As Variant + OnReloading = _PropertyGet("OnReloading") +End Property ' OnReloading (get) + +Property Let OnReloading(ByVal pvValue As Variant) + Call _PropertySet("OnReloading", pvValue) +End Property ' OnReloading (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnResetted() As Variant + OnResetted = _PropertyGet("OnResetted") +End Property ' OnResetted (get) + +Property Let OnResetted(ByVal pvValue As Variant) + Call _PropertySet("OnResetted", pvValue) +End Property ' OnResetted (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnRowChanged() As Variant + OnRowChanged = _PropertyGet("OnRowChanged") +End Property ' OnRowChanged (get) + +Property Let OnRowChanged(ByVal pvValue As Variant) + Call _PropertySet("OnRowChanged", pvValue) +End Property ' OnRowChanged (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnloaded() As Variant + OnUnloaded = _PropertyGet("OnUnloaded") +End Property ' OnUnloaded (get) + +Property Let OnUnloaded(ByVal pvValue As Variant) + Call _PropertySet("OnUnloaded", pvValue) +End Property ' OnUnloaded (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OnUnloading() As Variant + OnUnloading = _PropertyGet("OnUnloading") +End Property ' OnUnloading (get) + +Property Let OnUnloading(ByVal pvValue As Variant) + Call _PropertySet("OnUnloading", pvValue) +End Property ' OnUnloading (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function OptionGroup(ByVal Optional pvGroupName As Variant) As Variant +' Return either an error or an object of type OPTIONGROUP based on its name + +Const cstThisSub = "SubForm.OptionGroup" +Dim ogGroup As Object + Utils._SetCalledSub(cstThisSub) + If IsMissing(pvGroupName) Then Call _TraceArguments() + If _ErrorHandler() Then On Local Error Goto Error_Function + + Set ogGroup = _OptionGroup(pvGroupName, CTLPARENTISSUBFORM, ParentComponent, DatabaseForm) + If Not IsNull(ogGroup) Then + ogGroup._DocEntry = _DocEntry + ogGroup._DbEntry = _DbEntry + End If + Set OptionGroup = ogGroup + +Exit_Function: + Utils._ResetCalledSub(cstThisSub) + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, cstThisSub, Erl) + GoTo Exit_Function +End Function ' OptionGroup V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OrderBy() As Variant + OrderBy = _PropertyGet("OrderBy") +End Property ' OrderBy (get) V1.2.0 + +Property Let OrderBy(ByVal pvValue As Variant) + Call _PropertySet("OrderBy", pvValue) +End Property ' OrderBy (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get OrderByOn() As Variant + OrderByOn = _PropertyGet("OrderByOn") +End Property ' OrderByOn (get) V1.2.0 + +Property Let OrderByOn(ByVal pvValue As Variant) + Call _PropertySet("OrderByOn", pvValue) +End Property ' OrderByOn (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Parent() As Object + + Utils._SetCalledSub("SubForm.getParent") + On Error Goto Error_Function + + Set Parent = _Parent + +Exit_Function: + Utils._ResetCalledSub("SubForm.getParent") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm.getParent", Erl) + Set Parent = Nothing + GoTo Exit_Function +End Function ' Parent + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Recordset() As Object + Recordset = _PropertyGet("Recordset") +End Property ' Recordset (get) V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get RecordSource() As Variant + RecordSource = _PropertyGet("RecordSource") +End Property ' RecordSource (get) + +Property Let RecordSource(ByVal pvValue As Variant) + Call _PropertySet("RecordSource", pvValue) +End Property ' RecordSource (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Controls(Optional ByVal pvIndex As Variant) As Variant +' Return a Control object with name or index = pvIndex + +If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("SubForm.Controls") + +Dim ocControl As Variant, sParentShortcut As String, iControlCount As Integer +Dim oCounter As Variant, sControls() As Variant, i As Integer, bFound As Boolean, sIndex As String +Dim j As Integer + + Set ocControl = Nothing + iControlCount = DatabaseForm.getCount() + + If IsMissing(pvIndex) Then ' No argument, return Collection pseudo-object + Set oCounter = New Collect + Set oCounter._This = oCounter + oCounter._CollType = COLLCONTROLS + oCounter._Parent = _This + oCounter._Count = iControlCount + Set Controls = oCounter + Goto Exit_Function + End If + + If Not Utils._CheckArgument(pvIndex, 1, Utils._AddNumeric(vbString)) Then Goto Exit_Function + + ' Start building the ocControl object + ' Determine exact name + Set ocControl = New Control + Set ocControl._This = ocControl + Set ocControl._Parent = _This + ocControl._ParentType = CTLPARENTISSUBFORM + sParentShortcut = _Shortcut + sControls() = DatabaseForm.getElementNames() + + Select Case VarType(pvIndex) + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + If pvIndex < 0 Or pvIndex > iControlCount - 1 Then Goto Trace_Error_Index + ocControl._Name = sControls(pvIndex) + Case vbString ' Check control name validity (non case sensitive) + bFound = False + sIndex = UCase(Utils._Trim(pvIndex)) + For i = 0 To iControlCount - 1 + If UCase(sControls(i)) = sIndex Then + bFound = True + Exit For + End If + Next i + If bFound Then ocControl._Name = sControls(i) Else Goto Trace_NotFound + End Select + + With ocControl + ._Shortcut = sParentShortcut & "!" & Utils._Surround(._Name) + Set .ControlModel = DatabaseForm.getByName(._Name) + ._ImplementationName = .ControlModel.getImplementationName() + ._FormComponent = ParentComponent + If Utils._hasUNOProperty(.ControlModel, "ClassId") Then ._ClassId = .ControlModel.ClassId + If ._ClassId > 0 And ._ClassId <> acHiddenControl Then + Set .ControlView = ParentComponent.CurrentController.getControl(.ControlModel) + End If + + ._Initialize() + ._DocEntry = _DocEntry + ._DbEntry = _DbEntry + End With + Set Controls = ocControl + +Exit_Function: + Utils._ResetCalledSub("SubForm.Controls") + Exit Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRCOLLECTION, Utils._CalledSub(), 0, 1) + Set Controls = Nothing + Goto Exit_Function +Trace_NotFound: + TraceError(TRACEFATAL, ERRCONTROLNOTFOUND, Utils._CalledSub(), 0, , Array(pvIndex, _Name)) + Set Controls = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm.Controls", Erl) + Set Controls = Nothing + GoTo Exit_Function +End Function ' Controls V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("SubForm.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("SubForm.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Refresh() As Boolean +' Refresh data with its most recent value in the database in a form or subform + Utils._SetCalledSub("SubForm.Refresh") + If _ErrorHandler() Then On Local Error Goto Error_Function + Refresh = False + +Dim oSet As Object + Set oSet = DatabaseForm.createResultSet() + If Not IsNull(oSet) Then + oSet.refreshRow() + Refresh = True + End If + +Exit_Function: + Set oSet = Nothing + Utils._ResetCalledSub("SubForm.Refresh") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm.Refresh", Erl) + GoTo Exit_Function +End Function ' Refresh + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Requery() As Boolean +' Refresh data displayed in a form, subform, combobox or listbox + Utils._SetCalledSub("SubForm.Requery") + If _ErrorHandler() Then On Local Error Goto Error_Function + Requery = False + + DatabaseForm.reload() + Requery = True + +Exit_Function: + Utils._ResetCalledSub("SubForm.Requery") + Exit Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm.Requery", Erl) + GoTo Exit_Function +End Function ' Requery + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("SubForm.setProperty") + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub("SubForm.setProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private Function _GetListener(ByVal psProperty As String) As String +' Return the X...Listener corresponding with the property in argument + + Select Case UCase(psProperty) + Case UCase("OnApproveCursorMove") + _GetListener = "XRowSetApproveListener" + Case UCase("OnApproveParameter") + _GetListener = "XDatabaseParameterListener" + Case UCase("OnApproveReset"), UCase("OnResetted") + _GetListener = "XResetListener" + Case UCase("OnApproveRowChange") + _GetListener = "XRowSetApproveListener" + Case UCase("OnApproveSubmit") + _GetListener = "XSubmitListener" + Case UCase("OnConfirmDelete") + _GetListener = "XConfirmDeleteListener" + Case UCase("OnCursorMoved"), UCase("OnRowChanged") + _GetListener = "XRowSetListener" + Case UCase("OnErrorOccurred") + _GetListener = "XSQLErrorListener" + Case UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnUnloaded"), UCase("OnUnloading") + _GetListener = "XLoadListener" + End Select + +End Function ' _GetListener V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + + _PropertiesList = Array("AllowAdditions", "AllowDeletions", "AllowEdits", "CurrentRecord" _ + , "Filter", "FilterOn", "LinkChildFields", "LinkMasterFields", "Name" _ + , "ObjectType", "OnApproveCursorMove", "OnApproveParameter" _ + , "OnApproveReset", "OnApproveRowChange", "OnApproveSubmit", "OnConfirmDelete" _ + , "OnCursorMoved", "OnErrorOccurred", "OnLoaded", "OnReloaded", "OnReloading" _ + , "OnResetted", "OnRowChanged", "OnUnloaded", "OnUnloading", "OrderBy" _ + , "OrderByOn", "Parent", "RecordSource" _ + ) ' Recordset removed + +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String, ByVal Optional pvIndex As Variant) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("SubForm.get" & psProperty) +Dim iArgNr As Integer + If Not IsMissing(pvIndex) Then + Select Case UCase(_A2B_.CalledSub) + Case UCase("getProperty") : iArgNr = 3 + Case UCase("SubForm.getProperty") : iArgNr = 2 + Case UCase("SubForm.get" & psProperty) : iArgNr = 1 + End Select + If Not Utils._CheckArgument(pvIndex, iArgNr, Utils._AddNumeric()) Then Goto Exit_Function + End If + +'Execute +Dim oDatabase As Object, vBookmark As Variant, oObject As Object + _PropertyGet = EMPTY + + Select Case UCase(psProperty) + Case UCase("AllowAdditions") + _PropertyGet = DatabaseForm.AllowInserts + Case UCase("AllowDeletions") + _PropertyGet = DatabaseForm.AllowDeletes + Case UCase("AllowEdits") + _PropertyGet = DatabaseForm.AllowUpdates + Case UCase("CurrentRecord") + _PropertyGet = DatabaseForm.Row + Case UCase("Filter") + _PropertyGet = DatabaseForm.Filter + Case UCase("FilterOn") + _PropertyGet = DatabaseForm.ApplyFilter + Case UCase("LinkChildFields") + If Utils._hasUNOProperty(DatabaseForm, "DetailFields") Then + If IsMissing(pvIndex) Then + _PropertyGet = DatabaseForm.DetailFields + Else + If pvIndex < 0 Or pvIndex > UBound(DatabaseForm.DetailFields) Then Goto trace_Error_Index + _PropertyGet = DatabaseForm.DetailFields(pvIndex) + End If + End If + Case UCase("LinkMasterFields") + If Utils._hasUNOProperty(DatabaseForm, "MasterFields") Then + If IsMissing(pvIndex) Then + _PropertyGet = DatabaseForm.MasterFields + Else + If pvIndex < 0 Or pvIndex > UBound(DatabaseForm.MasterFields) Then Goto trace_Error_Index + _PropertyGet = DatabaseForm.MasterFields(pvIndex) + End If + End If + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("OnApproveCursorMove"), UCase("OnApproveParameter"), UCase("OnApproveReset"), UCase("OnApproveRowChange") _ + , UCase("OnApproveSubmit"), UCase("OnConfirmDelete"), UCase("OnCursorMoved"), UCase("OnErrorOccurred") _ + , UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnResetted"), UCase("OnRowChanged") _ + , UCase("OnUnloaded"), UCase("OnUnloading") + _PropertyGet = Utils._GetEventScriptCode(DatabaseForm, psProperty, _Name) + Case UCase("OrderBy") + _PropertyGet = _OrderBy + Case UCase("OrderByOn") + If DatabaseForm.Order = "" Then _PropertyGet = False Else _PropertyGet = True + Case UCase("Parent") ' Only for indirect access from property object + _PropertyGet = Parent + Case UCase("Recordset") + If DatabaseForm.Command = "" Then Goto Trace_Error ' No underlying data ?? + Set oObject = New Recordset + With DatabaseForm + Set oObject._This = oObject + oObject._CommandType = .CommandType + oObject._Command = .Command + oObject._ParentName = _Name + oObject._ParentType = _Type + Set oDatabase = Application._CurrentDb(_DocEntry, _DbEntry) + Set oObject._ParentDatabase = oDatabase + Set oObject._ParentDatabase.Connection = .ActiveConnection + oObject._ForwardOnly = ( .ResultSetType = com.sun.star.sdbc.ResultSetType.FORWARD_ONLY ) + oObject._PassThrough = ( .EscapeProcessing = False ) + oObject._ReadOnly = ( .ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.READ_ONLY ) + Call oObject._Initialize() + End With + With oDatabase + .RecordsetMax = .RecordsetMax + 1 + oObject._Name = Format(.RecordsetMax, "0000000") + .RecordsetsColl.Add(oObject, UCase(oObject._Name)) + End With + Set _PropertyGet = oObject + Case UCase("RecordSource") + _PropertyGet = DatabaseForm.Command + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("SubForm.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEWARNING, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Trace_Error_Index: + TraceError(TRACEFATAL, ERRINDEXVALUE, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = EMPTY + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm._PropertyGet", Erl) + _PropertyGet = EMPTY + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + + Utils._SetCalledSub("SubForm.set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +'Execute +Dim iArgNr As Integer + + If _IsLeft(_A2B_.CalledSub, "SubForm.") Then iArgNr = 1 Else iArgNr = 2 + Select Case UCase(psProperty) + Case UCase("AllowAdditions") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + DatabaseForm.AllowInserts = pvValue + DatabaseForm.reload() + Case UCase("AllowDeletions") + If Not Utils._CheckArgument(pvValue,iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + DatabaseForm.AllowDeletes = pvValue + DatabaseForm.reload() + Case UCase("AllowEdits") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + DatabaseForm.AllowUpdates = pvValue + DatabaseForm.reload() + Case UCase("CurrentRecord") + If Not Utils._CheckArgument(pvValue, iArgNr, Utils._AddNumeric(), , False) Then Goto Trace_Error_Value + DatabaseForm.absolute(pvValue) + Case UCase("Filter") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + DatabaseForm.Filter = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + Case UCase("FilterOn") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + DatabaseForm.ApplyFilter = pvValue + DatabaseForm.reload() + Case UCase("OnApproveCursorMove"), UCase("OnApproveParameter"), UCase("OnApproveReset"), UCase("OnApproveRowChange") _ + , UCase("OnApproveSubmit"), UCase("OnConfirmDelete"), UCase("OnCursorMoved"), UCase("OnErrorOccurred") _ + , UCase("OnLoaded"), UCase("OnReloaded"), UCase("OnReloading"), UCase("OnResetted"), UCase("OnRowChanged") _ + , UCase("OnUnloaded"), UCase("OnUnloading") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + If Not Utils._RegisterEventScript(DatabaseForm _ + , psProperty _ + , _GetListener(psProperty) _ + , pvValue, _Name _ + ) Then GoTo Trace_Error + Case UCase("OrderBy") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + _OrderBy = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + Case UCase("OrderByOn") + If Not Utils._CheckArgument(pvValue, iArgNr, vbBoolean, , False) Then Goto Trace_Error_Value + If pvValue Then DatabaseForm.Order = _OrderBy Else DatabaseForm.Order = "" + DatabaseForm.reload() + Case UCase("RecordSource") + If Not Utils._CheckArgument(pvValue, iArgNr, vbString, , False) Then Goto Trace_Error_Value + DatabaseForm.Command = Application._CurrentDb(_DocEntry, _DbEntry)._ReplaceSquareBrackets(pvValue) + DatabaseForm.CommandType = com.sun.star.sdb.CommandType.COMMAND + DatabaseForm.Filter = "" + DatabaseForm.reload() + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("SubForm.set" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "SubForm._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/TempVar.xba b/wizards/source/access2base/TempVar.xba new file mode 100644 index 000000000..d600de3b2 --- /dev/null +++ b/wizards/source/access2base/TempVar.xba @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TempVar" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Compatible +Option ClassModule + +Option Explicit + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS ROOT FIELDS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private _Type As String ' Must be TEMPVAR +Private _This As Object ' Workaround for absence of This builtin function +Private _Parent As Object +Private _Name As String +Private _Value As Variant + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CONSTRUCTORS / DESTRUCTORS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Initialize() + _Type = OBJTEMPVAR + Set _This = Nothing + Set _Parent = Nothing + _Name = "" + _Value = Null +End Sub ' Constructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Sub Class_Terminate() + On Local Error Resume Next + Call Class_Initialize() +End Sub ' Destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub Dispose() + Call Class_Terminate() +End Sub ' Explicit destructor + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS GET/LET/SET PROPERTIES --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Property Get Name() As String + Name = _PropertyGet("Name") +End Property ' Name (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get ObjectType() As String + ObjectType = _PropertyGet("ObjectType") +End Property ' ObjectType (get) + +REM ----------------------------------------------------------------------------------------------------------------------- +Property Get Value() As Variant + Value = _PropertyGet("Value") +End Property ' Value (get) + +Property Let Value(ByVal pvValue As Variant) + Call _PropertySet("Value", pvValue) +End Property ' Value (set) + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- CLASS METHODS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function getProperty(Optional ByVal pvProperty As Variant) As Variant +' Return property value of psProperty property name + + Utils._SetCalledSub("TempVar.getProperty") + If IsMissing(pvProperty) Then Call _TraceArguments() + getProperty = _PropertyGet(pvProperty) + Utils._ResetCalledSub("TempVar.getProperty") + +End Function ' getProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function hasProperty(ByVal Optional pvProperty As Variant) As Boolean +' Return True if object has a valid property called pvProperty (case-insensitive comparison !) + + If IsMissing(pvProperty) Then hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList()) Else hasProperty = PropertiesGet._hasProperty(_Type, _PropertiesList(), pvProperty) + Exit Function + +End Function ' hasProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function Properties(ByVal Optional pvIndex As Variant) As Variant +' Return +' a Collection object if pvIndex absent +' a Property object otherwise + +Dim vProperty As Variant, vPropertiesList() As Variant, sObject As String + vPropertiesList = _PropertiesList() + sObject = Utils._PCase(_Type) + If IsMissing(pvIndex) Then + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList) + Else + vProperty = PropertiesGet._Properties(sObject, _This, vPropertiesList, pvIndex) + vProperty._Value = _PropertyGet(vPropertiesList(pvIndex)) + End If + +Exit_Function: + Set Properties = vProperty + Exit Function +End Function ' Properties + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function setProperty(ByVal Optional psProperty As String, ByVal Optional pvValue As Variant) As Boolean +' Return True if property setting OK + Utils._SetCalledSub("TempVar.getProperty") + setProperty = _PropertySet(psProperty, pvValue) + Utils._ResetCalledSub("TempVar.getProperty") +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertiesList() As Variant + _PropertiesList = Array("Name", "ObjectType", "Value") +End Function ' _PropertiesList + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertyGet(ByVal psProperty As String) As Variant +' Return property value of the psProperty property name + + If _ErrorHandler() Then On Local Error Goto Error_Function + Utils._SetCalledSub("TempVar.get" & psProperty) + _PropertyGet = Nothing + + Select Case UCase(psProperty) + Case UCase("Name") + _PropertyGet = _Name + Case UCase("ObjectType") + _PropertyGet = _Type + Case UCase("Value") + _PropertyGet = _Value + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("TempVar.get" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertyGet = Nothing + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "TempVar._PropertyGet", Erl) + _PropertyGet = Nothing + GoTo Exit_Function +End Function ' _PropertyGet + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PropertySet(ByVal psProperty As String, ByVal pvValue As Variant) As Boolean + + Utils._SetCalledSub("TempVar.set" & psProperty) + If _ErrorHandler() Then On Local Error Goto Error_Function + _PropertySet = True + +'Execute +Dim iArgNr As Integer + + If _IsLeft(_A2B_.CalledSub, "TempVar.") Then iArgNr = 1 Else iArgNr = 2 + Select Case UCase(psProperty) + Case UCase("Value") + _Value = pvValue + _A2B_.TempVars.Item(UCase(_Name)).Value = pvValue + Case Else + Goto Trace_Error + End Select + +Exit_Function: + Utils._ResetCalledSub("TempVar.set" & psProperty) + Exit Function +Trace_Error: + TraceError(TRACEFATAL, ERRPROPERTY, Utils._CalledSub(), 0, 1, psProperty) + _PropertySet = False + Goto Exit_Function +Trace_Error_Value: + TraceError(TRACEFATAL, ERRPROPERTYVALUE, Utils._CalledSub(), 0, 1, Array(pvValue, psProperty)) + _PropertySet = False + Goto Exit_Function +Error_Function: + TraceError(TRACEABORT, Err, "TempVar._PropertySet", Erl) + _PropertySet = False + GoTo Exit_Function +End Function ' _PropertySet + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Test.xba b/wizards/source/access2base/Test.xba new file mode 100644 index 000000000..7ad95904e --- /dev/null +++ b/wizards/source/access2base/Test.xba @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Test" script:language="StarBasic">Option Explicit +'Option Compatible + +Sub Main +Dim a, b() + _ErrorHandler(False) +' DebugPrint vbLF +' TraceConsole() + exit sub +End Sub + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Trace.xba b/wizards/source/access2base/Trace.xba new file mode 100644 index 000000000..220f1f623 --- /dev/null +++ b/wizards/source/access2base/Trace.xba @@ -0,0 +1,432 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Trace" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +Public Const cstLogMaxEntries = 99 + +REM Typical Usage +REM TraceLog("INFO", "The OK button was pressed") +REM +REM Typical Usage for error logging +REM Sub MySub() +REM On Local Error GoTo Error_Sub +REM ... +REM Exit_Sub: +REM Exit Sub +REM Error_Sub: +REM TraceError("ERROR", Err, "MySub", Erl) +REM GoTo Exit_Sub +REM End Sub +REM +REM To display the current logged traces and/or to set parameters +REM TraceConsole() + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub TraceConsole() +' Display the Trace dialog with current trace log values and parameter choices + If _ErrorHandler() Then On Local Error Goto Error_Sub + +Dim sLineBreak As String, oTraceDialog As Object + sLineBreak = vbNewLine + + Set oTraceDialog = CreateUnoDialog(Utils._GetDialogLib().dlgTrace) + oTraceDialog.Title = _GetLabel("DLGTRACE_TITLE") + oTraceDialog.Model.HelpText = _GetLabel("DLGTRACE_HELP") + +Dim oEntries As Object, oTraceLog As Object, oClear As Object, oMinLevel As Object, oNbEntries As Object, oDump As Object +Dim oControl As Object +Dim i As Integer, sText As String, iOKCancel As Integer + + Set oNbEntries = oTraceDialog.Model.getByName("numNbEntries") + oNbEntries.Value = _A2B_.TraceLogCount + oNbEntries.HelpText = _GetLabel("DLGTRACE_LBLNBENTRIES_HELP") + + Set oControl = oTraceDialog.Model.getByName("lblNbEntries") + oControl.Label = _GetLabel("DLGTRACE_LBLNBENTRIES_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_LBLNBENTRIES_HELP") + + Set oEntries = oTraceDialog.Model.getByName("numEntries") + If _A2B_.TraceLogMaxEntries = 0 Then _A2B_.TraceLogMaxEntries = cstLogMaxEntries + oEntries.Value = _A2B_.TraceLogMaxEntries + oEntries.HelpText = _GetLabel("DLGTRACE_LBLENTRIES_HELP") + + Set oControl = oTraceDialog.Model.getByName("lblEntries") + oControl.Label = _GetLabel("DLGTRACE_LBLENTRIES_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_LBLENTRIES_HELP") + + Set oDump = oTraceDialog.Model.getByName("cmdDump") + oDump.Enabled = 0 + oDump.Label = _GetLabel("DLGTRACE_CMDDUMP_LABEL") + oDump.HelpText = _GetLabel("DLGTRACE_CMDDUMP_HELP") + + Set oTraceLog = oTraceDialog.Model.getByName("txtTraceLog") + oTraceLog.HelpText = _GetLabel("DLGTRACE_TXTTRACELOG_HELP") + If UBound(_A2B_.TraceLogs) >= 0 Then ' Array yet initialized + oTraceLog.HardLineBreaks = True + sText = "" + If _A2B_.TraceLogCount > 0 Then + If _A2B_.TraceLogCount < _A2B_.TraceLogMaxEntries Then i = -1 Else i = _A2B_.TraceLogLast + Do + If i < _A2B_.TraceLogMaxEntries - 1 Then i = i + 1 Else i = 0 + If Len(_A2B_.TraceLogs(i)) > 11 Then + sText = sText & Right(_A2B_.TraceLogs(i), Len(_A2B_.TraceLogs(i)) - 11) & sLineBreak ' Skip date in display + End If + Loop While i <> _A2B_.TraceLogLast + oDump.Enabled = 1 ' Enable DumpToFile only if there is something to dump + End If + If Len(sText) > 0 Then sText = Left(sText, Len(sText) - Len(sLineBreak)) ' Skip last linefeed + oTraceLog.Text = sText + Else + oTraceLog.Text = _GetLabel("DLGTRACE_TXTTRACELOG_TEXT") + End If + + Set oClear = oTraceDialog.Model.getByName("chkClear") + oClear.State = 0 ' Unchecked + oClear.HelpText = _GetLabel("DLGTRACE_LBLCLEAR_HELP") + + Set oControl = oTraceDialog.Model.getByName("lblClear") + oControl.Label = _GetLabel("DLGTRACE_LBLCLEAR_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_LBLCLEAR_HELP") + + Set oMinLevel = oTraceDialog.Model.getByName("cboMinLevel") + If _A2B_.MinimalTraceLevel = 0 Then _A2B_.MinimalTraceLevel = _TraceLevel(TRACEERRORS) + oMinLevel.Text = _TraceLevel(_A2B_.MinimalTraceLevel) + oMinLevel.HelpText = _GetLabel("DLGTRACE_LBLMINLEVEL_HELP") + + Set oControl = oTraceDialog.Model.getByName("lblMinLevel") + oControl.Label = _GetLabel("DLGTRACE_LBLMINLEVEL_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_LBLMINLEVEL_HELP") + + Set oControl = oTraceDialog.Model.getByName("cmdOK") + oControl.Label = _GetLabel("DLGTRACE_CMDOK_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_CMDOK_HELP") + + Set oControl = oTraceDialog.Model.getByName("cmdCancel") + oControl.Label = _GetLabel("DLGTRACE_CMDCANCEL_LABEL") + oControl.HelpText = _GetLabel("DLGTRACE_CMDCANCEL_HELP") + + iOKCancel = oTraceDialog.Execute() + + Select Case iOKCancel + Case 1 ' OK + If oClear.State = 1 Then + _A2B_.TraceLogs() = Array() ' Erase logged traces + _A2B_.TraceLogCount = 0 + End If + If oMinLevel.Text <> "" Then _A2B_.MinimalTraceLevel = _TraceLevel(oMinLevel.Text) + If oEntries.Value <> 0 And oEntries.Value <> _A2B_.TraceLogMaxEntries Then + _A2B_.TraceLogs() = Array() + _A2B_.TraceLogMaxEntries = oEntries.Value + End If + Case 0 ' Cancel + Case Else + End Select + +Exit_Sub: + If Not IsNull(oTraceDialog) Then oTraceDialog.Dispose() + Exit Sub +Error_Sub: + With _A2B_ + .TraceLogs() = Array() + .TraceLogCount = 0 + .TraceLogLast = 0 + End With + GoTo Exit_Sub +End Sub ' TraceConsole V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub TraceError(ByVal psErrorLevel As String _ + , ByVal piErrorCode As Integer _ + , ByVal psErrorProc As String _ + , ByVal piErrorLine As Integer _ + , ByVal Optional pvMsgBox As Variant _ + , ByVal Optional pvArgs As Variant _ + ) +' Store error code and description in trace rolling buffer +' Display error message if errorlevel >= ERROR +' Stop program execution if errorlevel = FATAL or ABORT + + On Local Error Resume Next + If IsEmpty(_A2B_) Then Call Application._RootInit() ' First use of Access2Base in current LibO/AOO session + +Dim sErrorText As String, sErrorDesc As String, oDb As Object + sErrorDesc = _ErrorMessage(piErrorCode, pvArgs) + sErrorText = _GetLabel("ERR#") & CStr(piErrorCode) _ + & " (" & sErrorDesc & ") " & _GetLabel("ERROCCUR") _ + & Iif(piErrorLine > 0, " " & _GetLabel("ERRLINE") & " " & CStr(piErrorLine), "") _ + & Iif(psErrorProc <> "", " " & _GetLabel("ERRIN") & " " & psErrorProc, Iif(_A2B_.CalledSub = "", "", " " & _Getlabel("ERRIN") & " " & _A2B_.CalledSub)) + With _A2B_ + .LastErrorCode = piErrorCode + .LastErrorLevel = psErrorLevel + .ErrorText = sErrorDesc + .ErrorLongText = sErrorText + .CalledSub = "" + End With + If IsMissing(pvMsgBox) Then pvMsgBox = ( psErrorLevel = TRACEERRORS Or psErrorLevel = TRACEFATAL Or psErrorLevel = TRACEABORT ) + TraceLog(psErrorLevel, sErrorText, pvMsgBox) + + ' Unexpected error detected in user program or in Access2Base + If psErrorLevel = TRACEFATAL Or psErrorLevel = TRACEABORT Then + If psErrorLevel = TRACEFATAL Then + Set oDb = _A2B_.CurrentDb() + If Not IsNull(oDb) Then oDb.CloseAllrecordsets() + End If + Stop + End If + +End Sub ' TraceError V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function TraceErrorCode() As Variant +' Return the last encountered error code, level, description in an array +' UNPUBLISHED + +Dim vError As Variant + + With _A2B_ + vError = Array( _ + .LastErrorCode _ + , .LastErrorLevel _ + , .ErrorText _ + , .ErrorLongText _ + ) + End With + TraceErrorCode = vError + +End Function ' TraceErrorCode V6.3 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub TraceLevel(ByVal Optional psTraceLevel As String) +' Set trace level to argument + + If _ErrorHandler() Then On Local Error Goto Error_Sub + Select Case True + Case IsMissing(psTraceLevel) : psTraceLevel = "ERROR" + Case psTraceLevel = "" : psTraceLevel = "ERROR" + Case Utils._InList(UCase(psTraceLevel), Array( _ + TRACEDEBUG, TRACEINFO, TRACEWARNING, TRACEERRORS, TRACEFATAL, TRACEABORT _ + )) + Case Else : Goto Exit_Sub + End Select + _A2B_.MinimalTraceLevel = _TraceLevel(psTraceLevel) + +Exit_Sub: + Exit Sub +Error_Sub: + With _A2B_ + .TraceLogs() = Array() + .TraceLogCount = 0 + .TraceLogLast = 0 + End With + GoTo Exit_Sub +End Sub ' TraceLevel V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub TraceLog(Byval psTraceLevel As String _ + , ByVal psText As String _ + , ByVal Optional pbMsgBox As Boolean _ + ) +' Store Text in trace log (circular buffer) + + If _ErrorHandler() Then On Local Error Goto Error_Sub +Dim vTraceLogs() As String, sTraceLevel As String + + With _A2B_ + If .MinimalTraceLevel = 0 Then .MinimalTraceLevel = _TraceLevel(TRACEERRORS) + If _TraceLevel(psTraceLevel) < .MinimalTraceLevel Then Exit Sub + + If UBound(.TraceLogs) = -1 Then ' Initialize TraceLog + If .TraceLogMaxEntries = 0 Then .TraceLogMaxEntries = cstLogMaxEntries + + Redim vTraceLogs(0 To .TraceLogMaxEntries - 1) + .TraceLogs = vTraceLogs + .TraceLogCount = 0 + .TraceLogLast = -1 + If .MinimalTraceLevel = 0 Then .MinimalTraceLevel = _TraceLevel(TRACEERRORS) ' Set default value + End If + + .TraceLogLast = .TraceLogLast + 1 + If .TraceLogLast > UBound(.TraceLogs) Then .TraceLogLast = LBound(.TraceLogs) ' Circular buffer + If Len(psTraceLevel) > 7 Then sTraceLevel = Left(psTraceLevel, 7) Else sTraceLevel = psTraceLevel & Spc(8 - Len(psTraceLevel)) + .TraceLogs(.TraceLogLast) = Format(Now(), "YYYY-MM-DD hh:mm:ss") & " " & sTraceLevel & psText + If .TraceLogCount <= UBound(.TraceLogs) Then .TraceLogCount = .TraceLogCount + 1 ' # of active entries + End With + + If IsMissing(pbMsgBox) Then pbMsgBox = True +Dim iMsgBox As Integer + If pbMsgBox Then + Select Case psTraceLevel + Case TRACEINFO: iMsgBox = vbInformation + Case TRACEERRORS, TRACEWARNING: iMsgBox = vbExclamation + Case TRACEFATAL, TRACEABORT: iMsgBox = vbCritical + Case Else: iMsgBox = vbInformation + End Select + MsgBox psText, vbOKOnly + iMsgBox, psTraceLevel + End If + +Exit_Sub: + Exit Sub +Error_Sub: + With _A2B_ + .TraceLogs() = Array() + .TraceLogCount = 0 + .TraceLogLast = 0 + End With + GoTo Exit_Sub +End Sub ' TraceLog V0.9.5 + + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Private Sub _DumpToFile(oEvent As Object) +' Execute the Dump To File command from the Trace dialog +' Modified from Andrew Pitonyak's Base Macro Programming §10.4 + + + If _ErrorHandler() Then On Local Error GoTo Error_Sub + +Dim sPath as String, iFileNumber As Integer, i As Integer + + sPath = _PromptFilePicker("txt") + If sPath <> "" Then ' Save button pressed + If UBound(_A2B_.TraceLogs) >= 0 Then ' Array yet initialized + iFileNumber = FreeFile() + Open sPath For Append Access Write Lock Read As iFileNumber + If _A2B_.TraceLogCount > 0 Then + If _A2B_.TraceLogCount < _A2B_.TraceLogMaxEntries Then i = -1 Else i = _A2B_.TraceLogLast + Do + If i < _A2B_.TraceLogMaxEntries - 1 Then i = i + 1 Else i = 0 + Print #iFileNumber _A2B_.TraceLogs(i) + Loop While i <> _A2B_.TraceLogLast + End If + Close iFileNumber + MsgBox _GetLabel("SAVECONSOLEENTRIES"), vbOK + vbInformation, _GetLabel("SAVECONSOLE") + End If + End If + +Exit_Sub: + Exit Sub +Error_Sub: + TraceError("ERROR", Err, "DumpToFile", Erl) + GoTo Exit_Sub +End Sub ' DumpToFile V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ErrorHandler(Optional ByVal pbCheck As Boolean) As Boolean +' Indicate if error handler is activated or not +' When argument present set error handler + If IsEmpty(_A2B_) Then Call Application._RootInit() ' First use of Access2Base in current LibO/AOO session + If Not IsMissing(pbCheck) Then _A2B_.ErrorHandler = pbCheck + _ErrorHandler = _A2B_.ErrorHandler + Exit Function +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _ErrorMessage(ByVal piErrorNumber As Integer, Optional ByVal pvArgs As Variant) As String +' Return error message corresponding to ErrorNumber (standard or not) +' and replaces %0, %1, ... , %9 by psArgs(0), psArgs(1), ... + +Dim sErrorMessage As String, i As Integer, sErrLabel + _ErrorMessage = "" + If piErrorNumber > ERRINIT Then + sErrLabel = "ERR" & piErrorNumber + sErrorMessage = _Getlabel(sErrLabel) + If Not IsMissing(pvArgs) Then + If Not IsArray(pvArgs) Then + sErrorMessage = Join(Split(sErrorMessage, "%0"), Utils._CStr(pvArgs, False)) + Else + For i = LBound(pvArgs) To UBound(pvArgs) + sErrorMessage = Join(Split(sErrorMessage, "%" & i), Utils._CStr(pvArgs(i), False)) + Next i + End If + End If + Else + sErrorMessage = Error(piErrorNumber) + ' Most (or all?) error messages terminate with a "." + If Len(sErrorMessage) > 1 And Right(sErrorMessage, 1) = "." Then sErrorMessage = Left(sErrorMessage, Len(sErrorMessage)-1) + End If + + _ErrorMessage = sErrorMessage + Exit Function + +End Function ' ErrorMessage V0.8.9 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _PromptFilePicker(ByVal psSuffix As String) As String +' Prompt for output file name +' Return "" if Cancel +' Modified from Andrew Pitonyak's Base Macro Programming §10.4 + + If _ErrorHandler() Then On Local Error GoTo Error_Function + +Dim oFileDialog as Object, oUcb as object, oPath As Object +Dim iAccept as Integer, sInitPath as String + + Set oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") + oFileDialog.Initialize(Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION)) + Set oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + + oFileDialog.appendFilter("*." & psSuffix, "*." & psSuffix) + oFileDialog.appendFilter("*.*", "*.*") + oFileDialog.setCurrentFilter("*." & psSuffix) + Set oPath = createUnoService("com.sun.star.util.PathSettings") + sInitPath = oPath.Work ' Probably My Documents + If oUcb.Exists(sInitPath) Then oFileDialog.SetDisplayDirectory(sInitPath) + + iAccept = oFileDialog.Execute() + + _PromptFilePicker = "" + If iAccept = 1 Then ' Save button pressed + _PromptFilePicker = oFileDialog.Files(0) + End If + +Exit_Function: + If Not IsEmpty(oFileDialog) And Not IsNull(oFileDialog) Then oFileDialog.Dispose() + Exit Function +Error_Function: + TraceError("ERROR", Err, "PromptFilePicker", Erl) + GoTo Exit_Function +End Function ' PromptFilePicker V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _TraceArguments(Optional psCall As String) +' Process the ERRMISSINGARGUMENTS error +' psCall is present if error detected before call to _SetCalledSub + + If Not IsMissing(psCall) Then Utils._SetCalledSub(psCall) + TraceError(TRACEFATAL, ERRMISSINGARGUMENTS, Utils._CalledSub(), 0) + Exit Sub + +End Sub ' TraceArguments + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _TraceLevel(ByVal pvTraceLevel As Variant) As Variant +' Convert string trace level to numeric value or the opposite + +Dim vTraces As Variant, i As Integer + vTraces = Array(TRACEDEBUG, TRACEINFO, TRACEWARNING, TRACEERRORS, TRACEFATAL, TRACEABORT, TRACEANY) + + Select Case VarType(pvTraceLevel) + Case vbString + _TraceLevel = 4 ' 4 = Default + For i = 0 To UBound(vTraces) + If UCase(pvTraceLevel) = UCase(vTraces(i)) Then + _TraceLevel = i + 1 + Exit For + End If + Next i + Case vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal + If pvTraceLevel < 1 Or pvTraceLevel > UBound(vTraces) + 1 Then _TraceLevel = TRACEERRORS Else _TraceLevel = vTraces(pvTraceLevel - 1) + End Select + +End Function ' TraceLevel + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/UtilProperty.xba b/wizards/source/access2base/UtilProperty.xba new file mode 100644 index 000000000..9f7ee4821 --- /dev/null +++ b/wizards/source/access2base/UtilProperty.xba @@ -0,0 +1,331 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="UtilProperty" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +'********************************************************************** +' UtilProperty module +' +' Module of utilities to manipulate arrays of PropertyValue's. +'********************************************************************** + +'********************************************************************** +' Copyright (c) 2003-2004 Danny Brewer +' d29583@groovegarden.com +'********************************************************************** + +'********************************************************************** +' If you make changes, please append to the change log below. +' +' Change Log +' Danny Brewer Revised 2004-02-25-01 +' Jean-Pierre Ledure Adapted to Access2Base coding conventions +' PropValuesToStr rewritten and addition of StrToPropValues +' Bug corrected on date values +' Addition of support of 2-dimensional arrays +' Support of empty arrays to allow JSON conversions +'********************************************************************** + +Option Explicit + +Private Const cstHEADER = "### PROPERTYVALUES ###" +Private Const cstEMPTYARRAY = "### EMPTY ARRAY ###" + +REM ======================================================================================================================= +Public Function _MakePropertyValue(ByVal Optional psName As String, Optional pvValue As Variant) As com.sun.star.beans.PropertyValue +' Create and return a new com.sun.star.beans.PropertyValue. + +Dim oPropertyValue As New com.sun.star.beans.PropertyValue + + If Not IsMissing(psName) Then oPropertyValue.Name = psName + If Not IsMissing(pvValue) Then oPropertyValue.Value = _CheckPropertyValue(pvValue) + _MakePropertyValue() = oPropertyValue + +End Function ' _MakePropertyValue V1.3.0 + +REM ======================================================================================================================= +Public Function _CheckPropertyValue(ByRef pvValue As Variant) As Variant +' Date BASIC variables give error. Change them to strings +' Empty arrays should be replaced by cstEMPTYARRAY + + If VarType(pvValue) = vbDate Then + _CheckPropertyValue = Utils._CStr(pvValue, False) + ElseIf IsArray(pvValue) Then + If UBound(pvValue, 1) < LBound(pvValue, 1) Then _CheckPropertyValue = cstEMPTYARRAY Else _CheckPropertyValue = pvValue + Else + _CheckPropertyValue = pvValue + End If + +End Function ' _CheckPropertyValue + +REM ======================================================================================================================= +Public Function _NumPropertyValues(ByRef pvPropertyValuesArray As Variant) As Integer +' Return the number of PropertyValue's in an array. +' Parameters: +' pvPropertyValuesArray - an array of PropertyValue's, that is an array of com.sun.star.beans.PropertyValue. +' Returns zero if the array contains no elements. + +Dim iNumProperties As Integer + If Not IsArray(pvPropertyValuesArray) Then iNumProperties = 0 Else iNumProperties = UBound(pvPropertyValuesArray) + 1 + _NumPropertyValues() = iNumProperties + +End Function ' _NumPropertyValues V1.3.0 + +REM ======================================================================================================================= +Public Function _FindPropertyIndex(ByRef pvPropertyValuesArray As Variant, ByVal psPropName As String ) As Integer +' Find a particular named property from an array of PropertyValue's. +' Finds the index in the array of PropertyValue's and returns it, or returns -1 if it was not found. + +Dim iNumProperties As Integer, i As Integer, vProp As Variant + iNumProperties = _NumPropertyValues(pvPropertyValuesArray) + For i = 0 To iNumProperties - 1 + vProp = pvPropertyValuesArray(i) + If UCase(vProp.Name) = UCase(psPropName) Then + _FindPropertyIndex() = i + Exit Function + EndIf + Next i + _FindPropertyIndex() = -1 + +End Function ' _FindPropertyIndex V1.3.0 + +REM ======================================================================================================================= +Public Function _FindProperty(ByRef pvPropertyValuesArray As Variant, ByVal psPropName As String) As com.sun.star.beans.PropertyValue +' Find a particular named property from an array of PropertyValue's. +' Finds the PropertyValue and returns it, or returns Null if not found. + +Dim iPropIndex As Integer, vProp As Variant + iPropIndex = _FindPropertyIndex(pvPropertyValuesArray, psPropName) + If iPropIndex >= 0 Then + vProp = pvPropertyValuesArray(iPropIndex) ' access array subscript + _FindProperty() = vProp + EndIf + +End Function ' _FindProperty V1.3.0 + +REM ======================================================================================================================= +Public Function _GetPropertyValue(ByRef pvPropertyValuesArray As Variant, ByVal psPropName As String, Optional pvDefaultValue) As Variant +' Get the value of a particular named property from an array of PropertyValue's. +' vDefaultValue - This value is returned if the property is not found in the array. + +Dim iPropIndex As Integer, vProp As Variant, vValue As Variant, vMatrix As Variant, i As Integer, j As Integer + iPropIndex = _FindPropertyIndex(pvPropertyValuesArray, psPropName) + If iPropIndex >= 0 Then + vProp = pvPropertyValuesArray(iPropIndex) ' access array subscript + vValue = vProp.Value ' get the value from the PropertyValue + If VarType(vValue) = vbString Then + If vValue = cstEMPTYARRAY Then _GetPropertyValue() = Array() Else _GetPropertyValue() = vValue + ElseIf IsArray(vValue) Then + If IsArray(vValue(0)) Then ' Array of arrays + vMatrix = Array() + ReDim vMatrix(0 To UBound(vValue), 0 To UBound(vValue(0))) + For i = 0 To UBound(vValue) + For j = 0 To UBound(vValue(0)) + vMatrix(i, j) = vValue(i)(j) + Next j + Next i + _GetPropertyValue() = vMatrix + Else + _GetPropertyValue() = vValue ' Simple vector OK + End If + Else + _GetPropertyValue() = vValue + End If + Else + If IsMissing(pvDefaultValue) Then pvDefaultValue = Null + _GetPropertyValue() = pvDefaultValue + EndIf + +End Function ' _GetPropertyValue V1.3.0 + +REM ======================================================================================================================= +Public Sub _SetPropertyValue(ByRef pvPropertyValuesArray As Variant, ByVal psPropName As String, ByVal pvValue As Variant) +' Set the value of a particular named property from an array of PropertyValue's. + +Dim iPropIndex As Integer, vProp As Variant, iNumProperties As Integer + + iPropIndex = _FindPropertyIndex(pvPropertyValuesArray, psPropName) + If iPropIndex >= 0 Then + ' Found, the PropertyValue is already in the array. Just modify its value. + vProp = pvPropertyValuesArray(iPropIndex) ' access array subscript + vProp.Value = _CheckPropertyValue(pvValue) ' set the property value. + pvPropertyValuesArray(iPropIndex) = vProp ' put it back into array + Else + ' Not found, the array contains no PropertyValue with this name. Append new element to array. + iNumProperties = _NumPropertyValues(pvPropertyValuesArray) + If iNumProperties = 0 Then + pvPropertyValuesArray = Array(_MakePropertyValue(psPropName, pvValue)) + Else + ' Make array larger. + Redim Preserve pvPropertyValuesArray(iNumProperties) + ' Assign new PropertyValue + pvPropertyValuesArray(iNumProperties) = _MakePropertyValue(psPropName, pvValue) + EndIf + EndIf + +End Sub ' _SetPropertyValue V1.3.0 + +REM ======================================================================================================================= +Public Sub _DeleteProperty(ByRef pvPropertyValuesArray As Variant, ByVal psPropName As String) +' Delete a particular named property from an array of PropertyValue's. + +Dim iPropIndex As Integer + iPropIndex = _FindPropertyIndex(pvPropertyValuesArray, psPropName) + If iPropIndex >= 0 Then _DeleteIndexedProperty(pvPropertyValuesArray, iPropIndex) + +End Sub ' _DeletePropertyValue V1.3.0 + +REM ======================================================================================================================= +Public Sub _DeleteIndexedProperty(ByRef pvPropertyValuesArray As Variant, ByVal piPropIndex As Integer) +' Delete a particular indexed property from an array of PropertyValue's. + +Dim iNumProperties As Integer, i As Integer + iNumProperties = _NumPropertyValues(pvPropertyValuesArray) + + ' Did we find it? + If piPropIndex < 0 Then + ' Do nothing + ElseIf iNumProperties = 1 Then + ' Just return a new empty array + pvPropertyValuesArray = Array() + Else + ' If it is NOT the last item in the array, then shift other elements down into it's position. + If piPropIndex < iNumProperties - 1 Then + ' Bump items down lower in the array. + For i = piPropIndex To iNumProperties - 2 + pvPropertyValuesArray(i) = pvPropertyValuesArray(i + 1) + Next i + EndIf + ' Redimension the array to have one fewer element. + Redim Preserve pvPropertyValuesArray(iNumProperties - 2) + EndIf + +End Sub ' _DeleteIndexedProperty V1.3.0 + +REM ======================================================================================================================= +Public Function _PropValuesToStr(ByRef pvPropertyValuesArray As Variant) As String +' Return a string with dumped content of the array of PropertyValue's. +' SYNTAX: +' NameOfProperty = This is a string (or 12 or 2016-12-31 12:05 or 123.45 or -0.12E-05 ...) +' NameOfArray = (10) +' 1;2;3;4;5;6;7;8;9;10 +' NameOfMatrix = (2,10) +' 1;2;3;4;5;6;7;8;9;10 +' A;B;C;D;E;F;G;H;I;J +' Semicolons and backslashes are escaped with a backslash (see _CStr and _CVar functions) + +Dim iNumProperties As Integer, sResult As String, i As Integer, j As Integer, vProp As Variant +Dim sName As String, vValue As Variant, iType As Integer +Dim cstLF As String + + cstLF = vbLf() + iNumProperties = _NumPropertyValues(pvPropertyValuesArray) + + sResult = cstHEADER & cstLF + For i = 0 To iNumProperties - 1 + vProp = pvPropertyValuesArray(i) + sName = vProp.Name + vValue = vProp.Value + iType = VarType(vValue) + Select Case iType + Case < vbArray ' Scalar + sResult = sResult & sName & " = " & Utils._CStr(vValue, False) & cstLF + Case Else ' Vector or matrix + If uBound(vValue, 1) < 0 Then + sResult = sResult & sName & " = (0)" & cstLF + ' 1-dimension but vector of vectors must also be considered + ElseIf VarType(vValue(0)) >= vbArray Then + sResult = sResult & sName & " = (" & UBound(vValue) + 1 & "," & UBound(vValue(0)) + 1 & ")" & cstLF + For j = 0 To UBound(vValue) + sResult = sResult & Utils._CStr(vValue(j), False) & cstLF + Next j + Else + sResult = sResult & sName & " = (" & UBound(vValue, 1) + 1 & ")" & cstLF + sResult = sResult & Utils._CStr(vValue, False) & cstLF + End If + End Select + Next i + + _PropValuesToStr() = Left(sResult, Len(sResult) - 1) ' Remove last LF + +End Function ' _PropValuesToStr V1.3.0 + +REM ======================================================================================================================= +Public Function _StrToPropValues(psString) As Variant +' Return an array of PropertyValue's rebuilt from the string parameter + +Dim vString() As Variant, i As Integer,iArray As Integer, iRows As Integer, iCols As Integer +Dim lPosition As Long, sName As String, vValue As Variant, vResult As Variant, sDim As String +Dim lSearch As Long +Dim cstLF As String +Const cstEqualArray = " = (", cstEqual = " = " + + cstLF = Chr(10) + _StrToPropValues = Array() + vResult = Array() + + If psString = "" Then Exit Function + vString = Split(psString, cstLF) + If UBound(vString) <= 0 Then Exit Function ' There must be at least one name-value pair + If vString(0) <> cstHEADER Then Exit Function ' Check origin + + iArray = -1 + For i = 1 To UBound(vString) + If vString(i) <> "" Then ' Skip empty lines + If iArray < 0 Then ' Not busy with array row + lPosition = 1 + sName = Utils._RegexSearch(vString(i), "^\b\w+\b", lPosition) ' Identifier + If sName = "" Then Exit Function + If InStr(vString(i), cstEqualArray) = lPosition + Len(sName) Then ' Start array processing + lSearch = lPosition + Len(sName) + Len(cstEqualArray) - 1 + sDim = Utils._RegexSearch(vString(i), "\([0-9]+\)", lSearch) ' e.g. (10) + If sDim = "(0)" Then ' Empty array + iRows = -1 + vValue = Array() + _SetPropertyValue(vResult, sName, vValue) + ElseIf sDim <> "" Then ' Vector with content + iCols = CInt(Mid(sDim, 2, Len(sDim) - 2)) + iRows = 0 + ReDim vValue(0 To iCols - 1) + iArray = 0 + Else ' Matrix with content + lSearch = lPosition + Len(sName) + Len(cstEqualArray) - 1 + sDim = Utils._RegexSearch(vString(i), "\([0-9]+,", lSearch) ' e.g. (10, + iRows = CInt(Mid(sDim, 2, Len(sDim) - 2)) + sDim = Utils._RegexSearch(vString(i), ",[0-9]+\)", lSearch) ' e.g. ,20) + iCols = CInt(Mid(sDim, 2, Len(sDim) - 2)) + ReDim vValue(0 To iRows - 1) + iArray = 0 + End If + ElseIf InStr(vString(i), cstEqual) = lPosition + Len(sName) Then + vValue = Utils._CVar(Mid(vString(i), Len(sName) + Len(cstEqual) + 1)) + _SetPropertyValue(vResult, sName, vValue) + Else + Exit Function + End If + Else ' Line is an array row + If iRows = 0 Then + vValue = Utils._CVar(vString(i), True) ' Keep dates as strings + iArray = -1 + _SetPropertyValue(vResult, sName, vValue) + Else + vValue(iArray) = Utils._CVar(vString(i), True) + If iArray < iRows - 1 Then + iArray = iArray + 1 + Else + iArray = -1 + _SetPropertyValue(vResult, sName, vValue) + End If + End If + End If + End If + Next i + + _StrToPropValues = vResult + +End Function + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/Utils.xba b/wizards/source/access2base/Utils.xba new file mode 100644 index 000000000..b5dee5214 --- /dev/null +++ b/wizards/source/access2base/Utils.xba @@ -0,0 +1,1306 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Utils" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +Global _A2B_ As Variant + +REM ----------------------------------------------------------------------------------------------------------------------- +REM --- PRIVATE FUNCTIONS --- +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function _AddArray(ByVal pvArray As Variant, pvItem As Variant) As Variant +'Add the item at the end of the array + +Dim vArray() As Variant + If IsArray(pvArray) Then vArray = pvArray Else vArray = Array() + ReDim Preserve vArray(LBound(vArray) To UBound(vArray) + 1) + vArray(UBound(vArray)) = pvItem + _AddArray() = vArray() + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _AddNumeric(ByVal Optional pvTypes As Variant) As Variant +'Return on top of argument the list of all numeric types +'Facilitates the entry of the list of allowed types in _CheckArgument calls + +Dim i As Integer, vNewList() As Variant, vNumeric() As Variant, iSize As Integer + If IsMissing(pvTypes) Then + vNewList = Array() + ElseIf IsArray(pvTypes) Then + vNewList = pvTypes + Else + vNewList = Array(pvTypes) + End If + + vNumeric = Array(vbInteger, vbLong, vbSingle, vbDouble, vbCurrency, vbBigint, vbDecimal, vbBoolean) + + iSize = UBound(vNewlist) + ReDim Preserve vNewList(iSize + UBound(vNumeric) + 1) + For i = 0 To UBound(vNumeric) + vNewList(iSize + i + 1) = vNumeric(i) + Next i + + _AddNumeric = vNewList + +End Function ' _AddNumeric V0.8.0 + +REM ----------------------------------------------------------------------------------------------------------------------- + +Public Function _BitShift(piValue As Integer, piConstant As Integer) As Boolean + + _BitShift = False + If piValue = 0 Then Exit Function + Select Case piConstant + Case 1 + Select Case piValue + Case 1, 3, 5, 7, 9, 11, 13, 15: _BitShift = True + Case Else + End Select + Case 2 + Select Case piValue + Case 2, 3, 6, 7, 10, 11, 14, 15: _BitShift = True + Case Else + End Select + Case 4 + Select Case piValue + Case 4, 5, 6, 7, 12, 13, 14, 15: _BitShift = True + Case Else + End Select + Case 8 + Select Case piValue + Case 8, 9, 10, 11, 12, 13, 14, 15: _BitShift = True + Case Else + End Select + End Select + +End Function ' BitShift + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CalledSub() As String + _CalledSub = Iif(_A2B_.CalledSub = "", "", _GetLabel("CALLTO") & " '" & _A2B_.CalledSub & "'") +End Function ' CalledSub V0.8.9 + + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CheckArgument(pvItem As Variant _ + , ByVal piArgNr As Integer _ + , Byval pvType As Variant _ + , ByVal Optional pvValid As Variant _ + , ByVal Optional pvError As Boolean _ + ) As Variant +' Called by public functions to check the validity of their arguments +' pvItem Argument to be checked +' piArgNr Argument sequence number +' pvType Single value or array of allowed variable types +' If of string type must contain one or more valid pseudo-object types +' pvValid Single value or array of allowed values - comparison for strings is case-insensitive +' pvError If True (default), error handling in this routine. False in _setProperty methods in class modules. + + _CheckArgument = False + +Dim iVarType As Integer + If IsArray(pvType) Then iVarType = VarType(pvType(LBound(pvType))) Else iVarType = VarType(pvType) + If iVarType = vbString Then ' pvType is a pseudo-type string + _CheckArgument = Utils._IsPseudo(pvItem, pvType) + Else + If IsMissing(pvValid) Then _CheckArgument = Utils._IsScalar(pvItem, pvType) Else _CheckArgument = Utils._IsScalar(pvItem, pvType, pvValid) + End If + + If VarType(pvItem) = vbCurrency Or VarType(pvItem) = vbDecimal Or VarType(pvItem) = vbBigint Then pvItem = CDbl(pvItem) + +Exit_Function: + If Not _CheckArgument Then + If IsMissing(pvError) Then pvError = True + If pvError Then + TraceError(TRACEFATAL, ERRWRONGARGUMENT, Utils._CalledSub(), 0, 1, Array(piArgNr, pvItem)) + End If + End If + Exit Function +End Function ' CheckArgument V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CStr(ByVal pvArg As Variant, ByVal Optional pbShort As Boolean) As String +' Convert pvArg into a readable string (truncated if too long and pbShort = True or missing) +' pvArg may be a byte-array. Other arrays are processed recursively into a semicolon separated string + +Dim sArg As String, sObject As String, oArg As Object, sLength As String, i As Long, iMax As Long +Const cstLength = 50 +Const cstByteLength = 25 + + If IsMissing(pbShort) Then pbShort = True + If IsArray(pvArg) Then + sArg = "" + If VarType(pvArg) = vbByte Or VarType(pvArg) = vbArray + vbByte Then + If pbShort And UBound(pvArg) > cstByteLength Then iMax = cstByteLength Else iMax = UBound(pvArg) + For i = 0 To iMax + sArg = sArg & Right("00" & Hex(pvArg(i)), 2) + Next i + Else + If pbShort Then + sArg = "[ARRAY]" + Else ' One-dimension arrays only + For i = LBound(pvArg) To UBound(pvArg) + sArg = sArg & Utils._CStr(pvArg(i), pbShort) & ";" ' Recursive call + Next i + If Len(sArg) > 1 Then sArg = Left(sArg, Len(sArg) - 1) + End If + End If + Else + Select Case VarType(pvArg) + Case vbEmpty : sArg = "[EMPTY]" + Case vbNull : sArg = "[NULL]" + Case vbObject + If IsNull(pvArg) Then + sArg = "[NULL]" + Else + sObject = Utils._ImplementationName(pvArg) + If Utils._IsPseudo(pvArg, Array(OBJDATABASE, OBJCOLLECTION, OBJPROPERTY, OBJFORM, OBJSUBFORM, OBJCONTROL, OBJOPTIONGROUP _ + , OBJEVENT, OBJFIELD, OBJTABLEDEF, OBJQUERYDEF, OBJRECORDSET, OBJTEMPVAR, OBJCOMMANDBAR, OBJCOMMANDBARCONTROL _ + , OBJDIALOG _ + )) Then + Set oArg = pvArg ' To avoid "Object variable not set" error message + sArg = "[" & oArg._Type & "] " & oArg._Name + ElseIf sObject <> "" Then + sArg = "[" & sObject & "]" + Else + sArg = "[OBJECT]" + End If + End If + Case vbVariant : sArg = "[VARIANT]" + Case vbString + ' Replace CR + LF by \n and HT by \t + ' Replace semicolon by \; to allow semicolon separated rows + sArg = Replace( _ + Replace( _ + Replace( _ + Replace( _ + Replace(pvArg, "\", "\\") _ + , Chr(13), "") _ + , Chr(10), "\n") _ + , Chr(9), "\t") _ + , ";", "\;") + Case vbBoolean : sArg = Iif(pvArg, "[TRUE]", "[FALSE]") + Case vbByte : sArg = Right("00" & Hex(pvArg), 2) + Case vbSingle, vbDouble, vbCurrency + sArg = Format(pvArg) + If InStr(UCase(sArg), "E") = 0 Then sArg = Format(pvArg, "##0.0##") + sArg = Replace(sArg, ",", ".") + Case vbBigint : sArg = CStr(CLng(pvArg)) + Case vbDate : sArg = Year(pvArg) & "-" & Right("0" & Month(pvArg), 2) & "-" & Right("0" & Day(pvArg), 2) _ + & " " & Right("0" & Hour(pvArg), 2) & ":" & Right("0" & Minute(pvArg), 2) _ + & ":" & Right("0" & Second(pvArg), 2) + Case Else : sArg = CStr(pvArg) + End Select + End If + If pbShort And Len(sArg) > cstLength Then + sLength = "(" & Len(sArg) & ")" + sArg = Left(sArg, cstLength - 5 - Len(slength)) & " ... " & sLength + End If + _CStr = sArg + +End Function ' CStr V0.9.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _CVar(ByRef psArg As String, ByVal Optional pbStrDate As Boolean) As Variant +' psArg is presumed an output of _CStr (stored in the meantime in a text file f.i.) +' _CVar returns the corresponding original variant variable or Null/Nothing if not possible +' Return values may of types Array, Long, Double, Date, Boolean, String, Null or Empty +' pbStrDate = True keeps dates as strings + +Dim cstEscape1 As String, cstEscape2 As String + cstEscape1 = Chr(14) ' Form feed used as temporary escape character for \\ + cstEscape2 = Chr(27) ' ESC used as temporary escape character for \; + + _CVar = "" + If Len(psArg) = 0 Then Exit Function + +Dim sArg As String, vArgs() As Variant, vVars() As Variant, i As Integer + If IsMissing(pbStrDate) Then pbStrDate = False + sArg = Replace( _ + Replace( _ + Replace( _ + Replace(psArg, "\\", cstEscape1) _ + , "\;", cstEscape2) _ + , "\n", Chr(10)) _ + , "\t", Chr(9)) + + ' Semicolon separated string + vArgs = Split(sArg, ";") + If UBound(vArgs) > LBound(vArgs) Then ' Process each item recursively + vVars = Array() + Redim vVars(LBound(vArgs) To UBound(vArgs)) + For i = LBound(vVars) To UBound(vVars) + vVars(i) = _CVar(vArgs(i), pbStrDate) + Next i + _CVar = vVars + Exit Function + End If + + ' Usual case + Select Case True + Case sArg = "[EMPTY]" : _CVar = EMPTY + Case sArg = "[NULL]" Or sArg = "[VARIANT]" : _CVar = Null + Case sArg = "[OBJECT]" : _CVar = Nothing + Case sArg = "[TRUE]" : _CVar = True + Case sArg = "[FALSE]" : _CVar = False + Case IsDate(sArg) + If pbStrDate Then _CVar = sArg Else _CVar = CDate(sArg) + Case IsNumeric(sArg) + If InStr(sArg, ".") > 0 Then + _CVar = Val(sArg) + Else + _CVar = CLng(Val(sArg)) ' Val always returns a double + End If + Case _RegexSearch(sArg, "^[-+]?[0-9]*\.?[0-9]+(e[-+]?[0-9]+)?$") <> "" + _CVar = Val(sArg) ' Scientific notation + Case Else : _CVar = Replace(Replace(sArg, cstEscape1, "\"), cstEscape2, ";") + End Select + +End Function ' CVar V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _DecimalPoint() As String +'Return locale decimal point + _DecimalPoint = Mid(Format(0, "0.0"), 2, 1) +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _ExtensionLocation() As String +' Return the URL pointing to the location where OO installed the Access2Base extension +' Adapted from http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Extensions/Location_of_Installed_Extensions + +Dim oPip As Object, sLocation As String + Set oPip = GetDefaultContext.getByName("/singletons/com.sun.star.deployment.PackageInformationProvider") + _ExtensionLocation = oPip.getPackageLocation("Access2Base") + +End Function ' ExtensionLocation + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetDialogLib() As Object +' Return actual Access2Base dialogs library + +Dim oDialogLib As Object + + Set oDialogLib = DialogLibraries + If oDialogLib.hasByName("Access2BaseDev") Then + If Not oDialogLib.IsLibraryLoaded("Access2BaseDev") Then oDialogLib.loadLibrary("Access2BaseDev") + Set _GetDialogLib = DialogLibraries.Access2BaseDev + ElseIf oDialogLib.hasByName("Access2Base") Then + If Not oDialogLib.IsLibraryLoaded("Access2Base") Then oDialogLib.loadLibrary("Access2Base") + Set _GetDialogLib = DialogLibraries.Access2Base + Else + Set _GetDialogLib = Nothing + EndIf + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetEventName(ByVal psProperty As String) As String +' Return the LO internal event name +' Corrects the typo on ErrorOccur(r?)ed + + _GetEventName = Replace(LCase(Mid(psProperty, 3, 1)) & Right(psProperty, Len(psProperty) - 3), "errorOccurred", "errorOccured") + +End Function ' _GetEventName V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetEventScriptCode(poObject As Object _ + , ByVal psEvent As String _ + , ByVal psName As String _ + , Optional ByVal pbExtendName As Boolean _ + ) As String +' Extract from the parent of poObject the macro linked to psEvent. +' psName is the name of the object + +Dim i As Integer, vEvents As Variant, sEvent As String, oParent As Object, iIndex As Integer, sName As String + + _GetEventScriptCode = "" + If Not Utils._hasUNOMethod(poObject, "getParent") Then Exit Function + + ' Find form index i.e. find control via getByIndex() + If IsMissing(pbExtendName) Then pbExtendName = False + Set oParent = poObject.getParent() + iIndex = -1 + For i = 0 To oParent.getCount() - 1 + sName = oParent.getByIndex(i).Name + If (sName = psName) Or (pbExtendName And (sName = "MainForm" Or sName = "Form")) Then + iIndex = i + Exit For + End If + Next i + If iIndex < 0 Then Exit Function + + ' Find script event + vEvents = oParent.getScriptEvents(iIndex) ' Returns an array + sEvent = Utils._GetEventName(psEvent) ' Targeted event method + For i = 0 To UBound(vEvents) + If vEvents(i).EventMethod = sEvent Then + _GetEventScriptCode = vEvents(i).ScriptCode + Exit For + End If + Next i + +End Function ' _GetEventScriptCode V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _GetResultSetColumnValue(poResultSet As Object _ + , ByVal piColIndex As Integer _ + , Optional ByVal pbReturnBinary As Boolean _ + ) As Variant +REM Modified from Roberto Benitez's BaseTools +REM get the data for the column specified by ColIndex +REM If pbReturnBinary = False (default) then return length of binary field +REM get type name from metadata + +Dim vValue As Variant, iType As Integer, vDateTime As Variant, oValue As Object +Dim bNullable As Boolean, lSize As Long +Const cstMaxTextLength = 65535 +Const cstMaxBinlength = 2 * 65535 + + On Local Error Goto 0 ' Disable error handler + vValue = Null ' Default value if error + If IsMissing(pbReturnBinary) Then pbReturnBinary = False + With com.sun.star.sdbc.DataType + iType = poResultSet.MetaData.getColumnType(piColIndex) + bNullable = ( poResultSet.MetaData.IsNullable(piColIndex) = com.sun.star.sdbc.ColumnValue.NULLABLE ) + Select Case iType + Case .ARRAY : vValue = poResultSet.getArray(piColIndex) + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + Set oValue = poResultSet.getBinaryStream(piColIndex) + If bNullable Then + If Not poResultSet.wasNull() Then + If Not _hasUNOMethod(oValue, "getLength") Then ' When no recordset + lSize = cstMaxBinLength + Else + lSize = CLng(oValue.getLength()) + End If + If lSize <= cstMaxBinLength And pbReturnBinary Then + vValue = Array() + oValue.readBytes(vValue, lSize) + Else ' Return length of field, not content + vValue = lSize + End If + End If + End If + oValue.closeInput() + Case .BIT, .BOOLEAN : vValue = poResultSet.getBoolean(piColIndex) + Case .DATE : vDateTime = poResultSet.getDate(piColIndex) + If Not poResultSet.wasNull() Then vValue = DateSerial(CInt(vDateTime.Year), CInt(vDateTime.Month), CInt(vDateTime.Day)) + Case .DISTINCT, .OBJECT, .OTHER, .STRUCT + vValue = Null + Case .DOUBLE, .REAL : vValue = poResultSet.getDouble(piColIndex) + Case .FLOAT : vValue = poResultSet.getFloat(piColIndex) + Case .INTEGER, .SMALLINT : vValue = poResultSet.getInt(piColIndex) + Case .BIGINT : vValue = poResultSet.getLong(piColIndex) + Case .DECIMAL, .NUMERIC : vValue = poResultSet.getDouble(piColIndex) + Case .SQLNULL : vValue = poResultSet.getNull(piColIndex) + Case .OBJECT, .OTHER, .STRUCT : vValue = Null + Case .REF : vValue = poResultSet.getRef(piColIndex) + Case .TINYINT : vValue = poResultSet.getShort(piColIndex) + Case .CHAR, .VARCHAR : vValue = poResultSet.getString(piColIndex) + Case .LONGVARCHAR, .CLOB + Set oValue = poResultSet.getCharacterStream(piColIndex) + If bNullable Then + If Not poResultSet.wasNull() Then + If Not _hasUNOMethod(oValue, "getLength") Then ' When no recordset + lSize = cstMaxTextLength + Else + lSize = CLng(oValue.getLength()) + End If + oValue.closeInput() + vValue = poResultSet.getString(piColIndex) + End If + Else + oValue.closeInput() + End If + Case .TIME : vDateTime = poResultSet.getTime(piColIndex) + If Not poResultSet.wasNull() Then vValue = TimeSerial(vDateTime.Hours, vDateTime.Minutes, vDateTime.Seconds)', vDateTime.HundredthSeconds) + Case .TIMESTAMP : vDateTime = poResultSet.getTimeStamp(piColIndex) + If Not poResultSet.wasNull() Then vValue = DateSerial(CInt(vDateTime.Year), CInt(vDateTime.Month), CInt(vDateTime.Day)) _ + + TimeSerial(vDateTime.Hours, vDateTime.Minutes, vDateTime.Seconds)', vDateTime.HundredthSeconds) + Case Else + vValue = poResultSet.getString(piColIndex) 'GIVE STRING A TRY + If IsNumeric(vValue) Then vValue = Val(vValue) 'Required when type = "", sometimes numeric fields are returned as strings (query/MSAccess) + End Select + If bNullable Then + If poResultSet.wasNull() Then vValue = Null + End If + End With + + _GetResultSetColumnValue = vValue + +End Function ' GetResultSetColumnValue V 1.5.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _FinalProperty(psShortcut As String) As String +' Return the final property of a shortcut + +Const cstEXCLAMATION = "!" +Const cstDOT = "." + +Dim iCurrentIndex As Integer, vCurrentObject As Variant, sCurrentProperty As String +Dim sComponents() As String, sSubComponents() As String + _FinalProperty = "" + sComponents = Split(Trim(psShortcut), cstEXCLAMATION) + If UBound(sComponents) = 0 Then Exit Function + sSubComponents = Split(sComponents(UBound(sComponents)), cstDOT) + Select Case UBound(sSubComponents) + Case 1 + _FinalProperty = sSubComponents(1) + Case Else + Exit Function + End Select + +End Function ' FinalProperty + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetProductName(ByVal Optional psFlag As String) as String +'Return OO product ("PRODUCT") and version numbers ("VERSION") +'Derived from Tools library + +Dim oProdNameAccess as Object +Dim sVersion as String +Dim sProdName as String + If IsMissing(psFlag) Then psFlag = "ALL" + oProdNameAccess = _GetRegistryKeyContent("org.openoffice.Setup/Product") + sProdName = oProdNameAccess.getByName("ooName") + sVersion = oProdNameAccess.getByName("ooSetupVersionAboutBox") + Select Case psFlag + Case "ALL" : _GetProductName = sProdName & " " & sVersion + Case "PRODUCT" : _GetProductName = sProdName + Case "VERSION" : _GetProductName = sVersion + End Select +End Function ' GetProductName V1.0.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetRandomFileName(ByVal psName As String) As String +' Return the full name of a random temporary file suffixed by psName + +Dim sRandom As String + sRandom = Right("000000" & Int(999999 * Rnd), 6) + _GetRandomFileName = Utils._getTempDirectoryURL() & "/" & "A2B_TEMP_" & psName & "_" & sRandom + +End Function ' GetRandomFileName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _GetRegistryKeyContent(sKeyName as string, Optional bforUpdate as Boolean) As Variant +'Implement ConfigurationProvider service +'Derived from Tools library + +Dim oConfigProvider as Object +Dim aNodePath(0) as new com.sun.star.beans.PropertyValue + oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider") + aNodePath(0).Name = "nodepath" + aNodePath(0).Value = sKeyName + If IsMissing(bForUpdate) Then bForUpdate = False + If bForUpdate Then + _GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", aNodePath()) + Else + _GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath()) + End If +End Function ' GetRegistryKeyContent V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _getTempDirectoryURL() As String +' Return the temporary directory defined in the OO Options (Paths) +Dim sDirectory As String, oSettings As Object, oPathSettings As Object + + If _ErrorHandler() Then On Local Error Goto Error_Function + + _getTempDirectoryURL = "" + oPathSettings = createUnoService( "com.sun.star.util.PathSettings" ) + sDirectory = oPathSettings.GetPropertyValue( "Temp" ) + + _getTempDirectoryURL = sDirectory + +Exit_Function: + Exit Function +Error_Function: + TraceError("ERROR", Err, "_getTempDirectoryURL", Erl) + _getTempDirectoryURL = "" + Goto Exit_Function +End Function ' _getTempDirectoryURL V0.8.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _getUNOTypeName(pvObject As Variant) As String +' Return the symbolic name of the pvObject (UNO-object) type +' Code-snippet from XRAY + +Dim oService As Object, vClass as Variant + _getUNOTypeName = "" + On Local Error Resume Next + oService = CreateUnoService("com.sun.star.reflection.CoreReflection") + vClass = oService.getType(pvObject) + If vClass.TypeClass = com.sun.star.uno.TypeClass.STRUCT Then + _getUNOTypeName = vClass.Name + End If + oService.Dispose() + +End Function ' getUNOTypeName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _hasUNOMethod(pvObject As Variant, psMethod As String) As Boolean +' Return true if pvObject has the (UNO) method psMethod +' Code-snippet found in Bernard Marcelly's XRAY + +Dim vInspect as Variant + _hasUNOMethod = False + If IsNull(pvObject) Then Exit Function + On Local Error Resume Next + vInspect = _A2B_.Introspection.Inspect(pvObject) + _hasUNOMethod = vInspect.hasMethod(psMethod, com.sun.star.beans.MethodConcept.ALL) + +End Function ' hasUNOMethod V0.8.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _hasUNOProperty(pvObject As Variant, psProperty As String) As Boolean +' Return true if pvObject has the (UNO) property psProperty +' Code-snippet found in Bernard Marcelly's XRAY + +Dim vInspect as Variant + _hasUNOProperty = False + If IsNull(pvObject) Then Exit Function + On Local Error Resume Next + vInspect = _A2B_.Introspection.Inspect(pvObject) + _hasUNOProperty = vInspect.hasProperty(psProperty, com.sun.star.beans.PropertyConcept.ALL) + +End Function ' hasUNOProperty V0.8.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ImplementationName(pvObject As Variant) As String +' Use getImplementationName method or _getUNOTypeName function + +Dim sObjectType As String + On Local Error Resume Next + sObjectType = pvObject.getImplementationName() + If sObjectType = "" Then sObjectType = _getUNOTypeName(pvObject) + + _ImplementationName = sObjectType + +End Function ' ImplementationName + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _InList(ByVal pvItem As Variant, pvList As Variant, ByVal Optional pvReturnValue As Variant, Optional ByVal pbBinarySearch As Boolean) As Variant +' Return True if pvItem is present in the pvList array (case insensitive comparison) +' Return the value in pvList if pvReturnValue = True + +Dim i As Integer, bFound As Boolean, iListVarType As Integer, iItemVarType As Integer +Dim iTop As Integer, iBottom As Integer, iFound As Integer + iItemVarType = VarType(pvItem) + If IsMissing(pvReturnValue) Then pvReturnValue = False + If iItemVarType = vbNull Or IsNull(pvList) Then + _InList = False + ElseIf Not IsArray(pvList) Then + If iItemVarType = vbString Then bFound = ( UCase(pvItem) = UCase(pvList) ) Else bFound = ( pvItem = pvList ) + If Not pvReturnValue Then + _InList = bFound + Else + If bFound Then _InList = pvList Else _InList = False + End If + ElseIf UBound(pvList) < LBound(pvList) Then ' Array not initialized + _InList = False + Else + bFound = False + _InList = False + iListVarType = VarType(pvList(LBound(pvList))) + If iListVarType = iItemVarType _ + Or ( (iListVarType = vbInteger Or iListVarType = vbLong Or iListVarType = vbSingle Or iListVarType = vbDouble _ + Or iListVarType = vbCurrency Or iListVarType = vbBigint Or iListVarType = vbDecimal) _ + And (iItemVarType = vbInteger Or iItemVarType = vbLong Or iItemVarType = vbSingle Or iItemVarType = vbDouble _ + Or iItemVarType = vbCurrency Or iItemVarType = vbBigint Or iItemVarType = vbDecimal) _ + ) Then + If IsMissing(pbBinarySearch) Then pbBinarySearch = False + If Not pbBinarySearch Then ' Linear search + For i = LBound(pvList) To UBound(pvList) + If iItemVarType = vbString Then bFound = ( UCase(pvItem) = UCase(pvList(i)) ) Else bFound = ( pvItem = pvList(i) ) + If bFound Then + iFound = i + Exit For + End If + Next i + Else ' Binary search => array must be sorted + iTop = UBound(pvList) + iBottom = lBound(pvList) + Do + iFound = (iTop + iBottom) / 2 + If ( iItemVarType = vbString And UCase(pvItem) > UCase(pvList(iFound)) ) Or ( iItemVarType <> vbString And pvItem > pvList(iFound) ) Then + iBottom = iFound + 1 + Else + iTop = iFound - 1 + End If + If iItemVarType = vbString Then bFound = ( UCase(pvItem) = UCase(pvList(iFound)) ) Else bFound = ( pvItem = pvList(iFound) ) + Loop Until ( bFound ) Or ( iBottom > iTop ) + End If + If bFound Then + If Not pvReturnValue Then _InList = True Else _InList = pvList(iFound) + End If + End If + End If + + Exit Function + +End Function ' InList V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _InspectPropertyType(poObject As Object, psProperty As String) As String +'Return type of property EVEN WHEN EMPTY ! (Used in date and time controls) + +Dim oInspect1 As Object, oInspect2 As Object, oInspect3 As Object +' On Local Error Resume Next + _InspectPropertyType = "" + Set oInspect1 = CreateUnoService("com.sun.star.script.Invocation") + Set oInspect2 = oInspect1.createInstanceWithArguments(Array(poObject)).IntroSpection + If Not IsNull(oInspect2) Then + Set oInspect3 = oInspect2.getProperty(psProperty, com.sun.star.beans.PropertyConcept.ALL) + If Not IsNull(oInspect3) Then _InspectPropertyType = oInspect3.Type.Name + End If + Set oInspect1 = Nothing : Set oInspect2 = Nothing : Set oInspect3 = Nothing + +End Function ' InspectPropertyType V1.0.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _IsLeft(psString As String, psLeft As String) As Boolean +' Return True if left part of psString = psLeft + +Dim iLength As Integer + iLength = Len(psLeft) + _IsLeft = False + If Len(psString) >= iLength Then + If Left(psString, iLength) = psLeft Then _IsLeft = True + End If + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _IsBinaryType(ByVal lType As Long) As Boolean + + With com.sun.star.sdbc.DataType + Select Case lType + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + _IsBinaryType = True + Case Else + _IsBinaryType = False + End Select + End With + +End Function ' IsBinaryType V1.6.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _IsPseudo(pvObject As Variant, ByVal pvType As Variant) As Boolean +' Test pvObject: does it exist ? +' is the _Type item = one of the proposed pvTypes ? +' does the pseudo-object refer to an existing object (e.g. does the form really exist in the db) ? + +Dim bIsPseudo As Boolean, bPseudoExists As Boolean, vObject As Variant + + If _ErrorHandler() Then On Local Error Goto Exit_False + + _IsPseudo = False + bIsPseudo = False + vObject = pvObject ' To avoid "Object variable not set" error message + Select Case True + Case IsEmpty(vObject) + Case IsNull(vObject) + Case VarType(vObject) <> vbObject + Case Else + With vObject + Select Case True + Case IsEmpty(._Type) + Case IsNull(._Type) + Case ._Type = "" + Case Else + bIsPseudo = _InList(._Type, pvType) + If Not bIsPseudo Then ' If primary type did not succeed, give the subtype a chance + If ._Type = OBJCONTROL Then bIsPseudo = _InList(._SubType, pvType) + End If + End Select + End With + End Select + + If Not bIsPseudo Then Goto Exit_Function + +Dim oDoc As Object, oForms As Variant +Const cstSeparator = "\;" + + bPseudoExists = False + With vObject + Select Case ._Type + Case OBJFORM + If ._Name <> "" Then ' Check validity of form name + Set oDoc = _A2B_.CurrentDocument() + If oDoc.DbConnect = DBCONNECTFORM Then bPseudoExists = True Else bPseudoExists = _InList(._Name, Application._GetAllHierarchicalNames()) + End If + Case OBJDATABASE + If ._DbConnect = DBCONNECTFORM Then bPseudoExists = True Else bPseudoExists = Not IsNull(.Connection) + Case OBJDIALOG + If ._Name <> "" Then ' Check validity of dialog name + bPseudoExists = ( _A2B_.hasItem(COLLALLDIALOGS, ._Name) ) + End If + Case OBJCOLLECTION + bPseudoExists = True + Case OBJCONTROL + If Not IsNull(.ControlModel) And ._Name <> "" Then ' Check validity of control + Set oForms = .ControlModel.Parent + bPseudoExists = ( oForms.hasByName(._Name) ) + End If + Case OBJSUBFORM + If Not IsNull(.DatabaseForm) And ._Name <> "" Then ' Check validity of subform + If .DatabaseForm.ImplementationName = "com.sun.star.comp.forms.ODatabaseForm" Then + Set oForms = .DatabaseForm.Parent + bPseudoExists = ( oForms.hasByName(._Name) ) + End If + End If + Case OBJOPTIONGROUP + bPseudoExists = ( .Count > 0 ) + Case OBJCOMMANDBAR + bPseudoExists = ( Not IsNull(._Window) ) + Case OBJCOMMANDBARCONTROL + bPseudoExists = ( Not IsNull(._ParentCommandBar) ) + Case OBJEVENT + bPseudoExists = ( Not IsNull(._EventSource) ) + Case OBJPROPERTY + bPseudoExists = ( ._Name <> "" ) + Case OBJTABLEDEF + bPseudoExists = ( ._Name <> "" And Not IsNull(.Table) ) + Case OBJQUERYDEF + bPseudoExists = ( ._Name <> "" And Not IsNull(.Query) ) + Case OBJRECORDSET + bPseudoExists = ( Not IsNull(.RowSet) ) + Case OBJFIELD + bPseudoExists = ( ._Name <> "" And Not IsNull(.Column) ) + Case OBJTEMPVAR + If ._Name <> "" Then ' Check validity of tempvar name + bPseudoExists = ( _A2B_.hasItem(COLLTEMPVARS, ._Name) ) + End If + Case Else + End Select + End With + + _IsPseudo = ( bIsPseudo And bPseudoExists ) + +Exit_Function: + Exit Function +Exit_False: + _IsPseudo = False + Goto Exit_Function +End Function ' IsPseudo V1.1.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _IsScalar(ByVal pvArg As Variant, Byval pvType As Variant, ByVal Optional pvValid As Variant) As Boolean +' Check type of pvArg and value in allowed pvValid list + + _IsScalar = False + + If IsArray(pvType) Then + If Not _InList(VarType(pvArg), pvType) Then Exit Function + ElseIf VarType(pvArg) <> pvType Then + If pvType = vbBoolean And VarType(pvArg) = vbLong Then + If pvArg < -1 And pvArg > 0 Then Exit Function ' Special boolean processing because the Not function returns a Long + Else + Exit Function + End If + End If + If Not IsMissing(pvValid) Then + If Not _InList(pvArg, pvValid) Then Exit Function + End If + + _IsScalar = True + +Exit_Function: + Exit Function +End Function ' IsScalar V0.7.5 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _PCase(ByVal psString As String) As String +' Return the proper case representation of argument + +Dim vSubStrings() As Variant, i As Integer, iLen As Integer + vSubStrings = Split(psString, " ") + For i = 0 To UBound(vSubStrings) + iLen = Len(vSubStrings(i)) + If iLen > 1 Then + vSubStrings(i) = UCase(Left(vSubStrings(i), 1)) & LCase(Right(vSubStrings(i), iLen - 1)) + ElseIf iLen = 1 Then + vSubStrings(i) = UCase(vSubStrings(i)) + End If + Next i + _PCase = Join(vSubStrings, " ") + +End Function ' PCase V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _PercentEncode(ByVal psChar As String) As String +' Percent encoding of single psChar character +' https://en.wikipedia.org/wiki/UTF-8 + +Dim lChar As Long, sByte1 As String, sByte2 As String, sByte3 As String + lChar = Asc(psChar) + + Select Case lChar + Case 48 To 57, 65 To 90, 97 To 122 ' 0-9, A-Z, a-z + _PercentEncode = psChar + Case Asc("-"), Asc("."), Asc("_"), Asc("~") + _PercentEncode = psChar + Case Asc("!"), Asc("$"), Asc("&"), Asc("'"), Asc("("), Asc(")"), Asc("*"), Asc("+"), Asc(","), Asc(";"), Asc("=") ' Reserved characters used as delimiters in query strings + _PercentEncode = psChar + Case Asc(" "), Asc("%") + _PercentEncode = "%" & Right("00" & Hex(lChar), 2) + Case 0 To 127 + _PercentEncode = psChar + Case 128 To 2047 + sByte1 = "%" & Right("00" & Hex(Int(lChar / 64) + 192), 2) + sByte2 = "%" & Right("00" & Hex((lChar Mod 64) + 128), 2) + _PercentEncode = sByte1 & sByte2 + Case 2048 To 65535 + sByte1 = "%" & Right("00" & Hex(Int(lChar / 4096) + 224), 2) + sByte2 = "%" & Right("00" & Hex(Int(lChar - (4096 * Int(lChar / 4096))) /64 + 128), 2) + sByte3 = "%" & Right("00" & Hex((lChar Mod 64) + 128), 2) + _PercentEncode = sByte1 & sByte2 & sByte3 + Case Else ' Not supported + _PercentEncode = psChar + End Select + + Exit Function + +End Function ' _PercentEncode V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _ReadFileIntoArray(ByVal psFileName) As Variant +' Loads all lines of a text file into a variant array +' Any error reduces output to an empty array +' Input file name presumed in URL form + +Dim vLines() As Variant, iFile As Integer, sLine As String, iCount1 As Integer, iCount2 As Integer +Const cstMaxLines = 16000 ' +/- the limit of array sizes in Basic + On Local Error GoTo Error_Function + vLines = Array() + _ReadFileIntoArray = Array() + If psFileName = "" Then Exit Function + + iFile = FreeFile() + Open psFileName For Input Access Read Shared As #iFile + iCount1 = 0 + Do While Not Eof(iFile) And iCount1 < cstMaxLines + Line Input #iFile, sLine + iCount1 = iCount1 + 1 + Loop + Close #iFile + + ReDim vLines(0 To iCount1 - 1) ' Reading file twice preferred to ReDim Preserve for performance reasons + iFile = FreeFile() + Open psFileName For Input Access Read Shared As #iFile + iCount2 = 0 + Do While Not Eof(iFile) And iCount2 < iCount1 + Line Input #iFile, vLines(iCount2) + iCount2 = iCount2 + 1 + Loop + Close #iFile + +Exit_Function: + _ReadFileIntoArray() = vLines() + Exit Function +Error_Function: + vLines = Array() + Resume Exit_Function +End Function ' _ReadFileIntoArray V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _RegexSearch(ByRef psString As String _ + , ByVal psRegex As String _ + , Optional ByRef plStart As Long _ + , Optional ByVal bForward As Boolean _ + ) As String +' Search is not case-sensitive +' Return "" if regex not found, otherwise returns the matching string +' plStart = start position of psString to search (starts at 1) +' In output plStart contains the first position of the matching string +' To search again the same or another pattern => plStart = plStart + Len(matching string) + +Dim oTextSearch As Object +Dim vOptions As Variant 'com.sun.star.util.SearchOptions +Dim lEnd As Long, vResult As Object + + _RegexSearch = "" + Set oTextSearch = _A2B_.TextSearch ' UNO XTextSearch service + vOptions = _A2B_.SearchOptions + vOptions.searchString = psRegex ' Pattern to be searched + oTextSearch.setOptions(vOptions) + If IsMissing(plStart) Then plStart = 1 + If plStart <= 0 Or plStart > Len(psString) Then Exit Function + If IsMissing(bForWard) Then bForward = True + If bForward Then + lEnd = Len(psString) + vResult = oTextSearch.searchForward(psString, plStart - 1, lEnd) + Else + lEnd = 1 + vResult = oTextSearch.searchForward(psString, plStart, lEnd - 1) + End If + With vResult + If .subRegExpressions >= 1 Then + ' http://www.openoffice.org/api/docs/common/ref/com/sun/star/util/SearchResult.html + Select Case bForward + Case True + plStart = .startOffset(0) + 1 + lEnd = .endOffset(0) + 1 + Case False + plStart = .endOffset(0) + 1 + lEnd = .startOffset(0) + End Select + _RegexSearch = Mid(psString, plStart, lEnd - plStart) + Else + plStart = 0 + End If + End With + +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _RegisterDialogEventScript(poObject As Object _ + , ByVal psEvent As String _ + , ByVal psListener As String _ + , ByVal psScriptCode As String _ + ) As Boolean +' Register a script event (psEvent) to poObject (Dialog or dialog Control) + +Dim oEvents As Object, sEvent As String, sEventName As String, oEvent As Object + + _RegisterDialogEventScript = False + If Not _hasUNOMethod(poObject, "getEvents") Then Exit Function + +' Remove existing event, if any, then store new script code + Set oEvents = poObject.getEvents() + sEvent = Utils._GetEventName(psEvent) + sEventName = "com.sun.star.awt." & psListener & "::" & sEvent + If oEvents.hasByName(sEventName) Then oEvents.removeByName(sEventName) + Set oEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor") + With oEvent + .ListenerType = psListener + .EventMethod = sEvent + .ScriptType = "Script" ' Better than "Basic" + .ScriptCode = psScriptCode + End With + oEvents.insertByName(sEventName, oEvent) + + _RegisterDialogEventScript = True + +End Function ' _RegisterDialogEventScript V1.8.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _RegisterEventScript(poObject As Object _ + , ByVal psEvent As String _ + , ByVal psListener As String _ + , ByVal psScriptCode As String _ + , ByVal psName As String _ + , Optional ByVal pbExtendName As Boolean _ + ) As Boolean +' Register a script event (psEvent) to poObject (Form, SubForm or Control) + +Dim i As Integer, oEvent As Object, sEvent As String, oParent As Object, iIndex As Integer, sName As String + + _RegisterEventScript = False + If Not _hasUNOMethod(poObject, "getParent") Then Exit Function + + ' Find object internal index i.e. how to reach it via getByIndex() + If IsMissing(pbExtendName) Then pbExtendName = False + Set oParent = poObject.getParent() + iIndex = -1 + For i = 0 To oParent.getCount() - 1 + sName = oParent.getByIndex(i).Name + If (sName = psName) Or (pbExtendName And (sName = "MainForm" Or sName = "Form")) Then + iIndex = i + Exit For + End If + Next i + If iIndex < 0 Then Exit Function + + sEvent = Utils._GetEventName(psEvent) ' Targeted event method + If psScriptCode = "" Then + oParent.revokeScriptEvent(iIndex, psListener, sEvent, "") + Else + Set oEvent = CreateUnoStruct("com.sun.star.script.ScriptEventDescriptor") + With oEvent + .ListenerType = psListener + .EventMethod = sEvent + .ScriptType = "Script" ' Better than "Basic" + .ScriptCode = psScriptCode + End With + oParent.registerScriptEvent(iIndex, oEvent) + End If + _RegisterEventScript = True + +End Function ' _RegisterEventScript V1.7.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _ResetCalledSub(ByVal psSub As String) +' Called in bottom of each public function. _A2B_.CalledSub variable is used for error handling +' Used to trace routine in/outs and to clarify error messages + If IsEmpty(_A2B_) Then Call Application._RootInit() ' Only when Utils module recompiled + With _A2B_ + If .CalledSub = psSub Then .CalledSub = "" + If .MinimalTraceLevel = 1 Then TraceLog(TRACEDEBUG, _GetLabel("Exiting") & " " & psSub & " ...", False) + End With +End Sub ' ResetCalledSub + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _RunScript(ByVal psScript As String, Optional pvArgs() As Variant) As Boolean +' Execute a given script with pvArgs() array of arguments + + On Local Error Goto Error_Function + _RunScript = False + If IsNull(ThisComponent) Then Goto Exit_Function + +Dim oSCriptProvider As Object, oScript As Object, vResult As Variant + + Set oScriptProvider = ThisComponent.ScriptProvider() + Set oScript = oScriptProvider.getScript(psScript) + If IsMissing(pvArgs()) Then pvArgs() = Array() + vResult = oScript.Invoke(pvArgs(), Array(), Array()) + _RunScript = True + +Exit_Function: + Exit Function +Error_Function: + _RunScript = False + Goto Exit_Function +End Function + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Sub _SetCalledSub(ByVal psSub As String) +' Called in top of each public function. +' Used to trace routine in/outs and to clarify error messages + If IsEmpty(_A2B_) Then Call Application._RootInit() ' First use of Access2Base in current LibO/AOO session + With _A2B_ + If .CalledSub = "" Then + .CalledSub = psSub + .LastErrorCode = 0 + .LastErrorLevel = "" + .ErrorText = "" + .ErrorLongText = "" + End If + If .MinimalTraceLevel = 1 Then TraceLog(TRACEDEBUG, _GetLabel("Entering") & " " & psSub & " ...", False) + End With +End Sub ' SetCalledSub + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _Surround(ByVal psName As String) As String +' Return [Name] if Name contains spaces +' Return [Name1].[Name2].[Name3] if Name1.Name2.Name3 contains dots + +Const cstSquareOpen = "[" +Const cstSquareClose = "]" +Const cstDot = "." +Dim sName As String + + If InStr(psName, ".") > 0 Then + sName = Join(Split(psName, cstDot), cstSquareClose & cstDot & cstSquareOpen) + _Surround = cstSquareOpen & sName & cstSquareClose + ElseIf InStr(psName, " ") > 0 Then + _Surround = cstSquareOpen & psName & cstSquareClose + Else + _Surround = psName + End If + +End Function ' Surround + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _Trim(ByVal psString As String) As String +' Remove leading and trailing spaces, remove surrounding square brackets, replace tabs by spaces +Const cstSquareOpen = "[" +Const cstSquareClose = "]" +Dim sTrim As String + + sTrim = Trim(Replace(psString, vbTab, " ")) + _Trim = sTrim + If Len(sTrim) <= 2 Then Exit Function + + If Left(sTrim, 1) = cstSquareOpen Then + If Right(sTrim, 1) = cstSquareClose Then + _Trim = Mid(sTrim, 2, Len(sTrim) - 2) + End If + End If +End Function ' Trim V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Public Function _TrimArray(pvArray As Variant) As Variant +' Remove empty strings from strings array + +Dim sTrim As String, vTrim() As Variant, i As Integer, j As Integer, iCount As Integer + vTrim = Null + If Not IsArray(pvArray) Then + If Len(Trim(pvArray)) > 0 Then vTrim = Array(pvArray) Else vTrim = Array() + ElseIf UBound(pvArray) < LBound(pvArray) Then ' Array empty + vTrim = Array() + Else + iCount = 0 + For i = LBound(pvArray) To UBound(pvArray) + If Len(Trim(pvArray(i))) = 0 Then iCount = iCount + 1 + Next i + If iCount = 0 Then + vTrim() = pvArray() + ElseIf iCount = UBound(pvArray) - LBound(pvArray) + 1 Then ' Array empty or all blanks + vTrim() = Array() + Else + ReDim vTrim(LBound(pvArray) To UBound(pvArray) - iCount) + j = 0 + For i = LBound(pvArray) To UBound(pvArray) + If Len(Trim(pvArray(i))) > 0 Then + vTrim(j) = pvArray(i) + j = j + 1 + End If + Next i + End If + End If + + _TrimArray() = vTrim() + +End Function ' TrimArray V0.9.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _UpdateResultSetColumnValue(piRDBMS As Integer _ + , poResultSet As Object _ + , ByVal piColIndex As Integer _ + , ByVal pvValue As Variant _ + ) As Boolean +REM store the pvValue for the column specified by ColIndex +REM get type name from metadata + +Dim iType As Integer, vDateTime As Variant, oValue As Object +Dim bNullable As Boolean, lSize As Long, iValueType As Integer, sValueTypeName As String +Const cstMaxTextLength = 65535 +Const cstMaxBinlength = 2 * 65535 + + On Local Error Goto 0 ' Disable error handler + _UpdateResultSetColumnValue = False + With com.sun.star.sdbc.DataType + iType = poResultSet.MetaData.getColumnType(piColIndex) + iValueType = VarType(pvValue) + sValueTypeName = UCase(poResultSet.MetaData.getColumnTypeName(piColIndex)) + bNullable = ( poResultSet.MetaData.IsNullable(piColIndex) = com.sun.star.sdbc.ColumnValue.NULLABLE ) + + If bNullable And IsNull(pvValue) Then + poResultSet.updateNull(piColIndex) + Else + Select Case iType + Case .ARRAY, .DISTINCT, .OBJECT, .OTHER, .REF, .SQLNULL, .STRUCT + poResultSet.updateNull(piColIndex) + Case .BINARY, .VARBINARY, .LONGVARBINARY, .BLOB + poResultSet.updateBytes(piColIndex, pvValue) + Case .BIT, .BOOLEAN : poResultSet.updateBoolean(piColIndex, pvValue) + Case .DATE : vDateTime = CreateUnoStruct("com.sun.star.util.Date") + vDateTime.Year = Year(pvValue) + vDateTime.Month = Month(pvValue) + vDateTime.Day = Day(pvValue) + poResultSet.updateDate(piColIndex, vDateTime) + Case .DECIMAL, .NUMERIC : poResultSet.updateDouble(piColIndex, pvValue) + Case .DOUBLE, .REAL : poResultSet.updateDouble(piColIndex, pvValue) + Case .FLOAT : poResultSet.updateFloat(piColIndex, pvValue) + Case .INTEGER, .SMALLINT : poResultSet.updateInt(piColIndex, pvValue) + Case .BIGINT : poResultSet.updateLong(piColIndex, pvValue) + Case .DECIMAL, .NUMERIC : poResultSet.updateDouble(piColIndex, pvValue) + Case .TINYINT : poResultSet.updateShort(piColIndex, pvValue) + Case .CHAR, .VARCHAR, .LONGVARCHAR, .CLOB + If piRDBMS = DBMS_SQLITE And InStr(sValueTypeName, "BINARY") > 0 Then ' Sqlite exception ... ! + poResultSet.updateBytes(piColIndex, pvValue) + Else + poResultSet.updateString(piColIndex, pvValue) + End If + Case .TIME : vDateTime = CreateUnoStruct("com.sun.star.util.Time") + vDateTime.Hours = Hour(pvValue) + vDateTime.Minutes = Minute(pvValue) + vDateTime.Seconds = Second(pvValue) + 'vDateTime.HundredthSeconds = 0 + poResultSet.updateTime(piColIndex, vDateTime) + Case .TIMESTAMP : vDateTime = CreateUnoStruct("com.sun.star.util.DateTime") + vDateTime.Year = Year(pvValue) + vDateTime.Month = Month(pvValue) + vDateTime.Day = Day(pvValue) + vDateTime.Hours = Hour(pvValue) + vDateTime.Minutes = Minute(pvValue) + vDateTime.Seconds = Second(pvValue) + 'vDateTime.HundredthSeconds = 0 + poResultSet.updateTimestamp(piColIndex, vDateTime) + Case Else + If bNullable Then poResultSet.updateNull(piColIndex) + End Select + End If + + End With + + _UpdateResultSetColumnValue = True + +End Function ' UpdateResultSetColumnValue V 1.6.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _URLEncode(ByVal psToEncode As String) As String +' http://www.w3schools.com/tags/ref_urlencode.asp +' http://xkr.us/articles/javascript/encode-compare/ +' http://tools.ietf.org/html/rfc3986 + +Dim sEncoded As String, sChar As String +Dim lCurrentChar As Long, bQuestionMark As Boolean + + sEncoded = "" + bQuestionMark = False + For lCurrentChar = 1 To Len(psToEncode) + sChar = Mid(psToEncode, lCurrentChar, 1) + Select Case sChar + Case " ", "%" + sEncoded = sEncoded & _PercentEncode(sChar) + Case "?" ' Is it the first "?" ? + If bQuestionMark Then ' "?" introduces in a URL the arguments part + sEncoded = sEncoded & _PercentEncode(sChar) + Else + sEncoded = sEncoded & sChar + bQuestionMark = True + End If + Case "\" + If bQuestionMark Then + sEncoded = sEncoded & _PercentEncode(sChar) + Else + sEncoded = sEncoded & "/" ' If Windows file naming ... + End If + Case Else + If bQuestionMark Then + sEncoded = sEncoded & _PercentEncode(sChar) + Else + sEncoded = sEncoded & _UTF8Encode(sChar) ' Because IE does not support %encoding in first part of URL + End If + End Select + Next lCurrentChar + + _URLEncode = sEncoded + +End Function ' _URLEncode V1.4.0 + +REM ----------------------------------------------------------------------------------------------------------------------- +Private Function _UTF8Encode(ByVal psChar As String) As String +' &-encoding of single psChar character (e.g. "é" becomes "&eacute;" or numeric equivalent +' http://www.w3schools.com/charsets/ref_html_utf8.asp + + Select Case psChar + Case """" : _UTF8Encode = "&quot;" + Case "&" : _UTF8Encode = "&amp;" + Case "<" : _UTF8Encode = "&lt;" + Case ">" : _UTF8Encode = "&gt;" + Case "'" : _UTF8Encode = "&apos;" + Case ":", "/", "?", "#", "[", "]", "@" ' Reserved characters + _UTF8Encode = psChar + Case Chr(13) : _UTF8Encode = "" ' Carriage return + Case Chr(10) : _UTF8Encode = "<br>" ' Line Feed + Case < Chr(126) : _UTF8Encode = psChar + Case "€" : _UTF8Encode = "&euro;" + Case Else : _UTF8Encode = "&#" & Asc(psChar) & ";" + End Select + + Exit Function + +End Function ' _UTF8Encode V1.4.0 + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/_License.xba b/wizards/source/access2base/_License.xba new file mode 100644 index 000000000..fa8a5743b --- /dev/null +++ b/wizards/source/access2base/_License.xba @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="_License" script:language="StarBasic"> +' Copyright 2012-2017 Jean-Pierre LEDURE + +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +' Access2Base is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +' Access2Base is free software; you can redistribute it and/or modify it under the terms of either (at your option): +' +' 1) The Mozilla Public License, v. 2.0. If a copy of the MPL was not +' distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/ . +' +' 2) The GNU Lesser General Public License as published by +' the Free Software Foundation, either version 3 of the License, or +' (at your option) any later version. If a copy of the LGPL was not +' distributed with this file, see http://www.gnu.org/licenses/ . + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/acConstants.xba b/wizards/source/access2base/acConstants.xba new file mode 100644 index 000000000..9678a5b20 --- /dev/null +++ b/wizards/source/access2base/acConstants.xba @@ -0,0 +1,394 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="acConstants" script:language="StarBasic"> +REM ======================================================================================================================= +REM === The Access2Base library is a part of the LibreOffice project. === +REM === Full documentation is available on http://www.access2base.com === +REM ======================================================================================================================= + +Option Explicit + +REM Access2Base ----------------------------------------------------- +Global Const Access2Base_Version = "7.0.0" ' Alignment on LibreOffice versions + +REM AcCloseSave +REM ----------------------------------------------------------------- +Global Const acSaveNo = 2 +Global Const acSavePrompt = 0 +Global Const acSaveYes = 1 + +REM AcFormView +REM ----------------------------------------------------------------- +Global Const acDesign = 1 +Global Const acNormal = 0 +Global Const acPreview = 2 + +REM AcFormOpenDataMode +REM ----------------------------------------------------------------- +Global Const acFormAdd = 0 +Global Const acFormEdit = 1 +Global Const acFormPropertySettings = -1 +Global Const acFormReadOnly = 2 + +REM acView +REM ----------------------------------------------------------------- +Global Const acViewDesign = 1 +Global Const acViewNormal = 0 +Global Const acViewPreview = 2 + +REM acOpenDataMode +REM ----------------------------------------------------------------- +Global Const acAdd = 0 +Global Const acEdit = 1 +Global Const acReadOnly = 2 + +REM AcObjectType +REM ----------------------------------------------------------------- +Global Const acDefault = -1 +Global Const acDiagram = 8 +Global Const acForm = 2 +Global Const acQuery = 1 +Global Const acReport = 3 +Global Const acTable = 0 +' Unexisting in MS/Access +Global Const acBasicIDE = 101 +Global Const acDatabaseWindow = 102 +Global Const acDocument = 111 +Global Const acWelcome = 112 +' Subtype if acDocument +Global Const docWriter = "Writer" +Global Const docCalc = "Calc" +Global Const docImpress = "Impress" +Global Const docDraw = "Draw" +Global Const docMath = "Math" + +REM AcWindowMode +REM ----------------------------------------------------------------- +Global Const acDialog = 3 +Global Const acHidden = 1 +Global Const acIcon = 2 +Global Const acWindowNormal = 0 + +REM VarType constants +REM ----------------------------------------------------------------- +Global Const vbEmpty = 0 +Global Const vbNull = 1 +Global Const vbInteger = 2 +Global Const vbLong = 3 +Global Const vbSingle = 4 +Global Const vbDouble = 5 +Global Const vbCurrency = 6 +Global Const vbDate = 7 +Global Const vbString = 8 +Global Const vbObject = 9 +Global Const vbBoolean = 11 +Global Const vbVariant = 12 +Global Const vbByte = 17 +Global Const vbUShort = 18 +Global Const vbULong = 19 +Global Const vbBigint = 35 +Global Const vbDecimal = 37 +Global Const vbArray = 8192 + +REM MsgBox constants +REM ----------------------------------------------------------------- +Global Const vbOKOnly = 0 ' OK button only (default) +Global Const vbOKCancel = 1 ' OK and Cancel buttons +Global Const vbAbortRetryIgnore = 2 ' Abort, Retry, and Ignore buttons +Global Const vbYesNoCancel = 3 ' Yes, No, and Cancel buttons +Global Const vbYesNo = 4 ' Yes and No buttons +Global Const vbRetryCancel = 5 ' Retry and Cancel buttons +Global Const vbCritical = 16 ' Critical message +Global Const vbQuestion = 32 ' Warning query +Global Const vbExclamation = 48 ' Warning message +Global Const vbInformation = 64 ' Information message +Global Const vbDefaultButton1 = 128 ' First button is default (default) (VBA: 0) +Global Const vbDefaultButton2 = 256 ' Second button is default +Global Const vbDefaultButton3 = 512 ' Third button is default +Global Const vbApplicationModal = 0 ' Application modal message box (default) +REM MsgBox Return Values +REM ----------------------------------------------------------------- +Global Const vbOK = 1 ' OK button pressed +Global Const vbCancel = 2 ' Cancel button pressed +Global Const vbAbort = 3 ' Abort button pressed +Global Const vbRetry = 4 ' Retry button pressed +Global Const vbIgnore = 5 ' Ignore button pressed +Global Const vbYes = 6 ' Yes button pressed +Global Const vbNo = 7 ' No button pressed + +REM Dialogs Return Values +REM ------------------------------------------------------------------ +Global Const dlgOK = 1 ' OK button pressed +Global Const dlgCancel = 0 ' Cancel button pressed + +REM Control Types +REM ----------------------------------------------------------------- +Global Const acCheckBox = 5 +Global Const acComboBox = 7 +Global Const acCommandButton = 2 : Global Const acToggleButton = 122 +Global Const acCurrencyField = 18 +Global Const acDateField = 15 +Global Const acFileControl = 12 +Global Const acFixedLine = 24 ' FREE ENTRY (USEFUL IN DIALOGS) +Global Const acFixedText = 10 : Global Const acLabel = 10 +Global Const acFormattedField = 1 ' FREE ENTRY TAKEN TO NOT CONFUSE WITH acTextField +Global Const acGridControl = 11 +Global Const acGroupBox = 8 : Global Const acOptionGroup = 8 +Global Const acHiddenControl = 13 +Global Const acImageButton = 4 +Global Const acImageControl = 14 : Global Const acImage = 14 +Global Const acListBox = 6 +Global Const acNavigationBar = 22 +Global Const acNumericField = 17 +Global Const acPatternField = 19 +Global Const acProgressBar = 23 ' FREE ENTRY (USEFUL IN DIALOGS) +Global Const acRadioButton = 3 : Global Const acOptionButton = 3 +Global Const acScrollBar = 20 +Global Const acSpinButton = 21 +Global Const acSubform = 112 +Global Const acTextField = 9 : Global Const acTextBox = 9 +Global Const acTimeField = 16 + +REM AcRecord +REM ----------------------------------------------------------------- +Global Const acFirst = 2 +Global Const acGoTo = 4 +Global Const acLast = 3 +Global Const acNewRec = 5 +Global Const acNext = 1 +Global Const acPrevious = 0 + +REM FindRecord +REM ----------------------------------------------------------------- +Global Const acAnywhere = 0 +Global Const acEntire = 1 +Global Const acStart = 2 +Global Const acDown = 1 +Global Const acSearchAll = 2 +Global Const acUp = 0 +Global Const acAll = 0 +Global Const acCurrent = -1 + +REM AcDataObjectType +REM ----------------------------------------------------------------- +Global Const acActiveDataObject = -1 +Global Const acDataForm = 2 +Global Const acDataQuery = 1 +Global Const acDataServerView = 7 +Global Const acDataStoredProcedure = 9 +Global Const acDataTable = 0 + +REM AcQuitOption +REM ----------------------------------------------------------------- +Global Const acQuitPrompt = 0 +Global Const acQuitSaveAll = 1 +Global Const acQuitSaveNone = 2 + +REM AcCommand +REM ----------------------------------------------------------------- +Global Const acCmdAboutMicrosoftAccess = 35 +Global Const acCmdAboutOpenOffice = 35 +Global Const acCmdAboutLibreOffice = 35 +Global Const acCmdVisualBasicEditor = 525 +Global Const acCmdBringToFront = 52 +Global Const acCmdClose = 58 +Global Const acCmdToolbarsCustomize = 165 +Global Const acCmdChangeToCommandButton = 501 +Global Const acCmdChangeToCheckBox = 231 +Global Const acCmdChangeToComboBox = 230 +Global Const acCmdChangeToTextBox = 227 +Global Const acCmdChangeToLabel = 228 +Global Const acCmdChangeToImage = 234 +Global Const acCmdChangeToListBox = 229 +Global Const acCmdChangeToOptionButton = 233 +Global Const acCmdCopy = 190 +Global Const acCmdCut = 189 +Global Const acCmdCreateRelationship = 150 +Global Const acCmdDelete = 337 +Global Const acCmdDatabaseProperties = 256 +Global Const acCmdSQLView = 184 +Global Const acCmdRemove = 366 +Global Const acCmdDesignView = 183 +Global Const acCmdFormView = 281 +Global Const acCmdNewObjectForm = 136 +Global Const acCmdNewObjectTable = 134 +Global Const acCmdNewObjectView = 350 +Global Const acCmdOpenDatabase = 25 +Global Const acCmdNewObjectQuery = 135 +Global Const acCmdShowAllRelationships = 149 +Global Const acCmdNewObjectReport = 137 +Global Const acCmdSelectAll = 333 +Global Const acCmdRemoveTable = 84 +Global Const acCmdOpenTable = 221 +Global Const acCmdRename = 143 +Global Const acCmdDeleteRecord = 223 +Global Const acCmdApplyFilterSort = 93 +Global Const acCmdSnapToGrid = 62 +Global Const acCmdViewGrid = 63 +Global Const acCmdInsertHyperlink = 259 +Global Const acCmdMaximumRecords = 508 +Global Const acCmdObjectBrowser = 200 +Global Const acCmdPaste = 191 +Global Const acCmdPasteSpecial = 64 +Global Const acCmdPrint = 340 +Global Const acCmdPrintPreview = 54 +Global Const acCmdSaveRecord = 97 +Global Const acCmdFind = 30 +Global Const acCmdUndo = 292 +Global Const acCmdRefresh = 18 +Global Const acCmdRemoveFilterSort = 144 +Global Const acCmdRunMacro = 31 +Global Const acCmdSave = 20 +Global Const acCmdSaveAs = 21 +Global Const acCmdSelectAllRecords = 109 +Global Const acCmdSendToBack = 53 +Global Const acCmdSortDescending = 164 +Global Const acCmdSortAscending = 163 +Global Const acCmdTabOrder = 41 +Global Const acCmdDatasheetView = 282 +Global Const acCmdZoomSelection = 371 + +REM AcSendObjectType +REM ----------------------------------------------------------------- +Global Const acSendForm = 2 +Global Const acSendNoObject = -1 +Global Const acSendQuery = 1 +Global Const acSendReport = 3 +Global Const acSendTable = 0 + +REM AcOutputObjectType +REM ----------------------------------------------------------------- +Global Const acOutputTable = 0 +Global Const acOutputQuery = 1 +Global Const acOutputForm = 2 +Global Const acOutputArray = -1 + +REM AcEncoding +REM ----------------------------------------------------------------- +Global Const acUTF8Encoding = 76 + +REM AcFormat +REM ----------------------------------------------------------------- +Global Const acFormatPDF = "writer_pdf_Export" +Global Const acFormatODT = "writer8" +Global Const acFormatDOC = "MS Word 97" +Global Const acFormatHTML = "HTML" +Global Const acFormatODS = "calc8" +Global Const acFormatXLS = "MS Excel 97" +Global Const acFormatXLSX = "Calc MS Excel 2007 XML" +Global Const acFormatTXT = "Text - txt - csv (StarCalc)" + +REM AcExportQuality +REM ----------------------------------------------------------------- +Global Const acExportQualityPrint = 0 +Global Const acExportQualityScreen = 1 + +REM AcSysCmdAction +REM ----------------------------------------------------------------- +Global Const acSysCmdAccessDir = 9 +Global Const acSysCmdAccessVer = 7 +Global Const acSysCmdClearHelpTopic = 11 +Global Const acSysCmdClearStatus = 5 +Global Const acSysCmdGetObjectState = 10 +Global Const acSysCmdGetWorkgroupFile = 13 +Global Const acSysCmdIniFile = 8 +Global Const acSysCmdInitMeter = 1 +Global Const acSysCmdProfile = 12 +Global Const acSysCmdRemoveMeter = 3 +Global Const acSysCmdRuntime = 6 +Global Const acSysCmdSetStatus = 4 +Global Const acSysCmdUpdateMeter = 2 + +REM Type property +REM ----------------------------------------------------------------- +Global Const dbBigInt = 16 +Global Const dbBinary = 9 +Global Const dbBoolean = 1 +Global Const dbByte = 2 +Global Const dbChar = 18 +Global Const dbCurrency = 5 +Global Const dbDate = 8 +Global Const dbDecimal = 20 +Global Const dbDouble = 7 +Global Const dbFloat = 21 +Global Const dbGUID = 15 +Global Const dbInteger = 3 +Global Const dbLong = 4 +Global Const dbLongBinary = 11 ' (OLE Object) +Global Const dbMemo= 12 +Global Const dbNumeric = 19 +Global Const dbSingle = 6 +Global Const dbText = 10 +Global Const dbTime = 22 +Global Const dbTimeStamp = 23 +Global Const dbVarBinary = 17 +Global Const dbUndefined = -1 + +REM Attributes property +REM ----------------------------------------------------------------- +Global Const dbAutoIncrField = 16 +Global Const dbDescending = 1 +Global Const dbFixedField = 1 +Global Const dbHyperlinkField = 32768 +Global Const dbSystemField = 8192 +Global Const dbUpdatableField = 32 +Global Const dbVariableField = 2 + +REM OpenRecordset +REM ----------------------------------------------------------------- +Global Const dbOpenForwardOnly = 8 +Global Const dbSQLPassThrough = 64 +Global Const dbReadOnly = 4 + +REM Query types +REM ----------------------------------------------------------------- +Global Const dbQAction = 240 +Global Const dbQAppend = 64 +Global Const dbQDDL = 4 '96 +Global Const dbQDelete = 32 +Global Const dbQMakeTable = 128 '80 +Global Const dbQSelect = 0 +Global Const dbQSetOperation = 8 '128 +Global Const dbQSQLPassThrough = 1 '112 +Global Const dbQUpdate = 16 '48 + +REM Edit mode +REM ----------------------------------------------------------------- +Global Const dbEditNone = 0 +Global Const dbEditInProgress = 1 +Global Const dbEditAdd = 2 + +REM Toolbars +REM ----------------------------------------------------------------- +Global Const msoBarTypeNormal = 0 ' Usual toolbar +Global Const msoBarTypeMenuBar = 1 ' Menu bar +Global Const msoBarTypePopup = 2 ' Shortcut menu +Global Const msoBarTypeStatusBar = 11 ' Status bar +Global Const msoBarTypeFloater = 12 ' Floating window + +Global Const msoControlButton = 1 ' Command button +Global Const msoControlPopup = 10 ' Popup, submenu + +REM New Lines +REM ----------------------------------------------------------------- +Public Function vbCr() As String : vbCr = Chr(13) : End Function +Public Function vbLf() As String : vbLf = Chr(10) : End Function +Public Function vbNewLine() As String +Const cstWindows = 1 + If GetGuiType() = cstWindows Then vbNewLine = vbCR & vbLF Else vbNewLine = vbLF +End Function ' vbNewLine V1.4.0 +Public Function vbTab() As String : vbTab = Chr(9) : End Function + +REM Module types +REM ----------------------------------------------------------------- +Global Const acClassModule = 1 +Global Const acStandardModule = 0 + +REM (Module) procedure types +REM ----------------------------------------------------------------- +Global Const vbext_pk_Get = 1 ' A Property Get procedure +Global Const vbext_pk_Let = 2 ' A Property Let procedure +Global Const vbext_pk_Proc = 0 ' A Sub or Function procedure +Global Const vbext_pk_Set = 3 ' A Property Set procedure + +</script:module>
\ No newline at end of file diff --git a/wizards/source/access2base/access2base.py b/wizards/source/access2base/access2base.py new file mode 100644 index 000000000..d68cd87aa --- /dev/null +++ b/wizards/source/access2base/access2base.py @@ -0,0 +1,1474 @@ +# -*- coding: utf-8 -*- + +# Copyright 2012-2020 Jean-Pierre LEDURE + +# ===================================================================================================================== +# === The Access2Base library is a part of the LibreOffice project. === +# === Full documentation is available on http://www.access2base.com === +# ===================================================================================================================== + +# Access2Base is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# Access2Base is free software; you can redistribute it and/or modify it under the terms of either (at your option): + +# 1) The Mozilla Public License, v. 2.0. If a copy of the MPL was not +# distributed with this file, you can obtain one at http://mozilla.org/MPL/2.0/ . + +# 2) The GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. If a copy of the LGPL was not +# distributed with this file, see http://www.gnu.org/licenses/ . + +""" +The access2base.py module implements an interface between Python (user) scripts and the Access2Base Basic library. + +Usage: + from access2base import * +Additionally, if Python and LibreOffice are started in separate processes: + If LibreOffice started from console ... (example for Linux) + ./soffice --accept='socket,host=localhost,port=2019;urp;' + then insert next statement + A2BConnect(hostname = 'localhost', port = 2019) + +Specific documentation about Access2Base and Python: + http://www.access2base.com/access2base.html#%5B%5BAccess2Base%20and%20Python%5D%5D +""" + +import uno +XSCRIPTCONTEXT = uno + +from platform import system as _opsys +import datetime, os, sys, traceback + +_LIBRARY = '' # Should be 'Access2Base' or 'Access2BaseDev' +_VERSION = '6.4' # Actual version number +_WRAPPERMODULE = 'Python' # Module name in the Access2Base library containing Python interfaces + +# CallByName types +_vbGet, _vbLet, _vbMethod, _vbSet, _vbUNO = 2, 4, 1, 8, 16 + + +class _Singleton(type): + """ + A Singleton design pattern + Credits: « Python in a Nutshell » by Alex Martelli, O'Reilly + """ + instances = {} + def __call__(cls, *args, **kwargs): + if cls not in cls.instances: + cls.instances[cls] = super(_Singleton, cls).__call__(*args, **kwargs) + return cls.instances[cls] + + +class acConstants(object, metaclass = _Singleton): + """ + VBA constants used in the Access2Base API. + Values derived from MSAccess, except when conflicts + """ + # Python special constants (used in the protocol between Python and Basic) + # ----------------------------------------------------------------- + Empty = '+++EMPTY+++' + Null = '+++NULL+++' + Missing = '+++MISSING+++' + FromIsoFormat = '%Y-%m-%d %H:%M:%S' # To be used with datetime.datetime.strptime() + + # AcCloseSave + # ----------------------------------------------------------------- + acSaveNo = 2 + acSavePrompt = 0 + acSaveYes = 1 + + # AcFormView + # ----------------------------------------------------------------- + acDesign = 1 + acNormal = 0 + acPreview = 2 + + # AcFormOpenDataMode + # ----------------------------------------------------------------- + acFormAdd = 0 + acFormEdit = 1 + acFormPropertySettings = -1 + acFormReadOnly = 2 + + # acView + # ----------------------------------------------------------------- + acViewDesign = 1 + acViewNormal = 0 + acViewPreview = 2 + + # acOpenDataMode + # ----------------------------------------------------------------- + acAdd = 0 + acEdit = 1 + acReadOnly = 2 + + # AcObjectType + # ----------------------------------------------------------------- + acDefault = -1 + acDiagram = 8 + acForm = 2 + acQuery = 1 + acReport = 3 + acTable = 0 + # Unexisting in MS/Access + acBasicIDE = 101 + acDatabaseWindow = 102 + acDocument = 111 + acWelcome = 112 + # Subtype if acDocument + docWriter = "Writer" + docCalc = "Calc" + docImpress = "Impress" + docDraw = "Draw" + docMath = "Math" + + # AcWindowMode + # ----------------------------------------------------------------- + acDialog = 3 + acHidden = 1 + acIcon = 2 + acWindowNormal = 0 + + # VarType constants + # ----------------------------------------------------------------- + vbEmpty = 0 + vbNull = 1 + vbInteger = 2 + vbLong = 3 + vbSingle = 4 + vbDouble = 5 + vbCurrency = 6 + vbDate = 7 + vbString = 8 + vbObject = 9 + vbBoolean = 11 + vbVariant = 12 + vbByte = 17 + vbUShort = 18 + vbULong = 19 + vbBigint = 35 + vbDecimal = 37 + vbArray = 8192 + + # MsgBox constants + # ----------------------------------------------------------------- + vbOKOnly = 0 # OK button only (default) + vbOKCancel = 1 # OK and Cancel buttons + vbAbortRetryIgnore = 2 # Abort, Retry, and Ignore buttons + vbYesNoCancel = 3 # Yes, No, and Cancel buttons + vbYesNo = 4 # Yes and No buttons + vbRetryCancel = 5 # Retry and Cancel buttons + vbCritical = 16 # Critical message + vbQuestion = 32 # Warning query + vbExclamation = 48 # Warning message + vbInformation = 64 # Information message + vbDefaultButton1 = 128 # First button is default (default) (VBA: 0) + vbDefaultButton2 = 256 # Second button is default + vbDefaultButton3 = 512 # Third button is default + vbApplicationModal = 0 # Application modal message box (default) + # MsgBox Return Values + # ----------------------------------------------------------------- + vbOK = 1 # OK button pressed + vbCancel = 2 # Cancel button pressed + vbAbort = 3 # Abort button pressed + vbRetry = 4 # Retry button pressed + vbIgnore = 5 # Ignore button pressed + vbYes = 6 # Yes button pressed + vbNo = 7 # No button pressed + + # Dialogs Return Values + # ------------------------------------------------------------------ + dlgOK = 1 # OK button pressed + dlgCancel = 0 # Cancel button pressed + + # Control Types + # ----------------------------------------------------------------- + acCheckBox = 5 + acComboBox = 7 + acCommandButton = 2 + acToggleButton = 122 + acCurrencyField = 18 + acDateField = 15 + acFileControl = 12 + acFixedLine = 24 # FREE ENTRY (USEFUL IN DIALOGS) + acFixedText = 10 + acLabel = 10 + acFormattedField = 1 # FREE ENTRY TAKEN TO NOT CONFUSE WITH acTextField + acGridControl = 11 + acGroupBox = 8 + acOptionGroup = 8 + acHiddenControl = 13 + acImageButton = 4 + acImageControl = 14 + acImage = 14 + acListBox = 6 + acNavigationBar = 22 + acNumericField = 17 + acPatternField = 19 + acProgressBar = 23 # FREE ENTRY (USEFUL IN DIALOGS) + acRadioButton = 3 + acOptionButton = 3 + acScrollBar = 20 + acSpinButton = 21 + acSubform = 112 + acTextField = 9 + acTextBox = 9 + acTimeField = 16 + + # AcRecord + # ----------------------------------------------------------------- + acFirst = 2 + acGoTo = 4 + acLast = 3 + acNewRec = 5 + acNext = 1 + acPrevious = 0 + + # FindRecord + # ----------------------------------------------------------------- + acAnywhere = 0 + acEntire = 1 + acStart = 2 + acDown = 1 + acSearchAll = 2 + acUp = 0 + acAll = 0 + acCurrent = -1 + + # AcDataObjectType + # ----------------------------------------------------------------- + acActiveDataObject = -1 + acDataForm = 2 + acDataQuery = 1 + acDataServerView = 7 + acDataStoredProcedure = 9 + acDataTable = 0 + + # AcQuitOption + # ----------------------------------------------------------------- + acQuitPrompt = 0 + acQuitSaveAll = 1 + acQuitSaveNone = 2 + + # AcCommand + # ----------------------------------------------------------------- + acCmdAboutMicrosoftAccess = 35 + acCmdAboutOpenOffice = 35 + acCmdAboutLibreOffice = 35 + acCmdVisualBasicEditor = 525 + acCmdBringToFront = 52 + acCmdClose = 58 + acCmdToolbarsCustomize = 165 + acCmdChangeToCommandButton = 501 + acCmdChangeToCheckBox = 231 + acCmdChangeToComboBox = 230 + acCmdChangeToTextBox = 227 + acCmdChangeToLabel = 228 + acCmdChangeToImage = 234 + acCmdChangeToListBox = 229 + acCmdChangeToOptionButton = 233 + acCmdCopy = 190 + acCmdCut = 189 + acCmdCreateRelationship = 150 + acCmdDelete = 337 + acCmdDatabaseProperties = 256 + acCmdSQLView = 184 + acCmdRemove = 366 + acCmdDesignView = 183 + acCmdFormView = 281 + acCmdNewObjectForm = 136 + acCmdNewObjectTable = 134 + acCmdNewObjectView = 350 + acCmdOpenDatabase = 25 + acCmdNewObjectQuery = 135 + acCmdShowAllRelationships = 149 + acCmdNewObjectReport = 137 + acCmdSelectAll = 333 + acCmdRemoveTable = 84 + acCmdOpenTable = 221 + acCmdRename = 143 + acCmdDeleteRecord = 223 + acCmdApplyFilterSort = 93 + acCmdSnapToGrid = 62 + acCmdViewGrid = 63 + acCmdInsertHyperlink = 259 + acCmdMaximumRecords = 508 + acCmdObjectBrowser = 200 + acCmdPaste = 191 + acCmdPasteSpecial = 64 + acCmdPrint = 340 + acCmdPrintPreview = 54 + acCmdSaveRecord = 97 + acCmdFind = 30 + acCmdUndo = 292 + acCmdRefresh = 18 + acCmdRemoveFilterSort = 144 + acCmdRunMacro = 31 + acCmdSave = 20 + acCmdSaveAs = 21 + acCmdSelectAllRecords = 109 + acCmdSendToBack = 53 + acCmdSortDescending = 164 + acCmdSortAscending = 163 + acCmdTabOrder = 41 + acCmdDatasheetView = 282 + acCmdZoomSelection = 371 + + # AcSendObjectType + # ----------------------------------------------------------------- + acSendForm = 2 + acSendNoObject = -1 + acSendQuery = 1 + acSendReport = 3 + acSendTable = 0 + + # AcOutputObjectType + # ----------------------------------------------------------------- + acOutputTable = 0 + acOutputQuery = 1 + acOutputForm = 2 + acOutputArray = -1 + + # AcEncoding + # ----------------------------------------------------------------- + acUTF8Encoding = 76 + + # AcFormat + # ----------------------------------------------------------------- + acFormatPDF = "writer_pdf_Export" + acFormatODT = "writer8" + acFormatDOC = "MS Word 97" + acFormatHTML = "HTML" + acFormatODS = "calc8" + acFormatXLS = "MS Excel 97" + acFormatXLSX = "Calc MS Excel 2007 XML" + acFormatTXT = "Text - txt - csv (StarCalc)" + + # AcExportQuality + # ----------------------------------------------------------------- + acExportQualityPrint = 0 + acExportQualityScreen = 1 + + # AcSysCmdAction + # ----------------------------------------------------------------- + acSysCmdAccessDir = 9 + acSysCmdAccessVer = 7 + acSysCmdClearHelpTopic = 11 + acSysCmdClearStatus = 5 + acSysCmdGetObjectState = 10 + acSysCmdGetWorkgroupFile = 13 + acSysCmdIniFile = 8 + acSysCmdInitMeter = 1 + acSysCmdProfile = 12 + acSysCmdRemoveMeter = 3 + acSysCmdRuntime = 6 + acSysCmdSetStatus = 4 + acSysCmdUpdateMeter = 2 + + # Type property + # ----------------------------------------------------------------- + dbBigInt = 16 + dbBinary = 9 + dbBoolean = 1 + dbByte = 2 + dbChar = 18 + dbCurrency = 5 + dbDate = 8 + dbDecimal = 20 + dbDouble = 7 + dbFloat = 21 + dbGUID = 15 + dbInteger = 3 + dbLong = 4 + dbLongBinary = 11 # (OLE Object) + dbMemo = 12 + dbNumeric = 19 + dbSingle = 6 + dbText = 10 + dbTime = 22 + dbTimeStamp = 23 + dbVarBinary = 17 + dbUndefined = -1 + + # Attributes property + # ----------------------------------------------------------------- + dbAutoIncrField = 16 + dbDescending = 1 + dbFixedField = 1 + dbHyperlinkField = 32768 + dbSystemField = 8192 + dbUpdatableField = 32 + dbVariableField = 2 + + # OpenRecordset + # ----------------------------------------------------------------- + dbOpenForwardOnly = 8 + dbSQLPassThrough = 64 + dbReadOnly = 4 + + # Query types + # ----------------------------------------------------------------- + dbQAction = 240 + dbQAppend = 64 + dbQDDL = 4 # 96 + dbQDelete = 32 + dbQMakeTable = 128 # 80 + dbQSelect = 0 + dbQSetOperation = 8 # 128 + dbQSQLPassThrough = 1 # 112 + dbQUpdate = 16 # 48 + + # Edit mode + # ----------------------------------------------------------------- + dbEditNone = 0 + dbEditInProgress = 1 + dbEditAdd = 2 + + # Toolbars + # ----------------------------------------------------------------- + msoBarTypeNormal = 0 # Usual toolbar + msoBarTypeMenuBar = 1 # Menu bar + msoBarTypePopup = 2 # Shortcut menu + msoBarTypeStatusBar = 11 # Status bar + msoBarTypeFloater = 12 # Floating window + + msoControlButton = 1 # Command button + msoControlPopup = 10 # Popup, submenu + + # New Lines + # ----------------------------------------------------------------- + vbCr = chr(13) + vbLf = chr(10) + + def _NewLine(): + if _opsys == 'Windows': return chr(13) + chr(10) + return chr(10) + + vbNewLine = _NewLine() + vbTab = chr(9) + + # Module types + # ----------------------------------------------------------------- + acClassModule = 1 + acStandardModule = 0 + + # (Module) procedure types + # ----------------------------------------------------------------- + vbext_pk_Get = 1 # A Property Get procedure + vbext_pk_Let = 2 # A Property Let procedure + vbext_pk_Proc = 0 # A Sub or Function procedure + vbext_pk_Set = 3 # A Property Set procedure + + +COMPONENTCONTEXT, DESKTOP, SCRIPTPROVIDER, THISDATABASEDOCUMENT = None, None, None, None + +def _ErrorHandler(type, value, tb): + ''' + Is the function to be set as new sys.excepthook to bypass the standard error handler + Derived from https://stackoverflow.com/questions/31949760/how-to-limit-python-traceback-to-specific-files + Handler removes traces pointing to methods located in access2base.py when error is due to a user programming error + sys.excepthook = _ErrorHandler + NOT APPLIED YET + ''' + + def check_file(name): + return 'access2base.py' not in name + + show = (fs for fs in traceback.extract_tb(tb) if check_file(fs.filename)) + fmt = traceback.format_list(show) + traceback.format_exception_only(type, value) + print(''.join(fmt), end = '', file = sys.stderr) + # Reset to standard handler + sys.excepthook = sys.__excepthook__ + + +def A2BConnect(hostname = '', port = 0): + """ + To be called explicitly by user scripts when Python process runs outside the LibreOffice process. + LibreOffice started as (Linux): + ./soffice --accept='socket,host=localhost,port=xxxx;urp;' + Otherwise called implicitly by the current module without arguments + Initializes COMPONENTCONTEXT, SCRIPTPROVIDER and DESKTOP + :param hostname: probably 'localhost' or '' + :param port: port number or 0 + :return: None + """ + global XSCRIPTCONTEXT, COMPONENTCONTEXT, DESKTOP, SCRIPTPROVIDER + # Determine COMPONENTCONTEXT, via socket or inside LibreOffice + if len(hostname) > 0 and port > 0: # Explicit connection request via socket + # Code derived from Bridge.py by Alain H. Romedenne + local_context = XSCRIPTCONTEXT.getComponentContext() + resolver = local_context.ServiceManager.createInstanceWithContext( + 'com.sun.star.bridge.UnoUrlResolver', local_context) + try: + conn = 'socket,host=%s,port=%d' % (hostname, port) + connection_url = 'uno:%s;urp;StarOffice.ComponentContext' % conn + established_context = resolver.resolve(connection_url) + except Exception: # thrown when LibreOffice specified instance isn't started + raise ConnectionError('Connection to LibreOffice failed (host = ' + hostname + ', port = ' + str(port) + ')') + COMPONENTCONTEXT = established_context + DESKTOP = None + elif len(hostname) == 0 and port == 0: # Usual interactive mode + COMPONENTCONTEXT = XSCRIPTCONTEXT.getComponentContext() + DESKTOP = COMPONENTCONTEXT.ServiceManager.createInstanceWithContext( 'com.sun.star.frame.Desktop', COMPONENTCONTEXT) + else: + raise SystemExit('The invocation of A2BConnect() has invalid arguments') + # Determine SCRIPTPROVIDER + servicemanager = COMPONENTCONTEXT.ServiceManager + masterscript = servicemanager.createInstanceWithContext("com.sun.star.script.provider.MasterScriptProviderFactory", COMPONENTCONTEXT) + SCRIPTPROVIDER = masterscript.createScriptProvider("") + Script = _A2B.xScript('TraceLog', 'Trace') # Don't use invokeMethod() to force reset of error stack + Script.invoke(('===>', 'Python wrapper loaded V.' + _VERSION, False), (), ()) + return None + + +class _A2B(object, metaclass = _Singleton): + """ + Collection of helper functions implementing the protocol between Python and Basic + Read comments in PythonWrapper Basic function + """ + + @classmethod + def BasicObject(cls, objectname): + objs = {'COLLECTION': _Collection + , 'COMMANDBAR': _CommandBar + , 'COMMANDBARCONTROL': _CommandBarControl + , 'CONTROL': _Control + , 'DATABASE': _Database + , 'DIALOG': _Dialog + , 'EVENT': _Event + , 'FIELD': _Field + , 'FORM': _Form + , 'MODULE': _Module + , 'OPTIONGROUP': _OptionGroup + , 'PROPERTY': _Property + , 'QUERYDEF': _QueryDef + , 'RECORDSET': _Recordset + , 'SUBFORM': _SubForm + , 'TABLEDEF': _TableDef + , 'TEMPVAR': _TempVar + } + return objs[objectname] + + @classmethod + def xScript(cls, script, module): + """ + At first call checks the existence of the Access2Base library + Initializes _LIBRARY with the found library name + First and next calls execute the given script in the given module of the _LIBRARY library + The script and module are presumed to exist + :param script: name of script + :param module: name of module + :return: the script object. NB: the execution is done with the invoke() method applied on the returned object + """ + global _LIBRARY + Script = None + def sScript(lib): + return 'vnd.sun.star.script:' + lib + '.' + module + '.' + script + '?language=Basic&location=application' + if _LIBRARY == '': + # Check the availability of the Access2Base library + for lib in ('Access2BaseDev', 'Access2Base'): + try: + if Script == None: + Script = SCRIPTPROVIDER.getScript(sScript(lib)) + _LIBRARY = lib + except Exception: + pass + if Script == None: + raise SystemExit('Access2Base basic library not found') + else: + Script = SCRIPTPROVIDER.getScript(sScript(_LIBRARY)) + return Script + + @classmethod + def A2BErrorCode(cls): + """ + Return the Access2Base error stack as a tuple + 0 => error code + 1 => severity level + 2 => short error message + 3 => long error message + """ + Script = cls.xScript('TraceErrorCode', 'Trace') + return Script.invoke((), (), ())[0] + + @classmethod + def invokeMethod(cls, script, module, *args): + """ + Direct call to a named script/module pair with their arguments + If the arguments do not match their definition at the Basic side, a TypeError is raised + :param script: name of script + :param module: name of module + :param args: list of arguments to be passed to the script + :return: the value returned by the script execution + """ + if COMPONENTCONTEXT == None: A2BConnect() # Connection from inside LibreOffice is done at first API invocation + Script = cls.xScript(script, module) + try: + Returned = Script.invoke((args), (), ())[0] + except: + raise TypeError("Access2Base error: method '" + script + "' in Basic module '" + module + "' call error. Check its arguments.") + else: + if Returned == None: + if cls.VerifyNoError(): return None + return Returned + + @classmethod + def invokeWrapper(cls, action, basic, script, *args): + """ + Call the Basic wrapper to invite it to execute the proposed action on a Basic object + If the arguments do not match their definition at the Basic side, a TypeError is raised + After execution, a check is done if the execution has raised an error within Basic + If yes, a TypeError is raised + :param action: Property Get, Property Let, Property Set, invoke Method or return UNO object + :param basic: the reference of the Basic object, i.e. the index in the array caching the addresses of the objects + conventionally Application = -1 and DoCmd = -2 + :param script: the property or method name + :param args: the arguments of the method, if any + :return: the value returned by the execution of the Basic routine + """ + if COMPONENTCONTEXT == None: A2BConnect() # Connection from inside LibreOffice is done at first API invocation + # Intercept special call to Application.Events() + if basic == Application.basicmodule and script == 'Events': + Script = cls.xScript('PythonEventsWrapper', _WRAPPERMODULE) + Returned = Script.invoke((args[0],), (), ()) + else: + Script = cls.xScript('PythonWrapper', _WRAPPERMODULE) + NoArgs = '+++NOARGS+++' # Conventional notation for properties/methods without arguments + if len(args) == 0: + args = (action,) + (basic,) + (script,) + (NoArgs,) + else: + args = (action,) + (basic,) + (script,) + args + try: + Returned = Script.invoke((args), (), ()) + except: + raise TypeError("Access2Base error: method '" + script + "' call error. Check its arguments.") + + if isinstance(Returned[0], tuple): + # Is returned value a reference to a basic object, a scalar or a UNO object ? + if len(Returned[0]) in (3, 4): + if Returned[0][0] == 0: # scalar + return Returned[0][1] + elif Returned[0][0] == 1: # reference to objects cache + basicobject = cls.BasicObject(Returned[0][2]) + if len(Returned[0]) == 3: + return basicobject(Returned[0][1], Returned[0][2]) + else: + return basicobject(Returned[0][1], Returned[0][2], Returned[0][3]) + elif Returned[0][0] == 2: # Null value + return None + else: # Should not happen + return None + else: # UNO object + return Returned[0] + elif Returned[0] == None: + if cls.VerifyNoError(): return None + else: # Should not happen + return Returned[0] + + @classmethod + def VerifyNoError(cls): + # has Access2Base generated an error ? + errorstack = cls.A2BErrorCode() # 0 = code, 1 = severity, 2 = short text, 3 = long text + if errorstack[1] in ('ERROR', 'FATAL', 'ABORT'): + raise TypeError('Access2Base error: ' + errorstack[3]) + return True + + +class Application(object, metaclass = _Singleton): + """ Collection of methods located in the Application (Basic) module """ + W = _A2B.invokeWrapper + basicmodule = -1 + + @classmethod + def AllDialogs(cls, dialog = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'AllDialogs', dialog) + @classmethod + def AllForms(cls, form = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'AllForms', form) + @classmethod + def AllModules(cls, module = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'AllModules', module) + @classmethod + def CloseConnection(cls): + return cls.W(_vbMethod, cls.basicmodule, 'CloseConnection') + @classmethod + def CommandBars(cls, bar = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'CommandBars', bar) + @classmethod + def CurrentDb(cls): + return cls.W(_vbMethod, cls.basicmodule, 'CurrentDb') + @classmethod + def CurrentUser(cls): + return cls.W(_vbMethod, cls.basicmodule, 'CurrentUser') + @classmethod + def DAvg(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DAvg', expression, domain, criteria) + @classmethod + def DCount(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DCount', expression, domain, criteria) + @classmethod + def DLookup(cls, expression, domain, criteria = '', orderclause = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DLookup', expression, domain, criteria, orderclause) + @classmethod + def DMax(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DMax', expression, domain, criteria) + @classmethod + def DMin(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DMin', expression, domain, criteria) + @classmethod + def DStDev(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DStDev', expression, domain, criteria) + @classmethod + def DStDevP(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DStDevP', expression, domain, criteria) + @classmethod + def DSum(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DSum', expression, domain, criteria) + @classmethod + def DVar(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DVar', expression, domain, criteria) + @classmethod + def DVarP(cls, expression, domain, criteria = ''): + return cls.W(_vbMethod, cls.basicmodule, 'DVarP', expression, domain, criteria) + @classmethod + def Events(cls, event): + return cls.W(_vbMethod, cls.basicmodule, 'Events', event) + @classmethod + def Forms(cls, form = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'Forms', form) + @classmethod + def getObject(cls, shortcut): + return cls.W(_vbMethod, cls.basicmodule, 'getObject', shortcut) + GetObject = getObject + @classmethod + def getValue(cls, shortcut): + return cls.W(_vbMethod, cls.basicmodule, 'getValue', shortcut) + GetValue = getValue + @classmethod + def HtmlEncode(cls, string, length = 0): + return cls.W(_vbMethod, cls.basicmodule, 'HtmlEncode', string, length) + @classmethod + def OpenConnection(cls, thisdatabasedocument = acConstants.Missing): + global THISDATABASEDOCUMENT + if COMPONENTCONTEXT == None: A2BConnect() # Connection from inside LibreOffice is done at first API invocation + if DESKTOP != None: + THISDATABASEDOCUMENT = DESKTOP.getCurrentComponent() + return _A2B.invokeMethod('OpenConnection', 'Application', THISDATABASEDOCUMENT) + @classmethod + def OpenDatabase(cls, connectionstring, username = '', password = '', readonly = False): + return cls.W(_vbMethod, cls.basicmodule, 'OpenDatabase', connectionstring, username + , password, readonly) + @classmethod + def ProductCode(cls): + return cls.W(_vbMethod, cls.basicmodule, 'ProductCode') + @classmethod + def setValue(cls, shortcut, value): + return cls.W(_vbMethod, cls.basicmodule, 'setValue', shortcut, value) + SetValue = setValue + @classmethod + def SysCmd(cls, action, text = '', value = -1): + return cls.W(_vbMethod, cls.basicmodule, 'SysCmd', action, text, value) + @classmethod + def TempVars(cls, var = acConstants.Missing): + return cls.W(_vbMethod, cls.basicmodule, 'TempVars', var) + @classmethod + def Version(cls): + return cls.W(_vbMethod, cls.basicmodule, 'Version') + + +class DoCmd(object, metaclass = _Singleton): + """ Collection of methods located in the DoCmd (Basic) module """ + W = _A2B.invokeWrapper + basicmodule = -2 + + @classmethod + def ApplyFilter(cls, filter = '', sqlwhere = '', controlname = ''): + return cls.W(_vbMethod, cls.basicmodule, 'ApplyFilter', filter, sqlwhere, controlname) + @classmethod + def Close(cls, objecttype, objectname, save = acConstants.acSavePrompt): + return cls.W(_vbMethod, cls.basicmodule, 'Close', objecttype, objectname, save) + @classmethod + def CopyObject(cls, sourcedatabase, newname, sourceobjecttype, sourceobjectname): # 1st argument must be set + return cls.W(_vbMethod, cls.basicmodule, 'CopyObject', sourcedatabase, newname, sourceobjecttype + , sourceobjectname) + @classmethod + def FindNext(cls): + return cls.W(_vbMethod, cls.basicmodule, 'FindNext') + @classmethod + def FindRecord(cls, findwhat, match = acConstants.acEntire, matchcase = False, search = acConstants.acSearchAll + , searchasformatted = False, onlycurrentfield = acConstants.acCurrent, findfirst = True): + return cls.W(_vbMethod, cls.basicmodule, 'FindRecord', findwhat, match, matchcase, search + , searchasformatted, onlycurrentfield, findfirst) + @classmethod + def GetHiddenAttribute(cls, objecttype, objectname = ''): + return cls.W(_vbMethod, cls.basicmodule, 'GetHiddenAttribute', objecttype, objectname) + @classmethod + def GoToControl(cls, controlname): + return cls.W(_vbMethod, cls.basicmodule, 'GoToControl', controlname) + @classmethod + def GoToRecord(cls, objecttype = acConstants.acActiveDataObject, objectname = '', record = acConstants.acNext + , offset = 1): + return cls.W(_vbMethod, cls.basicmodule, 'GoToRecord', objecttype, objectname, record, offset) + @classmethod + def Maximize(cls): + return cls.W(_vbMethod, cls.basicmodule, 'Maximize') + @classmethod + def Minimize(cls): + return cls.W(_vbMethod, cls.basicmodule, 'Minimize') + @classmethod + def MoveSize(cls, left = -1, top = -1, width = -1, height = -1): + return cls.W(_vbMethod, cls.basicmodule, 'MoveSize', left, top, width, height) + @classmethod + def OpenForm(cls, formname, view = acConstants.acNormal, filter = '', wherecondition = '' + , datamode = acConstants.acFormEdit, windowmode = acConstants.acWindowNormal, openargs = ''): + return cls.W(_vbMethod, cls.basicmodule, 'OpenForm', formname, view, filter, wherecondition + , datamode, windowmode, openargs) + @classmethod + def OpenQuery(cls, queryname, view = acConstants.acNormal, datamode = acConstants.acEdit): + return cls.W(_vbMethod, cls.basicmodule, 'OpenQuery', queryname, view, datamode) + @classmethod + def OpenReport(cls, queryname, view = acConstants.acNormal): + return cls.W(_vbMethod, cls.basicmodule, 'OpenReport', queryname, view) + @classmethod + def OpenSQL(cls, sql, option = -1): + return cls.W(_vbMethod, cls.basicmodule, 'OpenSQL', sql, option) + @classmethod + def OpenTable(cls, tablename, view = acConstants.acNormal, datamode = acConstants.acEdit): + return cls.W(_vbMethod, cls.basicmodule, 'OpenTable', tablename, view, datamode) + @classmethod + def OutputTo(cls, objecttype, objectname = '', outputformat = '', outputfile = '', autostart = False, templatefile = '' + , encoding = acConstants.acUTF8Encoding, quality = acConstants.acExportQualityPrint): + if objecttype == acConstants.acOutputForm: encoding = 0 + return cls.W(_vbMethod, cls.basicmodule, 'OutputTo', objecttype, objectname, outputformat + , outputfile, autostart, templatefile, encoding, quality) + @classmethod + def Quit(cls): + return cls.W(_vbMethod, cls.basicmodule, 'Quit') + @classmethod + def RunApp(cls, commandline): + return cls.W(_vbMethod, cls.basicmodule, 'RunApp', commandline) + @classmethod + def RunCommand(cls, command): + return cls.W(_vbMethod, cls.basicmodule, 'RunCommand', command) + @classmethod + def RunSQL(cls, SQL, option = -1): + return cls.W(_vbMethod, cls.basicmodule, 'RunSQL', SQL, option) + @classmethod + def SelectObject(cls, objecttype, objectname = '', indatabasewindow = False): + return cls.W(_vbMethod, cls.basicmodule, 'SelectObject', objecttype, objectname, indatabasewindow) + @classmethod + def SendObject(cls, objecttype = acConstants.acSendNoObject, objectname = '', outputformat = '', to = '', cc = '' + , bcc = '', subject = '', messagetext = '', editmessage = True, templatefile = ''): + return cls.W(_vbMethod, cls.basicmodule, 'SendObject', objecttype, objectname, outputformat, to, cc + , bcc, subject, messagetext, editmessage, templatefile) + @classmethod + def SetHiddenAttribute(cls, objecttype, objectname = '', hidden = True): + return cls.W(_vbMethod, cls.basicmodule, 'SetHiddenAttribute', objecttype, objectname, hidden) + @classmethod + def SetOrderBy(cls, orderby = '', controlname = ''): + return cls.W(_vbMethod, cls.basicmodule, 'SetOrderBy', orderby, controlname) + @classmethod + def ShowAllRecords(cls): + return cls.W(_vbMethod, cls.basicmodule, 'ShowAllRecords') + + +class Basic(object, metaclass = _Singleton): + """ Collection of helper functions having the same behaviour as their Basic counterparts """ + M = _A2B.invokeMethod + + @classmethod + def ConvertFromUrl(cls, url): + return cls.M('PyConvertFromUrl', _WRAPPERMODULE, url) + + @classmethod + def ConvertToUrl(cls, file): + return cls.M('PyConvertToUrl', _WRAPPERMODULE, file) + + @classmethod + def CreateUnoService(cls, servicename): + return cls.M('PyCreateUnoService', _WRAPPERMODULE, servicename) + + @classmethod + def DateAdd(cls, add, count, datearg): + if isinstance(datearg, datetime.datetime): datearg = datearg.isoformat() + dateadd = cls.M('PyDateAdd', _WRAPPERMODULE, add, count, datearg) + return datetime.datetime.strptime(dateadd, acConstants.FromIsoFormat) + + @classmethod + def DateDiff(cls, add, date1, date2, weekstart = 1, yearstart = 1): + if isinstance(date1, datetime.datetime): date1 = date1.isoformat() + if isinstance(date2, datetime.datetime): date2 = date2.isoformat() + return cls.M('PyDateDiff', _WRAPPERMODULE, add, date1, date2, weekstart, yearstart) + + @classmethod + def DatePart(cls, add, datearg, weekstart = 1, yearstart = 1): + if isinstance(datearg, datetime.datetime): datearg = datearg.isoformat() + return cls.M('PyDatePart', _WRAPPERMODULE, add, datearg, weekstart, yearstart) + + @classmethod + def DateValue(cls, datestring): + datevalue = cls.M('PyDateValue', _WRAPPERMODULE, datestring) + return datetime.datetime.strptime(datevalue, acConstants.FromIsoFormat) + + @classmethod + def Format(cls, value, format = None): + if isinstance(value, (datetime.datetime, datetime.date, datetime.time, )): + value = value.isoformat() + return cls.M('PyFormat', _WRAPPERMODULE, value, format) + + @classmethod + def GetGUIType(cls): + return cls.M('PyGetGUIType', _WRAPPERMODULE) + + @staticmethod + def GetPathSeparator(): + return os.sep + + @classmethod + def GetSystemTicks(cls): + return cls.M('PyGetSystemTicks', _WRAPPERMODULE) + + @classmethod + def MsgBox(cls, text, type = None, dialogtitle = None): + return cls.M('PyMsgBox', _WRAPPERMODULE, text, type, dialogtitle) + + class GlobalScope(object, metaclass = _Singleton): + @classmethod + def BasicLibraries(cls): + return Basic.M('PyGlobalScope', _WRAPPERMODULE, 'Basic') + @classmethod + def DialogLibraries(self): + return Basic.M('PyGlobalScope', _WRAPPERMODULE, 'Dialog') + + @classmethod + def InputBox(cls, text, title = None, default = None, xpos = None, ypos = None): + return cls.M('PyInputBox', _WRAPPERMODULE, text, title, default, xpos, ypos) + + @staticmethod + def Now(): + return datetime.datetime.now() + + @staticmethod + def RGB(red, green, blue): + return int('%02x%02x%02x' % (red, green, blue), 16) + + @classmethod + def Timer(cls): + return cls.M('PyTimer', _WRAPPERMODULE) + + @staticmethod + def Xray(myObject): + xrayscript = 'vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&location=application' + xScript = SCRIPTPROVIDER.getScript(xrayscript) + xScript.invoke((myObject,), (), ()) + return + + +class _BasicObject(object): + """ + Parent class of Basic objects + Each subclass is identified by its classProperties: + dictionary with keys = allowed properties, value = True if editable or False + Each instance is identified by its + - reference in the cache managed by Basic + - type ('DATABASE', 'COLLECTION', ...) + - name (form, control, ... name) - may be blank + Properties are got and set following next strategy: + 1. Property names are controlled strictly ('Value' and not 'value') + 2. Getting a property value for the first time is always done via a Basic call + 3. Next occurrences are fetched from the Python dictionary of the instance if the property is read-only, otherwise via a Basic call + 4. Methods output might force the deletion of a property from the dictionary ('MoveNext' changes 'BOF' and 'EOF' properties) + 5. Setting a property value is done via a Basic call, except if self.internal == True + """ + W = _A2B.invokeWrapper + internal_attributes = ('objectreference', 'objecttype', 'name', 'internal') + + def __init__(self, reference = -1, objtype = None, name = ''): + self.objectreference = reference # reference in the cache managed by Basic + self.objecttype = objtype # ('DATABASE', 'COLLECTION', ...) + self.name = name # '' when no name + self.internal = False # True to exceptionally allow assigning a new value to a read-only property + self.localProperties = () + + def __getattr__(self, name): + if name in ('classProperties', 'localProperties'): + pass + elif name in self.classProperties: + # Get Property from Basic + return self.W(_vbGet, self.objectreference, name) + # Usual attributes getter + return super(_BasicObject, self).__getattribute__(name) + + def __setattr__(self, name, value): + if name in ('classProperties', 'localProperties'): + pass + elif name in self.classProperties: + if self.internal: # internal = True forces property setting even if property is read-only + pass + elif self.classProperties[name] == True: # True == Editable + self.W(_vbLet, self.objectreference, name, value) + else: + raise AttributeError("type object '" + self.objecttype + "' has no editable attribute '" + name + "'") + elif name[0:2] == '__' or name in self.internal_attributes or name in self.localProperties: + pass + else: + raise AttributeError("type object '" + self.objecttype + "' has no attribute '" + name + "'") + object.__setattr__(self, name, value) + return + + def __repr__(self): + repr = "Basic object (type='" + self.objecttype + "', index=" + str(self.objectreference) + if len(self.name) > 0: repr += ", name='" + self.name + "'" + return repr + ")" + + def _Reset(self, propertyname, basicreturn = None): + """ force new value or erase properties from dictionary (done to optimize calls to Basic scripts) """ + if propertyname in ('BOF', 'EOF'): + # After a Move method invocation on a Recordset object, BOF or EOF likely to be got soon + if isinstance(basicreturn, int): + self.internal = True + # f.i. basicreturn = 0b10 means: BOF = True, EOF = False + self.BOF = basicreturn in (2, 3, -2, -3) + self.EOF = basicreturn in (1, 3, -1, -3) + self.internal = False + return ( basicreturn >= 0 ) + else: + # Suppress possibly invalid property values: e.g. RecordCount after Delete applied on Recordset object + if property in self.__dict__: + del(self.propertyname) + return basicreturn + + @property + def Name(self): return self.name + @property + def ObjectType(self): return self.objecttype + + def Dispose(self): + return self.W(_vbMethod, self.objectreference, 'Dispose') + def getProperty(self, propertyname, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'getProperty', propertyname, index) + GetProperty = getProperty + def hasProperty(self, propertyname): + return propertyname in tuple(self.classProperties.keys()) + HasProperty = hasProperty + def Properties(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Properties', index) + def setProperty(self, propertyname, value, index = acConstants.Missing): + if self.hasProperty(propertyname): + if self.W(_vbMethod, self.objectreference, 'setProperty', propertyname, value, index): + return self.__setattr__(propertyname, value) + raise AttributeError("type object '" + self.objecttype + "' has no editable attribute '" + propertyname + "'") + SetProperty = setProperty + + +class _Collection(_BasicObject): + """ Collection object built as a Python iterator """ + classProperties = dict(Count = False) + def __init__(self, reference = -1, objtype = None): + super().__init__(reference, objtype) + self.localProperties = ('count', 'index') + self.count = self.Count + self.index = 0 + def __iter__(self): + self.index = 0 + return self + def __next__(self): + if self.index >= self.count: + raise StopIteration + next = self.Item(self.index) + self.index = self.index + 1 + return next + def __len__(self): + return self.count + + def Add(self, table, value = acConstants.Missing): + if isinstance(table, _BasicObject): # Add method applied to a TABLEDEFS collection + return self.W(_vbMethod, self.objectreference, 'Add', table.objectreference) + else: # Add method applied to a TEMPVARS collection + add = self.W(_vbMethod, self.objectreference, 'Add', table, value) + self.count = self.Count + return add + def Delete(self, name): + return self.W(_vbMethod, self.objectreference, 'Delete', name) + def Item(self, index): + return self.W(_vbMethod, self.objectreference, 'Item', index) + def Remove(self, tempvarname): + remove = self.W(_vbMethod, self.objectreference, 'Remove', tempvarname) + self.count = self.Count + return remove + def RemoveAll(self): + remove = self.W(_vbMethod, self.objectreference, 'RemoveAll') + self.count = self.Count + return remove + + +class _CommandBar(_BasicObject): + classProperties = dict(BuiltIn = False, Parent = False, Visible = True) + + def CommandBarControls(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'CommandBarControls', index) + def Reset(self): + return self.W(_vbMethod, self.objectreference, 'Reset') + + +class _CommandBarControl(_BasicObject): + classProperties = dict(BeginGroup = False, BuiltIn = False, Caption = True, Index = False, OnAction = True + , Parent = False, TooltipText = True, Type = False, Visible = True) + + def Execute(self): + return self.W(_vbMethod, self.objectreference, 'Execute') + + +class _Control(_BasicObject): + classProperties = dict(BackColor = True, BorderColor = True, BorderStyle = True, Cancel = True, Caption = True + , ControlSource = False, ControlTipText = True, ControlType = False, Default = True + , DefaultValue = True, Enabled = True, FontBold = True, FontItalic = True, FontName = True + , FontSize = True, FontUnderline = True, FontWeight = True, ForeColor = True, Form = False + , Format = True, ItemData = False, ListCount = False, ListIndex = True, Locked = True, MultiSelect = True + , OnActionPerformed = True, OnAdjustmentValueChanged = True, OnApproveAction = True + , OnApproveReset = True, OnApproveUpdate = True, OnChanged = True, OnErrorOccurred = True + , OnFocusGained = True, OnFocusLost = True, OnItemStateChanged = True, OnKeyPressed = True + , OnKeyReleased = True, OnMouseDragged = True, OnMouseEntered = True, OnMouseExited = True + , OnMouseMoved = True, OnMousePressed = True, OnMouseReleased = True, OnResetted = True, OnTextChanged = True + , OnUpdated = True, OptionValue = False, Page = False, Parent = False, Picture = True, Required = True + , RowSource = True, RowSourceType = True, Selected = True, SelLength = True, SelStart = True, SelText = True + , SubType = False, TabIndex = True, TabStop = True, Tag = True, Text = False, TextAlign = True + , TripleState = True, Value = True, Visible = True + ) + + @property + def BoundField(self): return self.W(_vbUNO, self.objectreference, 'BoundField') + @property + def ControlModel(self): return self.W(_vbUNO, self.objectreference, 'ControlModel') + @property + def ControlView(self): return self.W(_vbUNO, self.objectreference, 'ControlView') + @property + def LabelControl(self): return self.W(_vbUNO, self.objectreference, 'LabelControl') + + def AddItem(self, value, index = -1): + basicreturn = self.W(_vbMethod, self.objectreference, 'AddItem', value, index) + self._Reset('ItemData') + self._Reset('ListCount') + return basicreturn + def Controls(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Controls', index) + # Overrides method in parent class: list of properties is strongly control type dependent + def hasProperty(self, propertyname): + return self.W(_vbMethod, self.objectreference, 'hasProperty', propertyname) + HasProperty = hasProperty + def RemoveItem(self, index): + basicreturn = self.W(_vbMethod, self.objectreference, 'RemoveItem', index) + self._Reset('ItemData') + self._Reset('ListCount') + return basicreturn + def Requery(self): + return self.W(_vbMethod, self.objectreference, 'Requery') + def SetSelected(self, value, index): + return self.W(_vbMethod, self.objectreference, 'SetSelected', value, index) + def SetFocus(self): + return self.W(_vbMethod, self.objectreference, 'SetFocus') + + +class _Database(_BasicObject): + classProperties = dict(Connect = False, OnCreate = True + , OnFocus = True, OnLoad = True, OnLoadFinished = True, OnModifyChanged = True, OnNew = True + , OnPrepareUnload = True, OnPrepareViewClosing = True, OnSave = True, OnSaveAs = True + , OnSaveAsDone = True, OnSaveAsFailed = True, OnSaveDone = True, OnSaveFailed = True + , OnSubComponentClosed = True, OnSubComponentOpened = True, OnTitleChanged = True, OnUnfocus = True + , OnUnload = True, OnViewClosed = True, OnViewCreated = True, Version = False + ) + + @property + def Connection(self): return self.W(_vbUNO, self.objectreference, 'Connection') + @property + def Document(self): return self.W(_vbUNO, self.objectreference, 'Document') + @property + def MetaData(self): return self.W(_vbUNO, self.objectreference, 'MetaData') + + def Close(self): + return self.W(_vbMethod, self.objectreference, 'Close') + def CloseAllRecordsets(self): + return self.W(_vbMethod, self.objectreference, 'CloseAllRecordsets') + def CreateQueryDef(self, name, sqltext, option = -1): + return self.W(_vbMethod, self.objectreference, 'CreateQueryDef', name, sqltext, option) + def CreateTableDef(self, name): + return self.W(_vbMethod, self.objectreference, 'CreateTableDef', name) + def DAvg(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DAvg', expression, domain, criteria) + def DCount(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DCount', expression, domain, criteria) + def DLookup(self, expression, domain, criteria = '', orderclause = ''): + return self.W(_vbMethod, self.objectreference, 'DLookup', expression, domain, criteria, orderclause) + def DMax(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DMax', expression, domain, criteria) + def DMin(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DMin', expression, domain, criteria) + def DStDev(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DStDev', expression, domain, criteria) + def DStDevP(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DStDevP', expression, domain, criteria) + def DVar(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DVar', expression, domain, criteria) + def DVarP(self, expression, domain, criteria = ''): + return self.W(_vbMethod, self.objectreference, 'DVarP', expression, domain, criteria) + def OpenRecordset(self, source, type = -1, option = -1, lockedit = -1): + return self.W(_vbMethod, self.objectreference, 'OpenRecordset', source, type, option, lockedit) + def OpenSQL(self, SQL, option = -1): + return self.W(_vbMethod, self.objectreference, 'OpenSQL', SQL, option) + def OutputTo(self, objecttype, objectname = '', outputformat = '', outputfile = '', autostart = False, templatefile = '' + , encoding = acConstants.acUTF8Encoding, quality = acConstants.acExportQualityPrint): + if objecttype == acConstants.acOutputForm: encoding = 0 + return self.W(_vbMethod, self.objectreference, 'OutputTo', objecttype, objectname, outputformat, outputfile + , autostart, templatefile, encoding, quality) + def QueryDefs(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'QueryDefs', index) + def Recordsets(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Recordsets', index) + def RunSQL(self, SQL, option = -1): + return self.W(_vbMethod, self.objectreference, 'RunSQL', SQL, option) + def TableDefs(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'TableDefs', index) + + +class _Dialog(_BasicObject): + classProperties = dict(Caption = True, Height = True, IsLoaded = False, OnFocusGained = True + , OnFocusLost = True, OnKeyPressed = True, OnKeyReleased = True, OnMouseDragged = True + , OnMouseEntered = True, OnMouseExited = True, OnMouseMoved = True, OnMousePressed = True + , OnMouseReleased = True, Page = True, Parent = False, Visible = True, Width = True + ) + + @property + def UnoDialog(self): return self.W(_vbUNO, self.objectreference, 'UnoDialog') + + def EndExecute(self, returnvalue): + return self.W(_vbMethod, self.objectreference, 'EndExecute', returnvalue) + def Execute(self): + return self.W(_vbMethod, self.objectreference, 'Execute') + def Move(self, left = -1, top = -1, width = -1, height = -1): + return self.W(_vbMethod, self.objectreference, 'Move', left, top, width, height) + def OptionGroup(self, groupname): + return self.W(_vbMethod, self.objectreference, 'OptionGroup', groupname) + def Start(self): + return self.W(_vbMethod, self.objectreference, 'Start') + def Terminate(self): + return self.W(_vbMethod, self.objectreference, 'Terminate') + +class _Event(_BasicObject): + classProperties = dict(ButtonLeft = False, ButtonMiddle = False, ButtonRight = False, ClickCount = False + , ContextShortcut = False, EventName = False, EventType = False, FocusChangeTemporary = False + , KeyAlt = False, KeyChar = False, KeyCode = False, KeyCtrl = False, KeyFunction = False, KeyShift = False + , Recommendation = False, RowChangeAction = False, Source = False, SubComponentName = False + , SubComponentType = False, XPos = False, YPos = False + ) + + +class _Field(_BasicObject): + classProperties = dict(DataType = False, DataUpdatable = False, DbType = False, DefaultValue = True + , Description = True, FieldSize = False, Size = False, Source = False + , SourceField = False, SourceTable = False, TypeName = False, Value = True + ) + + @property + def Column(self): return self.W(_vbUNO, self.objectreference, 'Column') + + def AppendChunk(self, value): + return self.W(_vbMethod, self.objectreference, 'AppendChunk', value) + def GetChunk(self, offset, numbytes): + return self.W(_vbMethod, self.objectreference, 'GetChunk', offset, numbytes) + def ReadAllBytes(self, file): + return self.W(_vbMethod, self.objectreference, 'ReadAllBytes', file) + def ReadAllText(self, file): + return self.W(_vbMethod, self.objectreference, 'ReadAllText', file) + def WriteAllBytes(self, file): + return self.W(_vbMethod, self.objectreference, 'WriteAllBytes', file) + def WriteAllText(self, file): + return self.W(_vbMethod, self.objectreference, 'WriteAllText', file) + + +class _Form(_BasicObject): + classProperties = dict(AllowAdditions = True, AllowDeletions = True, AllowEdits = True, Bookmark = True + , Caption = True, CurrentRecord = True, Filter = True, FilterOn = True, Height = True + , IsLoaded = False, OnApproveCursorMove = True, OnApproveParameter = True, OnApproveReset = True + , OnApproveRowChange = True, OnApproveSubmit = True, OnConfirmDelete = True, OnCursorMoved = True + , OnErrorOccurred = True, OnLoaded = True, OnReloaded = True, OnReloading = True, OnResetted = True + , OnRowChanged = True, OnUnloaded = True, OnUnloading = True, OpenArgs = False, OrderBy = True + , OrderByOn = True, Parent = False, Recordset = False, RecordSource = True, Visible = True + , Width = True + ) + + @property + def Component(self): return self.W(_vbUNO, self.objectreference, 'Component') + @property + def ContainerWindow(self): return self.W(_vbUNO, self.objectreference, 'ContainerWindow') + @property + def DatabaseForm(self): return self.W(_vbUNO, self.objectreference, 'DatabaseForm') + + def Close(self): + return self.W(_vbMethod, self.objectreference, 'Close') + def Controls(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Controls', index) + def Move(self, left = -1, top = -1, width = -1, height = -1): + return self.W(_vbMethod, self.objectreference, 'Move', left, top, width, height) + def OptionGroup(self, groupname): + return self.W(_vbMethod, self.objectreference, 'OptionGroup', groupname) + def Refresh(self): + return self.W(_vbMethod, self.objectreference, 'Refresh') + def Requery(self): + return self.W(_vbMethod, self.objectreference, 'Requery') + def SetFocus(self): + return self.W(_vbMethod, self.objectreference, 'SetFocus') + + +class _Module(_BasicObject): + classProperties = dict(CountOfDeclarationLines = False, CountOfLines = False + , ProcStartLine = False, Type = False + ) + def __init__(self, reference = -1, objtype = None, name = ''): + super().__init__(reference, objtype, name) + self.localProperties = ('startline', 'startcolumn', 'endline', 'endcolumn', 'prockind') + + def Find(self, target, startline, startcolumn, endline, endcolumn, wholeword = False + , matchcase = False, patternsearch = False): + Returned = self.W(_vbMethod, self.objectreference, 'Find', target, startline, startcolumn, endline + , endcolumn, wholeword, matchcase, patternsearch) + if isinstance(Returned, tuple): + if Returned[0] == True and len(Returned) == 5: + self.startline = Returned[1] + self.startcolumn = Returned[2] + self.endline = Returned[3] + self.endcolumn = Returned[4] + return Returned[0] + return Returned + def Lines(self, line, numlines): + return self.W(_vbMethod, self.objectreference, 'Lines', line, numlines) + def ProcBodyLine(self, procname, prockind): + return self.W(_vbMethod, self.objectreference, 'ProcBodyLine', procname, prockind) + def ProcCountLines(self, procname, prockind): + return self.W(_vbMethod, self.objectreference, 'ProcCountLines', procname, prockind) + def ProcOfLine(self, line, prockind): + Returned = self.W(_vbMethod, self.objectreference, 'ProcOfLine', line, prockind) + if isinstance(Returned, tuple): + if len(Returned) == 2: + self.prockind = Returned[1] + return Returned[0] + return Returned + def ProcStartLine(self, procname, prockind): + return self.W(_vbMethod, self.objectreference, 'ProcStartLine', procname, prockind) + + +class _OptionGroup(_BasicObject): + classProperties = dict(Count = False, Value = True) + + def Controls(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Controls', index) + + +class _Property(_BasicObject): + classProperties = dict(Value = True) + + +class _QueryDef(_BasicObject): + classProperties = dict(SQL = True, Type = False) + + @property + def Query(self): return self.W(_vbUNO, self.objectreference, 'Query') + + def Execute(self, options = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Execute', options) + def Fields(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Fields', index) + def OpenRecordset(self, type = -1, option = -1, lockedit = -1): + return self.W(_vbMethod, self.objectreference, 'OpenRecordset', type, option, lockedit) + + +class _Recordset(_BasicObject): + classProperties = dict(AbsolutePosition = True, BOF = False, Bookmark = True, Bookmarkable = False + , EditMode = False, EOF = False, Filter = True, RecordCount = False + ) + + @property + def RowSet(self): return self.W(_vbUNO, self.objectreference, 'RowSet') + + def AddNew(self): + return self.W(_vbMethod, self.objectreference, 'AddNew') + def CancelUpdate(self): + return self.W(_vbMethod, self.objectreference, 'CancelUpdate') + def Clone(self): + return self.W(_vbMethod, self.objectreference, 'Clone') + def Close(self): + return self.W(_vbMethod, self.objectreference, 'Close') + def Delete(self): + return self._Reset('RecordCount',self.W(_vbMethod, self.objectreference, 'Delete')) + def Edit(self): + return self.W(_vbMethod, self.objectreference, 'Edit') + def Fields(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Fields', index) + def GetRows(self, numrows): + return self.W(_vbMethod, self.objectreference, 'GetRows', numrows) + def Move(self, rows, startbookmark = acConstants.Missing): + return self._Reset('BOF', self.W(_vbMethod, self.objectreference, 'Move', rows, startbookmark)) + def MoveFirst(self): + return self._Reset('BOF', self.W(_vbMethod, self.objectreference, 'MoveFirst')) + def MoveLast(self): + return self._Reset('BOF', self.W(_vbMethod, self.objectreference, 'MoveLast')) + def MoveNext(self): + return self._Reset('BOF', self.W(_vbMethod, self.objectreference, 'MoveNext')) + def MovePrevious(self): + return self._Reset('BOF', self.W(_vbMethod, self.objectreference, 'MovePrevious')) + def OpenRecordset(self, type = -1, option = -1, lockedit = -1): + return self.W(_vbMethod, self.objectreference, 'OpenRecordset', type, option, lockedit) + def Update(self): + return self._Reset('RecordCount',self.W(_vbMethod, self.objectreference, 'Update')) + + +class _SubForm(_Form): + classProperties = dict(AllowAdditions = True, AllowDeletions = True, AllowEdits = True, CurrentRecord = True + , Filter = True, FilterOn = True, LinkChildFields = False, LinkMasterFields = False + , OnApproveCursorMove = True, OnApproveParameter = True, OnApproveReset = True + , OnApproveRowChange = True, OnApproveSubmit = True, OnConfirmDelete = True, OnCursorMoved = True + , OnErrorOccurred = True, OnLoaded = True, OnReloaded = True, OnReloading = True, OnResetted = True + , OnRowChanged = True, OnUnloaded = True, OnUnloading = True, OrderBy = True + , OrderByOn = True, Parent = False, Recordset = False, RecordSource = True, Visible = True + ) + + def SetFocus(self): + raise AttributeError("type object 'SubForm' has no method 'SetFocus'") + + +class _TableDef(_BasicObject): + classProperties = dict() + + @property + def Table(self): return self.W(_vbUNO, self.objectreference, 'Table') + + def CreateField(self, name, type, size = 0, attributes = 0): + return self.W(_vbMethod, self.objectreference, 'CreateField', name, type, size, attributes) + def Fields(self, index = acConstants.Missing): + return self.W(_vbMethod, self.objectreference, 'Fields', index) + def OpenRecordset(self, type = -1, option = -1, lockedit = -1): + return self.W(_vbMethod, self.objectreference, 'OpenRecordset', type, option, lockedit) + + +class _TempVar(_BasicObject): + classProperties = dict(Value = True) + +""" +Set of directly callable error handling methods +""" +def DebugPrint(*args): + dargs = () + for arg in args: + if isinstance(arg, _BasicObject): + arg = ('[' + arg.objecttype + '] ' + arg.name).rstrip() + dargs = dargs + (arg,) + return _A2B.invokeMethod('DebugPrint', _WRAPPERMODULE, *dargs) +def TraceConsole(): return _A2B.invokeMethod('TraceConsole', 'Trace') +def TraceError(tracelevel, errorcode, errorprocedure, errorline): + return _A2B.invokeMethod('TraceError', 'Trace', tracelevel, errorcode, errorprocedure, errorline) +def TraceLevel(newtracelevel = 'ERROR'): return _A2B.invokeMethod('TraceLevel', 'Trace', newtracelevel) +def TraceLog(tracelevel, text, messagebox = True): + return _A2B.invokeMethod('TraceLog', 'Trace', tracelevel, text, messagebox) + diff --git a/wizards/source/access2base/dialog.xlb b/wizards/source/access2base/dialog.xlb new file mode 100644 index 000000000..dc06162b7 --- /dev/null +++ b/wizards/source/access2base/dialog.xlb @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Access2Base" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="dlgTrace"/> + <library:element library:name="dlgFormat"/> +</library:library> diff --git a/wizards/source/access2base/dlgFormat.xdl b/wizards/source/access2base/dlgFormat.xdl new file mode 100644 index 000000000..4b93fd720 --- /dev/null +++ b/wizards/source/access2base/dlgFormat.xdl @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="dlgFormat" dlg:left="246" dlg:top="119" dlg:width="153" dlg:height="40" dlg:help-text="Export the form" dlg:closeable="true" dlg:moveable="true" dlg:title="OutputTo"> + <dlg:bulletinboard> + <dlg:combobox dlg:id="cboFormat" dlg:tab-index="0" dlg:left="4" dlg:top="18" dlg:width="71" dlg:height="8" dlg:help-text="Format in which the form should be exported" dlg:value="PDF" dlg:spin="true"> + <dlg:menupopup> + <dlg:menuitem dlg:value="PDF"/> + <dlg:menuitem dlg:value="ODT"/> + <dlg:menuitem dlg:value="DOC"/> + <dlg:menuitem dlg:value="HTML"/> + </dlg:menupopup> + </dlg:combobox> + <dlg:text dlg:id="lblFormat" dlg:tab-index="1" dlg:left="4" dlg:top="7" dlg:width="100" dlg:height="9" dlg:help-text="Format in which the form should be exported" dlg:value="Select the output format"/> + <dlg:button dlg:id="cmdOK" dlg:tab-index="2" dlg:left="111" dlg:top="5" dlg:width="35" dlg:height="12" dlg:help-text="Validate your choice" dlg:default="true" dlg:value="OK" dlg:button-type="ok"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Access2Base.Trace._TraceOK?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="3" dlg:left="111" dlg:top="20" dlg:width="35" dlg:height="12" dlg:help-text="Cancel and close the dialog" dlg:value="Cancel" dlg:button-type="cancel"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/access2base/dlgTrace.xdl b/wizards/source/access2base/dlgTrace.xdl new file mode 100644 index 000000000..08324e47c --- /dev/null +++ b/wizards/source/access2base/dlgTrace.xdl @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="dlgTrace" dlg:left="81" dlg:top="63" dlg:width="438" dlg:height="154" dlg:help-text="Manage the console file and its entries" dlg:closeable="true" dlg:moveable="true" dlg:title="Console"> + <dlg:styles> + <dlg:style dlg:style-id="0" dlg:font-name="Courier New" dlg:font-stylename="Regular" dlg:font-family="modern"/> + <dlg:style dlg:style-id="1" dlg:look="simple"/> + <dlg:style dlg:style-id="2" dlg:background-color="0xe6e6e6" dlg:border="none"/> + </dlg:styles> + <dlg:bulletinboard> + <dlg:text dlg:id="lblEntries" dlg:tab-index="3" dlg:left="265" dlg:top="134" dlg:width="130" dlg:height="9" dlg:help-text="Clear the list and resize the circular buffer" dlg:value="Set max number of entries" dlg:align="right"/> + <dlg:numericfield dlg:id="numEntries" dlg:tab-index="4" dlg:left="399" dlg:top="129" dlg:width="28" dlg:height="16" dlg:help-text="Clear the list and resize the circular buffer" dlg:decimal-accuracy="0" dlg:value="20" dlg:value-min="5" dlg:value-max="999" dlg:spin="true"/> + <dlg:textfield dlg:style-id="0" dlg:id="txtTraceLog" dlg:tab-index="0" dlg:left="9" dlg:top="20" dlg:width="360" dlg:height="105" dlg:help-text="Text can be selected, copied, ..." dlg:hscroll="true" dlg:vscroll="true" dlg:multiline="true" dlg:readonly="true" dlg:value="--- Log file is empty ---"/> + <dlg:checkbox dlg:style-id="1" dlg:id="chkClear" dlg:tab-index="5" dlg:left="58" dlg:top="133" dlg:width="6" dlg:height="9" dlg:help-text="Clear the list" dlg:value="Clear" dlg:checked="false"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="6" dlg:left="381" dlg:top="38" dlg:width="40" dlg:height="12" dlg:help-text="Cancel and close the dialog" dlg:value="Cancel" dlg:button-type="cancel"/> + <dlg:text dlg:id="lblClear" dlg:tab-index="7" dlg:left="9" dlg:top="133" dlg:width="46" dlg:height="9" dlg:help-text="Clear the list" dlg:value="Clear the list" dlg:align="right"/> + <dlg:text dlg:id="lblMinLevel" dlg:tab-index="8" dlg:left="74" dlg:top="133" dlg:width="130" dlg:height="9" dlg:help-text="Register only logging requests above given level" dlg:value="Set minimal trace level" dlg:align="right"/> + <dlg:combobox dlg:id="cboMinLevel" dlg:tab-index="9" dlg:left="209" dlg:top="133" dlg:width="50" dlg:height="9" dlg:help-text="Register only logging requests above given level" dlg:spin="true"> + <dlg:menupopup> + <dlg:menuitem dlg:value="DEBUG"/> + <dlg:menuitem dlg:value="INFO"/> + <dlg:menuitem dlg:value="WARNING"/> + <dlg:menuitem dlg:value="ERROR"/> + <dlg:menuitem dlg:value="ABORT"/> + </dlg:menupopup> + </dlg:combobox> + <dlg:button dlg:id="cmdOK" dlg:tab-index="1" dlg:left="381" dlg:top="20" dlg:width="40" dlg:height="12" dlg:help-text="Validate" dlg:default="true" dlg:value="OK" dlg:button-type="ok"/> + <dlg:button dlg:id="cmdDump" dlg:tab-index="2" dlg:left="381" dlg:top="68" dlg:width="40" dlg:height="31" dlg:help-text="Choose a file and dump the actual list content in it" dlg:value="Dump to file" dlg:multiline="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Access2Base.Trace._DumpToFile?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="lblNbEntries" dlg:tab-index="10" dlg:left="9" dlg:top="10" dlg:width="105" dlg:height="7" dlg:help-text="Actual size of list" dlg:value="Actual number of entries:"/> + <dlg:numericfield dlg:style-id="2" dlg:id="numNbEntries" dlg:tab-index="11" dlg:left="123" dlg:top="9" dlg:width="17" dlg:height="9" dlg:help-text="Actual size of list" dlg:readonly="true" dlg:decimal-accuracy="0" dlg:value="0"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/access2base/script.xlb b/wizards/source/access2base/script.xlb new file mode 100644 index 000000000..478a061e8 --- /dev/null +++ b/wizards/source/access2base/script.xlb @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Access2Base" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="Application"/> + <library:element library:name="Methods"/> + <library:element library:name="acConstants"/> + <library:element library:name="Test"/> + <library:element library:name="Trace"/> + <library:element library:name="DoCmd"/> + <library:element library:name="Utils"/> + <library:element library:name="Database"/> + <library:element library:name="PropertiesSet"/> + <library:element library:name="Collect"/> + <library:element library:name="PropertiesGet"/> + <library:element library:name="Form"/> + <library:element library:name="Python"/> + <library:element library:name="_License"/> + <library:element library:name="SubForm"/> + <library:element library:name="L10N"/> + <library:element library:name="OptionGroup"/> + <library:element library:name="Event"/> + <library:element library:name="Property"/> + <library:element library:name="Control"/> + <library:element library:name="Dialog"/> + <library:element library:name="Field"/> + <library:element library:name="DataDef"/> + <library:element library:name="Recordset"/> + <library:element library:name="TempVar"/> + <library:element library:name="Root_"/> + <library:element library:name="UtilProperty"/> + <library:element library:name="CommandBar"/> + <library:element library:name="CommandBarControl"/> + <library:element library:name="Module"/> +</library:library> diff --git a/wizards/source/config/dialog.xlc b/wizards/source/config/dialog.xlc new file mode 100644 index 000000000..34064e83e --- /dev/null +++ b/wizards/source/config/dialog.xlc @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:libraries PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "libraries.dtd"> +<library:libraries xmlns:library="http://openoffice.org/2000/library" xmlns:xlink="http://www.w3.org/1999/xlink"> + <library:library library:name="Standard" library:link="false"/> +</library:libraries> diff --git a/wizards/source/config/script.xlc b/wizards/source/config/script.xlc new file mode 100644 index 000000000..34064e83e --- /dev/null +++ b/wizards/source/config/script.xlc @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:libraries PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "libraries.dtd"> +<library:libraries xmlns:library="http://openoffice.org/2000/library" xmlns:xlink="http://www.w3.org/1999/xlink"> + <library:library library:name="Standard" library:link="false"/> +</library:libraries> diff --git a/wizards/source/configshare/dialog.xlc b/wizards/source/configshare/dialog.xlc new file mode 100644 index 000000000..89647f648 --- /dev/null +++ b/wizards/source/configshare/dialog.xlc @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:libraries PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "libraries.dtd"> +<library:libraries xmlns:library="http://openoffice.org/2000/library" xmlns:xlink="http://www.w3.org/1999/xlink"> + <library:library library:name="FormWizard" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/FormWizard/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Template" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Template/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Tools" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Tools/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Gimmicks" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Gimmicks/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="ImportWizard" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/ImportWizard/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Euro" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Euro/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Depot" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Depot/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="ScriptBindingLibrary" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/ScriptBindingLibrary/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Access2Base" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Access2Base/dialog.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + </library:libraries> diff --git a/wizards/source/configshare/script.xlc b/wizards/source/configshare/script.xlc new file mode 100644 index 000000000..69dbb2832 --- /dev/null +++ b/wizards/source/configshare/script.xlc @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:libraries PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "libraries.dtd"> +<library:libraries xmlns:library="http://openoffice.org/2000/library" xmlns:xlink="http://www.w3.org/1999/xlink"> + <library:library library:name="FormWizard" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/FormWizard/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Template" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Template/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Tools" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Tools/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Gimmicks" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Gimmicks/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="ImportWizard" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/ImportWizard/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Euro" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Euro/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Depot" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Depot/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="ScriptBindingLibrary" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/ScriptBindingLibrary/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> + <library:library library:name="Access2Base" xlink:href="$(INST)/@LIBO_SHARE_FOLDER@/basic/Access2Base/script.xlb/" xlink:type="simple" library:link="true" library:readonly="false"/> +</library:libraries> diff --git a/wizards/source/depot/CommonLang.xba b/wizards/source/depot/CommonLang.xba new file mode 100644 index 000000000..ec2f62733 --- /dev/null +++ b/wizards/source/depot/CommonLang.xba @@ -0,0 +1,368 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="CommonLang" script:language="StarBasic">REM ***** BASIC ***** + + +' Column A has the index 1 +Public Const SBCOLUMNNAME1 = 3 ' Stock names, sheet 1 +Public Const SBCOLUMNID1 = 4 ' Stock ID, sheet 1 +Public Const SBCOLUMNQUANTITY1 = 5 ' Stock quantity sheet 1 +Public Const SBCOLUMNRATE1 = 7 ' Price for stocks, sheet 1 +Public Const SBCOLUMNNAME2 = 3 ' Stock names, sheet 2 +Public Const SBCOLUMNDATE2 = 4 ' Transaction dates, sheet 2 +Public Const SBCOLUMNQUANTITY2 = 5 ' Transaction quantity, sheet 2 +Public Const SBCOLUMNRATE2 = 6 ' Price for stocks, sheet 2 +Public Const SBCOLUMNPROVPERCENT2 = 7 ' Provision in %, sheet 2 +Public Const SBCOLUMNPROVMIN2 = 8 ' Minimum provision, sheet 2 +Public Const SBCOLUMNPROVFIX2 = 9 ' Fixed provision, sheet 2 +Public Const SBCOLUMNPROCEEDS2 = 12 ' Profit, sheet 2 +Public Const SBCOLUMNQTYSOLD2 = 14 ' Quantity sold, sheet 2 +Public Const SBCOLUMNQTYREST2 = 15 ' Quantity not sold yet, sheet 2 +Public Const SBCOLUMNPRCREST2 = 16 ' Proportional price for quantity not sold yet, sheet 2 +Public Const SBCOLUMNREALPROC2 = 17 ' Realized proceeds, sheet 2 +Public Const SBCOLUMNDIVIDEND2 = 18 ' Dividend paid, sheet 2 +Public Const SBCOLUMNREALPROFIT2 = 19 ' Realized profit, sheet 2 +Public Const SBROWFIRSTTRANSACT2 = 8 ' First data row, sheet 2 +Public Const SBROWHEADER1 = 6 ' Headline, sheet 1 +Public Const SBMSGOK = 0 +Public Const SBMSGYESNO = 4 +Public Const SBMSGSTOP = 16 +Public Const SBMSGQUESTION = 32 +Public Const SBMSGDEFAULTBTN2 = 256 +Public Const SBHASID = 1 ' 0 = no ID, 1 = stocks have an ID +Public Const SBDIALOGSELL = 1 ' Step for main dialog +Public Const SBDIALOGBUY = 2 ' Step for main dialog +Public Const SBBINARY = 0 +Public TransactMode as Integer +Public Const LIFO = -1 +Public Const FIFO = 1 + +Public Const HANDLEDIVIDEND = 1 +Public Const HANDLESPLIT = 2 + +Global oDocument as Object +Global oDocFormats() as Object +Global oController as Object +Global oFirstSheet as Object +Global oBankSheet as Object +Global oMovementSheet as Object +Global sDocLanguage as String +Global sDocCountry as String +Global oSheets as Object +Global oDocLocale as New com.sun.star.lang.Locale +Global bEnableMarket as Boolean +Global bEnableInternet as Boolean +Global oMarketModel as Object +Global oInternetModel as Object + +Global sCurCurrency$, sCurExtension$, sCurChartSource$, sCurStockIDLabel$, sCurSeparator$ + +Public oNumberFormatter as Object +Public bDebugmode as Boolean +Global GlobListindex as Integer +Public blabla() as String +Public SplitDate as Date +Public oChartSheet as Object +Public oBackgroundSheet as Object +Public Const SBDATECOLUMN = 3 +Public Const SBVALUECOLUMN = 4 +Public Const SBSTARTROW = 25 +Public Const SBCHARTPERIOD = 14 +Public Const SBINTERVAL = "d" +Public sColumnHeader as String +Public StartDate as Date +Public EndDate as Date +Public iCurRow as Integer +Public iMaxRow as Integer +Public iStartDay as Integer +Public iStartMonth as Integer +Public iStartYear as Integer +Public iEndDay as Integer +Public iEndMonth as Integer +Public iEndYear as Integer +Public oStatusLine as Object +Public Today as Date +Public sInterval as String +Public ShortMonths(11,1) +Public iStep as Integer +Public sDepotCurrency as String +Public iValueCol as Integer + +Public DlgReference as Object +Public DlgTransaction as Object +Public DlgStockRates as Object +Public DlgStartUp as Object +Public TransactModel as Object +Public StockRatesModel as Object +Public StartUpModel as Object +Public StockRatesTitle(1 To 3) +Public TransactTitle(1 To 2) +Public NullList() +Public sStartupWelcome$, sStartupChooseMarket$, sStartupHint$ + +Public sMarket(7,10) as String +Public sCountryMarket(7,10) as String + +Public cDlgCaption1$, cDlgCaption2$ +Public sMsgError$, sMsgNoName$, sMsgNoQuantity$, sMsgNoDividend$, sMsgNoExchangeRate$ +Public sMsgNoValidExchangeDate$, sMsgWrongExchangeDate$, sMsgSellTooMuch$, sMsgConfirm$ +Public sMsgFreeStock$, sMsgTotalLoss$, sMsgEndDatebeforeNow$, sMsgStartDatebeforeEndDate$ + +Public sOk$, sCancel$ +Public sMsgAuthorization$, sMsgDeleteAll$ +Public SellMethod$ +Public cSplit$ +Global HistoryChartSource as String +Public DateCellStyle as String +Public CurrCellStyle as String +Public sStartDate$, sEndDate$, sHistory$ +Public sInsertStockname$ +Public sProductname$, sTitle$ +Public sInsertStocks$, sStockname$, sNoInternetUpdate$, sMarketplace$, sNoInternetDataAvailable$ +Public sCheckInternetSettings as String + +Sub LoadLanguage() + LoadDepotDialogs() + Select Case sDocLanguage + Case "de" + LoadGermanLanguage() + Case "en" + LoadEnglishLanguage() + Case "fr" + LoadFrenchLanguage() + Case "it" + LoadItalianLanguage() + Case "es" + LoadSpanishLanguage() + Case "sv" + LoadSwedishLanguage() + Case "ja" + LoadJapaneseLanguage() + Case "ko" + LoadKoreanLanguage() + Case "zh" + If sDocCountry = "CN" Then + LoadChineseSimpleLanguage() + Else + LoadChineseTradLanguage() + End If + End Select + InitializeStartUpModel() +End Sub + +Sub CompleteMarketList() +Dim EuroIndex as Integer +Dim LocCountry as String +Dim LocLanguage as String +Dim sLangList() as String +Dim sCountryList() as String +Dim sExtensionList() as String +Dim MaxIndex as Integer +Dim bIsLocale as Boolean + + GlobListIndex = -1 + For n = 0 To 5 + LocLanguage = sMarket(n,6) + LocCountry = sMarket(n,7) + If Instr(1,LocLanguage,";",SBBINARY) = 0 Then + bIsLocale = CheckDocLocale(LocLanguage, LocCountry) + Else + EuroIndex = 0 + sLangList() = ArrayoutofString(LocLanguage, ";", MaxIndex) + sCountryList() = ArrayoutofString(LocCountry, ";", MaxIndex) + sExtensionList() = ArrayoutofString(sMarket(n,8), ";", MaxIndex) + For m = 0 To MaxIndex + bIsLocale = CheckDocLocale(sLangList(m), sCountryList(m)) + If bIsLocale Then + EuroIndex = m + Exit For + End If + Next m + sMarket(n,6) = sLangList(EuroIndex) + sMarket(n,7) = sCountryList(EuroIndex) + sMarket(n,8) = sExtensionList(EuroIndex) + End If + If bIsLocale Then + GlobListIndex = n + Exit For + End If + Next n +End Sub + +Sub LocalizedCurrencies() + If GlobListIndex = -1 Then + sCountryMarket(0,0) = "Euro" + sCountryMarket(0,1) = chr(8364) + sCountryMarket(0,2) = "Paris" + sCountryMarket(0,3) = "http://fr.finance.yahoo.com/d/quotes.csv?s=<StockID>.PA&f=s4l1t1c1ghov&e=.csv" + sCountryMarket(0,5) = "Code" + sCountryMarket(0,6) = "fr" + sCountryMarket(0,7) = "FR" + sCountryMarket(0,8) = "40C" + sCountryMarket(0,9) = "59/9" + sCountryMarket(0,10) = "1" + + sCountryMarket(1,0) = "Euro" + sCountryMarket(1,1) = chr(8364) + sCountryMarket(1,2) = "Milano" + sCountryMarket(1,3) = "http://it.finance.yahoo.com/d/quotes.csv?s=<StockID>.MI&f=sl1d1t1c1ohgv&e=.csv" + sCountryMarket(1,5) = "Codice" + sCountryMarket(1,6) = "it" + sCountryMarket(1,7) = "IT" + sCountryMarket(1,8) = "410" + sCountryMarket(1,9) = "44" + sCountryMarket(1,10) = "1" + + sCountryMarket(2,0) = "Euro" + sCountryMarket(2,1) = chr(8364) + sCountryMarket(2,2) = "Madrid" + sCountryMarket(2,3) = "http://es.finance.yahoo.com/d/quotes.csv?s=<StockID>&m=MC&f=sl1d1t1c1ohgv&e=.csv" + sCountryMarket(2,5) = "Simbolo" + sCountryMarket(2,6) = "es" + sCountryMarket(2,7) = "ES" + sCountryMarket(2,8) = "40A" + sCountryMarket(2,9) = "44" + sCountryMarket(2,10) = "1" + + sCountryMarket(3,0) = "Dansk krone" + sCountryMarket(3,1) = "kr" + sCountryMarket(3,2) = "København" + sCountryMarket(3,3) = "http://dk.finance.yahoo.com/d/quotes.csv?s=<StockID.CO&f=sl1d1t1c1ohgv&e=.csv" + sCountryMarket(3,5) = "Aktiesymbol" + sCountryMarket(3,6) = "da" + sCountryMarket(3,7) = "DK" + sCountryMarket(3,8) = "406" + sCountryMarket(3,9) = "44" + sCountryMarket(3,10) = "1" + + sCountryMarket(4,0) = "Svensk krona" + sCountryMarket(4,1) = "kr" + sCountryMarket(4,2) = "Stockholm" + sCountryMarket(4,3) = "http://se.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&f=sl1d1t1c1ohgv&e=.c" + sCountryMarket(4,5) = "Kod" + sCountryMarket(4,6) = "sv" + sCountryMarket(4,7) = "SE" + sCountryMarket(4,8) = "41D" + sCountryMarket(4,9) = "44" + sCountryMarket(4,10) = "1" + + ' Taiwan Dollar + sCountryMarket(5,0) = "新臺幣" + sCountryMarket(5,1) = "¥" + sCountryMarket(5,2) = "代號" + sCountryMarket(5,3) = "http://tw.finance.yahoo.com/d/quotes.csv?s=<StockID>.TW&f=sl1d1t1c1ohgv&e=.csv" + sCountryMarket(5,5) = "代號" + sCountryMarket(5,6) = "zh" + sCountryMarket(5,7) = "TW" + sCountryMarket(5,8) = "404" + sCountryMarket(5,9) = "44" + sCountryMarket(5,10) = "1" + + ' Chinese Yuan + sCountryMarket(6,0) = "人民币" + sCountryMarket(6,1) = "¥" + sCountryMarket(6,2) = "代号" + sCountryMarket(6,3) = "http://cn.finance.yahoo.com/d/quotes.csv?s=<StockID>.SS&f=sl1d1t1c1ohgv&e=.csv" + sCountryMarket(6,5) = "代号" + sCountryMarket(6,6) = "zh" + sCountryMarket(6,7) = "CN" + sCountryMarket(6,8) = "804" + sCountryMarket(6,9) = "44" + sCountryMarket(6,10) = "1" + + ' korean Won + sCountryMarket(7,0) = "한국 원화" + sCountryMarket(7,1) = "₩" + sCountryMarket(7,2) = "서울" + sCountryMarket(7,3) = "http://kr.finance.yahoo.com/d/quotes.csv?s=<StockID>.KS&f=snl1d1t1c1ohgv&e=.csv" + sCountryMarket(7,5) = "종목 코드" + sCountryMarket(7,6) = "ko" + sCountryMarket(7,7) = "KR" + sCountryMarket(7,8) = "412" + sCountryMarket(7,9) = "44" + sCountryMarket(7,10) = "2" + + +' sCountryMarket(5,0) = "Российский рубль" +' sCountryMarket(5,1) = "р." +' sCountryMarket(5,2) = "" +' sCountryMarket(5,3) = "" +' sCountryMarket(5,5) = "" +' sCountryMarket(5,6) = "ru" +' sCountryMarket(5,7) = "RU" +' sCountryMarket(5,8) = "-419" +' sCountryMarket(5,9) = "" +' +' sCountryMarket(6,0) = "Złoty polski" +' sCountryMarket(6,1) = "zł" +' sCountryMarket(6,2) = "" +' sCountryMarket(6,3) = "" +' sCountryMarket(6,5) = "" 'Still Todo!! +' sCountryMarket(6,6) = "pl" +' sCountryMarket(6,7) = "PL" +' sCountryMarket(6,8) = "-415" +' sCountryMarket(6,9) = "" +' +' sCountryMarket(7,0) = "Türkische Lira" +' sCountryMarket(7,1) = "TL" +' sCountryMarket(7,2) = "" +' sCountryMarket(7,3) = "" +' sCountryMarket(7,5) = "" 'Still Todo!! +' sCountryMarket(7,6) = "tr" +' sCountryMarket(7,7) = "TR" +' sCountryMarket(7,8) = "-41F" +' sCountryMarket(7,9) = "" + + Dim n as Integer + Dim m as Integer +' Dim sCountryMarket(6,9) as String + + For n = 0 To Ubound(sCountryMarket(),1) + If sDocLanguage = sCountryMarket(n,6) and sDocCountry = sCountryMarket(n,7) Then + GlobListIndex = 6 + For m = 0 To 10 + sMarket(6,m) = sCountryMarket(n,m) + Next m + Exit For + End If + Next n + End If +End Sub + +Sub LoadDepotDialogs() + DlgTransaction = LoadDialog("Depot", "Dialog2") + DlgStockRates = LoadDialog("Depot", "Dialog3") + DlgStartUp = LoadDialog("Depot", "Dialog4") + TransactModel = DlgTransaction.Model + StockRatesModel = DlgStockRates.Model + StartUpModel = DlgStartUp.Model +End Sub + + +Sub InitializeStartUpModel() + With StartUpModel + .lblWelcome.Label = sStartupWelcome & Chr(13) & chr(13) & sStartUpChooseMarket + sStartUpHint = ReplaceString(sStartUpHint, sHistory, "<History>") + .lblHint.Label = sStartupHint +' .cmdGoOn.Enabled = Ubound(StartUpModel.lstMarkets.SelectedItems()) <> -1 + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With +End Sub</script:module> diff --git a/wizards/source/depot/Currency.xba b/wizards/source/depot/Currency.xba new file mode 100644 index 000000000..d728424d3 --- /dev/null +++ b/wizards/source/depot/Currency.xba @@ -0,0 +1,195 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Currency" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + +Dim bDoUnLoad as Boolean + + +Sub Startup() +Dim i as Integer +Dim a as Integer +Dim ListString as String +Dim MarketListBoxControl as Object + Initialize(False) + MarketListBoxControl = DlgStartUp.GetControl("lstMarkets") + a = 0 + For i = 0 To Ubound(sMarket(),1) + ListString = sMarket(i,0) + If sMarket(i,0) <> "" Then + If sMarket(i,3) = "" Then + ListString = ListString & " (" & sNoInternetUpdate & ")" + Else + ListString = ListString & " (" & sMarketplace & " " & sMarket(i,2) & ")" + End If + MarketListBoxControl.AddItem(ListString, a) + a = a + 1 + End If + Next i + MarketListBoxControl.SelectItemPos(GlobListIndex, True) + DlgStartUp.Title = sDepotCurrency + DlgStartUp.Model.cmdGoOn.DefaultButton = True + DlgStartUp.GetControl("lstMarkets").SetFocus() + DlgStartUp.Execute() + DlgStartUp.Dispose() +End Sub + + +Sub EnableGoOnButton() + StartUpModel.cmdGoOn.Enabled = True + StartUpModel.cmdGoOn.DefaultButton = True +End Sub + + +Sub CloseStartUpDialog() + DlgStartUp.EndExecute() +' oDocument.Dispose() +End Sub + + +Sub DisposeDocument() + If bDoUnload Then + oDocument.Dispose() + End If +End Sub + + +Sub ChooseMarket(Optional aEvent) +Dim Index as Integer +Dim bIsDocLanguage as Boolean +Dim bIsDocCountry as Boolean + oInternetModel = GetControlModel(oDocument.Sheets(0), "CmdInternet") + If Not IsMissing(aEvent) Then + Index = StartupModel.lstMarkets.SelectedItems(0) + oInternetModel.Tag = Index + Else + Index = oInternetModel.Tag + End If + oMarketModel = GetControlModel(oDocument.Sheets(0), "CmdHistory") + sCurCurrency = sMarket(Index,1) + If Index = 0 Then + HistoryChartSource = sMarket(Index,4) + End If + sCurStockIDLabel = sMarket(Index,5) + sCurExtension = sMarket(Index,8) + iValueCol = Val(sMarket(Index,10)) + If Instr(sCurExtension,";") <> 0 Then + ' Take the german extension as the stock place is Frankfurt + sCurExtension = "407" + End If + sCurChartSource = sMarket(Index,3) + bIsDocLanguage = Instr(1, sMarket(Index,6), sDocLanguage, SBBINARY) <> 0 + bIsDocCountry = Instr(1, sMarket(Index,7), sDocCountry, SBBINARY) <> 0 OR SDocCountry = "" + sCurSeparator = sMarket(Index,9) + TransactModel.txtRate.CurrencySymbol = sCurCurrency + TransactModel.txtFix.CurrencySymbol = sCurCurrency + TransactModel.txtMinimum.CurrencySymbol = sCurCurrency + bEnableMarket = Index = 0 + bEnableInternet = sCurChartSource <> "" + oMarketModel.Enabled = bEnableMarket + oInternetModel.Enabled = bEnableInternet + If Not IsMissing(aEvent) Then + ConvertStylesCurrencies() + bDoUnload = False + DlgStartUp.EndExecute() + End If +End Sub + + +Sub ConvertStylesCurrencies() +Dim m as integer +Dim aStyleFormat as Object +Dim StyleName as String +Dim bAddToList as Boolean +Dim oStyle as Object +Dim oStyles as Object + UnprotectSheets(oSheets) + oFirstSheet.GetCellByPosition(SBCOLUMNID1, SBROWHEADER1).SetString(sCurStockIDLabel) + oStyles = oDocument.StyleFamilies.GetbyIndex(0) + For m = 0 To oStyles.count-1 + oStyle = oStyles.GetbyIndex(m) + StyleName = oStyle.Name + bAddToList = CheckFormatType(oStyle) + If bAddToList Then + SwitchNumberFormat(ostyle, oDocFormats, sCurCurrency, sCurExtension) + End If + Next m + ProtectSheets(oSheets) +End Sub + + +Sub SwitchNumberFormat(oObject as Object, oFormats as object, sNewSymbol as String, sNewExtension as String) +Dim nFormatLanguage as Integer +Dim nFormatDecimals as Integer +Dim nFormatLeading as Integer +Dim bFormatLeading as Integer +Dim bFormatNegRed as Integer +Dim bFormatThousands as Integer +Dim aNewStr as String +Dim iNumberFormat as Long +Dim sSimpleStr as String +Dim nSimpleKey as Long +Dim aFormat() +Dim oLocale as New com.sun.star.lang.Locale + ' Numberformat with the new Symbol as Base for new Format + sSimpleStr = "0 [$" & sNewSymbol & "-" & sNewExtension & "]" + nSimpleKey = Numberformat(oFormats, sSimpleStr, oDocLocale) + On Local Error Resume Next + iNumberFormat = oObject.NumberFormat + If Err <> 0 Then + Msgbox "Error Reading the Number Format" + Resume CLERROR + End If + + On Local Error GoTo NOKEY + aFormat() = oFormats.getByKey(iNumberFormat) + On Local Error GoTo 0 + ' set new currency format with according settings + nFormatDecimals = aFormat.Decimals + nFormatLeading = aFormat.LeadingZeros + bFormatNegRed = aFormat.NegativeRed + bFormatThousands = aFormat.ThousandsSeparator + oLocale = aFormat.Locale + aNewStr = oFormats.generateFormat(nSimpleKey, oLocale, bFormatThousands, bFormatNegRed, nFormatDecimals, nFormatLeading) + oObject.NumberFormat = Numberformat(oFormats, aNewStr, oLocale) + NOKEY: + If Err <> 0 Then + Resume CLERROR + End If + CLERROR: +End Sub + + +Function Numberformat( oFormats as Object, aFormatStr as String, oLocale as Variant ) +Dim nRetkey + nRetKey = oFormats.queryKey(aFormatStr, oLocale, True) + If nRetKey = -1 Then + nRetKey = oFormats.addNew( aFormatStr, oLocale ) + If nRetKey = -1 Then nRetKey = 0 + End If + Numberformat = nRetKey +End Function + + +Function CheckFormatType(oStyle as Object) +Dim oFormatofObject as Object + oFormatofObject = oDocFormats.getByKey(oStyle.NumberFormat) + CheckFormatType = INT(oFormatOfObject.Type) AND com.sun.star.util.NumberFormat.CURRENCY +End Function</script:module> diff --git a/wizards/source/depot/Depot.xba b/wizards/source/depot/Depot.xba new file mode 100644 index 000000000..6a8b1419c --- /dev/null +++ b/wizards/source/depot/Depot.xba @@ -0,0 +1,517 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Depot" script:language="StarBasic">Option Explicit + + +Sub Initialize(Optional bChooseMarketPlace as Boolean) +Dim bEnableHistory as Boolean + GlobalScope.BasicLibraries.LoadLibrary("Tools") +' oMarketModel = GetControlModel(oDocument.Sheets(0), "CmdHistory") +' bEnableHistory = oMarketModel.Enabled + ToggleWindow(False) + Today = Date() + bDebugmode = False + oDocument = ThisComponent + oController = oDocument.GetCurrentController + oSheets = oDocument.Sheets + oFirstSheet = oSheets(0) + oMovementSheet = oSheets(1) + oBankSheet = oSheets(2) + oDocFormats = oDocument.NumberFormats + oNumberFormatter = CreateUnoService("com.sun.star.util.NumberFormatter") + oNumberFormatter.AttachNumberFormatsSupplier(oDocument) + oDocLocale = oDocument.CharLocale + sDocLanguage = oDocLocale.Language + sDocCountry = oDocLocale.Country + LoadLanguage() + ToggleWindow(True) +' oMarketModel.Enabled = bEnableHistory + If Not IsMissing(bChooseMarketPlace) Then + If bChoosemarketPlace Then + ChooseMarket() + End If + Else + ChooseMarket() + End If + If Not IsMissing(bChooseMarketPlace) Then + If bChooseMarketPlace Then + oMarketModel.Enabled = bEnableMarket + oInternetModel.Enabled = bEnableInternet + End If + End If +End Sub + + +Sub Buy() + Initialize(True) + FillListbox(DlgTransaction.GetControl("lstBuyStocks"), TransactTitle(SBDIALOGBUY), False) + SetupTransactionControls(SBDIALOGBUY) + EnableTransactionControls(False) + DlgTransaction.Execute() +End Sub + + +Sub Sell() + Initialize(True) + If FillListbox(DlgTransaction.GetControl("lstSellStocks"), TransactTitle(SBDIALOGSELL), True) Then + SetupTransactionControls(SBDIALOGSELL) + EnableTransactionControls(False) + DlgTransaction.Execute() + End If +End Sub + + +Sub Reset() +Dim TransactionCount as Integer +Dim StockCount, iStartRow, i as Integer +Dim oRows, oRange as Object +Dim StockName as String + Initialize(True) + ' Delete transactions and reset overview + If MsgBox(sMsgDeleteAll, SBMSGYESNO+SBMSGQUESTION+SBMSGDEFAULTBTN2, sMsgAuthorization) = 6 Then + ' Assumption: If and only if there is an overview, then there are transactions, too + UnprotectSheets(oSheets) + StockCount = GetStocksCount(iStartRow) + + For i = 1 To StockCount + StockName = oFirstSheet.GetCellbyPosition(SBCOLUMNNAME1, iStartRow + i).String + If oSheets.HasbyName(StockName) Then + oSheets.RemoveByName(StockName) + End If + Next + oDocument.AddActionLock + RemoveStockRows(oFirstSheet, iStartRow + 1, StockCount) + TransactionCount = GetTransactionCount(iStartRow) + RemoveStockRows(oMovementSheet, iStartRow + 2, TransactionCount) + ProtectSheets(oSheets) + oDocument.RemoveActionLock + End If +End Sub + + +Sub TransactionOk +Dim Sold as Long +Dim RestQuantity, Value, PartialValue, Profit +Dim iNewRow as Integer, iRow as Integer +Dim iStockRow as Long, iRestQuantity as Long +Dim oNameCell as Object +Dim CellStockName as String, SelStockName as String +Dim CurRate as Double +Dim TransactDate as Date +Dim LocStockName as String + ' Check for rate entered + If TransactModel.txtRate.Value = 0 Then + If TransactModel.Step = SBDIALOGBUY Then + If MsgBox(sMsgFreeStock, SBMSGYESNO+SBMSGQUESTION, sMsgConfirm)=7 Then + Exit Sub + End If + Else + If MsgBox(sMsgTotalLoss, SBMSGYESNO+SBMSGQUESTION, sMsgConfirm)=7 Then + Exit Sub + End If + End If + End If + CurRate = TransactModel.txtRate.Value + TransactDate = CDateFromUNODate(TransactModel.txtDate.Date) + DlgTransaction.EndExecute() + UnprotectSheets(oSheets) + + iNewRow = DuplicateRow(oMovementSheet, "HiddenRow3") + + If TransactModel.Step = SBDIALOGBUY Then + CellStockName = TransactModel.lstBuyStocks.Text + If Instr(1,CellStockName,"$") <> 0 Then + CellStockName = "'" & CellStockName & "'" + End If + oMovementSheet.GetCellByPosition(SBCOLUMNNAME2, iNewRow).String = CellStockName + oMovementSheet.GetCellByPosition(SBCOLUMNQUANTITY2, iNewRow).Value = TransactModel.txtQuantity.Value + Else + CellStockName = DlgTransaction.GetControl("lstSellStocks").GetSelectedItem() + oMovementSheet.GetCellByPosition(SBCOLUMNNAME2, iNewRow).String = CellStockName + oMovementSheet.GetCellByPosition(SBCOLUMNQUANTITY2, iNewRow).Value = -TransactModel.txtQuantity.Value + End If + + oMovementSheet.GetCellByPosition(SBCOLUMNDATE2, iNewRow).Value = CDateFromUNODate(TransactModel.txtDate.Date) + oMovementSheet.GetCellByPosition(SBCOLUMNRATE2, iNewRow).Value = TransactModel.txtRate.Value + oMovementSheet.GetCellByPosition(SBCOLUMNPROVPERCENT2, iNewRow).Value = TransactModel.txtCommission.EffectiveValue + oMovementSheet.GetCellByPosition(SBCOLUMNPROVMIN2, iNewRow).Value = TransactModel.txtMinimum.Value + oMovementSheet.GetCellByPosition(SBCOLUMNPROVFIX2, iNewRow).Value = TransactModel.txtFix.Value + + ' Buy stocks: Update overview for new stocks + If TransactModel.Step = SBDIALOGBUY Then + iStockRow = GetStockRowIndex(CellStockName) + If iStockRow = -1 Then + iNewRow = DuplicateRow(oFirstSheet, "HiddenRow2") + oFirstSheet.GetCellByPosition(SBCOLUMNNAME1, iNewRow).String = CellStockName + oFirstSheet.GetCellByPosition(SBCOLUMNID1, iNewRow).String = TransactModel.txtStockID.Text + iStockRow = GetStockRowIndex(CellStockName) + End If + ' Sell stocks: Get transaction value, then update Transaction sheet + ElseIf TransactModel.Step = SBDIALOGSELL Then + Profit = oMovementSheet.GetCellByPosition(SBCOLUMNPROCEEDS2, iNewRow).Value + Value = Profit + Sold = TransactModel.txtQuantity.Value + SelStockName = DlgTransaction.GetControl("lstSellStocks").GetSelectedItem() + ' Go to first name + If TransactMode = FIFO Then + iRow = SBROWFIRSTTRANSACT2 + Else + iRow = iNewRow-1 + End If + + ' Check that no transaction after split date exists else cancel split + Do While Sold > 0 + oNameCell = oMovementSheet.GetCellByPosition(SBCOLUMNNAME2, iRow) + CellStockName = oNameCell.String + If CellStockName = SelStockName Then + ' Update transactions: Note quantity sold + RestQuantity = oMovementSheet.GetCellByPosition(SBCOLUMNQTYREST2, iRow).Value + ' If there still is a rest left ... + If RestQuantity > 0 Then + If RestQuantity < Sold Then + ' Recalculate profit of new transaction + Profit = Profit - oMovementSheet.GetCellByPosition(SBCOLUMNPRCREST2, iRow).Value + AddValueToCellContent(SBCOLUMNQTYSOLD2, iRow, RestQuantity) + PartialValue = RestQuantity / Sold * Value + AddValueToCellContent(SBCOLUMNREALPROC2, iRow, PartialValue) + Sold = Sold - RestQuantity + Value = Value - PartialValue + Else + ' Recalculate profit of neTransactModel.lstBuyStocks.Textw transaction + PartialValue = oMovementSheet.GetCellByPosition(SBCOLUMNPRCREST2, iRow).Value + Profit = Profit - PartialValue/RestQuantity * Sold + ' Update sold shares cell + AddValueToCellContent(SBCOLUMNQTYSOLD2, iRow, Sold) + ' Update sales turnover cell + AddValueToCellContent(SBCOLUMNREALPROC2, iRow, Value) + ' Update variables for rest of transaction + Sold = 0 + Value = 0 + End If + End If + End If + iRow = iRow + TransactMode + Loop + oMovementSheet.GetCellByPosition(SBCOLUMNREALPROFIT2,iNewRow).Value = Profit + iStockRow = GetStockRowIndex(SelStockName) + iRestQuantity = oFirstSheet.GetCellbyPosition(SBCOLUMNQUANTITY1, iStockRow).Value +' If iRestQuantity = 0 Then +' If oSheets.HasbyName(SelStockName) Then +' oSheets.RemoveByName(SelStockName) +' End If +' Else + +' End If + End If + InsertCurrentValue(CurRate, iStockRow,TransactDate) + ProtectSheets(oSheets) +End Sub + + +Sub SelectStockname(aEvent as Object) +Dim iCurRow as Integer +Dim CurStockName as String + With TransactModel + ' Find row with stock name + If TransactModel.Step = SBDIALOGBUY Then + CurStockName = .lstBuyStocks.Text + iCurRow = GetStockRowIndex(CurStockName) + .txtQuantity.ValueMax = 10000000 + Else + Dim ListBoxList() as String + ListBoxList() = GetSelectedListboxItems(aEvent.Source.getModel()) + CurStockName = ListBoxList(0) +' CurStockName = DlgTransaction.GetControl(aEvent.Source.getModel.Name).GetSelectedItem() + iCurRow = GetStockRowIndex(CurStockName) + Dim fdouble as Double + fdouble = oFirstSheet.GetCellByPosition(SBCOLUMNQUANTITY1, iCurRow).Value + .txtQuantity.Value = fdouble + .txtQuantity.ValueMax = oFirstSheet.GetCellByPosition(SBCOLUMNQUANTITY1, iCurRow).Value + .txtRate.Value = oFirstSheet.GetCellbyPosition(SBCOLUMNRATE1, iCurRow).Value + End If + .txtStockID.Enabled = .Step = SBDIALOGBUY + .lblStockID.Enabled = .Step = SBDIALOGBUY + ' Default settings for quantity and rate + .txtStockID.Text = GetStockID(CurStockName, iCurRow) + End With + EnableTransactionControls(CurStockName <> "") + TransactModel.cmdGoOn.DefaultButton = True +End Sub + + + +Sub HandleStocks(Mode as Integer, oDialog as Object) +Dim DividendPerShare, DividendTotal, RestQuantity, OldValue +Dim SelStockName, CellStockName as String +Dim oNameCell as Object, oDateCell as Object +Dim iRow as Integer +Dim oDividendCell as Object +Dim Amount +Dim OldNumber, NewNumber as Integer +Dim NoteText as String +Dim TotalStocksCount as Long +Dim oModel as Object + oDocument.AddActionLock + oDialog.EndExecute() + oModel = oDialog.Model + SelStockName = DlgStockRates.GetControl("lstStockNames").GetSelectedItem() + Select Case Mode + Case HANDLEDIVIDEND + Dim bTakeTotal as Boolean + ' Update transactions: Enter dividend paid for all Buy transactions not sold completely + bTakeTotal = oModel.optTotal.State = 1 + If bTakeTotal Then + DividendTotal = oModel.txtDividend.Value + iRow = GetStockRowIndex(SelStockName) + TotalStocksCount = oFirstSheet.GetCellByPosition(SBCOLUMNQUANTITY1,iRow).Value + DividendPerShare = DividendTotal/TotalStocksCount + Else + DividendPerShare = oModel.txtDividend.Value + End If + + Case HANDLESPLIT + ' Store entered values in variables + OldNumber = oModel.txtOldRate.Value + NewNumber = oModel.txtNewRate.Value + SplitDate = CDateFromUNODate(oModel.txtDate.Date) + iRow = SBROWFIRSTTRANSACT2 + NoteText = cSplit & SplitDate & ", " & oModel.txtOldRate.Value & oModel.lblColon.Label & oModel.txtNewRate.Value + Do + oNameCell = oMovementSheet.GetCellByPosition(SBCOLUMNNAME2, iRow) + CellStockName = oNameCell.String + If CellStockName = SelStockName Then + oDateCell = oMovementSheet.GetCellByPosition(SBCOLUMNDATE2, iRow) + If oDateCell.Value >= SplitDate Then + MsgBox sMsgWrongExchangeDate, SBMSGOK + SBMSGSTOP, sMsgError + Exit Sub + End If + End If + iRow = iRow + 1 + Loop Until CellStockName = "" + End Select + iRow = SBROWFIRSTTRANSACT2 + UnprotectSheets(oSheets) + Do + oNameCell = oMovementSheet.GetCellByPosition(SBCOLUMNNAME2, iRow) + CellStockName = oNameCell.String + If CellStockName = SelStockName Then + Select Case Mode + Case HANDLEDIVIDEND + RestQuantity = oMovementSheet.GetCellByPosition(SBCOLUMNQTYREST2, iRow).Value + If RestQuantity > 0 Then + oDividendCell = oMovementSheet.GetCellByPosition(SBCOLUMNDIVIDEND2, iRow) + OldValue = oDividendCell.Value + oDividendCell.Value = OldValue + RestQuantity * DividendPerShare + End If + Case HANDLESPLIT + oDateCell = oMovementSheet.GetCellByPosition(SBCOLUMNDATE2, iRow) + SplitCellValue(oMovementSheet, NewNumber, OldNumber, SBCOLUMNQUANTITY2, iRow, NoteText) + SplitCellValue(oMovementSheet, OldNumber, NewNumber, SBCOLUMNRATE2, iRow, "") + SplitCellValue(oMovementSheet, NewNumber, OldNumber, SBCOLUMNQTYSOLD2, iRow, "") + End Select + End If + iRow = iRow + 1 + Loop Until CellStockName = "" + If Mode = HANDLESPLIT Then + CalculateChartafterSplit(SelStockName, NewNumber, OldNumber, NoteText, SplitDate) + End If + oDocument.CalculateAll() + ProtectSheets(oSheets) + oDocument.RemoveActionLock +End Sub + + +Sub CancelStockRate() + DlgStockRates.EndExecute() +End Sub + + +Sub CancelTransaction() + DlgTransaction.EndExecute() +End Sub + + +Sub CommitStockRate() +Dim CurStep as Integer + CurStep = StockRatesModel.Step + Select Case CurStep + Case 1 + ' Check for quantity entered + If StockRatesModel.txtDividend.Value = 0 Then + MsgBox sMsgNoDividend, SBMSGSTOP+SBMSGSTOP, sMsgError + Exit Sub + End If + HandleStocks(HANDLEDIVIDEND, DlgStockRates) + Case 2 + HandleStocks(HANDLESPLIT, DlgStockRates) + Case 3 + InsertCompanyHistory() + End Select +End Sub + + +Sub EnableTransactionControls(bEnable as Boolean) + With TransactModel + .lblQuantity.Enabled = bEnable + .txtQuantity.Enabled = bEnable + .lblRate.Enabled = bEnable + .txtRate.Enabled = bEnable + .lblDate.Enabled = bEnable + .txtDate.Enabled = bEnable + .lblCommission.Enabled = bEnable + .txtCommission.Enabled = bEnable + .lblMinimum.Enabled = bEnable + .txtMinimum.Enabled = bEnable + .lblFix.Enabled = bEnable + .txtFix.Enabled = bEnable + If TransactModel.Step = SBDIALOGSELL Then + .cmdGoOn.Enabled = Ubound(TransactModel.lstSellStocks.SelectedItems()) > -1 + DlgTransaction.GetControl("lstSellStocks").SetFocus() + Else + .cmdGoOn.Enabled = TransactModel.lstBuyStocks.Text <> "" + DlgTransaction.GetControl("lstBuyStocks").SetFocus() + End If + If bEnable Then + TransactModel.cmdGoOn.DefaultButton = True + End If + End With +End Sub + + +Sub SetupTransactionControls(CurStep as Integer) + DlgReference = DlgTransaction + With TransactModel + .txtDate.Date = CDateToUNODate(Date()) + .txtDate.DateMax = CDateToUNODate(Date()) + .txtStockID.Enabled = False + .lblStockID.Enabled = False + .lblStockID.Label = sCurStockIDLabel + .txtRate.CurrencySymbol = sCurCurrency + .txtFix.CurrencySymbol = sCurCurrency + .Step = CurStep + End With + DlgTransaction.Title = TransactTitle(CurStep) + CellValuetoControl(oBankSheet, TransactModel.txtCommission, "ProvisionPercent") + CellValuetoControl(oBankSheet, TransactModel.txtMinimum, "ProvisionMinimum") + CellValuetoControl(oBankSheet, TransactModel.txtFix, "ProvisionFix") +End Sub + + +Sub AddShortCuttoControl() +Dim SelCompany as String +Dim iRow, SelIndex as Integer + SelIndex = DlgTransaction.GetControl("lstBuyStocks").GetSelectedItemPos() + If SelIndex <> -1 Then + SelCompany = TransactModel.lstBuyStocks.StringItemList(SelIndex) + iRow = GetStockRowIndex(SelCompany) + If iRow <> -1 Then + TransactModel.txtStockID.Text = oFirstSheet.GetCellByPosition(SBCOLUMNID1,iRow).String + TransactModel.txtRate.Value = oFirstSheet.GetCellByPosition(SBCOLUMNRATE1,iRow).Value + Else + TransactModel.txtStockID.Text = "" + TransactModel.txtRate.Value = 0 + End If + Else + TransactModel.txtStockID.Text = "" + TransactModel.txtRate.Value = 0 + End If +End Sub + + +Sub OpenStockRatePage(aEvent) +Dim CurStep as Integer + Initialize(True) + CurStep = aEvent.Source.Model.Tag + If FillListbox(DlgStockRates.GetControl("lstStockNames"), StockRatesTitle(CurStep), True) Then + StockRatesModel.Step = CurStep + ToggleStockRateControls(False, CurStep) + InitializeStockRatesControls(CurStep) + DlgStockRates.Execute() + End If +End Sub + + +Sub SelectStockNameForRates() +Dim StockName as String + StockName = DlgStockRates.GetControl("lstStockNames").GetSelectedItem() + If StockName <> "" Then + StockRatesModel.txtStockID.Text = GetStockID(StockName) + ToggleStockRateControls(True, StockRatesModel.Step) + End If + StockRatesModel.cmdGoOn.DefaultButton = True +End Sub + + +Sub ToggleStockRateControls(bDoEnable as Boolean, CurStep as Integer) + With StockRatesModel + .lblStockID.Enabled = False + .txtStockID.Enabled = False + .cmdGoOn.Enabled = Ubound(StockRatesModel.lstStockNames.SelectedItems()) <> -1 + Select Case CurStep + Case 1 + .optPerShare.Enabled = bDoEnable + .optTotal.Enabled = bDoEnable + .lblDividend.Enabled = bDoEnable + .txtDividend.Enabled = bDoEnable + Case 2 + .lblExchangeRate.Enabled = bDoEnable + .lblDate.Enabled = bDoEnable + .lblColon.Enabled = bDoEnable + .txtOldRate.Enabled = bDoEnable + .txtNewRate.Enabled = bDoEnable + .txtDate.Enabled = bDoEnable + Case 3 + .lblStartDate.Enabled = bDoEnable + .lblEndDate.Enabled = bDoEnable + .txtStartDate.Enabled = bDoEnable + .txtEndDate.Enabled = bDoEnable + .hlnInterval.Enabled = bDoEnable + .optDaily.Enabled = bDoEnable + .optWeekly.Enabled = bDoEnable + End Select + End With +End Sub + + +Sub InitializeStockRatesControls(CurStep as Integer) + DlgReference = DlgStockRates + DlgStockRates.Title = StockRatesTitle(CurStep) + With StockRatesModel + .txtStockID.Text = "" + .lblStockID.Label = sCurStockIDLabel + Select Case CurStep + Case 1 + .txtDividend.Value = 0 + .optPerShare.State = 1 + .txtDividend.CurrencySymbol = sCurCurrency + Case 2 + .txtOldRate.Value = 1 + .txtNewRate.Value = 1 + .txtDate.Date = CDateToUNODate(Date()) + Case 3 + .txtStartDate.DateMax = CDateToUNODate(CDate(Date())-1) + .txtEndDate.DateMax = CDateToUNODate(CDate(Date())-1) + .txtStartDate.Date = CDateToUNODate(CDate(Date())-8) + .txtEndDate.Date = CDateToUNODate(CDate(Date())-1) + .optDaily.State = 1 + End Select + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Dialog2.xdl b/wizards/source/depot/Dialog2.xdl new file mode 100644 index 000000000..94851c3e4 --- /dev/null +++ b/wizards/source/depot/Dialog2.xdl @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="Dialog2" dlg:tab-index="0" dlg:left="91" dlg:top="24" dlg:width="220" dlg:height="128" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_DIALOG_SELLBUY" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblStockNames" dlg:tab-index="0" dlg:left="6" dlg:top="6" dlg:width="102" dlg:height="8" dlg:value="lblStockNames"/> + <dlg:menulist dlg:id="lstSellStocks" dlg:tab-index="1" dlg:left="6" dlg:top="17" dlg:width="102" dlg:height="12" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_1_LSTSELLSTOCKS" dlg:spin="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Depot.Depot.SelectStockname?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:combobox dlg:id="lstBuyStocks" dlg:tab-index="2" dlg:left="6" dlg:top="17" dlg:width="102" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_2_LSTBUYSTOCKS" dlg:spin="true"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Depot.Depot.SelectStockname?language=Basic&location=application" script:language="Script"/> + </dlg:combobox> + <dlg:text dlg:id="lblStockID" dlg:tab-index="3" dlg:left="150" dlg:top="6" dlg:width="66" dlg:height="8" dlg:value="lblStockID"/> + <dlg:textfield dlg:id="txtStockID" dlg:tab-index="4" dlg:left="150" dlg:top="17" dlg:width="40" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SELLBUY"/> + <dlg:text dlg:id="lblQuantity" dlg:tab-index="5" dlg:left="6" dlg:top="36" dlg:width="57" dlg:height="8" dlg:value="lblQuantity"/> + <dlg:numericfield dlg:id="txtQuantity" dlg:tab-index="6" dlg:left="6" dlg:top="47" dlg:width="46" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTQUANTITY" dlg:decimal-accuracy="0" dlg:value-min="1"/> + <dlg:currencyfield dlg:id="txtRate" dlg:tab-index="7" dlg:left="68" dlg:top="47" dlg:width="40" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTRATE" dlg:value-min="0"/> + <dlg:datefield dlg:id="txtDate" dlg:tab-index="8" dlg:left="150" dlg:top="47" dlg:width="50" dlg:height="12" dlg:tag="Dialog2" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTDATE" dlg:strict-format="true" dlg:spin="true"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Depot.tools.CheckInputDate?language=Basic&location=application" script:language="Script"/> + </dlg:datefield> + <dlg:text dlg:id="lblRate" dlg:tab-index="9" dlg:left="68" dlg:top="36" dlg:width="77" dlg:height="8" dlg:value="lblRate"/> + <dlg:text dlg:id="lblDate" dlg:tab-index="10" dlg:left="150" dlg:top="37" dlg:width="66" dlg:height="8" dlg:value="lblDate"/> + <dlg:formattedfield dlg:id="txtCommission" dlg:tab-index="11" dlg:left="6" dlg:top="90" dlg:width="40" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTCOMMISSION" dlg:format-code="0,00%" dlg:format-locale="de;DE"/> + <dlg:text dlg:id="lblCommission" dlg:tab-index="12" dlg:left="6" dlg:top="79" dlg:width="60" dlg:height="8" dlg:value="lblCommission"/> + <dlg:currencyfield dlg:id="txtFix" dlg:tab-index="13" dlg:left="68" dlg:top="90" dlg:width="40" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTFIX" dlg:value-min="0"/> + <dlg:currencyfield dlg:id="txtMinimum" dlg:tab-index="14" dlg:left="150" dlg:top="90" dlg:width="40" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTMINIMUM" dlg:value-min="0"/> + <dlg:text dlg:id="lblFix" dlg:tab-index="15" dlg:left="68" dlg:top="79" dlg:width="71" dlg:height="8" dlg:value="lblFix"/> + <dlg:text dlg:id="lblMinimum" dlg:tab-index="16" dlg:left="150" dlg:top="79" dlg:width="66" dlg:height="8" dlg:value="lblMinimum"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="17" dlg:left="58" dlg:top="109" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SELLBUY" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Depot.CancelTransaction?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="18" dlg:left="111" dlg:top="109" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SELLBUY" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Depot.TransactionOk?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:fixedline dlg:id="hlnCommission" dlg:tab-index="19" dlg:left="6" dlg:top="66" dlg:width="210" dlg:height="8" dlg:value="hlnCommission"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/depot/Dialog3.xdl b/wizards/source/depot/Dialog3.xdl new file mode 100644 index 000000000..3b8904700 --- /dev/null +++ b/wizards/source/depot/Dialog3.xdl @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="Dialog3" dlg:left="161" dlg:top="81" dlg:width="176" dlg:height="119" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_DIALOG_SPLIT" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblStockNames" dlg:tab-index="0" dlg:left="6" dlg:top="6" dlg:width="98" dlg:height="8" dlg:value="lblStockNames"/> + <dlg:menulist dlg:id="lstStockNames" dlg:tab-index="1" dlg:left="5" dlg:top="17" dlg:width="102" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_LSTSTOCKNAMES" dlg:spin="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Depot.Depot.SelectStockNameForRates?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:textfield dlg:id="txtStockID" dlg:tab-index="2" dlg:left="120" dlg:top="17" dlg:width="50" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_TXTSTOCKID_SPLIT"/> + <dlg:datefield dlg:id="txtStartDate" dlg:tab-index="3" dlg:left="63" dlg:top="37" dlg:width="50" dlg:height="12" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_3_TXTSTARTDATE" dlg:spin="true"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Depot.tools.CheckInputDate?language=Basic&location=application" script:language="Script"/> + </dlg:datefield> + <dlg:datefield dlg:id="txtEndDate" dlg:tab-index="4" dlg:left="63" dlg:top="53" dlg:width="50" dlg:height="12" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_3_TXTENDDATE" dlg:spin="true"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Depot.tools.CheckInputDate?language=Basic&location=application" script:language="Script"/> + </dlg:datefield> + <dlg:radiogroup> + <dlg:radio dlg:id="optDaily" dlg:tab-index="5" dlg:left="12" dlg:top="83" dlg:width="75" dlg:height="10" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_3_OPTDAILY" dlg:value="optDaily"/> + <dlg:radio dlg:id="optWeekly" dlg:tab-index="6" dlg:left="101" dlg:top="83" dlg:width="69" dlg:height="10" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_3_OPTWEEKLY" dlg:value="optWeekly"/> + </dlg:radiogroup> + <dlg:datefield dlg:id="txtDate" dlg:tab-index="7" dlg:left="71" dlg:top="73" dlg:width="50" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_2_TXTDATE" dlg:spin="true"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Depot.tools.CheckInputDate?language=Basic&location=application" script:language="Script"/> + </dlg:datefield> + <dlg:radiogroup> + <dlg:radio dlg:id="optPerShare" dlg:tab-index="8" dlg:left="6" dlg:top="37" dlg:width="69" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_1_OPTPERSHARE" dlg:value="optPerShare"/> + <dlg:radio dlg:id="optTotal" dlg:tab-index="9" dlg:left="6" dlg:top="51" dlg:width="69" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_1_OPTTOTAL" dlg:value="optTotal"/> + </dlg:radiogroup> + <dlg:currencyfield dlg:id="txtDividend" dlg:tab-index="10" dlg:left="6" dlg:top="80" dlg:width="50" dlg:height="12" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_1_TXTDIVIDEND" dlg:value-min="0" dlg:spin="true"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="11" dlg:left="41" dlg:top="98" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_SPLIT" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Depot.CancelStockRate?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="12" dlg:left="94" dlg:top="98" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_SPLIT" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Depot.CommitStockRate?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="lblStockID" dlg:tab-index="13" dlg:left="120" dlg:top="6" dlg:width="50" dlg:height="8" dlg:value="lblStockID"/> + <dlg:text dlg:id="lblDividend" dlg:tab-index="14" dlg:left="6" dlg:top="68" dlg:width="73" dlg:height="8" dlg:page="1" dlg:value="lblDividend"/> + <dlg:text dlg:id="lblExchangeRate" dlg:tab-index="15" dlg:left="6" dlg:top="39" dlg:width="92" dlg:height="8" dlg:page="2" dlg:value="lblExchangeRate"/> + <dlg:text dlg:id="lblColon" dlg:tab-index="16" dlg:left="40" dlg:top="55" dlg:width="5" dlg:height="8" dlg:page="2" dlg:value=" :"/> + <dlg:text dlg:id="lblDate" dlg:tab-index="17" dlg:left="5" dlg:top="75" dlg:width="66" dlg:height="8" dlg:page="2" dlg:value="lblDate"/> + <dlg:fixedline dlg:id="hlnInterval" dlg:tab-index="18" dlg:left="6" dlg:top="72" dlg:width="164" dlg:height="8" dlg:page="3" dlg:value="hlnInterval"/> + <dlg:text dlg:id="lblStartDate" dlg:tab-index="19" dlg:left="6" dlg:top="39" dlg:width="53" dlg:height="8" dlg:page="3" dlg:value="lblStartDate"/> + <dlg:text dlg:id="lblEndDate" dlg:tab-index="20" dlg:left="6" dlg:top="55" dlg:width="53" dlg:height="8" dlg:page="3" dlg:value="lblEndDate"/> + <dlg:numericfield dlg:id="txtOldRate" dlg:tab-index="21" dlg:left="6" dlg:top="53" dlg:width="30" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_2_TXTOLDRATE" dlg:decimal-accuracy="0" dlg:value-min="1" dlg:spin="true"/> + <dlg:numericfield dlg:id="txtNewRate" dlg:tab-index="22" dlg:left="50" dlg:top="53" dlg:width="30" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_2_TXTNEWRATE" dlg:decimal-accuracy="0" dlg:value-min="1" dlg:spin="true"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/depot/Dialog4.xdl b/wizards/source/depot/Dialog4.xdl new file mode 100644 index 000000000..057eb9d17 --- /dev/null +++ b/wizards/source/depot/Dialog4.xdl @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="Dialog4" dlg:left="161" dlg:top="81" dlg:width="160" dlg:height="120" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_DIALOG_HISTORY" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblWelcome" dlg:tab-index="0" dlg:left="6" dlg:top="6" dlg:width="148" dlg:height="49" dlg:value="lblWelcome" dlg:multiline="true"/> + <dlg:text dlg:id="lblHint" dlg:tab-index="1" dlg:left="6" dlg:top="73" dlg:width="148" dlg:height="26" dlg:value="lblHint" dlg:multiline="true"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="2" dlg:left="28" dlg:top="100" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDCANCEL_HISTORY" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Currency.CloseStartUpDialog?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="3" dlg:left="84" dlg:top="100" dlg:width="52" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_0_CMDGOON_HISTORY" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Depot.Currency.ChooseMarket?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:menulist dlg:id="lstMarkets" dlg:tab-index="4" dlg:left="6" dlg:top="57" dlg:width="148" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGDEPOT_LSTMARKETS" dlg:spin="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Depot.Currency.EnableGoOnButton?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/depot/Internet.xba b/wizards/source/depot/Internet.xba new file mode 100644 index 000000000..d3393bc72 --- /dev/null +++ b/wizards/source/depot/Internet.xba @@ -0,0 +1,356 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Internet" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit +Public sNewSheetName as String + +Function CheckHistoryControls() +Dim bLocGoOn as Boolean +Dim Firstdate as Date +Dim LastDate as Date + LastDate = CDateFromUNODate(StockRatesModel.txtEndDate.Date) + FirstDate = CDateFromUNODate(StockRatesModel.txtStartDate.Date) + bLocGoOn = FirstDate <> 0 And LastDate <> 0 + If bLocGoOn Then + If FirstDate >= LastDate Then + Msgbox(sMsgStartDatebeforeEndDate,16, sProductname) + bLocGoOn = False + End If + End If + CheckHistoryControls = bLocGoon +End Function + + +Sub InsertCompanyHistory() +Dim StockName as String +Dim CurRow as Integer +Dim sMsgInternetError as String +Dim CurRate as Double +Dim oCell as Object +Dim sStockID as String +Dim ChartSource as String + If CheckHistoryControls() Then + StartDate = CDateFromUNODate(StockRatesModel.txtStartDate.Date) + EndDate = CDateFromUNODate(StockRatesModel.txtEndDate.Date) + DlgStockRates.EndExecute() + If StockRatesModel.optDaily.State = 1 Then + sInterval = "d" + iStep = 1 + ElseIf StockRatesModel.optWeekly.State = 1 Then + sInterval = "w" + iStep = 7 + StartDate = StartDate - WeekDay(StartDate) + 2 + EndDate = EndDate - WeekDay(EndDate) + 2 + End If + iEndDay = Day(EndDate) + iEndMonth = Month(EndDate) + iEndYear = Year(EndDate) + iStartDay = Day(StartDate) + iStartMonth = Month(StartDate) + iStartYear = Year(StartDate) +' oDocument.AddActionLock() + UnprotectSheets(oSheets) + InitializeStatusline("", 10, 1) + oBackGroundSheet = oSheets.GetbyName("Background") + StockName = DlgStockRates.GetControl("lstStockNames").GetSelectedItem() + CurRow = GetStockRowIndex(Stockname) + sStockID = oFirstSheet.GetCellByPosition(SBCOLUMNID1, CurRow).String + ChartSource = ReplaceString(HistoryChartSource, sStockID, "<StockID>") + ChartSource = ReplaceString(ChartSource, iStartDay, "<StartDay>") + ChartSource = ReplaceString(ChartSource, cStr(iStartMonth-1), "<StartMonth>") + ChartSource = ReplaceString(ChartSource, iStartYear, "<StartYear>") + ChartSource = ReplaceString(ChartSource, iEndDay, "<EndDay>") + ChartSource = ReplaceString(ChartSource, cStr(iEndMonth-1), "<EndMonth>") + ChartSource = ReplaceString(ChartSource, iEndYear, "<EndYear>") + ChartSource = ReplaceString(ChartSource, sInterval, "<interval>") + oStatusLine.SetValue(2) + If GetCurrentRate(ChartSource, CurRate, 1) Then + oStatusLine.SetValue(8) + UpdateValue(StockName, Today, CurRate) + oStatusLine.SetValue(9) + UpdateChart(StockName) + oStatusLine.SetValue(10) + Else + sMsgInternetError = Stockname & ": " & sNoInternetDataAvailable & chr(13) & sCheckInternetSettings + Msgbox(sMsgInternetError, 16, sProductname) + End If + ProtectSheets(oSheets) + oStatusLine.End + If oSheets.HasbyName(sNewSheetName) Then + oController.ActiveSheet = oSheets.GetByName(sNewSheetName) + End If +' oDocument.RemoveActionLock() + End If +End Sub + + + +Sub InternetUpdate() +Dim i as Integer +Dim StocksCount as Integer +Dim iStartRow as Integer +Dim sUrl as String +Dim StockName as String +Dim CurRate as Double +Dim oCell as Object +Dim sMsgInternetError as String +Dim sStockID as String +Dim ChartSource as String +' oDocument.AddActionLock() + Initialize(True) + UnprotectSheets(oSheets) + StocksCount = GetStocksCount(iStartRow) + InitializeStatusline("", StocksCount + 1, 1) + Today = CDate(Date) + For i = iStartRow + 1 To iStartRow + StocksCount + StockName = oFirstSheet.GetCellbyPosition(SBCOLUMNNAME1, i).String + sStockID = oFirstSheet.GetCellByPosition(SBCOLUMNID1, i).String + ChartSource = ReplaceString(sCurChartSource, sStockID, "<StockID>") + If GetCurrentRate(ChartSource, CurRate, 0) Then + InsertCurrentValue(CurRate, i, Now) + Else + sMsgInternetError = Stockname & ": " & sNoInternetDataAvailable & chr(13) & sCheckInternetSettings + Msgbox(sMsgInternetError, 16, sProductname) + End If + oStatusline.SetValue(i - iStartRow + 1) + Next + ProtectSheets(oSheets) + oStatusLine.End +' oDocument.RemoveActionLock +End Sub + + + +Function GetCurrentRate(sUrl as String, fValue As Double, iValueRow as Integer) as Boolean +Dim sFilter As String +Dim sOptions As String +Dim oLinkSheet As Object +Dim sDate as String + If oSheets.hasByName("Link") Then + oLinkSheet = oSheets.getByName("Link") + Else + oLinkSheet = oDocument.createInstance("com.sun.star.sheet.Spreadsheet") + oSheets.insertByName("Link", oLinkSheet) + oLinkSheet.IsVisible = False + End If + + sFilter = "Text - txt - csv (StarCalc)" + sOptions = sCurSeparator & ",34,SYSTEM,1,1/10/2/10/3/10/4/10/5/10/6/10/7/10/8/10/9/10" + + oLinkSheet.LinkMode = com.sun.star.sheet.SheetLinkMode.NONE + oLinkSheet.link(sUrl, "", sFilter, sOptions, 1 ) + fValue = oLinkSheet.getCellByPosition(iValueCol, iValueRow).Value + If fValue = 0 Then + Dim sValue as String + sValue = oLinkSheet.getCellByPosition(1, iValueRow).String + sValue = ReplaceString(sValue, ".",",") + fValue = Val(sValue) + End If + GetCurrentRate = fValue <> 0 +End Function + + + +Sub UpdateValue(ByVal sName As String, fDate As Double, fValue As Double ) +Dim oSheet As Object +Dim iColumn As Long +Dim iRow As Long +Dim i as Long +Dim oCell As Object +Dim LastDate as Date +Dim bLeaveLoop as Boolean +Dim RemoveCount as Long +Dim iLastRow as Long +Dim iLastLinkRow as Long +Dim dDate as Date +Dim CurDate as Date +Dim oLinkSheet as Object +Dim StartIndex as Long +Dim iCellValue as Long + ' Insert Sheet with Company - Chart + sName = CheckNewSheetname(oSheets, sName) + If NOT oSheets.hasByName(sName) Then + oSheets.CopybyName("Background", sName, oSheets.Count) + oSheet = oSheets.getByName(sName) + iCurRow = SBSTARTROW + iMaxRow = iCurRow + oCell = oSheet.getCellByPosition(SBDATECOLUMN, iCurRow) + oCell.Value = fDate + End If + sNewSheetName = sName + oLinkSheet = oSheets.GetByName("Link") + oSheet = oSheets.getByName(sName) + iLastRow = GetLastUsedRow(oSheet)- 2 + iLastLinkRow = GetLastUsedRow(oLinkSheet) + iCurRow = iLastRow + bLeaveLoop = False + RemoveCount = 0 + ' Delete all Cells in Date Area + Do + oCell = oSheet.GetCellbyPosition(SBDATECOLUMN,iCurRow) + If oCell.CellStyle = sColumnHeader Then + bLeaveLoop = True + StartIndex = iCurRow + iCurRow = iCurRow + 1 + Else + RemoveCount = RemoveCount + 1 + iCurRow = iCurRow - 1 + End If + Loop Until bLeaveLoop + If RemoveCount > 1 Then + oSheet.Rows.RemoveByIndex(iCurRow, RemoveCount-1) + End If + For i = 1 To iLastLinkRow + oCell = oSheet.GetCellbyPosition(SBDATECOLUMN,iCurRow) + iCellValue = oLinkSheet.GetCellByPosition(0,i).Value + If iCellValue > 0 Then + oCell.SetValue(oLinkSheet.GetCellByPosition(0,i).Value) + Else + oCell.SetValue(StringToDate(oLinkSheet.GetCellByPosition(0,i).String)) + End If + oCell = oSheet.GetCellbyPosition(SBVALUECOLUMN,iCurRow) + oCell.SetValue(oLinkSheet.GetCellByPosition(4,i).Value) + If i < iLastLinkRow Then + iCurRow = iCurRow + 1 + oSheet.Rows.InsertByIndex(iCurRow,1) + End If + Next i + iMaxRow = iCurRow +End Sub + + +Function StringToDate(DateString as String) as Date +Dim ShortMonths(11) +Dim DateList() as String +Dim MaxIndex as Integer +Dim i as Integer + ShortMonths(0) = "Jan" + ShortMonths(1) = "Feb" + ShortMonths(2) = "Mar" + ShortMonths(3) = "Apr" + ShortMonths(4) = "May" + ShortMonths(5) = "Jun" + ShortMonths(6) = "Jul" + ShortMonths(7) = "Aug" + ShortMonths(8) = "Sep" + ShortMonths(9) = "Oct" + ShortMonths(10) = "Nov" + ShortMonths(11) = "Dec" + For i = 0 To 11 + DateString = ReplaceString(DateString,CStr(i+1),ShortMonths(i)) + Next i + DateString = ReplaceString(DateString, ".", "-") + StringToDate = CDate(DateString) +End Function + + +Sub UpdateChart(sName As String) +Dim oSheet As Object +Dim oCell As Object, oCursor As Object +Dim oChartRange As Object +Dim oEmbeddedChart As Object, oCharts As Object +Dim oChart As Object, oDiagram As Object +Dim oYAxis As Object, oXAxis As Object +Dim fMin As Double, fMax As Double +Dim nDateFormat As Long +Dim aPos As Variant +Dim aSize As Variant +Dim oContainerChart as Object +Dim mRangeAddresses(0) as New com.sun.star.table.CellRangeAddress + mRangeAddresses(0).Sheet = GetSheetIndex(oSheets, sNewSheetName) + mRangeAddresses(0).StartColumn = SBDATECOLUMN + mRangeAddresses(0).StartRow = SBSTARTROW-1 + mRangeAddresses(0).EndColumn = SBVALUECOLUMN + mRangeAddresses(0).EndRow = iMaxRow + + oSheet = oDocument.Sheets.getByName(sNewSheetName) + oCharts = oSheet.Charts + + If Not oCharts.hasElements Then + oSheet.GetCellbyPosition(2,2).SetString(sName) + oChartRange = oSheet.getCellRangeByPosition(SBDATECOLUMN,6,5,SBSTARTROW-3) + aPos = oChartRange.Position + aSize = oChartRange.Size + + Dim oRectangleShape As New com.sun.star.awt.Rectangle + oRectangleShape.X = aPos.X + oRectangleShape.Y = aPos.Y + oRectangleShape.Width = aSize.Width + oRectangleShape.Height = aSize.Height + oCharts.addNewByName(sName, oRectangleShape, mRangeAddresses(), True, False) + oContainerChart = oCharts.getByName(sName) + oChart = oContainerChart.EmbeddedObject + oChart.Title.String = "" + oChart.HasLegend = False + oChart.diagram = oChart.createInstance("com.sun.star.chart.XYDiagram") + oDiagram = oChart.Diagram + oDiagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.COLUMNS + oChart.Area.LineStyle = com.sun.star.drawing.LineStyle.SOLID + oXAxis = oDiagram.XAxis + oXAxis.TextBreak = False + nDateFormat = oXAxis.NumberFormats.getStandardFormat(com.sun.star.util.NumberFormat.DATE, oDocLocale) + + oYAxis = oDiagram.getYAxis() + oYAxis.AutoOrigin = True + Else + oChart = oCharts(0) + oChart.Ranges = mRangeAddresses() + oChart.HasRowHeaders = False + oEmbeddedChart = oChart.EmbeddedObject + oDiagram = oEmbeddedChart.Diagram + oXAxis = oDiagram.XAxis + End If + oXAxis.AutoStepMain = False + oXAxis.AutoStepHelp = False + oXAxis.StepMain = iStep + oXAxis.StepHelp = iStep + fMin = oSheet.getCellByPosition(SBDATECOLUMN,SBSTARTROW).Value + fMax = oSheet.getCellByPosition(SBDATECOLUMN,iMaxRow).Value + oXAxis.Min = fMin + oXAxis.Max = fMax + oXAxis.AutoMin = False + oXAxis.AutoMax = False +End Sub + + +Sub CalculateChartafterSplit(SheetName, NewNumber, OldNumber, NoteText, SplitDate) +Dim oSheet as Object +Dim i as Integer +Dim oValueCell as Object +Dim oDateCell as Object +Dim bLeaveLoop as Boolean + If oSheets.HasbyName(SheetName) Then + oSheet = oSheets.GetbyName(SheetName) + i = 0 + bLeaveLoop = False + Do + oValueCell = oSheet.GetCellbyPosition(SBVALUECOLUMN, SBSTARTROW + i) + If oValueCell.CellStyle = CurrCellStyle Then + SplitCellValue(oSheet, OldNumber, NewNumber, SBVALUECOLUMN, SBSTARTROW + i, "") + i = i + 1 + Else + bLeaveLoop = True + End If + Loop Until bLeaveLoop + oDateCell = oSheet.GetCellbyPosition(SBDATECOLUMN, SBSTARTROW + i-1) + oDateCell.Annotation.SetString(NoteText) + End If +End Sub +</script:module> diff --git a/wizards/source/depot/Lang_de.xba b/wizards/source/depot/Lang_de.xba new file mode 100644 index 000000000..a8b4c55ca --- /dev/null +++ b/wizards/source/depot/Lang_de.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_de" script:language="StarBasic">Option Explicit + +Sub LoadGermanLanguage() + + sProductname = GetProductname + sOK = "~OK" + sCancel = "Abbrechen" + sColumnHeader = "Spaltenkopf" + sInsertStockName = "Bitte fügen Sie zunächst einige Aktien in Ihr Depot ein!" + sTitle = "<PRODUCTNAME>: Aktienverwaltung" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Eingabefehler" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Bitte geben Sie eine Stückzahl größer als 0 ein" + sMsgNoDividend = "Bitte geben Sie eine Dividende je Stück oder eine Gesamtdividende ein" + sMsgNoExchangeRate = "Bitte geben Sie eine korrekte Umtauschrate ein (alte Aktien -> neue Aktien)." + sMsgNoValidExchangeDate = "Bitte geben Sie ein gültiges Datum für den Aktiensplitt ein." + sMsgWrongExchangeDate = "Splitt nicht möglich, da bereits Transaktionen nach dem Splitt-Datum existieren." + sMsgSellTooMuch = "So viele Aktien können Sie nicht verkaufen. Maximum: " + sMsgConfirm = "Bestätigung erforderlich" + sMsgFreeStock = "Beabsichtigen Sie die Eingabe von Gratisaktien?" + sMsgTotalLoss = "Beabsichtigen Sie die Eingabe eines Totalverlustes?" + sMsgAuthorization = "Sicherheitsabfrage" + sMsgDeleteAll = "Wollen Sie alle Bewegungen löschen und die Depotübersicht rücksetzen?" + cSplit = "Aktiensplitt am " + sHistory = "Historie" + TransactTitle(1) = "Aktien verkaufen" + TransactTitle(2) = "Aktien kaufen" + StockRatesTitle(1) = "Dividendenzahlung" + StockRatesTitle(2) = "Aktiensplitt" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Depotwährung" + sStockName = "Aktienname" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Ergebnis Datum" + CurrCellStyle = "Ergebnis Euro mit Dezimalen" + sStartDate = "Startdatum:" + sEndDate = "Enddatum:" + sStartUpWelcome = "Diese Vorlage ermöglicht Ihnen eine effiziente Verwaltung Ihres Aktiendepots" + sStartUpChooseMarket = "Wählen Sie zunächst Ihre Referenz-Währung und damit den Börsenplatz für das Internet Update aus!" + sStartUpHint = "Leider steht Ihnen die <History>- Funktion nur für den amerikanischen Markt zur Verfügung!" + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "ohne Internet Update" + sMarketPlace = "Börsenplatz:" + sNoInternetDataAvailable = "Internet-Kurse konnten nicht empfangen werden!" + sCheckInternetSettings = "Mögliche Ursachen sind: <BR> Ihre Internet Einstellungen müssen überprüft werden.<BR> Sie haben eine falsche Kennung (z.B. Symbol, WKN) für die Aktie eingegeben." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "Das Enddatum muss vor dem heutigen Tag liegen!" + sMsgStartDatebeforeEndDate = "Das Startdatum muss vor dem Enddatum liegen!" + + sMarket(0,0) = "Amerikanischer Dollar" + sMarket(0,1) = "$" + sMarket(0,2) = "New York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Symbol" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Frankfurt" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "WKN" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "Englisches Pfund" + sMarket(2,1) = "£" + sMarket(2,2) = "London" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Symbol" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Japanischer Yen" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokyo" + sMarket(3,3) = "" + sMarket(3,5) = "Code" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Hongkong Dollar" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hongkong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Nummer" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Australischer Dollar" + sMarket(5,1) = "$" + sMarket(5,2) = "Sydney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Symbol" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Menge" + .lblRate.Label = "Kurs" + .lblDate.Label = "Transaktionsdatum" + .hlnCommission.Label = "Sonstige Ausgaben" + .lblCommission.Label = "Provision" + .lblMinimum.Label = "Mindestprovision" + .lblFix.Label = "Festbetrag/Spesen" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Dividende/Aktie" + .optTotal.Label = "Dividende gesamt" + .lblDividend.Label = "Betrag" + .lblExchangeRate.Label = "Umtauschrate (alt->neu)" + .lblColon.Label = ":" + .lblDate.Label = "Umtauschdatum:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Täglich" + .optWeekly.Label = "~Wöchentlich" + .hlnInterval.Label = "Zeitraum" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_en.xba b/wizards/source/depot/Lang_en.xba new file mode 100644 index 000000000..b97efb156 --- /dev/null +++ b/wizards/source/depot/Lang_en.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_en" script:language="StarBasic">Option Explicit + +Sub LoadEnglishLanguage() + + sProductname = GetProductname + sOK = "~OK" + sCancel = "Cancel" + sColumnHeader = "Column Header" + sInsertStockName = "Please enter shares in your portfolio." + sTitle = "<PRODUCTNAME>: Stocks Manager" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Input Error" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Please enter a quantity larger than 0" + sMsgNoDividend = "Please enter the dividend per share or the total dividend" + sMsgNoExchangeRate = "Please enter the correct exchange rate (old shares -> new shares)" + sMsgNoValidExchangeDate = "Please enter a valid date for the split." + sMsgWrongExchangeDate = "Splitting not possible, as transactions already exist after the split date." + sMsgSellTooMuch = "You cannot sell that many shares. Maximum: " + sMsgConfirm = "Confirmation Required" + sMsgFreeStock = "Do you intend to enter free shares?" + sMsgTotalLoss = "Do you intend to enter a total loss?" + sMsgAuthorization = "Security Query" + sMsgDeleteAll = "Do you want to delete all movements and reset the portfolio overview?" + cSplit = "Stock split on " + sHistory = "History" + TransactTitle(1) = "StarOffice Stocks Manager: Selling Shares" + TransactTitle(2) = "StarOffice Stocks Manager: Buying Shares" + StockRatesTitle(1) = "StarOffice Stocks Manager: Dividend Payment" + StockRatesTitle(2) = "Stock Split" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Portfolio Currency" + sStockName = "Name of Stock" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Result Date" + CurrCellStyle = "1" + sStartDate = "Start date:" + sEndDate = "End date:" + sStartUpWelcome = "This template enables you to manage your stock portfolio efficiently." + sStartUpChooseMarket = "First, select your reference currency and thus the stock exchange for the Internet update." + sStartUpHint = "Unfortunately, the only <History> function available to you is that for the American market." + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "without Internet update" + sMarketPlace = "Stock exchange:" + sNoInternetDataAvailable = "No prices could be received from the Internet!" + sCheckInternetSettings = "Possible causes could be: <BR>Your Internet settings have to be modified. <BR>The Symbol (e.g. Code, Ticker Symbol) entered for the stock was incorrect." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "The end date has to be before today's date." + sMsgStartDatebeforeEndDate = "The start date has to be before the end date." + + sMarket(0,0) = "American Dollar" + sMarket(0,1) = "$" + sMarket(0,2) = "New York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Symbol" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Frankfurt" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "Ticker Symbol" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "British Pound" + sMarket(2,1) = "£" + sMarket(2,2) = "London" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Symbol" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Japanese Yen" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokyo" + sMarket(3,3) = "" + sMarket(3,5) = "Code" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Hong Kong Dollar" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hong Kong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Number" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Australian Dollar" + sMarket(5,1) = "$" + sMarket(5,2) = "Sydney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Symbol" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Quantity" + .lblRate.Label = "Price" + .lblDate.Label = "Transaction Date" + .hlnCommission.Label = "Other expenditures" + .lblCommission.Label = "Commission" + .lblMinimum.Label = "Min. Commission" + .lblFix.Label = "Fixed Costs/Charges" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Dividends/Stocks" + .optTotal.Label = "Total Dividends" + .lblDividend.Label = "Amount" + .lblExchangeRate.Label = "Exchange Rate (old->new)" + .lblColon.Label = ":" + .lblDate.Label = "Exchange Date:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Daily" + .optWeekly.Label = "~Weekly" + .hlnInterval.Label = "Time period" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_es.xba b/wizards/source/depot/Lang_es.xba new file mode 100644 index 000000000..b6bf01c43 --- /dev/null +++ b/wizards/source/depot/Lang_es.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_es" script:language="StarBasic">Option Explicit + +Sub LoadSpanishLanguage() + + sProductname = GetProductname + sOK = "~Aceptar" + sCancel = "Cancelar" + sColumnHeader = "Título de columna" + sInsertStockName = "Introduzca primero algunas acciones en su depósito." + sTitle = "<PRODUCTNAME>: Administración de acciones" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Error de entrada" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Indique una cantidad mayor que 0" + sMsgNoDividend = "Indique un dividendo por unidad o un dividendo total" + sMsgNoExchangeRate = "Indique aquí un cambio correcto (acción vieja -> nueva acción)" + sMsgNoValidExchangeDate = "Indique una fecha correcta para el fraccionamiento de la acción." + sMsgWrongExchangeDate = "El fraccionamiento no es posible porque existen transacciones después de la fecha de fraccionamiento." + sMsgSellTooMuch = "No puede vender tantas acciones. Como máximo: " + sMsgConfirm = "Confirmación necesaria" + sMsgFreeStock = "¿Tiene previsto considerar acciones gratis?" + sMsgTotalLoss = "¿Tiene previsto introducir una pérdida total?" + sMsgAuthorization = "Pregunta de seguridad" + sMsgDeleteAll = "¿Desea borrar todos los movimientos y reiniciar el balance de depósito?" + cSplit = "Fraccionamiento el " + sHistory = "Historia" + TransactTitle(1) = "Vender acciones" + TransactTitle(2) = "Comprar acciones" + StockRatesTitle(1) = "Pago de dividendos" + StockRatesTitle(2) = "Fraccionamiento" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Moneda del depósito" + sStockName = "Nombre de la acción" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Resultado Fecha" + CurrCellStyle = "1" + sStartDate = "Fecha de inicio:" + sEndDate = "Fecha final:" + sStartUpWelcome = "Esta plantilla le permite administrar eficientemente su depósito de acciones" + sStartUpChooseMarket = "Seleccione primero la moneda de referencia y la plaza bursátil para la actualización a través de Internet." + sStartUpHint = "La función <History> está disponible únicamente para el mercado americano." + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "Sin actualización por Internet" + sMarketPlace = "Plaza bursátil:" + sNoInternetDataAvailable = "No se pudieron recibir las cotizaciones por Internet." + sCheckInternetSettings = "Causas posibles: <BR> Debe comprobar la configuración de Internet.<BR> Ha indicado un código incorrecto (p.ej. número, símbolo, etc.) para la acción." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "La fecha final debe ser anterior a la fecha de hoy." + sMsgStartDatebeforeEndDate = "La fecha inicial debe ser anterior a la fecha final." + + sMarket(0,0) = "Dólar estadounidense" + sMarket(0,1) = "$" + sMarket(0,2) = "Nueva York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Símbolo" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Frankfurt" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "Código" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "Libra esterlina" + sMarket(2,1) = "£" + sMarket(2,2) = "Londres" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Símbolo" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Yen japonés" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokio" + sMarket(3,3) = "" + sMarket(3,5) = "Código" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Dólar hongkonés" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hong Kong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Número" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Dólar australiano" + sMarket(5,1) = "$" + sMarket(5,2) = "Sidney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Símbolo" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Cantidad" + .lblRate.Label = "Cotización" + .lblDate.Label = "Fecha de operación" + .hlnCommission.Label = "Otros gastos" + .lblCommission.Label = "Provisión" + .lblMinimum.Label = "Provisión mínima" + .lblFix.Label = "Cantidad fija/comisión" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Dividendos/Acción" + .optTotal.Label = "Dividendos totales" + .lblDividend.Label = "Importe" + .lblExchangeRate.Label = "Cambio (vieja->nueva)" + .lblColon.Label = ":" + .lblDate.Label = "Fecha de cambio:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Diario" + .optWeekly.Label = "~Semanal" + .hlnInterval.Label = "Periodo" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_fr.xba b/wizards/source/depot/Lang_fr.xba new file mode 100644 index 000000000..27f9a685c --- /dev/null +++ b/wizards/source/depot/Lang_fr.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_fr" script:language="StarBasic">Option Explicit + +Sub LoadFrenchLanguage() + + sProductname = GetProductname + sOK = "~OK" + sCancel = "Annuler" + sColumnHeader = "En-tête de colonne" + sInsertStockName = "Saisissez quelques actions dans votre portefeuille !" + sTitle = "<PRODUCTNAME> : Gestion d'actions" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Erreur de saisie" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Saisissez une quantité supérieure à 0 !" + sMsgNoDividend = "Vous devez saisir le montant des dividendes perçus (soit les dividendes par action, soit la somme totale perçue)." + sMsgNoExchangeRate = "Saisissez un taux correct de conversion (anciennes actions -> nouvelles actions)." + sMsgNoValidExchangeDate = "Saisissez une date correcte pour le split d'action." + sMsgWrongExchangeDate = "Split impossible car il y a déjà eu des transactions après la date du split !" + sMsgSellTooMuch = "Impossible de vendre autant d'actions ! Maximum : " + sMsgConfirm = "Confirmation required" + sMsgFreeStock = "S'agit-il d'actions gratuites ?" + sMsgTotalLoss = "Prévoyez-vous une perte totale ?" + sMsgAuthorization = "Requête de sécurité" + sMsgDeleteAll = "Voulez-vous supprimer tous les mouvements et remettre le portefeuille d'actions à zéro ?" + cSplit = "Split d'action le " + sHistory = "Historique" + TransactTitle(1) = "Vente d'actions" + TransactTitle(2) = "Achat d'actions" + StockRatesTitle(1) = "Versement des dividendes" + StockRatesTitle(2) = "Split d'action" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Monnaie du portefeuille" + sStockName = "Nom de l'action" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Résultat date" + CurrCellStyle = "1" + sStartDate = "Date de début :" + sEndDate = "Date de fin :" + sStartUpWelcome = "Utilisez ce modèle pour une gestion efficiente de votre portefeuille d'actions !" + sStartUpChooseMarket = "Commencez par choisir une monnaie de référence et ainsi la place boursière pour la mise à jour Internet !" + sStartUpHint = "La fonction <History> n'est cependant disponible que pour le marché américain." + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "Sans mise à jour Internet" + sMarketPlace = "Place boursière :" + sNoInternetDataAvailable = "Réception des cours Internet impossible !" + sCheckInternetSettings = "Causes possibles : <BR> Problème de paramétrage Internet : vérifiez les paramètres !<BR> Vous avez saisi un identificateur (par ex. symbole ou code) incorrect pour l'action." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "La date spécifiée pour la fin doit précéder celle de ce jour !" + sMsgStartDatebeforeEndDate = "La date spécifiée pour le début doit succéder à celle de ce jour !" + + sMarket(0,0) = "Dollar Américain" + sMarket(0,1) = "$" + sMarket(0,2) = "New York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Symbole" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Francfort" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "Code" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "Livre Sterling" + sMarket(2,1) = "£" + sMarket(2,2) = "Londres" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Symbole" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Yen Japonais" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokyo" + sMarket(3,3) = "" + sMarket(3,5) = "Code" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Dollar de Hong Kong" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hong Kong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Numéro" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Dollar Australien" + sMarket(5,1) = "$" + sMarket(5,2) = "Sydney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Symbole" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Quantité" + .lblRate.Label = "Cours" + .lblDate.Label = "Date de transaction" + .hlnCommission.Label = "Dépenses diverses" + .lblCommission.Label = "Commission" + .lblMinimum.Label = "Commission minimale" + .lblFix.Label = "Montant fixe/frais" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Dividende/action" + .optTotal.Label = "Dividende total" + .lblDividend.Label = "Montant" + .lblExchangeRate.Label = "Taux de conversion (ancien->nouveau)" + .lblColon.Label = ":" + .lblDate.Label = "Date de la conversion:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Quotidien" + .optWeekly.Label = "~Hebdomadaire" + .hlnInterval.Label = "Période" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module> diff --git a/wizards/source/depot/Lang_it.xba b/wizards/source/depot/Lang_it.xba new file mode 100644 index 000000000..a8d21bf25 --- /dev/null +++ b/wizards/source/depot/Lang_it.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_it" script:language="StarBasic">Option Explicit + +Sub LoadItalianLanguage() + + sProductname = GetProductname + sOK = "~OK" + sCancel = "Annulla" + sColumnHeader = "Intestazione colonna" + sInsertStockName = "Inserite un nome di azioni" + sTitle = "<PRODUCTNAME>: Gestione delle azioni" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Errore dati immessi" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Inserite il numero delle azioni" + sMsgNoDividend = "Inserite un dividendo a unità oppure un dividendo totale" + sMsgNoExchangeRate = "Indicate un corretto tasso di cambio (vecchie azioni -> nuove azioni)." + sMsgNoValidExchangeDate = "Indicate la data di frazionamento delle azioni." + sMsgWrongExchangeDate = "Il frazionamento non è possibile perché sono ancora in atto transazioni dopo la data indicata." + sMsgSellTooMuch = "Non potete vendere così tante azioni. Massimo: " + sMsgConfirm = "È necessaria una conferma" + sMsgFreeStock = "Confermate la digitazione di azioni gratuite?" + sMsgTotalLoss = "Confermate la digitazione di perdita totale?" + sMsgAuthorization = "Domanda di sicurezza" + sMsgDeleteAll = "Eliminare tutti i movimenti e ripristinare la panoramica dei depositi?" + cSplit = "Frazionamento delle azioni il: " + sHistory = "Cronologia" + TransactTitle(1) = "Vendita di azioni" + TransactTitle(2) = "Acquisto di azioni" + StockRatesTitle(1) = "Pagamento dei dividendi" + StockRatesTitle(2) = "Frazionamento azioni" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Valuta deposito" + sStockName = "Nome delle azioni" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Risultato data" + CurrCellStyle = "1" + sStartDate = "Data d'inizio:" + sEndDate = "Data finale:" + sStartUpWelcome = "Questo modello vi permette una gestione efficace delle vostre azioni." + sStartUpChooseMarket = "Selezionate la valuta di riferimento e la Borsa per il collegamento Internet." + sStartUpHint = "La funzione <History> è disponibile solo per il mercato americano." + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "Senza aggiornamento Internet" + sMarketPlace = "Borsa:" + sNoInternetDataAvailable = "Impossibile ricevere le quotazioni Internet" + sCheckInternetSettings = "Possibili cause: <BR> le impostazioni Internet devono essere modificate.<BR> Avete indicato un indice (ad es. simbolo o codice) errato per le azioni." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "La data finale dev'essere anteriore alla data odierna." + sMsgStartDatebeforeEndDate = "La data d'inizio deve precedere la data finale." + + sMarket(0,0) = "Dollaro USA" + sMarket(0,1) = "$" + sMarket(0,2) = "New York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Simbolo" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Francoforte" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "Numero identificazione titoli" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "Sterlina inglese" + sMarket(2,1) = "£" + sMarket(2,2) = "Londra" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Simbolo" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Yen" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokyo" + sMarket(3,3) = "" + sMarket(3,5) = "Codice" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Dollaro Hong Kong" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hong Kong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Numero" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Dollaro australiano" + sMarket(5,1) = "$" + sMarket(5,2) = "Sydney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Simbolo" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Quantità" + .lblRate.Label = "Quotazione" + .lblDate.Label = "Data della transazione" + .hlnCommission.Label = "Spese extra" + .lblCommission.Label = "Commissioni" + .lblMinimum.Label = "Commissione minima" + .lblFix.Label = "Importo fisso/Spese" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Dividendo/Azione" + .optTotal.Label = "Dividendo totale" + .lblDividend.Label = "Importo" + .lblExchangeRate.Label = "Tasso di cambio (vecchio->nuovo)" + .lblColon.Label = ":" + .lblDate.Label = "Data di cambio:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Giornaliero" + .optWeekly.Label = "~Settimanale" + .hlnInterval.Label = "Durata" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module> diff --git a/wizards/source/depot/Lang_ja.xba b/wizards/source/depot/Lang_ja.xba new file mode 100644 index 000000000..114a0bf08 --- /dev/null +++ b/wizards/source/depot/Lang_ja.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_ja" script:language="StarBasic">Option Explicit + +Sub LoadJapaneseLanguage() + + sProductname = GetProductname + sOK = "~OK" + sCancel = "キャンセル" + sColumnHeader = "列番号" + sInsertStockName = "最初に株の銘柄を入力してください。" + sTitle = "<PRODUCTNAME>: 株管理" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "入力フィールド" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "0 より大きな額を入力してください。" + sMsgNoDividend = "1株当たりの配当金額または総配当金額を入力してください。" + sMsgNoExchangeRate = "交換比率(旧株->新株)を入力してください。" + sMsgNoValidExchangeDate = "株式分割日を入力してください。" + sMsgWrongExchangeDate = "分割日以降に取引がすでに存在するので、分割できません。" + sMsgSellTooMuch = "売却できる株式数を超えています。最大値: " + sMsgConfirm = "ご確認ください" + sMsgFreeStock = "無料株式を入力しますか?" + sMsgTotalLoss = "全損の入力を行いますか?" + sMsgAuthorization = "確認ダイアログ" + sMsgDeleteAll = "すべての移動を取り消し、ポートフォリオの概要をリセットしますか?" + cSplit = "株式分割日 " + sHistory = "履歴" + TransactTitle(1) = "株を買う" + TransactTitle(2) = "株を買う" + StockRatesTitle(1) = "配当額" + StockRatesTitle(2) = "株式分割" + StockRatesTitle(3) = sHistory + sDepotCurrency = "ポートフォリオの通貨" + sStockName = "株式名" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "結果(日付)" + CurrCellStyle = "1" + sStartDate = "開始日:" + sEndDate = "終了日:" + sStartUpWelcome = "このテンプレートを使えば、株式のポートフォリオをより効率的に管理できます。" + sStartUpChooseMarket = "まず、インターネットにより情報を更新する基準通貨と、対応する証券取引所を選択します。" + sStartUpHint = "残念ながら、<History> 機能を使用できるのは米国市場に限られています。" + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "インターネットによる情報の更新を行いません" + sMarketPlace = "証券取引所:" + sNoInternetDataAvailable = "インターネットから株価情報を受信できない場合があります!" + sCheckInternetSettings = "考えられる原因は次のとおりです。<BR>インターネット設定の変更が必要です。<BR>入力した株式のが間違っています。" + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "終了日は、今日の日付より前であることが必要です。" + sMsgStartDatebeforeEndDate = "開始日は、終了日より前であることが必要です。" + + sMarket(0,0) = "米ドル" + sMarket(0,1) = "$" + sMarket(0,2) = "ニューヨーク" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "シンボル" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "ユーロ" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "フランクフルト" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "銘柄コード" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "英ポンド" + sMarket(2,1) = "£" + sMarket(2,2) = "ロンドン" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "シンボル" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "日本円" + sMarket(3,1) = "¥" + sMarket(3,2) = "東京" + sMarket(3,3) = "" + sMarket(3,5) = "コード" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "香港ドル" + sMarket(4,1) = "HK$" + sMarket(4,2) = "香港" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "番号" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "オーストリア・ドル" + sMarket(5,1) = "$" + sMarket(5,2) = "シドニー" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "シンボル" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "株数" + .lblRate.Label = "価格" + .lblDate.Label = "取引日" + .hlnCommission.Label = "その他の経費n" + .lblCommission.Label = "手数料" + .lblMinimum.Label = "最低手数料" + .lblFix.Label = "固定費/諸経費" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "配当金/株式数" + .optTotal.Label = "配当金の総額" + .lblDividend.Label = "金額" + .lblExchangeRate.Label = "交換比率(旧株->新株)" + .lblColon.Label = ":" + .lblDate.Label = "交換日:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~毎日" + .optWeekly.Label = "~毎週" + .hlnInterval.Label = "期間" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_ko.xba b/wizards/source/depot/Lang_ko.xba new file mode 100644 index 000000000..fcc3224e1 --- /dev/null +++ b/wizards/source/depot/Lang_ko.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_ko" script:language="StarBasic">Option Explicit + +Sub LoadKoreanLanguage() + + sProductname = GetProductname + sOK = "~확인" + sCancel = "취소" + sColumnHeader = "열 머리글" + sInsertStockName = "주식 종목을 삽입해주십시오." + sTitle = "<PRODUCTNAME>: 주식 매수" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "입력 오류" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "0 이하의 매수를 입력해주십시오." + sMsgNoDividend = "한 주당 배당분 또는 총배당분을 입력해주십시오." + sMsgNoExchangeRate = "정확한 환율을 입력해주십시오 (구주를 신주로 소급 시)." + sMsgNoValidExchangeDate = "유효한 배당 결제일을 입력해주십시오." + sMsgWrongExchangeDate = "배당 기준일이 경과하여 배당할 수 없습니다." + sMsgSellTooMuch = "이렇게 많은 주식을 팔 수 없습니다. 최대 매도수: " + sMsgConfirm = "확인 필요" + sMsgFreeStock = "공짜 주식을 입력하시겠습니까?" + sMsgTotalLoss = "주가 폭락세를 입력하시겠습니까?" + sMsgAuthorization = "안정성 조회" + sMsgDeleteAll = "모든 주가 움직임을 삭제하고 계좌 현황을 원래대로 하시겠습니까?" + cSplit = "주식 배당일 " + sHistory = "내역" + TransactTitle(1) = "주식 관리: 주식 매도" + TransactTitle(2) = "주식 관리: 주식 매수" + StockRatesTitle(1) = "주식 관리: 배당금 지불" + StockRatesTitle(2) = "주식 관리: 주식 배분" + StockRatesTitle(3) = sHistory + sDepotCurrency = "주식 계좌 통화" + sStockName = "주식 종목명" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "결과, 날짜" + CurrCellStyle = "1" + sStartDate = "매매일:" + sEndDate = "만기일:" + sStartUpWelcome = "이 템플릿을 사용하여 주식 투자 관리를 효율적으로 할 수 있습니다." + sStartUpChooseMarket = "인터넷 업데이트를 위해 우선 관련 통화와 증권 장소를 선택하십시오." + sStartUpHint = "<내역> 기능은 미국 시장용으로만 사용할 수 있습니다." + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "인터넷 업데이트 없음" + sMarketPlace = "증권 장소:" + sNoInternetDataAvailable = "인터넷 시세는 받을 수 없었습니다." + sCheckInternetSettings = "원인: <BR> 인터넷 설정을 점검해야만 합니다.<BR> 옳지 않은 암호<예를 들어 잘못된 문자 또는 종목 코드>를 입력했습니다." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "만기일은 오늘 날짜 전에 기입되어야 합니다." + sMsgStartDatebeforeEndDate = "매매일은 만기일 전에 기입되어야 합니다." + + sMarket(0,0) = "미국 달러" + sMarket(0,1) = "$" + sMarket(0,2) = "뉴욕" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "기호" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "유로" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "프랑크푸르트" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "WKN" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "영국 파운드" + sMarket(2,1) = "£" + sMarket(2,2) = "런던" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "기호" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "엔화" + sMarket(3,1) = "¥" + sMarket(3,2) = "도쿄" + sMarket(3,3) = "" + sMarket(3,5) = "코드" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "홍콩 달러" + sMarket(4,1) = "HK$" + sMarket(4,2) = "홍콩" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "번호" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "호주 달러" + sMarket(5,1) = "$" + sMarket(5,2) = "시드니" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "기호" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "수량" + .lblRate.Label = "시세" + .lblDate.Label = "배당 결산일" + .hlnCommission.Label = "기타 지출" + .lblCommission.Label = "수수료" + .lblMinimum.Label = "최저 수수료" + .lblFix.Label = "약정 금액/기타 경비" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "배당분/주" + .optTotal.Label = "배당분 합계" + .lblDividend.Label = "금액" + .lblExchangeRate.Label = "환율(구주->신주)" + .lblColon.Label = ":" + .lblDate.Label = "환율일자" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~매일" + .optWeekly.Label = "~매주" + .hlnInterval.Label = "기간" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_sv.xba b/wizards/source/depot/Lang_sv.xba new file mode 100644 index 000000000..cbe67e1c2 --- /dev/null +++ b/wizards/source/depot/Lang_sv.xba @@ -0,0 +1,174 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_sv" script:language="StarBasic">Option Explicit + +Sub LoadSwedishLanguage() + sProductname = GetProductname + sOK = "~OK" + sCancel = "Avbryt" + sColumnHeader = "Kolumnhuvud" + sInsertStockName = "Infoga först några aktier i Din portfölj!" + sTitle = "<PRODUCTNAME>: Aktieförvaltning" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "Inmatningsfel" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "Var vänlig och mata in ett större antal än 0" + sMsgNoDividend = "Var vänlig och mata in utdelning per styck eller den totala utdelningen" + sMsgNoExchangeRate = "Var vänlig och mata in en korrekt omräkningskurs (gamla aktier -> nya aktier)." + sMsgNoValidExchangeDate = "Var vänlig och mata in ett giltigt datum för aktiesplitten." + sMsgWrongExchangeDate = "Split är inte möjlig eftersom det redan finns transaktioner efter splitdatum." + sMsgSellTooMuch = "Så många aktier kan Du inte sälja. Maximum: " + sMsgConfirm = "Bekräftelse krävs" + sMsgFreeStock = "Avser Du att mata in gratisaktier?" + sMsgTotalLoss = "Avser Du att mata in en totalförlust?" + sMsgAuthorization = "Säkerhetskontroll" + sMsgDeleteAll = "Vill Du ta bort alla rörelser och återställa portföljöversikten?" + cSplit = "Aktiesplit den " + sHistory = "Historik" + TransactTitle(1) = "Sälja aktier" + TransactTitle(2) = "Köpa aktier" + StockRatesTitle(1) = "Aktieutdelning" + StockRatesTitle(2) = "Aktiesplit" + StockRatesTitle(3) = sHistory + sDepotCurrency = "Portföljvaluta" + sStockName = "Aktienamn" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "Resultat datum" + CurrCellStyle = "1" + sStartDate = "Startdatum:" + sEndDate = "Slutdatum:" + sStartUpWelcome = "Med hjälp av den här mallen kan Du förvalta Din aktieportfölj effektivt" + sStartUpChooseMarket = "Välj först Din referensvaluta och därigenom börs för Internet-uppdateringen!" + sStartUpHint = "Tyvärr är <History>-funktionen bara tillgänglig för den amerikanska marknaden!" + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "utan Internet-uppdatering" + sMarketPlace = "Börs:" + sNoInternetDataAvailable = "Det gick inte att ta emot Internet-kurser!" + sCheckInternetSettings = "Detta kan bero på att: <BR> Dina Internet-inställningar måste ändras.<BR> Du har angivit ett felaktigt ID (t.ex. symbol, värdepappersnr.) för aktien." + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "Slutdatum måste ligga före idag!" + sMsgStartDatebeforeEndDate = "Startdatum måste ligga före slutdatum!" + + sMarket(0,0) = "Amerikansk dollar" + sMarket(0,1) = "$" + sMarket(0,2) = "New York" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "Symbol" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "Euro" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "Frankfurt" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "Värdepappersnr" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "Engelskt pund" + sMarket(2,1) = "£" + sMarket(2,2) = "London" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "Symbol" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "Japansk yen" + sMarket(3,1) = "¥" + sMarket(3,2) = "Tokyo" + sMarket(3,3) = "" + sMarket(3,5) = "Kod" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "Hongkongdollar" + sMarket(4,1) = "HK$" + sMarket(4,2) = "Hongkong" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "Nummer" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "Australisk dollar" + sMarket(5,1) = "$" + sMarket(5,2) = "Sydney" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "Symbol" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "Antal" + .lblRate.Label = "Kurs" + .lblDate.Label = "Transaktionsdatum" + .hlnCommission.Label = "Övriga utgifter" + .lblCommission.Label = "Provision" + .lblMinimum.Label = "Minimiprovision" + .lblFix.Label = "Fast belopp/omkostnader" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "Utdelning per aktie" + .optTotal.Label = "Utdelning totalt" + .lblDividend.Label = "Belopp" + .lblExchangeRate.Label = "Omräkningskurs (gammal->ny)" + .lblColon.Label = ":" + .lblDate.Label = "Omräkningsdatum:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "~Dagligen" + .optWeekly.Label = "~Varje vecka" + .hlnInterval.Label = "Period" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_tw.xba b/wizards/source/depot/Lang_tw.xba new file mode 100644 index 000000000..a4df8c1b6 --- /dev/null +++ b/wizards/source/depot/Lang_tw.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_tw" script:language="StarBasic">Option Explicit + +Sub LoadChineseTradLanguage() + + sProductname = GetProductname + sOK = "確定" + sCancel = "取消" + sColumnHeader = "欄標簽" + sInsertStockName = "請先填入股票名稱!" + sTitle = "<PRODUCTNAME>: 股票管理" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "輸入無效" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "請輸入大於0的交易股數" + sMsgNoDividend = "請輸入每股股息金額或股息總額" + sMsgNoExchangeRate = "請鍵入正確的換算比率(舊股票 -> 新股票)。" + sMsgNoValidExchangeDate = "請輸入股票分割的日期。" + sMsgWrongExchangeDate = "無法分割股票,因為分割日期之後已經買進或賣出股票。" + sMsgSellTooMuch = "最多能出售的股票數: " + sMsgConfirm = "需要确認" + sMsgFreeStock = "需要輸入一個贈送的股票?" + sMsgTotalLoss = "要輸入一個全部損失的股票?" + sMsgAuthorization = "安全詢問" + sMsgDeleteAll = "您要刪除所有的交易資料,重新建立一個股票一覽表?" + cSplit = "股票分割的日期 " + sHistory = "紀錄" + TransactTitle(1) = "出售股票" + TransactTitle(2) = "購買股票" + StockRatesTitle(1) = "支付股息" + StockRatesTitle(2) = "股票分割" + StockRatesTitle(3) = sHistory + sDepotCurrency = "股票的貨幣" + sStockName = "股票名稱" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "結果 日期" + CurrCellStyle = "1" + sStartDate = "交割日期:" + sEndDate = "到期日期:" + sStartUpWelcome = "這個樣式用於高效能地管理股票交易。" + sStartUpChooseMarket = "請先選一個參照的貨幣和一個可直接從 Internet 更新資料的贈券交易所。" + sStartUpHint = "很遺憾,<History>-功能僅適用於美國的交易所。" + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "不透過 internet 更新" + sMarketPlace = "證券交易所:" + sNoInternetDataAvailable = "無法接受 Internet 股票價格!" + sCheckInternetSettings = "可能的原因:<BR>Internet 設定不正確,需要重新設定。<BR>輸入了一個錯誤的股票代碼。" + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "到期日期必須是在今日之前!" + sMsgStartDatebeforeEndDate = "交割日期必須是在到期日期之前!" + + sMarket(0,0) = "美元" + sMarket(0,1) = "$" + sMarket(0,2) = "紐約" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "股票符號" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "歐元" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "法蘭克福" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "股代碼" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "英鎊" + sMarket(2,1) = "£" + sMarket(2,2) = "倫敦" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "股票符號" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "日元" + sMarket(3,1) = "¥" + sMarket(3,2) = "東京" + sMarket(3,3) = "" + sMarket(3,5) = "代碼" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "港幣" + sMarket(4,1) = "HK$" + sMarket(4,2) = "香港" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "編號" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "澳元" + sMarket(5,1) = "$" + sMarket(5,2) = "悉尼" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "股票符號" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "數量" + .lblRate.Label = "股票價格" + .lblDate.Label = "交易日期" + .hlnCommission.Label = "其它的支出費用" + .lblCommission.Label = "手續費" + .lblMinimum.Label = "最低手續費" + .lblFix.Label = "固定金額/費用" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "每股股息" + .optTotal.Label = "股息總計" + .lblDividend.Label = "金額" + .lblExchangeRate.Label = "轉換比率(舊股票 -> 新股票)" + .lblColon.Label = ":" + .lblDate.Label = "轉換日期:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "每日" + .optWeekly.Label = "每週" + .hlnInterval.Label = "時間週期" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/Lang_zh.xba b/wizards/source/depot/Lang_zh.xba new file mode 100644 index 000000000..a4dde61b4 --- /dev/null +++ b/wizards/source/depot/Lang_zh.xba @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Lang_zh" script:language="StarBasic">Option Explicit + +Sub LoadChineseSimpleLanguage() + + sProductname = GetProductname + sOK = "确定" + sCancel = "取消" + sColumnHeader = "列标题" + sInsertStockName = "请首先往您的帐号内输入一些股票名称!" + sTitle = "<PRODUCTNAME>:股票管理" + sTitle = ReplaceString(sTitle, sProductName, "<PRODUCTNAME>") + sMsgError = "输入错误" + sMsgNoName = sInsertStockname + sMsgNoQuantity = "请输入大于0的交易股数" + sMsgNoDividend = "请输入每股的红利金额或红利总额" + sMsgNoExchangeRate = "请输入一个正确的兑换率(旧股-> 新股)。" + sMsgNoValidExchangeDate = "请输入拆股生效日期。" + sMsgWrongExchangeDate = "因为在拆股生效后已经进行了股票交易,所以无法拆股。" + sMsgSellTooMuch = "您最多能出售的股票数为: " + sMsgConfirm = "需要确认" + sMsgFreeStock = "您想要输入赠送股票?" + sMsgTotalLoss = "您想要输入总亏损值?" + sMsgAuthorization = "安全查询" + sMsgDeleteAll = "您要删除所有的交易信息并重新建立股票帐号一览表吗?" + cSplit = "股票拆股日期 " + sHistory = "记录" + TransactTitle(1) = "出售股票" + TransactTitle(2) = "购买股票" + StockRatesTitle(1) = "支付红利" + StockRatesTitle(2) = "股票拆股" + StockRatesTitle(3) = sHistory + sDepotCurrency = "股票交易的货币" + sStockName = "股票名称" + TransactMode = LIFO ' Possible values: "FIFO" and "LIFO" + DateCellStyle = "结果 日期" + CurrCellStyle = "1" + sStartDate = "起始日期:" + sEndDate = "终止日期:" + sStartUpWelcome = "这个样式能够帮助您有效地管理自己的股票帐号" + sStartUpChooseMarket = "请首先选择采用的参考货币以及要直接用国际互联网来更新资料的证券交易所!" + sStartUpHint = "很遗憾,<History>功能仅可供美国市场使用!" + sStartupHint = ReplaceString(sStartUpHint, sHistory, "<History>") + sNoInternetUpdate = "不通过国际互联网更新" + sMarketPlace = "交易所:" + sNoInternetDataAvailable = "无法获得国际互联网上的行情!" + sCheckInternetSettings = "可能的原因是:<BR>您的国际互联网设定不正确,需要重新设定。<BR>输入了一个错误的股票号码。" + sCheckInternetSettings = ReplaceString(sCheckInternetSettings, chr(13), "<BR>") + + sMsgEndDatebeforeNow = "终止日期必须在今天之前!" + sMsgStartDatebeforeEndDate = "起始日期必须在终止日期之前!" + + sMarket(0,0) = "美元" + sMarket(0,1) = "$" + sMarket(0,2) = "纽约" + sMarket(0,3) = "http://finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(0,4) = "http://ichart.finance.yahoo.com/table.csv?" &_ + "s=<StockID>&d=<EndMonth>&e=<EndDay>&f=<Endyear>&g=d&" &_ + "a=<StartMonth>&b=<StartDay>&c=<Startyear>&ignore=.csv" + sMarket(0,5) = "图标" + sMarket(0,6) = "en" + sMarket(0,7) = "US" + sMarket(0,8) = "409" + sMarket(0,9) = "44" + sMarket(0,10) = "1" + + sMarket(1,0) = "欧元" + sMarket(1,1) = chr(8364) + sMarket(1,2) = "法兰克福" + sMarket(1,3) = "http://de.finance.yahoo.com/d/quotes.csv?s=<StockID>.F&f=sl1t1c1ghpv&e=.csv" + sMarket(1,5) = "代码" + sMarket(1,6) = "de;nl;pt;el" + sMarket(1,7) = "DE;NL;PT;GR" + sMarket(1,8) = "407;413;816;408" + sMarket(1,9) = "59/9" + sMarket(1,10) = "1" + + sMarket(2,0) = "英镑" + sMarket(2,1) = "£" + sMarket(2,2) = "伦敦" + sMarket(2,3) = "http://uk.finance.yahoo.com/d/quotes.csv?s=<StockID>.L&m=*&f=sl1t1c1ghov&e=.csv" + sMarket(2,5) = "股票代码" + sMarket(2,6) = "en" + sMarket(2,7) = "GB" + sMarket(2,8) = "809" + sMarket(2,9) = "44" + sMarket(2,10) = "1" + + sMarket(3,0) = "日元" + sMarket(3,1) = "¥" + sMarket(3,2) = "东京" + sMarket(3,3) = "" + sMarket(3,5) = "代码" + sMarket(3,6) = "ja" + sMarket(3,7) = "JP" + sMarket(3,8) = "411" + sMarket(3,9) = "" + sMarket(3,10) = "" + + sMarket(4,0) = "港币" + sMarket(4,1) = "HK$" + sMarket(4,2) = "香港" + sMarket(4,3) = "http://hk.finance.yahoo.com/d/quotes.csv?s=<StockID>.HK&f=sl1d1t1c1ohgv&e=.csv" + sMarket(4,5) = "编号" + sMarket(4,6) = "zh" + sMarket(4,7) = "HK" + sMarket(4,8) = "C04" + sMarket(4,9) = "44" + sMarket(4,10) = "1" + + sMarket(5,0) = "澳元" + sMarket(5,1) = "$" + sMarket(5,2) = "悉尼" + sMarket(5,3) = "http://au.finance.yahoo.com/d/quotes.csv?s=<StockID>&f=sl1d1t1c1ohgv&e=.csv" + sMarket(5,5) = "股票代码" + sMarket(5,6) = "en" + sMarket(5,7) = "AU" + sMarket(5,8) = "C09" + sMarket(5,9) = "44" + sMarket(5,10) = "1" + +' ****************************End of the default subset********************************* + CompleteMarketList() + + LocalizedCurrencies() + + With TransactModel + .lblStockNames.Label = sStockname + .lblQuantity.Label = "数量" + .lblRate.Label = "股票牌价" + .lblDate.Label = "交易日期" + .hlnCommission.Label = "其它支出费用" + .lblCommission.Label = "手续费" + .lblMinimum.Label = "最低手续费" + .lblFix.Label = "固定金额/费用" + .cmdGoOn.Label = sOK + .cmdCancel.Label = sCancel + End With + + With StockRatesModel + .optPerShare.Label = "每股红利" + .optTotal.Label = "红利总计" + .lblDividend.Label = "金额" + .lblExchangeRate.Label = "兑换率(旧->新)" + .lblColon.Label = ":" + .lblDate.Label = "兑换日期:" + .lblStockNames.Label = sStockname + .lblStartDate.Label = sStartDate + .lblEndDate.Label = sEndDate + .optDaily.Label = "每天" + .optWeekly.Label = "每周" + .hlnInterval.Label = "时间周期" + .cmdGoOn.Label = sOk + .cmdCancel.Label = sCancel + End With +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/depot/dialog.xlb b/wizards/source/depot/dialog.xlb new file mode 100644 index 000000000..764ea3f35 --- /dev/null +++ b/wizards/source/depot/dialog.xlb @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Depot" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="Dialog2"/> + <library:element library:name="Dialog3"/> + <library:element library:name="Dialog4"/> +</library:library> diff --git a/wizards/source/depot/script.xlb b/wizards/source/depot/script.xlb new file mode 100644 index 000000000..372665b22 --- /dev/null +++ b/wizards/source/depot/script.xlb @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Depot" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="Depot"/> + <library:element library:name="CommonLang"/> + <library:element library:name="Currency"/> + <library:element library:name="Internet"/> + <library:element library:name="Lang_de"/> + <library:element library:name="tools"/> + <library:element library:name="Lang_en"/> + <library:element library:name="Lang_fr"/> + <library:element library:name="Lang_it"/> + <library:element library:name="Lang_es"/> + <library:element library:name="Lang_sv"/> + <library:element library:name="Lang_zh"/> + <library:element library:name="Lang_tw"/> + <library:element library:name="Lang_ko"/> + <library:element library:name="Lang_ja"/> +</library:library> diff --git a/wizards/source/depot/tools.xba b/wizards/source/depot/tools.xba new file mode 100644 index 000000000..daadf4988 --- /dev/null +++ b/wizards/source/depot/tools.xba @@ -0,0 +1,217 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="tools" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + +Sub RemoveSheet() + If oSheets.HasbyName("Link") then + oSheets.RemovebyName("Link") + End If +End Sub + + +Sub InitializeStatusLine(StatusText as String, MaxValue as Integer, FirstValue as Integer) + oStatusline = oDocument.GetCurrentController.GetFrame.CreateStatusIndicator() + oStatusLine.Start(StatusText, MaxValue) + oStatusline.SetValue(FirstValue) +End Sub + + +Sub MakeRangeVisible(oSheet as Object, RangeName as String, BIsVisible as Boolean) +Dim oRangeAddress, oColumns as Object +Dim i, iStartColumn, iEndColumn as Integer + oRangeAddress = oSheet.GetCellRangeByName(RangeName).RangeAddress + iStartColumn = oRangeAddress.StartColumn + iEndColumn = oRangeAddress.EndColumn + oColumns = oSheet.Columns + For i = iStartColumn To iEndColumn + oSheet.Columns(i).IsVisible = bIsVisible + Next i +End Sub + + +Function GetRowIndex(oSheet as Object, RowName as String) +Dim oRange as Object + oRange = oSheet.GetCellRangeByName(RowName) + GetRowIndex = oRange.RangeAddress.StartRow +End Function + + +Function GetTransactionCount(iStartRow as Integer) +Dim iEndRow as Integer + iStartRow = GetRowIndex(oMovementSheet, "ColumnsToHide") + iEndRow = GetRowIndex(oMovementSheet, "HiddenRow3" ) + GetTransactionCount = iEndRow -iStartRow - 2 +End Function + + +Function GetStocksCount(iStartRow as Integer) +Dim iEndRow as Integer + iStartRow = GetRowIndex(oFirstSheet, "HiddenRow1") + iEndRow = GetRowIndex(oFirstSheet, "HiddenRow2") + GetStocksCount = iEndRow -iStartRow - 1 +End Function + + +Function FillListbox(ListboxControl as Object, MsgTitle as String, bShowMessage) as Boolean +Dim i, StocksCount as Integer +Dim iStartRow as Integer +Dim oCell as Object + ' Add stock names to empty list box + StocksCount = GetStocksCount(iStartRow) + If StocksCount > 0 Then + ListboxControl.Model.StringItemList() = NullList() + For i = 1 To StocksCount + oCell = oFirstSheet.GetCellByPosition(SBCOLUMNNAME1,iStartRow + i) + ListboxControl.AddItem(oCell.String, i-1) + Next + FillListbox() = True + Else + If bShowMessage Then + Msgbox(sInsertStockName, 16, MsgTitle) + FillListbox() = False + End If + End If +End Function + + +Sub CellValuetoControl(oSheet, oControl as Object, CellName as String) +Dim oCell as Object +Dim StringValue + oCell = GetCellByName(oSheet, CellName) + If oControl.PropertySetInfo.HasPropertyByName("EffectiveValue") Then + oControl.EffectiveValue = oCell.Value + Else + oControl.Value = oCell.Value + End If +' If oCell.FormulaResultType = 1 Then +' StringValue = oNumberFormatter.GetInputString(oCell.NumberFormat, oCell.Value) +' oControl.Text = DeleteStr(StringValue, "%") +' Else +' oControl.Text = oCell.String +' End If +End Sub + + +Sub RemoveStockRows(oSheet as Object, iStartRow, RowCount as Integer) + If RowCount > 0 Then + oSheet.Rows.RemoveByIndex(iStartRow, RowCount) + End If +End Sub + + +Sub AddValueToCellContent(iCellCol, iCellRow as Integer, AddValue) +Dim oCell as Object +Dim OldValue + oCell = oMovementSheet.GetCellByPosition(iCellCol, iCellRow) + OldValue = oCell.Value + oCell.Value = OldValue + AddValue +End Sub + + +Sub CheckInputDate(aEvent as Object) +Dim oRefDialog as Object +Dim oRefModel as Object +Dim oDateModel as Object + oDateModel = aEvent.Source.Model + oRefModel = DlgReference.GetControl("cmdGoOn").Model + oRefModel.Enabled = oDateModel.Date <> 0 +End Sub + + + +' Updates the cell with the CurrentValue after checking if the +' Newdate is later than the one that is referred to in the annotation +' of the cell +Sub InsertCurrentValue(CurValue as Double, iRow as Integer, Newdate as Date) +Dim oCell as Object +Dim OldDate as Date + oCell = oFirstSheet.GetCellByPosition(SBCOLUMNRATE1, iRow) + OldDate = CDate(oCell.Annotation.Text.String) + If NewDate >= OldDate Then + oCell.SetValue(CurValue) + oCell.Annotation.Text.SetString(CStr(NewDate)) + End If +End Sub + + +Sub SplitCellValue(oSheet, FirstNumber, SecondNumber, iCol, iRow, NoteText) +Dim oCell as Object +Dim OldValue + oCell = oSheet.GetCellByPosition(iCol, iRow) + OldValue = oCell.Value + oCell.Value = OldValue * FirstNumber / SecondNumber + If NoteText <> "" Then + oCell.Annotation.SetString(NoteText) + End If +End Sub + + +Function GetStockRowIndex(ByVal Stockname) as Integer +Dim i, StocksCount as Integer +Dim iStartRow as Integer +Dim oCell as Object + StocksCount = GetStocksCount(iStartRow) + For i = 1 To StocksCount + oCell = oFirstSheet.GetCellByPosition(SBCOLUMNNAME1,iStartRow + i) + If oCell.String = Stockname Then + GetStockRowIndex = iStartRow + i + Exit Function + End If + Next + GetStockRowIndex = -1 +End Function + + +Function GetStockID(StockName as String, Optional iFirstRow as Integer) as String +Dim CellStockName as String +Dim i as Integer +Dim iCount as Integer +Dim iLastRow as Integer + If IsMissing(iFirstRow) Then + iFirstRow = GetRowIndex(oFirstSheet, "HiddenRow1") + End If + iCount = GetStocksCount(iFirstRow) + iLastRow = iFirstRow + iCount + For i = iFirstRow To iLastRow + CellStockName = oFirstSheet.GetCellByPosition(SBCOLUMNNAME1, i).String + If CellStockname = StockName Then + Exit For + End If + Next i + If i > iLastRow Then + GetStockID() = "" + Else + If Not IsMissing(iFirstRow) Then + iFirstRow = i + End If + GetStockID() = oFirstSheet.GetCellByPosition(SBCOLUMNID1, i).String + End If +End Function + + +Function CheckDocLocale(LocLanguage as String, LocCountry as String) +Dim bIsDocLanguage as Boolean +Dim bIsDocCountry as Boolean + bIsDocLanguage = Instr(1, LocLanguage, sDocLanguage, SBBINARY) <> 0 + bIsDocCountry = Instr(1, LocCountry, sDocCountry, SBBINARY) <> 0 OR SDocCountry = "" + CheckDocLocale = (bIsDocLanguage And bIsDocCountry) +End Function +</script:module> diff --git a/wizards/source/euro/AutoPilotRun.xba b/wizards/source/euro/AutoPilotRun.xba new file mode 100644 index 000000000..77ca182df --- /dev/null +++ b/wizards/source/euro/AutoPilotRun.xba @@ -0,0 +1,415 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="AutoPilotRun" script:language="StarBasic">Option Explicit + +Public SourceDir as String +Public TargetDir as String +Public TargetStemDir as String +Public SourceFile as String +Public TargetFile as String +Public Source as String +Public SubstFile as String +Public SubstDir as String +Public NoArgs() +Public TypeList(6) as String +Public GoOn as Boolean +Public DoUnprotect as Integer +Public Password as String +Public DocIndex as Integer +Public oPathSettings as Object +Public oUcb as Object +Public TotDocCount as Integer +Public sTotDocCount as String +Public OpenProperties(1) as New com.sun.star.beans.PropertyValue + + +Sub StartAutoPilot() +Dim i As Integer +Dim oFactoryKey as Object + BasicLibraries.LoadLibrary("Tools") + BasicLibraries.LoadLibrary("ImportWizard") + If InitResources("Euro Converter") Then + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + oLocale = GetStarOfficeLocale() + InitializeConverter(oLocale, 2) + ToggleGoOnButton() + oFactoryKey = GetRegistryKeyContent("org.openoffice.Setup/Office/Factories") + DialogModel.chkTextDocuments.Enabled = oFactoryKey.hasbyName("com.sun.star.text.TextDocument") + DialogModel.cmdGoOn.DefaultButton = True + DialogModel.lstCurrencies.TabIndex = 12 + DialogConvert.GetControl("optWholeDir").SetFocus() + DialogConvert.Execute() + DialogConvert.Dispose() + End If +End Sub + + +Sub ConvertDocuments() +Dim FilesList() +Dim bDisposable as Boolean + + If Source <> "" And TargetDir <> "" Then + If DialogModel.optSingleFile.State = 1 Then + SourceFile = Source + TotDocCount = 1 + Else + SourceDir = Source + TargetStemDir = TargetDir + TypeList(0) = "calc8" + TypeList(1) = "calc_StarOffice_XML_Calc" + If DialogModel.chkTextDocuments.State = 1 Then + ReDim Preserve TypeList(5) as String + + TypeList(2) = "writer8" + TypeList(3) = "writerglobal8" + TypeList(4) = "writer_StarOffice_XML_Writer" + TypeList(5) = "writer_globaldocument_StarOffice_XML_Writer_GlobalDocument" + End If + FilesList() = ReadDirectories(SourceDir, bRecursive, True, False, TypeList()) + TotDocCount = Ubound(FilesList(),1) + 1 + End If + InitializeProgressPage(DialogModel) +' ChangeToNextProgressStep() + sTotDocCount = CStr(TotDocCount) + OpenProperties(0).Name = "Hidden" + OpenProperties(0).Value = True + OpenProperties(1).Name = "AsTemplate" + OpenProperties(1).Value = False + For DocIndex = 0 To TotDocCount - 1 + If InitializeDocument(FilesList(), bDisposable) Then + If StoreDocument() Then + ConvertDocument() + oDocument.Store + End If + If bDisposable Then + oDocument.Dispose() + End If + End If + Next DocIndex + DialogModel.cmdBack.Enabled = True + DialogModel.cmdGoOn.Enabled = True + DialogModel.cmdGoOn.Label = sReady + DialogModel.cmdCancel.Label = sEnd + End If +End Sub + + +Function InitializeDocument(FilesList(), bDisposable as Boolean) as Boolean +' The Autopilot is started from step No. 2 +Dim sViewPath as String +Dim bIsReadOnly as Boolean +Dim sExtension as String + On Local Error Goto NEXTFILE + If Not bCancelTask Then + If DialogModel.optWholeDir.State = 1 Then + SourceFile = FilesList(DocIndex,0) + TargetFile = ReplaceString(SourceFile,TargetStemDir,SourceDir) + TargetDir = DirectorynameoutofPath(TargetFile, "/") + Else + SourceFile = Source + TargetFile = TargetDir & "/" & FileNameoutofPath(SourceFile, "/") + End If + If CreateFolder(TargetDir) Then + sExtension = GetFileNameExtension(SourceFile, "/") + oDocument = OpenDocument(SourceFile, OpenProperties(), bDisposable) + If (oDocument.IsReadOnly) AND (UCase(SourceFile) = UCase(TargetFile)) Then + bIsReadOnly = True + Msgbox(sMsgDOCISREADONLY, 16, GetProductName()) + Else + bIsReadOnly = False + RetrieveDocumentObjects() + sViewPath = CutPathView(SourceFile, 60) + DialogModel.lblCurDocument.Label = Str(DocIndex+1) & "/" & sTotDocCount & " (" & sViewPath & ")" + End If + InitializeDocument() = Not bIsReadOnly + Else + InitializeDocument() = False + End If + Else + InitializeDocument() = False + End If +NEXTFILE: + If Err <> 0 Then + InitializeDocument() = False + Resume LETSGO +LETSGO: + End If +End Function + + +Sub ChangeToNextProgressStep() + DialogModel.lblCurProgress.FontWeight = com.sun.star.awt.FontWeight.NORMAL + DialogConvert.GetControl("lblCurProgress").Visible = True +End Sub + + +Function StoreDocument() as Boolean +Dim sCurFileExists as String +Dim iOverWrite as Integer + If (TargetFile <> "") And (Not bCancelTask) Then + On Local Error Goto NOSAVING + If oUcb.Exists(TargetFile) Then + sCurFileExists = ReplaceString(sMsgFileExists, ConvertFromUrl(TargetFile), "<1>") + sCurFileExists = ReplaceString(sCurFileExists, chr(13), "<CR>") + iOverWrite = Msgbox (sCurFileExists, 32 + 3, sMsgDLGTITLE) + Select Case iOverWrite + Case 1 ' OK + Case 2 ' Abort + bCancelTask = True + StoreDocument() = False + Exit Function + Case 7 ' No + StoreDocument() = False + Exit Function + End Select + End If + If TargetFile <> SourceFile Then + oDocument.StoreAsUrl(TargetFile,NoArgs) + Else + oDocument.Store + End If + StoreDocument() = True + NOSAVING: + If Err <> 0 Then + StoreDocument() = False + Resume CLERROR + End If + CLERROR: + End If +End Function + + +Sub SwapExtent() + DialogModel.chkRecursive.Enabled = DialogModel.optWholeDir.State = 1 + If DialogModel.optWholeDir.State = 1 Then + DialogModel.lblSource.Label = sSOURCEDIR + If Not IsNull(SubstFile) Then + SubstFile = DialogModel.txtSource.Text + DialogModel.txtSource.Text = SubstDir + End If + Else + DialogModel.LblSource.Label = sSOURCEFILE + If Not IsNull(SubstDir) Then + SubstDir = DialogModel.txtSource.Text + DialogModel.txtSource.Text = SubstFile + End If + End If + ToggleGoOnButton() +End Sub + + +Function InitializeThirdStep() as Boolean +Dim TextBoxText as String + Source = AssignFileName(DialogModel.txtSource.Text, DialogModel.lblSource.Label, True) + If CheckTextBoxPath(DialogModel.txtTarget, True, True, sMsgDLGTITLE, True) Then + TargetDir = AssignFileName(DialogModel.txtTarget.Text, DialogModel.lblTarget.Label, False) + Else + TargetDir = "" + End If + If Source <> "" And TargetDir <> "" Then + bRecursive = DialogModel.chkRecursive.State = 1 + bDoUnprotect = DialogModel.chkProtect.State = 1 + DialogModel.lblRetrieval.FontWeight = com.sun.star.awt.FontWeight.BOLD + DialogModel.lblRetrieval.Label = sPrgsRETRIEVAL + DialogModel.lblCurProgress.Label = sPrgsCONVERTING + If DialogModel.optWholeDir.State = 1 Then + TextBoxText = sSOURCEDIR & " " & ConvertFromUrl(Source) & chr(13) + If DialogModel.chkRecursive.State = 1 Then + TextBoxText = TextBoxText & DeleteStr(sInclusiveSubDir,"~") & chr(13) + End If + Else + TextBoxText = sSOURCEFILE & " " & ConvertFromUrl(Source) & chr(13) + End If + TextBoxText = TextBoxText & sTARGETDIR & " " & ConvertFromUrl(TargetDir) & chr(13) + If DialogModel.chkProtect.State = 1 Then + TextBoxText = TextboxText & sPrgsUNPROTECT + End If + DialogModel.txtConfig.Text = TextBoxText + ToggleProgressStep() + DialogModel.cmdGoOn.Enabled = False + InitializeThirdStep() = True + Else + InitializeThirdStep() = False + End If +End Function + + +Sub ToggleProgressStep(Optional aEvent as Object) +Dim bMakeVisible as Boolean +Dim LocStep as Integer + ' If the Sub is call by the 'cmdBack' Button then set the 'bMakeVisible' variable accordingly + bMakeVisible = IsMissing(aEvent) + If bMakeVisible Then + DialogModel.Step = 3 + Else + DialogModel.Step = 2 + End If + DialogConvert.GetControl("lblCurrencies").Visible = Not bMakeVisible + DialogConvert.GetControl("lstCurrencies").Visible = Not bMakeVisible + DialogConvert.GetControl("cmdBack").Visible = bMakeVisible + DialogConvert.GetControl("cmdGoOn").Visible = bMakeVisible + DialogModel.imgPreview.ImageUrl = BitmapDir & "euro_" & DialogModel.Step & ".png" +End Sub + + +Sub EnableStep2DialogControls(OnValue as Boolean) + With DialogModel + .hlnExtent.Enabled = OnValue + .optWholeDir.Enabled = OnValue + .optSingleFile.Enabled = OnValue + .chkProtect.Enabled = OnValue + .cmdCallSourceDialog.Enabled = OnValue + .cmdCallTargetDialog.Enabled = OnValue + .lblSource.Enabled = OnValue + .lblTarget.Enabled = OnValue + .txtSource.Enabled = OnValue + .txtTarget.Enabled = OnValue + .imgPreview.Enabled = OnValue + .lstCurrencies.Enabled = OnValue + .lblCurrencies.Enabled = OnValue + If OnValue Then + ToggleGoOnButton() + .chkRecursive.Enabled = .optWholeDir.State = 1 + Else + .cmdGoOn.Enabled = False + .chkRecursive.Enabled = False + End If + End With +End Sub + + +Sub InitializeProgressPage() + DialogConvert.GetControl("lblRetrieval").Visible = False + DialogConvert.GetControl("lblCurProgress").Visible = False + DialogModel.lblRetrieval.FontWeight = com.sun.star.awt.FontWeight.NORMAL + DialogModel.lblCurProgress.FontWeight = com.sun.star.awt.FontWeight.BOLD + DialogConvert.GetControl("lblRetrieval").Visible = True + DialogConvert.GetControl("lblCurProgress").Visible = True +End Sub + + +Function AssignFileName(sPath as String, ByVal HeaderString, bCheckFileType as Boolean) as String +Dim bIsValid as Boolean +Dim sLocMimeType as String +Dim sNoDirMessage as String + HeaderString = DeleteStr(HeaderString, ":") + sPath = ConvertToUrl(Trim(sPath)) + bIsValid = oUcb.Exists(sPath) + If bIsValid Then + If DialogModel.optSingleFile.State = 1 Then + If bCheckFileType Then + sLocMimeType = GetRealFileContent(sPath) + If DialogModel.chkTextDocuments.State = 1 Then + If (Instr(1, sLocMimeType, "text") = 0) And (Instr(1, sLocMimeType, "calc") = 0) Then + Msgbox(sMsgFileInvalid, 48, sMsgDLGTITLE) + bIsValid = False + End If + Else + If (Instr(1, sLocMimeType, "spreadsheet") = 0) And (Instr(1, sLocMimeType, "calc")) = 0 Then + Msgbox(sMsgFileInvalid, 48, sMsgDLGTITLE) + bIsValid = False + End If + End If + End If + Else + If Not oUcb.IsFolder(sPath) Then + sNoDirMessage = ReplaceString(sMsgNODIRECTORY,sPath,"<1>") + Msgbox(sNoDirMessage,48, sMsgDLGTITLE) + bIsValid = False + Else + sPath = RTrimStr(sPath,"/") + sPath = sPath & "/" + End If + End if + Else + Msgbox(HeaderString & " '" & ConvertFromUrl(sPath) & "' " & sMsgNOTTHERE,48, sMsgDLGTITLE) + End If + If bIsValid Then + AssignFileName() = sPath + Else + AssignFilename() = "" + End If +End Function + + +Sub ToggleGoOnButton() +Dim bDoEnable as Boolean +Dim sLocMimeType as String +Dim sPath as String + bDoEnable = Ubound(DialogModel.lstCurrencies.SelectedItems()) > -1 + If bDoEnable Then + ' Check if Source is set correctly + sPath = ConvertToUrl(Trim(DialogModel.txtSource.Text)) + bDoEnable = oUcb.Exists(sPath) + End If + DialogModel.cmdGoOn.Enabled = bDoEnable +End Sub + + +Sub CallFolderPicker() + GetFolderName(DialogModel.txtTarget) + ToggleGoOnButton() +End Sub + + +Sub CallFilePicker() + If DialogModel.optSingleFile.State = 1 Then + Dim oMasterKey as Object + Dim oTypes() as Object + Dim oUIKey() as Object + + oMasterKey = GetRegistryKeyContent("org.openoffice.TypeDetection.Types") + oTypes() = oMasterKey.Types + oUIKey = GetRegistryKeyContent("org.openoffice.Office.UI/FilterClassification/LocalFilters") + If DialogModel.chkTextDocuments.State = 1 Then + Dim FilterNames(7,1) as String + FilterNames(4,0) = oTypes.GetByName("writer_StarOffice_XML_Writer").UIName + FilterNames(4,1) = "*.sxw" + FilterNames(5,0) = oTypes.GetByName("writer_StarOffice_XML_Writer_Template").UIName + FilterNames(5,1) = "*.stw" + FilterNames(6,0) = oTypes.GetByName("writer8").UIName + FilterNames(6,1) = "*.odt" + FilterNames(7,0) = oTypes.GetByName("writer8_template").UIName + FilterNames(7,1) = "*.ott" + Else + ReDim FilterNames(3,1) as String + End If + FilterNames(0,0) = oTypes.GetByName("calc8").UIName + Filternames(0,1) = "*.ods" + FilterNames(1,0) = oTypes.GetByName("calc8_template").UIName + Filternames(1,1) = "*.ots" + FilterNames(2,0) = oTypes.GetByName("calc_StarOffice_XML_Calc").UIName + Filternames(2,1) = "*.sxc" + FilterNames(3,0) = oTypes.GetByName("calc_StarOffice_XML_Calc_Template").UIName + Filternames(3,1) = "*.stc" + GetFileName(DialogModel.txtSource, Filternames()) + Else + GetFolderName(DialogModel.txtSource) + End If + ToggleGoOnButton() +End Sub + + +Sub PreviousStep() + DialogModel.Step = 2 + DialogModel.cmdGoOn.Label = sGOON + DialogModel.cmdCancel.Label = sCANCEL +End Sub +</script:module> diff --git a/wizards/source/euro/Common.xba b/wizards/source/euro/Common.xba new file mode 100644 index 000000000..550042ee9 --- /dev/null +++ b/wizards/source/euro/Common.xba @@ -0,0 +1,289 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Common" script:language="StarBasic"> REM ***** BASIC ***** +Public DialogModel as Object +Public DialogConvert as Object +Public DialogPassword as Object +Public PasswordModel as Object + +Sub RetrieveDocumentObjects() + CurMimeType = Tools.GetDocumentType(oDocument) + If Instr(1, CurMimeType, "calc") <> 0 Then + oSheets = oDocument.Sheets + oSheet = oDocument.Sheets.GetbyIndex(0) + oAddressRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") + End If + ' Retrieve the indices for the cellformatations + oFormats = oDocument.NumberFormats +End Sub + + +Sub CancelTask() +' If Not DocDisposed Then +' ReprotectSheets() +' End If + If DialogModel.Step = 3 And (Not bCancelTask) Then + If Msgbox(sMsgCancelConversion, 36, sMsgCancelTitle) = 6 Then + bCancelTask = True + DialogConvert.EndExecute + Else + bCancelTask = False + End If + Else + DialogConvert.EndExecute() + End If +End Sub + + +Function ConvertDocument() + GoOn = True +' DocDisposed = True + InitializeProgressbar() + If Instr(1, CurMimeType, "calc") <> 0 Then + bDocHasProtectedSheets = CheckSheetProtection(oSheets) + If bDocHasProtectedSheets Then + bDocHasProtectedSheets = UnprotectSheetsWithPassword(oSheets, bDoUnProtect) + End If + If Not bDocHasProtectedSheets Then + If Not bRangeListDefined Then + TotCellCount = 0 + CreateRangeEnumeration(True) + Else + IncreaseStatusvalue(SBRelGet/3) + End If + RangeIndex = Ubound(RangeList()) + If RangeIndex > -1 Then + ConvertThehardWay(RangeList(), True, False) + MakeStyleEnumeration(True) + oDocument.calculateAll() + End If + ReprotectSheets() + bRangeListDefined = False + End If + Else + DialogModel.ProgressBar.ProgressValue = 10 ' oStatusline.SetValue(10) + ConvertTextFields() + DialogModel.ProgressBar.ProgressValue = 80 ' oStatusline.SetValue(80) + ConvertWriterTables() + End If + EndStatusLine() + On Local Error Goto 0 +End Function + + +Sub SwitchNumberFormat(oObject as Object, oFormats as object) +Dim nFormatLanguage as Integer +Dim nFormatDecimals as Integer +Dim nFormatLeading as Integer +Dim bFormatLeading as Integer +Dim bFormatNegRed as Integer +Dim bFormatThousands as Integer +Dim i as Integer +Dim aNewStr as String +Dim iNumberFormat as Long +Dim AddToList as Boolean +Dim sOldCurrSymbol as String + On Local Error Resume Next + iNumberFormat = oObject.NumberFormat + On Local Error GoTo NOKEY + aFormat() = oFormats.getByKey(iNumberFormat) + On Local Error GoTo 0 + sOldCurrSymbol = aFormat.CurrencySymbol + If sOldCurrSymbol = CurrValue(CurrIndex,5) Then + aSimpleStr = "0 [$EUR]" + Else + aSimpleStr = "0 [$" & sEuroSign & aFormat.CurrencyExtension & "]" + End If + + nSimpleKey = Numberformat(oFormats, aSimpleStr, oLocale) + ' set new Currency format with according settings + nFormatDecimals = 2 + nFormatLeading = aFormat.LeadingZeros + bFormatNegRed = aFormat.NegativeRed + bFormatThousands = aFormat.ThousandsSeparator + aNewStr = oFormats.generateFormat( nSimpleKey, aFormat.Locale, bFormatThousands, bFormatNegRed, nFormatDecimals, nFormatLeading) + oObject.NumberFormat = Numberformat(oFormats, aNewStr, aFormat.Locale) + NOKEY: + If Err <> 0 Then + Resume CLERROR + End If + CLERROR: +End Sub + + +Function Numberformat( oFormats as Object, aFormatStr as String, oLocale as Object) +Dim nRetkey +Dim l as String +Dim c as String + nRetKey = oFormats.queryKey( aFormatStr, oLocale, True ) + If nRetKey = -1 Then + l = oLocale.Language + c = oLocale.Country + nRetKey = oFormats.addNew( aFormatStr, oLocale ) + If nRetKey = -1 Then nRetKey = 0 + End If + Numberformat = nRetKey +End Function + + +Function CheckFormatType( FormatObject as object) +Dim i as Integer +Dim LocCurrIndex as Integer +Dim nFormatFormatString as String +Dim FormatLangID as Integer +Dim sFormatCurrExt as String +Dim oFormatofObject() as Object + + ' Retrieve the Format of the Object + On Local Error GoTo NOKEY + oFormatofObject = oFormats.getByKey(FormatObject.NumberFormat) + On Local Error GoTo 0 + If NOT INT(oFormatofObject.Type) AND com.sun.star.util.NumberFormat.CURRENCY Then + CheckFormatType = False + Exit Function + End If + If FieldInArray(CurrSymbolList(),2,oFormatofObject.CurrencySymbol) Then + ' If the Currencysymbol of the object is the one needed, then check the Currency extension + sFormatCurrExt = oFormatofObject.CurrencyExtension + + If FieldInList(CurExtension(),2,sFormatCurrExt) Then + ' The Currency - extension also fits + CheckFormatType = True + Else + ' The Currency - symbol is Euro-conforming (like 'DEM'), so there is no Currency-Extension + CheckFormatType = oFormatofObject.CurrencySymbol = CurrsymbolList(2) + End If + Else + ' The Currency Symbol of the object is not the desired one + If oFormatofObject.CurrencySymbol = "" Then + ' Format is "automatic" + CheckFormatType = CheckLocale(oFormatofObject.Locale) + Else + CheckFormatType = False + End If + End If + + NOKEY: + If Err <> 0 Then + CheckFormatType = False + Resume CLERROR + End If + CLERROR: +End Function + + +Sub StartConversion() + GoOn = True + Select Case DialogModel.Step + Case 1 + If DialogModel.chkComplete.State = 1 Then + ConvertWholeDocument() + Else + ConvertRangesorStylesofDocument() + End If + Case 2 + bCancelTask = False + If InitializeThirdStep() Then + ConvertDocuments() + bCancelTask = True + End If + Case 3 + DialogConvert.EndExecute() + End Select +End Sub + + +Sub IncreaseStatusValue(AddStatusValue as Integer) + StatusValue = Int(StatusValue + AddStatusValue) + If DialogModel.Step = 3 Then + DialogModel.ProgressBar.ProgressValue = StatusValue + Else + oStatusline.SetValue(StatusValue) + End If +End Sub + + +Sub SelectCurrency() +Dim AddtoList as Boolean +Dim NullList() +Dim OldCurrIndex as Integer + bRangeListDefined = False + OldCurrIndex = CurrIndex + CurrIndex = DialogModel.lstCurrencies.SelectedItems(0) + If OldCurrIndex <> CurrIndex Then + InitializeCurrencyValues(CurrIndex) + CurExtension(0) = LangIDValue(CurrIndex,0,2) + CurExtension(1) = LangIDValue(CurrIndex,1,2) + CurExtension(2) = LangIDValue(CurrIndex,2,2) + If DialogModel.Step = 1 Then + EnableStep1DialogControls(False,False, False) + If DialogModel.optCellTemplates.State = 1 Then + EnableStep1DialogControls(False, False, False) + CreateStyleEnumeration() + ElseIf ((DialogModel.optSheetRanges.State = 1) OR (DialogModel.optDocRanges.State = 1)) AND (DialogModel.Step = 1) Then + CreateRangeEnumeration(False) + If Ubound(RangeList()) = -1 Then + DialogModel.lstSelection.StringItemList() = NullList() + End If + ElseIf DialogModel.optSelRange.State= 1 Then + 'Preselected Range + End If + EnableStep1DialogControls(True, True, True) + ElseIf DialogModel.Step = 2 Then + EnableStep2DialogControls(True) + End If + End If +End Sub + + +Sub FillUpCurrencyListbox() +Dim i as Integer +Dim MaxIndex as Integer + MaxIndex = Ubound(CurrValue(),1) + Dim LocList(MaxIndex) as String + For i = 0 To MaxIndex + LocList(i) = CurrValue(i,0) + Next i + DialogModel.lstCurrencies.StringItemList() = LocList() + If CurrIndex > -1 Then + SelectListboxItem(DialogModel.lstCurrencies, CurrIndex) + End If +End Sub + + +Sub InitializeProgressbar() + CurCellCount = 0 + If Not IsNull(oStatusLine) Then + oStatusline.Start(sStsPROGRESS, 100) + Else + DialogModel.ProgressBar.ProgressValue = 0 + End If + StatusValue = 0 +End Sub + + +Sub EndStatusLine() + If Not IsNull(oStatusLine) Then + oStatusline.End + Else + DialogModel.ProgressBar.ProgressValue = 100 + End If +End Sub +</script:module> diff --git a/wizards/source/euro/ConvertRun.xba b/wizards/source/euro/ConvertRun.xba new file mode 100644 index 000000000..5e4f06e01 --- /dev/null +++ b/wizards/source/euro/ConvertRun.xba @@ -0,0 +1,334 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ConvertRun" script:language="StarBasic">Option Explicit + +Public oPreSelRange as Object + +Sub Main() + BasicLibraries.LoadLibrary("Tools") + If InitResources("Euro Converter") Then + bDoUnProtect = False + bPreSelected = True + oDocument = ThisComponent + RetrieveDocumentObjects() ' Statusline, SheetsCollection etc. + InitializeConverter(oDocument.CharLocale, 1) + GetPreSelectedRange() + If GoOn Then + DialogModel.lstCurrencies.TabIndex = 2 + DialogConvert.GetControl("chkComplete").SetFocus() + DialogConvert.Execute + End If + DialogConvert.Dispose + End If +End Sub + + +Sub SelectListItem() +Dim Listbox as Object +Dim oListSheet as Object +Dim CurStyleName as String +Dim oCursheet as Object +Dim oTempRanges as Object +Dim sCurSheetName as String +Dim RangeName as String +Dim oSheetRanges as Object +Dim ListIndex as Integer +Dim a as Integer +Dim i as Integer +Dim n as Integer +Dim m as Integer +Dim MaxIndex as Integer + Listbox = DialogModel.lstSelection + If Ubound(Listbox.SelectedItems()) > -1 Then + EnableStep1DialogControls(False, False, False) + oSelRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") + + ' Is the sheet the basis, then the sheetobject has to be created + If DialogModel.optDocRanges.State = 1 Then + ' Document is the basis for the conversion + ListIndex = Listbox.SelectedItems(0) + oCurSheet = RetrieveSheetoutofRangeName(Listbox.StringItemList(ListIndex)) + oDocument.CurrentController.SetActiveSheet(oCurSheet) + Else + oCurSheet = oDocument.CurrentController.ActiveSheet + End If + sCurSheetName = oCurSheet.Name + If DialogModel.optCellTemplates.State = 1 Then + Dim CurIndex as Integer + For i = 0 To Ubound(Listbox.SelectedItems()) + CurIndex = Listbox.SelectedItems(i) + CurStylename = Listbox.StringItemList(CurIndex) + oSheetRanges = oCursheet.CellFormatRanges.createEnumeration + While oSheetRanges.hasMoreElements + oRange = oSheetRanges.NextElement + If oRange.getPropertyState("NumberFormat") = 1 Then + If oRange.CellStyle = CurStyleName Then + oSelRanges.InsertbyName("",oRange) + End If + End If + Wend + Next i + Else + ' Hard Formatation is selected + a = -1 + For n = 0 To Ubound(Listbox.SelectedItems()) + m = Listbox.SelectedItems(n) + RangeName = Listbox.StringItemList(m) + oListSheet = RetrieveSheetoutofRangeName(RangeName) + a = a + 1 + MaxIndex = Ubound(SelRangeList()) + If a > MaxIndex Then + Redim Preserve SelRangeList(MaxIndex + SBRANGEUBOUND) + End If + SelRangeList(a) = RangeName + If oListSheet.Name = sCurSheetName Then + oRange = RetrieveRangeoutofRangeName(RangeName) + oSelRanges.InsertbyName("",oRange) + End If + Next n + End If + If a > -1 Then + ReDim Preserve SelRangeList(a) + Else + ReDim SelRangeList() + End If + oDocument.CurrentController.Select(oSelRanges) + EnableStep1DialogControls(True, True, True) + End If +End Sub + + +' Procedure that is called by an event +Sub RetrieveEnableValue() +Dim EnableValue as Boolean + EnableValue = Not DialogModel.lstSelection.Enabled + EnableStep1DialogControls(True, EnableValue, True) +End Sub + + +Sub EnableStep1DialogControls(bCurrEnabled as Boolean, bFrameEnabled as Boolean, bButtonsEnabled as Boolean) +Dim bCurrIsSelected as Boolean +Dim bObjectIsSelected as Boolean +Dim bConvertWholeDoc as Boolean +Dim bDoEnableFrame as Boolean + bConvertWholeDoc = DialogModel.chkComplete.State = 1 + bDoEnableFrame = bFrameEnabled And (NOT bConvertWholeDoc) + + ' Controls around the Selection Listbox + With DialogModel + .lblCurrencies.Enabled = bCurrEnabled + .lstCurrencies.Enabled = bCurrEnabled + .lstSelection.Enabled = bDoEnableFrame + .lblSelection.Enabled = bDoEnableFrame + .hlnSelection.Enabled = bDoEnableFrame + .optCellTemplates.Enabled = bDoEnableFrame + .optSheetRanges.Enabled = bDoEnableFrame + .optDocRanges.Enabled = bDoEnableFrame + .optSelRange.Enabled = bDoEnableFrame + End With + ' The CheckBox has the Value '1' when the Controls in the Frame are disabled + If bButtonsEnabled Then + bCurrIsSelected = Ubound(DialogModel.lstCurrencies.SelectedItems()) <> -1 + ' Enable GoOnButton only when Currency is selected + DialogModel.cmdGoOn.Enabled = bCurrIsSelected + DialogModel.chkComplete.Enabled = bCurrIsSelected + If bDoEnableFrame AND DialogModel.cmdGoOn.Enabled Then + ' If FrameControls are enabled, check if Listbox is Empty + bObjectIsSelected = Ubound(DialogModel.lstSelection.SelectedItems()) <> -1 + DialogModel.cmdGoOn.Enabled = bObjectIsSelected + End If + Else + DialogModel.cmdGoOn.Enabled = False + DialogModel.chkComplete.Enabled = False + End If +End Sub + + +Sub ConvertRangesOrStylesOfDocument() +Dim i as Integer +Dim ItemName as String +Dim SelList() as String +Dim oSheetRanges as Object + + bDocHasProtectedSheets = CheckSheetProtection(oSheets) + If bDocHasProtectedSheets Then + bDocHasProtectedSheets = UnprotectSheetsWithPassWord(oSheets, bDoUnProtect) + DialogModel.cmdGoOn.Enabled = False + End If + If Not bDocHasProtectedSheets Then + EnableStep1DialogControls(False, False, False) + InitializeProgressBar() + If DialogModel.optSelRange.State = 1 Then + SelectListItem() + End If + SelList() = DialogConvert.GetControl("lstSelection").SelectedItems() + If DialogModel.optCellTemplates.State = 1 Then + ' Option 'Soft' Formatation is selected + AssignRangestoStyle(DialogModel.lstSelection.StringItemList(), SelList()) + ConverttheSoftWay(SelList(), True) + ElseIf DialogModel.optSelRange.State = 1 Then + oSheetRanges = oPreSelRange.CellFormatRanges.createEnumeration + While oSheetRanges.hasMoreElements + oRange = oSheetRanges.NextElement + If CheckFormatType(oRange) Then + ConvertCellCurrencies(oRange) + SwitchNumberFormat(oRange, oFormats, sEuroSign) + End If + Wend + Else + ConverttheHardWay(SelList(), False, True) + End If + oStatusline.End + EnableStep1DialogControls(True, False, True) + DialogModel.cmdGoOn.Enabled = True + oDocument.CurrentController.Select(oSelRanges) + End If +End Sub + + +Sub ConvertWholeDocument() +Dim s as Integer + DialogModel.cmdGoOn.Enabled = False + DialogModel.chkComplete.Enabled = False + GoOn = ConvertDocument() + EmptyListbox(DialogModel.lstSelection()) + EnableStep1DialogControls(True, True, True) +End Sub + + +' Everything previously selected will be deselected +Sub EmptySelection() +Dim RangeName as String +Dim i as Integer +Dim MaxIndex as Integer +Dim EmptySelRangeList() as String + + If Not IsNull(oSelRanges) Then + If oSelRanges.HasElements Then + EmptySelRangeList() = ArrayOutofString(oSelRanges.RangeAddressesasString, ";", MaxIndex) + For i = 0 To MaxIndex + oSelRanges.RemovebyName(EmptySelRangeList(i)) + Next i + End If + oDocument.CurrentController.Select(oSelRanges) + Else + oSelRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") + End If +End Sub + + +Function AddSelectedRangeToSelRangesEnum() as Object +Dim oLocRange as Object + osheet = oDocument.CurrentController.GetActiveSheet + oSelRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") + ' Check if a Currency-Range has been selected + oLocRange = oDocument.CurrentController.Selection + bPreSelected = oLocRange.SupportsService("com.sun.star.sheet.SheetCellRange") + If bPreSelected Then + oSelRanges.InsertbyName("",oLocRange) + AddSelectedRangeToSelRangesEnum() = oLocRange + End If +End Function + + +Sub GetPreSelectedRange() +Dim i as Integer +Dim OldCurrSymbolList(2) as String +Dim OldCurrIndex as Integer +Dim OldCurExtension(2) as String + oPreSelRange = AddSelectedRangeToSelRangesEnum() + + DialogModel.chkComplete.State = Abs(Not(bPreSelected)) + If bPreSelected Then + DialogModel.optSelRange.State = 1 + AddRangeToListbox(oPreSelRange) + Else + DialogModel.optCellTemplates.State = 1 + CreateStyleEnumeration() + End If + EnableStep1DialogControls(True, bPreSelected, True) + DialogModel.optSelRange.Enabled = bPreSelected +End Sub + + +Sub AddRangeToListbox(oLocRange as Object) + EmptyListBox(DialogModel.lstSelection) + PreName = RetrieveRangeNamefromAddress(oLocRange) + AddSingleItemToListbox(DialogModel.lstSelection, Prename)', 0) + SelectListboxItem(DialogModel.lstCurrencies, CurrIndex) + TotCellCount = CountRangeCells(oLocRange) +End Sub + + +Sub CheckRangeSelection(Optional oEvent) + EmptySelection() + AddRangeToListbox(oPreSelRange) + oPreSelRange = AddSelectedRangeToSelRangesEnum() +End Sub + + +' Checks if a Field (LocField) is already defined in an Array +' Returns 'True' or 'False' +Function FieldInList(LocList(), MaxIndex as integer, ByVal LocField ) As Boolean +Dim i as integer + LocField = Ucase(LocField) + For i = Lbound(LocList()) to MaxIndex + If Ucase(LocList(i)) = LocField then + FieldInList = True + Exit Function + End if + Next + FieldInList = False +End Function + + +Function CheckLocale(oLocale) as Boolean +Dim i as Integer +Dim LocCountry as String +Dim LocLanguage as String + LocCountry = oLocale.Country + LocLanguage = oLocale.Language + For i = 0 To 1 + If LocLanguage = LangIDValue(CurrIndex,i,0) AND LocCountry = LangIDValue(CurrIndex,i,1) Then + CheckLocale = True + Exit Function + End If + Next i + CheckLocale = False +End Function + + +Sub SetOptionValuestoNull() + With DialogModel + .optCellTemplates.State = 0 + .optSheetRanges.State = 0 + .optDocRanges.State = 0 + .optSelRange.State = 0 + End With +End Sub + + + +Sub SetStatusLineText(sStsREPROTECT as String) + If Not IsNull(oStatusLine) Then + oStatusline.SetText(sStsREPROTECT) + End If +End Sub +</script:module> diff --git a/wizards/source/euro/DlgConvert.xdl b/wizards/source/euro/DlgConvert.xdl new file mode 100644 index 000000000..ff3f523a7 --- /dev/null +++ b/wizards/source/euro/DlgConvert.xdl @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DialogConvert" dlg:left="96" dlg:top="28" dlg:width="270" dlg:height="210" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_DIALOG" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblCurrencies" dlg:tab-index="1" dlg:left="170" dlg:top="39" dlg:width="92" dlg:height="8" dlg:value="lblCurrencies"/> + <dlg:checkbox dlg:id="chkComplete" dlg:tab-index="0" dlg:left="12" dlg:top="43" dlg:width="129" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CHECKBOX1" dlg:value="chkComplete" dlg:checked="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Euro.ConvertRun.RetrieveEnableValue?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:menulist dlg:id="lstCurrencies" dlg:tab-index="2" dlg:left="170" dlg:top="51" dlg:width="93" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_COMBOBOX1" dlg:spin="true" dlg:linecount="12"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Euro.Common.SelectCurrency?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:radiogroup> + <dlg:radio dlg:id="optCellTemplates" dlg:tab-index="3" dlg:left="12" dlg:top="96" dlg:width="129" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON1" dlg:value="optCellTemplates"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Soft.CreateStyleEnumeration?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optSheetRanges" dlg:tab-index="4" dlg:left="12" dlg:top="110" dlg:width="130" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON2" dlg:value="optSheetRanges"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Hard.CreateRangeList?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optDocRanges" dlg:tab-index="5" dlg:left="12" dlg:top="124" dlg:width="130" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON3" dlg:value="optDocRanges"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Hard.CreateRangeList?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optSelRange" dlg:tab-index="6" dlg:left="12" dlg:top="138" dlg:width="130" dlg:height="10" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OPTIONBUTTON4" dlg:value="optSelRange"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.ConvertRun.CheckRangeSelection?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:text dlg:id="lblSelection" dlg:tab-index="7" dlg:left="170" dlg:top="84" dlg:width="73" dlg:height="8" dlg:page="1" dlg:value="lblSelection"/> + <dlg:menulist dlg:id="lstSelection" dlg:tab-index="8" dlg:left="170" dlg:top="96" dlg:width="90" dlg:height="52" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_LISTBOX1" dlg:multiselection="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Euro.ConvertRun.SelectListItem?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:radiogroup> + <dlg:radio dlg:id="optSingleFile" dlg:tab-index="9" dlg:left="12" dlg:top="51" dlg:width="146" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OBFILE" dlg:value="optSingleFile"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.SwapExtent?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optWholeDir" dlg:tab-index="10" dlg:left="12" dlg:top="65" dlg:width="146" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_OBDIR" dlg:value="optWholeDir" dlg:checked="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.SwapExtent?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:textfield dlg:id="txtConfig" dlg:tab-index="11" dlg:left="6" dlg:top="50" dlg:width="258" dlg:height="55" dlg:page="3" dlg:vscroll="true" dlg:multiline="true" dlg:readonly="true"/> + <dlg:textfield dlg:id="txtSource" dlg:tab-index="12" dlg:left="80" dlg:top="82" dlg:width="165" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_TBSOURCE"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.ToggleGoOnButton?language=Basic&location=application" script:language="Script"/> + </dlg:textfield> + <dlg:button dlg:id="cmdCallSourceDialog" dlg:tab-index="13" dlg:left="249" dlg:top="81" dlg:width="15" dlg:height="14" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CBSOURCEOPEN" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.CallFilePicker?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:checkbox dlg:id="chkRecursive" dlg:tab-index="14" dlg:left="12" dlg:top="98" dlg:width="252" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CHECKRECURSIVE" dlg:value="chkRecursive" dlg:checked="false"/> + <dlg:checkbox dlg:id="chkTextDocuments" dlg:tab-index="15" dlg:left="12" dlg:top="112" dlg:width="251" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CHKTEXTDOCUMENTS" dlg:value="chkTextDocuments" dlg:checked="false"/> + <dlg:checkbox dlg:id="chkProtect" dlg:tab-index="16" dlg:left="12" dlg:top="126" dlg:width="251" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CHKPROTECT" dlg:value="chkProtect" dlg:checked="false"/> + <dlg:textfield dlg:id="txtTarget" dlg:tab-index="17" dlg:left="80" dlg:top="143" dlg:width="165" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_TBTARGET"/> + <dlg:button dlg:id="cmdCallTargetDialog" dlg:tab-index="18" dlg:left="249" dlg:top="142" dlg:width="15" dlg:height="14" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CBTARGETOPEN" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.CallFolderPicker?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:progressmeter dlg:id="ProgressBar" dlg:tab-index="19" dlg:left="85" dlg:top="152" dlg:width="179" dlg:height="10" dlg:page="3"/> + <dlg:text dlg:id="lblHint" dlg:tab-index="20" dlg:left="6" dlg:top="166" dlg:width="258" dlg:height="20" dlg:value="lblHint" dlg:multiline="true"/> + <dlg:text dlg:id="lblTarget" dlg:tab-index="21" dlg:left="6" dlg:top="145" dlg:width="73" dlg:height="8" dlg:page="2" dlg:value="lblTarget"/> + <dlg:text dlg:id="lblSource" dlg:tab-index="22" dlg:left="6" dlg:top="84" dlg:width="73" dlg:height="8" dlg:page="2" dlg:value="lblSource"/> + <dlg:text dlg:id="lblCurProgress" dlg:tab-index="23" dlg:left="16" dlg:top="130" dlg:width="208" dlg:height="8" dlg:page="3"/> + <dlg:text dlg:id="lblRetrieval" dlg:tab-index="24" dlg:left="9" dlg:top="119" dlg:width="216" dlg:height="8" dlg:page="3" dlg:value="lblRetrieval"/> + <dlg:text dlg:id="lblConfig" dlg:tab-index="25" dlg:left="6" dlg:top="39" dlg:width="94" dlg:height="8" dlg:page="3" dlg:value="lblConfig"/> + <dlg:text dlg:id="lblCurDocument" dlg:tab-index="26" dlg:left="16" dlg:top="141" dlg:width="208" dlg:height="8" dlg:page="3"/> + <dlg:img dlg:id="imgPreview" dlg:tab-index="27" dlg:left="6" dlg:top="6" dlg:width="258" dlg:height="26"/> + <dlg:fixedline dlg:id="hlnSelection" dlg:tab-index="28" dlg:left="7" dlg:top="72" dlg:width="258" dlg:height="8" dlg:page="1" dlg:value="hlnSelection"/> + <dlg:fixedline dlg:id="hlnExtent" dlg:tab-index="29" dlg:left="6" dlg:top="39" dlg:width="156" dlg:height="8" dlg:page="2" dlg:value="hlnExtent"/> + <dlg:fixedline dlg:id="hlnProgress" dlg:tab-index="30" dlg:left="6" dlg:top="108" dlg:width="258" dlg:height="8" dlg:page="3" dlg:value="hlnProgress"/> + <dlg:fixedline dlg:id="FixedLine1" dlg:tab-index="31" dlg:left="6" dlg:top="152" dlg:width="258" dlg:height="9" dlg:page="1"/> + <dlg:text dlg:id="lblProgress" dlg:tab-index="32" dlg:left="6" dlg:top="153" dlg:width="79" dlg:height="8" dlg:page="3" dlg:value="lblProgress"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="33" dlg:left="6" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CBCANCEL" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Common.CancelTask?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdHelp" dlg:tab-index="34" dlg:left="63" dlg:top="190" dlg:width="53" dlg:height="14" dlg:value="cmdHelp" dlg:button-type="help"/> + <dlg:button dlg:id="cmdBack" dlg:tab-index="35" dlg:left="155" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CBBACK" dlg:value="cmdBack"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.AutoPilotRun.PreviousStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="36" dlg:left="211" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGCONVERT_CBGOON" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Common.StartConversion?language=Basic&location=application" script:language="Script"/> + </dlg:button> + </dlg:bulletinboard> +</dlg:window> diff --git a/wizards/source/euro/DlgPassword.xdl b/wizards/source/euro/DlgPassword.xdl new file mode 100644 index 000000000..20beac046 --- /dev/null +++ b/wizards/source/euro/DlgPassword.xdl @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DlgPassword" dlg:left="77" dlg:top="93" dlg:width="310" dlg:height="65" dlg:closeable="true" dlg:moveable="true" dlg:title="DlgPassword"> + <dlg:bulletinboard> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="0" dlg:left="251" dlg:top="6" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGPASSWORD_CMDGOON" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Protect.ReadPassword?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="1" dlg:left="251" dlg:top="24" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGPASSWORD_CMDCANCEL" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Euro.Protect.RejectPassword?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdHelp" dlg:tab-index="2" dlg:left="251" dlg:top="45" dlg:width="53" dlg:height="14" dlg:tag="34692" dlg:value="cmdHelp" dlg:button-type="help"/> + <dlg:textfield dlg:id="txtPassword" dlg:tab-index="3" dlg:left="11" dlg:top="18" dlg:width="232" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGPASSWORD_TXTPASSWORD" dlg:echochar="*"/> + <dlg:fixedline dlg:id="hlnPassword" dlg:tab-index="4" dlg:left="6" dlg:top="6" dlg:width="238" dlg:height="8" dlg:value="hlnPassword"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/euro/Hard.xba b/wizards/source/euro/Hard.xba new file mode 100644 index 000000000..467225dec --- /dev/null +++ b/wizards/source/euro/Hard.xba @@ -0,0 +1,246 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Hard" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + + +Sub CreateRangeList() +Dim MaxIndex as Integer + MaxIndex = -1 + EnableStep1DialogControls(False, False, False) + EmptySelection() + DialogModel.lblSelection.Label = sCURRRANGES + EmptyListbox(DialogModel.lstSelection) + oDocument.CurrentController.Select(oSelRanges) + If (DialogModel.optSheetRanges.State = 1) AND (DialogModel.chkComplete.State <> 1) Then + ' Conversion on a sheet? + SetStatusLineText(sStsRELRANGES) + osheet = oDocument.CurrentController.GetActiveSheet + oRanges = osheet.CellFormatRanges.createEnumeration() + MaxIndex = AddSheetRanges(oRanges, MaxIndex, oSheet, False) + If MaxIndex > -1 Then + ReDim Preserve RangeList(MaxIndex) + End If + Else + CreateRangeEnumeration(False) + bRangeListDefined = True + End If + EnableStep1DialogControls(True, True, True) + SetStatusLineText("") +End Sub + + +Sub CreateRangeEnumeration(bAutopilot as Boolean) +Dim i as Integer +Dim MaxIndex as integer +Dim sStatustext as String + MaxIndex = -1 + If Not bRangeListDefined Then + ' Cellranges are not yet defined + oSheets = oDocument.Sheets + For i = 0 To oSheets.Count-1 + oSheet = oSheets.GetbyIndex(i) + If bAutopilot Then + IncreaseStatusValue(SBRELGET/osheets.Count) + Else + sStatustext = ReplaceString(sStsRELSHEETRANGES,Str(i+1),"%1Number%1") + sStatustext = ReplaceString(sStatusText,oSheets.Count,"%2TotPageCount%2") + SetStatusLineText(sStatusText) + End If + oRanges = osheet.CellFormatRanges.createEnumeration + MaxIndex = AddSheetRanges(oRanges, MaxIndex, oSheet, bAutopilot) + Next i + Else + If Not bAutoPilot Then + SetStatusLineText(sStsRELRANGES) + ' cellranges already defined + For i = 0 To Ubound(RangeList()) + If RangeList(i) <> "" Then + AddSingleItemToListBox(DialogModel.lstSelection, RangeList(i)) + End If + Next + End If + End If + If MaxIndex > -1 Then + ReDim Preserve RangeList(MaxIndex) + Else + ReDim RangeList() + End If + Rangeindex = MaxIndex +End Sub + + +Function AddSheetRanges(oRanges as Object, r as Integer, oSheet as Object, bAutopilot) +Dim RangeName as String +Dim AddtoList as Boolean +Dim iCurStep as Integer +Dim MaxIndex as Integer + iCurStep = DialogModel.Step + While oRanges.hasMoreElements + oRange = oRanges.NextElement + AddToList = CheckFormatType(oRange) + If AddToList Then + RangeName = RetrieveRangeNamefromAddress(oRange) + TotCellCount = TotCellCount + CountRangeCells(oRange) + If Not bAutoPilot Then + AddSingleItemToListbox(DialogModel.lstSelection, RangeName) + End If + ' The Ranges are only passed to an Array when the whole Document is the basis + ' Redimension the RangeList Array if necessary + MaxIndex = Ubound(RangeList()) + r = r + 1 + If r > MaxIndex Then + MaxIndex = MaxIndex + SBRANGEUBOUND + ReDim Preserve RangeList(MaxIndex) + End If + RangeList(r) = RangeName + End If + Wend + AddSheetRanges = r +End Function + + +' adds a section to the collection +Sub SelectRange() +Dim i as Integer +Dim RangeName as String +Dim SelItem as String +Dim CurRange as String +Dim SheetRangeName as String +Dim DescriptionList() as String +Dim MaxRangeIndex as Integer +Dim StatusValue as Integer + StatusValue = 0 + MaxRangeIndex = Ubound(SelRangeList()) + CurSheetName = oSheet.Name + For i = 0 To MaxRangeIndex + SelItem = SelRangeList(i) + ' Is the Range already included in the collection? + oRange = RetrieveRangeoutOfRangename(SelItem) + TotCellCount = TotCellCount + CountRangeCells(oRange) + DescriptionList() = ArrayOutofString(SelItem,".",1) + SheetRangeName = DeleteStr(DescriptionList(0),"'") + If SheetRangeName = CurSheetName Then + oSelRanges.InsertbyName("",oRange) + End If + IncreaseStatusValue(SBRELGET/MaxRangeIndex) + Next i +End Sub + + +Sub ConvertThehardWay(ListboxList(), SwitchFormat as Boolean, bRemove as Boolean) +Dim i as Integer +Dim AddCells as Long +Dim OldStatusValue as Single +Dim RangeName as String +Dim LastIndex as Integer +Dim oSelListbox as Object + + oSelListbox = DialogConvert.GetControl("lstSelection") + Lastindex = Ubound(ListboxList()) + If TotCellCount > 0 Then + OldStatusValue = StatusValue + ' hard format + For i = 0 To LastIndex + RangeName = ListboxList(i) + oRange = RetrieveRangeoutofRangeName(RangeName) + ConvertCellCurrencies(oRange) + If bRemove Then + If oSelRanges.HasbyName(RangeName) Then + oSelRanges.RemovebyName(RangeName) + oDocument.CurrentController.Select(oSelRanges) + End If + End If + If SwitchFormat Then + If oRange.getPropertyState("NumberFormat") <> 1 Then + ' Range is hard formatted + SwitchNumberFormat(oRange, oFormats, sEuroSign) + End If + Else + SwitchNumberFormat(oRange, oFormats, sEuroSign) + End If + AddCells = CountRangeCells(oRange) + CurCellCount = AddCells + IncreaseStatusValue((CurCellCount/TotCellCount)*(100-OldStatusValue)) + If bRemove Then + RemoveListBoxItemByName(oSelListbox.Model,Rangename) + End If + Next + End If +End Sub + + +Sub ConvertCellCurrencies(oRange as Object) +Dim oValues as Object +Dim oCells as Object +Dim oCell as Object + oValues = oRange.queryContentCells(com.sun.star.sheet.CellFlags.VALUE) + If (oValues.Count > 0) Then + oCells = oValues.Cells.createEnumeration + While oCells.hasMoreElements + oCell = oCells.nextElement + ModifyObjectValuewithCurrFactor(oCell) + Wend + End If +End Sub + + +Sub ModifyObjectValuewithCurrFactor(oDocObject as Object) +Dim oDocObjectValue as double + oDocObjectValue = oDocObject.Value + oDocObject.Value = Round(oDocObjectValue/CurrFactor, 2) +End Sub + + +Function CheckIfRangeisCurrency(FormatObject as Object) +Dim oFormatofObject() as Object + ' Retrieve the Format of the Object + On Local Error GoTo NOKEY + oFormatofObject() = oFormats.getByKey(FormatObject.NumberFormat) + On Local Error GoTo 0 + CheckIfRangeIsCurrency = INT(oFormatofObject.Type) AND com.sun.star.util.NumberFormat.CURRENCY + Exit Function +NOKEY: + CheckIfRangeisCurrency = False + Resume CLERROR + CLERROR: +End Function + + +Function CountColumnsForRow(IndexArray() as String, Row as Integer) +Dim i as Integer +Dim NoNulls as Boolean + For i = 1 To Ubound(IndexArray,2) + If IndexArray(Row,i)= "" Then + NoNulls = False + Exit For + End If + Next + CountColumnsForRow = i +End Function + + +Function CountRangeCells(oRange as Object) As Long +Dim oRangeAddress as Object +Dim LocCellCount as Long + oRangeAddress = oRange.RangeAddress + LocCellCount = (oRangeAddress.EndColumn - oRangeAddress.StartColumn + 1) * (oRangeAddress.EndRow - oRangeAddress.StartRow + 1) + CountRangeCells = LocCellCount +End Function</script:module>
\ No newline at end of file diff --git a/wizards/source/euro/Init.xba b/wizards/source/euro/Init.xba new file mode 100644 index 000000000..623a0a53b --- /dev/null +++ b/wizards/source/euro/Init.xba @@ -0,0 +1,667 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Init" script:language="StarBasic">Option Explicit +REM ***** BASIC ***** + +Public Const SBRANGEUBOUND = 20 +Public StyleRangeAssignmentList(SBRANGEUBOUND)as String +Public SelRangeList(SBRANGEUBOUND) as String +Public RangeList(SBRANGEUBOUND) as String +Public UnprotectList() as String +Public FilterNames(2,1) as String +Public bDoUnProtect as Boolean +Public bCancelTask as Boolean + +Public sREADY as String +Public sPROTECT as String +Public sCONTINUE as String + +Public sSELTEMPL as String +Public sSELCELL as String +Public sCURRRANGES as String +Public sTEMPLATES as String + +Public sSOURCEFILE as String +Public sSOURCEDIR as String +Public sTARGETDIR as String + +Public sStsPROGRESS as String +Public sStsCELLPROGRSS as String +Public sStsRELRANGES as String +Public sStsRELSHEETRANGES as String +Public sStsREPROTECT as String + +Public sMsgSELDIR as String +Public sMsgSELFILE as String +Public sMsgTARGETDIR as String +Public sMsgNOTTHERE as String +Public sMsgDLGTITLE as String +Public sMsgUNPROTECT as String +Public sMsgPWPROTECT as String +Public sMsgWRONGPW as String +Public sMsgSHEETPROTECTED as String +Public sMsgWARNING as String +Public sMsgSHEETSNOPROTECT as String +Public sMsgSHEETNOPROTECT as String +Public sMsgCHOOSECURRENCY as String +Public sMsgPASSWORD as String +Public sMsgOK as String +Public sMsgCANCEL as String +Public sMsgFileInvalid as String +Public sMsgNODIRECTORY as String +Public sMsgDOCISREADONLY as String +Public sMsgFileExists as String +Public sMsgCancelConversion as String +Public sMsgCancelTitle as String +Public sCurrPORTUGUESE as String +Public sCurrDUTCH as String +Public sCurrFRENCH as String +Public sCurrSPANISH as String +Public sCurrITALIAN as String +Public sCurrGERMAN as String +Public sCurrBELGIAN as String +Public sCurrIRISH as String +Public sCurrLUXEMBOURG as String +Public sCurrAUSTRIAN as String +Public sCurrFINNISH as String +Public sCurrGREEK as String +Public sCurrSLOVENIAN as String +Public sCurrCYPRIOT as String +Public sCurrMALTESE as String +Public sCurrSLOVAK as String +Public sCurrESTONIAN as String +Public sCurrLATVIAN as String +Public sCurrLITHUANIAN as String + +Public sPrgsRETRIEVAL as String +Public sPrgsCONVERTING as String +Public sPrgsUNPROTECT as String +Public sInclusiveSubDir as String + +Public Const SBCOUNTRYCOUNT = 19 +Public CurMimeType as String +Public CurCellCount as Long +Public oSheets as Object +Public oStyles as Object +Public oStyle as Object +Public oFormats as Object +Public aSimpleStr as String +Public nSimpleKey as Long +Public aFormat() as Variant +Public oRanges as Object +Public oRange as Object +Public nLanguage as integer +Public nFormatLanguage as integer +Public aCellFormat as Variant +Public oDocument as Object +Public StartCol, StartRow, EndCol, EndRow as String +Public oSheet as Object +Public IntStartCol, IntStartRow, IntEndCol, IntEndRow as integer +Public oSelRanges as Object +Public nFormatType as Integer +Public sFormatCurrency as String +Public sFormatLanguage as String +Public CurSheetName as String +Public oStatusLine as Object +Public Const SBRELGET = 50 +Public StatusValue as Single +Public TotCellCount as Long +Public StyleIndex as Integer +Public RangeIndex as Integer +Public CurrIndex as Integer +Public ActLangNumber(1) as Integer +Public CurExtension(2) as String +Public Currfactor as Double +Public CurrSymbolList(2) as String +Public CurrLanguage as String +Public CurrValue(18,5) +Public LangIDValue(18,2,2) as String +Public PreName as String +Public Separator as String +Public BitmapDir as String +Public TypeIndex as Integer, CSIndex as Integer, LangIndex as Integer, FSIndex as Integer +Public oLocale as New com.sun.star.lang.Locale +Public sEuroSign as String +Public oPointer as Object +Public sDocType as String +Public bPreSelected as Boolean +Public bRecursive as Boolean +Public bCancelProtection as Boolean +Public CurrRoundMode as Boolean +Public bRangeListDefined as Boolean +Public bDocHasProtectedSheets as Boolean +Public sGOON as String +Public sHELP as String +Public sCANCEL as String +Dim sEnd as String + +Sub InitializeResources() +Dim LocWorkPath as String + With DialogModel + ' Strings that are also needed by the Password Dialog + sGoOn = GetResText("STEP_ZERO_3") + sHelp = GetResText("STEP_ZERO_1") + sCANCEL = GetResText("MESSAGES_18") + sEnd = GetResText("STEP_ZERO_0") + sPROTECT = GetResText("STEP_ZERO_5") + sCONTINUE = GetResText("STEP_ZERO_7") + sSELTEMPL = GetResText("STEP_CONVERTER_6") + sSELCELL = GetResText("STEP_CONVERTER_7") + sCURRRANGES = GetResText("STEP_CONVERTER_8") + sTEMPLATES = GetResText("STEP_CONVERTER_9") + sStsPROGRESS = GetResText("STATUSLINE_0") + sStsCELLPROGRSS = GetResText("STATUSLINE_1") + sStsRELSHEETRANGES = GetResText("STATUSLINE_2") + sStsRELRANGES = GetResText("STATUSLINE_3") + sStsREPROTECT = GetResText("STATUSLINE_4") + sREADY = GetResText("MESSAGES_0") + sMsgSELDIR = GetResText("MESSAGES_1") + sMsgSELFILE = GetResText("MESSAGES_2") + sMsgTARGETDIR = GetResText("MESSAGES_3") + sMsgNOTTHERE = GetResText("MESSAGES_4") + sMsgDLGTITLE = GetResText("MESSAGES_5") + sMsgUNPROTECT = GetResText("MESSAGES_6") + sMsgPWPROTECT = GetResText("MESSAGES_7") + sMsgWRONGPW = GetResText("MESSAGES_8") + sMsgSHEETPROTECTED = GetResText("MESSAGES_9") + sMsgWARNING = GetResText("MESSAGES_10") + sMsgSHEETSNOPROTECT = GetResText("MESSAGES_11") + sMsgSHEETNOPROTECT = GetResText("MESSAGES_12") + sMsgCHOOSECURRENCY = GetResText("MESSAGES_15") + sMsgPASSWORD = GetResText("MESSAGES_16") + sMsgOK = GetResText("MESSAGES_17") + sMsgCANCEL = GetResText("MESSAGES_18") + sMsgFILEINVALID = GetResText("MESSAGES_19") + sMsgFILEINVALID = ReplaceString(sMsgFILEINVALID,"%PRODUCTNAME", GetProductname()) + SMsgNODIRECTORY = GetResText("MESSAGES_20") + sMsgDOCISREADONLY = GetResText("MESSAGES_21") + sMsgFileExists = GetResText("MESSAGES_22") + sMsgCancelConversion = GetResText("MESSAGES_23") + sMsgCancelTitle = GetResText("MESSAGES_24") + sCurrPORTUGUESE = GetResText("CURRENCIES_0") + sCurrDUTCH = GetResText("CURRENCIES_1") + sCurrFRENCH = GetResText("CURRENCIES_2") + sCurrSPANISH = GetResText("CURRENCIES_3") + sCurrITALIAN = GetResText("CURRENCIES_4") + sCurrGERMAN = GetResText("CURRENCIES_5") + sCurrBELGIAN = GetResText("CURRENCIES_6") + sCurrIRISH = GetResText("CURRENCIES_7") + sCurrLUXEMBOURG = GetResText("CURRENCIES_8") + sCurrAUSTRIAN = GetResText("CURRENCIES_9") + sCurrFINNISH = GetResText("CURRENCIES_10") + sCurrGREEK = GetResText("CURRENCIES_11") + sCurrSLOVENIAN = GetResText("CURRENCIES_12") + sCurrCYPRIOT = GetResText("CURRENCIES_13") + sCurrMALTESE = GetResText("CURRENCIES_14") + sCurrSLOVAK = GetResText("CURRENCIES_15") + sCurrESTONIAN = GetResText("CURRENCIES_16") + sCurrLATVIAN = GetResText("CURRENCIES_17") + sCurrLITHUANIAN = GetResText("CURRENCIES_18") + .cmdCancel.Label = sCANCEL + .cmdHelp.Label = sHELP + .cmdBack.Label = GetResText("STEP_ZERO_2") + .cmdGoOn.Label = sGOON + .lblHint.Label = GetResText("STEP_ZERO_4") + .lblCurrencies.Label = GetResText("STEP_ZERO_6") + .cmdBack.Enabled = False + If .Step = 1 Then + .chkComplete.Label = GetResText("STEP_CONVERTER_0") + .hlnSelection.Label = GetResText("STEP_CONVERTER_1") + .optCellTemplates.Label = GetResText("STEP_CONVERTER_2") + .optSheetRanges.Label = GetResText("STEP_CONVERTER_3") + .optDocRanges.Label = GetResText("STEP_CONVERTER_4") + .optSelRange.Label = GetResText("STEP_CONVERTER_5") + sCURRRANGES = GetResText("STEP_CONVERTER_8") + .lblSelection.Label = sCURRRANGES + Else + .lblProgress.Label = sStsPROGRESS + .hlnExtent.Label = GetResText("STEP_AUTOPILOT_0") + .optSingleFile.Label = GetResText("STEP_AUTOPILOT_1") + .optWholeDir.Label = GetResText("STEP_AUTOPILOT_2") + .chkProtect.Label = GetResText("STEP_AUTOPILOT_7") + .chkTextDocuments.Label = GetResText("STEP_AUTOPILOT_10") + + sSOURCEFILE = GetResText("STEP_AUTOPILOT_3") + sSOURCEDIR = GetResText("STEP_AUTOPILOT_4") + .lblSource.Label = sSOURCEDIR + sInclusiveSubDir = GetResText("STEP_AUTOPILOT_5") + .chkRecursive.Label = sInclusiveSubDir + sTARGETDIR = GetResText("STEP_AUTOPILOT_6") + .lblTarget.Label = STARGETDIR + + LocWorkPath = GetPathSettings("Work") + If Not oUcb.Exists(LocWorkPath) Then + ShowNoOfficePathError() + Stop + End If + + .txtSource.Text = ConvertfromUrl(LocWorkPath) + + SubstDir = .txtSource.Text + .txtTarget.Text = .txtSource.Text + .hlnProgress.Label = GetResText("STEP_LASTPAGE_0") + .lblConfig.Label = GetResText("STEP_LASTPAGE_3") + sPrgsRETRIEVAL = GetResText("STEP_LASTPAGE_1") + sPrgsCONVERTING = GetResText("STEP_LASTPAGE_2") + sPrgsUNPROTECT = GetResText("STEP_LASTPAGE_4") + End If + End With +End Sub + +Sub InitializeLanguages() + sEuroSign = chr(8364) + +' CURRENCIES_PORTUGUESE + LangIDValue(0,0,0) = "pt" + LangIDValue(0,0,1) = "" + LangIDValue(0,0,2) = "-816" + +' CURRENCIES_DUTCH + LangIDValue(1,0,0) = "nl" + LangIDValue(1,0,1) = "" + LangIDValue(1,0,2) = "-413" + +' CURRENCIES_FRENCH + LangIDValue(2,0,0) = "fr" + LangIDValue(2,0,1) = "" + LangIDValue(2,0,2) = "-40C" + +' CURRENCIES_SPANISH + LangIDValue(3,0,0) = "es" + LangIDValue(3,0,1) = "" + LangIDValue(3,0,2) = "-40A" + + 'Spanish modern + LangIDValue(3,1,0) = "es" + LangIDValue(3,1,1) = "" + LangIDValue(3,1,2) = "-C0A" + + 'Spanish katalanic + LangIDValue(3,2,0) = "es" + LangIDValue(3,2,1) = "" + LangIDValue(3,2,2) = "-403" + +' CURRENCIES_ITALIAN + LangIDValue(4,0,0) = "it" + LangIDValue(4,0,1) = "" + LangIDValue(4,0,2) = "-410" + +' CURRENCIES_GERMAN + LangIDValue(5,0,0) = "de" + LangIDValue(5,0,1) = "DE" + LangIDValue(5,0,2) = "-407" + +' CURRENCIES_BELGIAN + LangIDValue(6,0,0) = "fr" + LangIDValue(6,0,1) = "BE" + LangIDValue(6,0,2) = "-80C" + + LangIDValue(6,1,0) = "nl" + LangIDValue(6,1,1) = "BE" + LangIDValue(6,1,2) = "-813" + +' CURRENCIES_IRISH + LangIDValue(7,0,0) = "en" + LangIDValue(7,0,1) = "IE" + LangIDValue(7,0,2) = "-1809" + + LangIDValue(7,1,0) = "ga" + LangIDValue(7,1,1) = "IE" + LangIDValue(7,1,2) = "-83C" + +' CURRENCIES_LUXEMBOURG + LangIDValue(8,0,0) = "fr" + LangIDValue(8,0,1) = "LU" + LangIDValue(8,0,2) = "-140C" + + LangIDValue(8,1,0) = "de" + LangIDValue(8,1,1) = "LU" + LangIDValue(8,1,2) = "-1007" + +' CURRENCIES_AUSTRIAN + LangIDValue(9,0,0) = "de" + LangIDValue(9,0,1) = "AT" + LangIDValue(9,0,2) = "-C07" + +' CURRENCIES_FINNISH + LangIDValue(10,0,0) = "fi" + LangIDValue(10,0,1) = "FI" + LangIDValue(10,0,2) = "-40B" + + LangIDValue(10,1,0) = "sv" + LangIDValue(10,1,1) = "FI" + LangIDValue(10,1,2) = "-81D" + +' CURRENCIES_GREEK + LangIDValue(11,0,0) = "el" + LangIDValue(11,0,1) = "GR" + LangIDValue(11,0,2) = "-408" + +' CURRENCIES_SLOVENIAN + LangIDValue(12,0,0) = "sl" + LangIDValue(12,0,1) = "SI" + LangIDValue(12,0,2) = "-424" + +' CURRENCIES_CYPRIOT + LangIDValue(13,0,0) = "el" + LangIDValue(13,0,1) = "CY" + LangIDValue(13,0,2) = "-408" + +' CURRENCIES_MALTESE + LangIDValue(14,0,0) = "mt" + LangIDValue(14,0,1) = "MT" + LangIDValue(14,0,2) = "-43A" + +' CURRENCIES_SLOVAK + LangIDValue(15,0,0) = "sk" + LangIDValue(15,0,1) = "SK" + LangIDValue(15,0,2) = "-41B" + +' CURRENCIES_ESTONIAN + LangIDValue(16,0,0) = "et" + LangIDValue(16,0,1) = "ET" + LangIDValue(16,0,2) = "-425" + +' CURRENCIES_LATVIAN + LangIDValue(17,0,0) = "lv" + LangIDValue(17,0,1) = "LV" + LangIDValue(17,0,2) = "-426" + ' and Latgalian + LangIDValue(17,1,0) = "ltg" + LangIDValue(17,1,1) = "LV" + LangIDValue(17,1,2) = "-64B" + +' CURRENCIES_LITHUANIAN + LangIDValue(18,0,0) = "lt" + LangIDValue(18,0,1) = "LT" + LangIDValue(18,0,2) = "-427" + +End Sub + + + +Sub InitializeCurrencies() +Dim i as Integer + GoOn = True + + CurrValue(0,0) = sCurrPORTUGUESE + ' real conversion rate + CurrValue(0,1) = 200.482 + ' rounded conversion rate + CurrValue(0,2) = 200 + CurrValue(0,3) = "Esc." + CurrValue(0,4) = "Esc." + CurrValue(0,5) = "PTE" + + CurrValue(1,0) = sCurrDUTCH + ' real conversion rate + CurrValue(1,1) = 2.20371 + ' rounded conversion rate + CurrValue(1,2) = 2 + CurrValue(1,3) = "F" + CurrValue(1,4) = "fl" + CurrValue(1,5) = "NLG" + + CurrValue(2,0) = sCurrFRENCH + ' real conversion rate + CurrValue(2,1) = 6.55957 + ' rounded conversion rate + CurrValue(2,2) = 7 + CurrValue(2,3) = "F" + CurrValue(2,4) = "F" + CurrValue(2,5) = "FRF" + + CurrValue(3,0) = sCurrSPANISH + ' real conversion rate + CurrValue(3,1) = 166.386 + ' rounded conversion rate + CurrValue(3,2) = 170 + CurrValue(3,3) = "Pts" + CurrValue(3,4) = "Pts" + CurrValue(3,5) = "ESP" + + CurrValue(4,0) = sCurrITALIAN + ' real conversion rate + CurrValue(4,1) = 1936.27 + ' rounded conversion rate + CurrValue(4,2) = 2000 + CurrValue(4,3) = "L." + CurrValue(4,4) = "L." + CurrValue(4,5) = "ITL" + + CurrValue(5,0) = sCurrGERMAN + ' real conversion rate + CurrValue(5,1) = 1.95583 + ' rounded conversion rate + CurrValue(5,2) = 2 + CurrValue(5,3) = "DM" + CurrValue(5,4) = "DM" + CurrValue(5,5) = "DEM" + + CurrValue(6,0) = sCurrBELGIAN + ' real conversion rate + CurrValue(6,1) = 40.3399 + ' rounded conversion rate + CurrValue(6,2) = 40 + CurrValue(6,3) = "FB" + CurrValue(6,4) = "BF" + CurrValue(6,5) = "BEF" + + CurrValue(7,0) = sCurrIRISH + ' real conversion rate + CurrValue(7,1) = 0.787564 + ' rounded conversion rate + CurrValue(7,2) = 0.8 + CurrValue(7,3) = "IR£" + CurrValue(7,4) = "£" + CurrValue(7,5) = "IEP" + + CurrValue(8,0) = sCurrLUXEMBOURG + ' real conversion rate + CurrValue(8,1) = 40.3399 + ' rounded conversion rate + CurrValue(8,2) = 40 + CurrValue(8,3) = "F" + CurrValue(8,4) = "F" + CurrValue(8,5) = "LUF" + + CurrValue(9,0) = sCurrAUSTRIAN + ' real conversion rate + CurrValue(9,1) = 13.7603 + ' rounded conversion rate + CurrValue(9,2) = 15 + CurrValue(9,3) = "öS" + CurrValue(9,4) = "S" + CurrValue(9,5) = "ATS" + + CurrValue(10,0) = sCurrFINNISH + ' real conversion rate + CurrValue(10,1) = 5.94573 + ' rounded conversion rate + CurrValue(10,2) = 6 + CurrValue(10,3) = "mk" + CurrValue(10,4) = "mk" + CurrValue(10,5) = "FIM" + + CurrValue(11,0) = sCurrGREEK + ' real conversion rate + CurrValue(11,1) = 340.750 + ' rounded conversion rate + CurrValue(11,2) = 400 + CurrValue(11,3) = chr(916) & chr(961) & chr(967) + CurrValue(11,4) = chr(916) & chr(961) & chr(967) + CurrValue(11,5) = "GRD" + + CurrValue(12,0) = sCurrSLOVENIAN + ' real conversion rate + CurrValue(12,1) = 239.64 + ' rounded conversion rate + CurrValue(12,2) = 240 + CurrValue(12,3) = "SIT" + CurrValue(12,4) = "SIT" + CurrValue(12,5) = "SIT" + + CurrValue(13,0) = sCurrCYPRIOT + ' real conversion rate + CurrValue(13,1) = 0.585274 + ' rounded conversion rate + CurrValue(13,2) = 0.6 + CurrValue(13,3) = "£C" + CurrValue(13,4) = "£" + CurrValue(13,5) = "CYP" + + CurrValue(14,0) = sCurrMALTESE + ' real conversion rate + CurrValue(14,1) = 0.429300 + ' rounded conversion rate + CurrValue(14,2) = 0.4 + CurrValue(14,3) = chr(8356) + CurrValue(14,4) = "Lm" + CurrValue(14,5) = "MTL" + + CurrValue(15,0) = sCurrSLOVAK + ' real conversion rate + CurrValue(15,1) = 30.1260 + ' rounded conversion rate + CurrValue(15,2) = 30 + CurrValue(15,3) = "Sk" + CurrValue(15,4) = "Sk" + CurrValue(15,5) = "SKK" + + CurrValue(16,0) = sCurrESTONIAN + ' real conversion rate + CurrValue(16,1) = 15.6466 + ' rounded conversion rate + CurrValue(16,2) = 16 + CurrValue(16,3) = "kr" + CurrValue(16,4) = "kr" + CurrValue(16,5) = "EEK" + + CurrValue(17,0) = sCurrLATVIAN + ' real conversion rate + CurrValue(17,1) = 0.702804 + ' rounded conversion rate + CurrValue(17,2) = 0.7 + CurrValue(17,3) = "Ls" + CurrValue(17,4) = "Ls" + CurrValue(17,5) = "LVL" + + CurrValue(18,0) = sCurrLITHUANIAN + ' real conversion rate + CurrValue(18,1) = 3.45280 + ' rounded conversion rate + CurrValue(18,2) = 3.5 + CurrValue(18,3) = "Lt" + CurrValue(18,4) = "Lt" + CurrValue(18,5) = "LTL" + + i = -1 + CurrSymbolList(0) = "" + CurrSymbolList(1) = "" + InitializeCurrencyValues(CurrIndex) +End Sub + + +Sub InitializeControls() + If CurrIndex = -1 Then + If DialogModel.Step = 1 Then + EnableStep1DialogControls(True, False, False) + ElseIf DialogModel.Step = 2 Then + EnableStep2DialogControls(True) + End If + End If +End Sub + + +Sub InitializeConverter(oLocale, iDialogPage as Integer) +Dim Isthere as Boolean + bCancelProtection = False + bRangeListDefined = False + PWIndex = -1 + If iDialogPage = 1 Then + ToggleWindow(False) + sDocType = Tools.GetDocumentType(ThisComponent) + If sDocType = "sCalc" Then + bDocHasProtectedSheets = CheckSheetProtection(oSheets) + End If + oStatusline = ThisComponent.GetCurrentController.GetFrame.CreateStatusIndicator() + End If + DialogConvert = LoadDialog("Euro", "DlgConvert") + DialogModel = DialogConvert.Model + DialogPassword = LoadDialog("Euro", "DlgPassword") + PasswordModel = DialogPassword.Model + DialogModel.Step = iDialogPage + InitializeResources() + InitializeLanguages() + InitializeLocales(oLocale) + InitializeCurrencies() + InitializeControls() + BitmapDir = GetOfficeSubPath("Template", "../wizard/bitmap") + If BitmapDir = "" Then + Stop + End If + FillUpCurrencyListbox() + DialogModel.imgPreview.ImageUrl = BitmapDir & "euro_" & DialogModel.Step & ".png" + DialogConvert.Title = sMsgDLGTITLE + DialogModel.cmdGoOn.DefaultButton = True + If iDialogPage = 1 Then + ToggleWindow(True) + End If +End Sub + + +Sub InitializeCurrencyValues(CurrIndex) + If CurrIndex <> -1 Then + CurrLanguage = CurrValue(CurrIndex,0) + CurrFactor = CurrValue(CurrIndex,1) + CurrSymbolList(0) = CurrValue(CurrIndex,3) + CurrSymbolList(1) = CurrValue(CurrIndex,4) + CurrSymbolList(2) = CurrValue(CurrIndex,5) + End If +End Sub + + +Function InitializeLocales(oLocale) as Boolean +Dim i as Integer, n as Integer, m as Integer +Dim sLanguage as String, sCountry as String +Dim bTakeThisLocale as Boolean + sLanguage = oLocale.Language + sCountry = oLocale.Country + For n = 0 To SBCOUNTRYCOUNT - 1 + For m = 0 TO 1 + If DialogModel.Step = 2 Then + bTakeThisLocale = LangIDValue(n,m,0) = sLanguage + Else + bTakeThisLocale = LangIDValue(n,m,0) = sLanguage + End If + If bTakeThisLocale Then + CurrIndex = n + For i = 0 To 2 + CurExtension(i) = LangIDValue(CurrIndex,i,2) + Next i + InitializeLocales = True + Exit Function + End If + Next m + Next n + CurrIndex = -1 + InitializeLocales = False +End Function +</script:module> diff --git a/wizards/source/euro/Protect.xba b/wizards/source/euro/Protect.xba new file mode 100644 index 000000000..4a9cac577 --- /dev/null +++ b/wizards/source/euro/Protect.xba @@ -0,0 +1,192 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Protect" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + +Public PWIndex as Integer + + +Function UnprotectSheetsWithPassWord(oSheets as Object, bDoUnProtect as Boolean) +Dim i as Integer +Dim MaxIndex as Integer +Dim iMsgResult as Integer + PWIndex = -1 + If bDocHasProtectedSheets Then + If Not bDoUnprotect Then + ' At First query if sheets shall generally be unprotected + iMsgResult = Msgbox(sMsgUNPROTECT,36,sMsgDLGTITLE) + bDoUnProtect = iMsgResult = 6 + End If + If bDoUnProtect Then + MaxIndex = oSheets.Count-1 + For i = 0 To MaxIndex + bDocHasProtectedSheets = Not UnprotectSheet(oSheets(i)) + If bDocHasProtectedSheets Then + ReprotectSheets() + Exit For + End If + Next i + If PWIndex = -1 Then + ReDim UnProtectList() as String + Else + ReDim Preserve UnProtectList(PWIndex) as String + End If + Else + Msgbox (sMsgSHEETSNOPROTECT, 64, sMsgDLGTITLE) + End If + End If + UnProtectSheetsWithPassword = bDocHasProtectedSheets +End Function + + +Function UnprotectSheet(oListSheet as Object) +Dim ListSheetName as String +Dim sStatustext as String +Dim i as Integer +Dim bOneSheetIsUnprotected as Boolean + i = -1 + ListSheetName = oListSheet.Name + If oListSheet.IsProtected Then + oListSheet.Unprotect("") + If oListSheet.IsProtected Then + ' Sheet is protected by a Password + bOneSheetIsUnProtected = UnprotectSheetWithDialog(oListSheet, ListSheetName) + UnProtectSheet() = bOneSheetIsUnProtected + Else + ' The Sheet could be unprotected without a password + AddSheettoUnprotectionlist(ListSheetName,"") + UnprotectSheet() = True + End If + Else + UnprotectSheet() = True + End If +End Function + + +Function UnprotectSheetWithDialog(oListSheet as Object, ListSheetName as String) as Boolean +Dim PWIsCorrect as Boolean +Dim QueryText as String + oDocument.CurrentController.SetActiveSheet(oListSheet) + QueryText = ReplaceString(sMsgPWPROTECT,"'" & ListSheetName & "'", "%1TableName%1") + '"Please insert the password to unprotect the sheet '" & ListSheetName'" + Do + ExecutePasswordDialog(QueryText) + If bCancelProtection Then + bCancelProtection = False + Msgbox (sMsgSHEETSNOPROTECT, 64, sMsgDLGTITLE) + UnprotectSheetWithDialog() = False + exit Function + End If + oListSheet.Unprotect(Password) + If oListSheet.IsProtected Then + PWIsCorrect = False + Msgbox (sMsgWRONGPW, 64, sMsgDLGTITLE) + Else + ' Sheet could be unprotected + AddSheettoUnprotectionlist(ListSheetName,Password) + PWIsCorrect = True + End If + Loop Until PWIsCorrect + UnprotectSheetWithDialog() = True +End Function + + +Sub ExecutePasswordDialog(QueryText as String) + With PasswordModel + .Title = QueryText + .hlnPassword.Label = sMsgPASSWORD + .cmdCancel.Label = sMsgCANCEL + .cmdHelp.Label = sHELP + .cmdGoOn.Label = sMsgOK + .cmdGoOn.DefaultButton = True + End With + DialogPassword.Execute +End Sub + +Sub ReadPassword() + Password = PasswordModel.txtPassword.Text + DialogPassword.EndExecute +End Sub + + +Sub RejectPassword() + bCancelProtection = True + DialogPassword.EndExecute +End Sub + + +' Reprotects the previously protected sheets +' The password information is stored in the List 'UnProtectList()' +Sub ReprotectSheets() +Dim i as Integer +Dim oProtectSheet as Object +Dim ProtectList() as String +Dim SheetName as String +Dim SheetPassword as String + If PWIndex > -1 Then + SetStatusLineText(sStsREPROTECT) + For i = 0 To PWIndex + ProtectList() = ArrayOutOfString(UnProtectList(i),";") + SheetName = ProtectList(0) + If Ubound(ProtectList()) > 0 Then + SheetPassWord = ProtectList(1) + Else + SheetPassword = "" + End If + oProtectSheet = oSheets.GetbyName(SheetName) + If Not oProtectSheet.IsProtected Then + oProtectSheet.Protect(SheetPassWord) + End If + Next i + SetStatusLineText("") + End If + PWIndex = -1 + ReDim UnProtectList() +End Sub + + +' Add a Sheet to the list of sheets that finally have to be +' unprotected +Sub AddSheettoUnprotectionlist(ListSheetName as String, Password as String) +Dim MaxIndex as Integer + MaxIndex = Ubound(UnProtectList()) + PWIndex = PWIndex + 1 + If PWIndex > MaxIndex Then + ReDim Preserve UnprotectList(MaxIndex + SBRANGEUBOUND) + End If + UnprotectList(PWIndex) = ListSheetName & ";" & Password +End Sub + + +Function CheckSheetProtection(oSheets as Object) as Boolean +Dim MaxIndex as Integer +Dim i as Integer +Dim bProtectedSheets as Boolean + bProtectedSheets = False + MaxIndex = oSheets.Count-1 + For i = 0 To MaxIndex + bProtectedSheets = oSheets(i).IsProtected + If bProtectedSheets Then + CheckSheetProtection() = True + Exit Function + End If + Next i + CheckSheetProtection() = False +End Function</script:module> diff --git a/wizards/source/euro/Soft.xba b/wizards/source/euro/Soft.xba new file mode 100644 index 000000000..eed7bd030 --- /dev/null +++ b/wizards/source/euro/Soft.xba @@ -0,0 +1,256 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Soft" script:language="StarBasic">Option Explicit +REM ***** BASIC ***** + + +Sub CreateStyleEnumeration() + EmptySelection() + EmptyListbox(DialogModel.lstSelection) + CurSheetName = oDocument.CurrentController.GetActiveSheet.Name + MakeStyleEnumeration(False) + DialogModel.lblSelection.Label = sTEMPLATES +End Sub + + +Sub MakeStyleEnumeration(bAddToListbox as Boolean) +Dim m as integer +Dim aStyleFormat as Object +Dim Stylename as String + StyleIndex = -1 + oStyles = oDocument.StyleFamilies.GetbyIndex(0) + For m = 0 To oStyles.count-1 + oStyle = oStyles.GetbyIndex(m) + StyleName = oStyle.Name + If CheckFormatType(oStyle) Then + If Not bAddToListBox Then + AddSingleItemToListbox(DialogModel.lstSelection, Stylename) + Else + SwitchNumberFormat(ostyle, oFormats, sEuroSign) + End If + StyleIndex = StyleIndex + 1 + If StyleIndex > Ubound(StyleRangeAssignMentList()) Then + Redim Preserve StyleRangeAssignmentList(StyleIndex) + End If + StyleRangeAssignmentList(StyleIndex) = "<STYLENAME>" & Stylename & "</STYLENAME>" & _ + "<DEFINED>FALSE</DEFINED>" & "<RANGES></RANGES>" &_ + "<CELLCOUNT>0</CELLCOUNT>" &_ + "<SELECTED>FALSE</SELECTED>" + End If + Next m + If StyleIndex > -1 Then + Redim Preserve StyleRangeAssignmentList(StyleIndex) + Else + ReDim StyleRangeAssignmentList() + End If +End Sub + + +Sub AssignRangestoStyle(StyleList(), SelList()) +Dim i as Integer +Dim n as integer +Dim LastIndex as Integer +Dim CurStyleName as String +Dim AssignString as String + LastIndex = Ubound(StyleList()) + StatusValue = 0 + SetStatusLineText(sStsRELRANGES) + For i = 0 To LastIndex + CurStyleName = StyleList(i) + n = PartStringInArray(StyleRangeAssignmentList(), CurStyleName, 0) + AssignString = StyleRangeAssignmentlist(n) + If IndexInArray(CurStyleName, SelList()) <> -1 Then + ' Style is selected + If FindPartString(AssignString, "<DEFINED>", "</DEFINED>", 1) = "FALSE" Then + AssignString = ReplaceString(AssignString, "<SELECTED>TRUE</SELECTED>", "<SELECTED>FALSE</SELECTED>") + AssignCellFormatRanges(n, AssignString, CurStyleName) + End If + Else + ' Style is not selected + If FindPartString(AssignString, "<SELECTED>", "</SELECTED>", 1) = "FALSE" Then + DeselectStyle(CurStyleName, n) + End If + End If + IncreaseStatusvalue(SBRELGET/(LastIndex+1)) + Next i +End Sub + + +Sub AssignCellFormatRanges(n as Integer, AssignString as String, CurStyleName as String) +Dim oRanges() as Object +Dim oRange as Object +Dim oRangeAddress +Dim oSheet as Object +Dim StyleCellCount as Long +Dim i as Integer +Dim MaxIndex as Integer +Dim RangeString as String +Dim SheetName as String +Dim RangeName as String +Dim CellCountString as String + StyleCellCount = 0 + RangeString = "<RANGES>" + MaxIndex = oSheets.Count-1 + For i = 0 To MaxIndex + oSheet = oSheets(i) + SheetName = oSheet.Name + oRanges = osheet.CellFormatRanges.CreateEnumeration + While oRanges.hasMoreElements + oRange = oRanges.NextElement + If oRange.getPropertyState("NumberFormat") = 1 Then + If oRange.CellStyle = CurStyleName Then + oRangeAddress = oRange.RangeAddress + RangeName = RetrieveRangeNamefromAddress(oRange) + RangeString = RangeString & RangeName & "," + StyleCellCount = StyleCellCount + CountRangeCells(oRange) + End If + End If + Wend + Next i + If StyleCellCount > 0 Then + TotCellCount = TotCellCount + StyleCellCount + RangeString = RTrimStr(RangeString,",") + RangeString = RangeString & "</RANGES>" + CellCountString = "<CELLCOUNT>" & StyleCellCount & "</CELLCOUNT" + AssignString = ReplaceString(AssignString, RangeString,"<RANGES></RANGES>") + AssignString = ReplaceString(AssignString, CellCountString,"<CELLCOUNT>0</CELLCOUNT>") + End If + AssignString = ReplaceString(AssignString, "<DEFINED>TRUE</DEFINED>", "<DEFINED>FALSE</DEFINED>") + StyleRangeAssignmentList(n) = AssignString +End Sub + + +' deletes a styletemplate from the Collection that selects the ranges +Sub DeselectStyle(DeSelStyleName as String, n as Integer) +Dim i as Integer +Dim RangeName as String +Dim SelectString as String +Dim AssignString as String +Dim StyleRangeList() as String +Dim MaxIndex as Integer + SelectString ="<SELECTED>FALSE</SELECTED>" + AssignString = StyleRangeAssignmentList(n) + RangeString = FindPartString(AssignString,"<RANGES>","</RANGES>",1) + StyleRangeList() = ArrayoutofString(RangeString,",") + MaxIndex = Ubound(StyleRangeList()) + For i = 0 To MaxIndex + RangeName = StyleRangeList(i) + If oSelRanges.HasbyName(RangeName) Then + oSelRanges.RemovebyName(RangeName) + End If + Next i + AssignString = ReplaceString(AssignString, "<SELECTED>FALSE</SELECTED>", "<SELECTED>TRUE</SELECTED>") + StyleRangeAssignmentList(n) = AssignString +End Sub + + +Function RetrieveRangeNamefromAddress(oRange as Object) as String +Dim Rangename as String +Dim oAddressRanges as Object + oAddressRanges = oDocument.createInstance("com.sun.star.sheet.SheetCellRanges") + oAddressRanges.InsertbyName("",oRange) + Rangename = oAddressRanges.RangeAddressesasString +' Msgbox "Adresse: " & oRangeAddress.StartColumn & " ; " & oRangeAddress.EndColumn & " ; " & oRangeAddress.StartRow & " ; " & oRangeAddress.EndRow & chr(13) & RangeName +' oAddressRanges.RemovebyName(RangeName) + RetrieveRangeNamefromAddress = Rangename +End Function + + +' creates a sheet object from an according sectionname +Function RetrieveSheetoutofRangeName(TableText as String) +Dim DescriptionList() as String +Dim SheetName as String +Dim MaxIndex as integer + ' find out in which sheet the range is + DescriptionList() = ArrayOutofString(TableText,".",MaxIndex) + SheetName = DescriptionList(0) + SheetName = DeleteStr(SheetName,"'") + ' set the viewcursor on this sheet + RetrieveSheetoutofRangeName = oSheets.GetbyName(SheetName) +End Function + + +' creates a rangeobject from an according rangename +Function RetrieveRangeoutofRangeName(TableText as String) + oSheet = RetrieveSheetoutofRangeName(TableText) + oRange = oSheet.GetCellRangebyName(TableText) + RetrieveRangeoutofRangeName = oRange +End Function + + +Sub ConvertTheSoftWay(StyleList(), bDeSelect as Boolean) +Dim i as Integer +Dim l as Integer +Dim s as Integer +Dim n as Integer +Dim CurStyleName as String +Dim RangeName as String +Dim OldStatusValue as Integer +Dim LastIndex as Integer +Dim oSelListbox as Object +Dim StyleRangeList() as String +Dim MaxIndex as Integer + oSelListbox = DialogConvert.GetControl("lstSelection") + LastIndex = Ubound(StyleList()) + OldStatusValue = StatusValue + For i = 0 To LastIndex + CurStyleName = StyleList(i) + oStyle = oStyles.GetbyName(CurStyleName) + StyleRangeList() = GetAssignedRanges(CurStyleName, n) + MaxIndex = Ubound(StyleRangeList()) + For s = 0 To MaxIndex + RangeName = StyleRangeList(s) + oRange = RetrieveRangeoutofRangeName(RangeName) + If oRange.getPropertyState("NumberFormat") = 1 Then + ' Range is hard formatted + ConvertCellCurrencies(oRange) + CurCellCount = CountRangeCells(oRange) + End If + IncreaseStatusvalue((CurCellCount/TotCellCount)*(95-OldStatusValue)) + If bDeSelect Then + ' Note: On Problems see Bug #73157 + If oSelRanges.HasbyName(RangeName) Then + oSelRanges.RemovebyName(RangeName) + oDocument.CurrentController.Select(oSelRanges) + End If + End If + Next s + SwitchNumberFormat(ostyle, oFormats, sEuroSign) + StyleRangeAssignmentList(n) = "" + l = GetItemPos(oSelListBox.Model, CurStyleName) + oSelListbox.RemoveItems(l,1) + Next +End Sub + + +Function GetAssignedRanges(CurStyleName as String, n as Integer) +Dim StyleRangeList() as String +Dim RangeString as String +Dim AssignString as String + n = PartStringInArray(StyleRangeAssignmentList(), CurStyleName, 0) + If n <> -1 Then + AssignString = StyleRangeAssignmentList(n) + RangeString = FindPartString(AssignString,"<RANGES>", "</RANGES>",1) + If RangeString <> "" Then + StyleRangeList() = ArrayoutofString(RangeString,",") + End If + End If + GetAssignedRanges() = StyleRangeList() +End Function</script:module>
\ No newline at end of file diff --git a/wizards/source/euro/Writer.xba b/wizards/source/euro/Writer.xba new file mode 100644 index 000000000..bf89135bc --- /dev/null +++ b/wizards/source/euro/Writer.xba @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Writer" script:language="StarBasic">REM ***** BASIC ***** + + +Sub ConvertWriterTables() +Dim CellString as String +Dim oParagraphs as Object +Dim oPara as Object +Dim i as integer +Dim sCellNames() +Dim oCell as Object + oParagraphs = oDocument.Text.CreateEnumeration + While oParagraphs.HasMoreElements + oPara = oParagraphs.NextElement + If NOT oPara.supportsService("com.sun.star.text.Paragraph") Then + ' Note: As cells might be split or merged + ' you cannot refer to them via their indices + sCellNames = oPara.CellNames + For i = 0 To Ubound(sCellNames) + If sCellNames(i) <> "" Then + oCell = oPara.getCellByName(sCellNames(i)) + If CheckFormatType(oCell) Then + SwitchNumberFormat(oCell, oFormats, sEuroSign) + ModifyObjectValuewithCurrFactor(oCell) + End If + End If + Next + End If + Wend +End Sub + + +Sub ModifyObjectValuewithCurrFactor(oDocObject as Object) + oDocObjectValue = oDocObject.Value + oDocObject.Value = oDocObjectValue/CurrFactor +End Sub + + +Sub ConvertTextFields() +Dim oTextFields as Object +Dim oTextField as Object +Dim FieldValue +Dim oDocObjectValue as double +Dim InstanceNames(500) as String +Dim CurInstanceName as String +Dim MaxIndex as Integer + MaxIndex = 0 + oTextfields = oDocument.getTextfields.CreateEnumeration + While oTextFields.hasmoreElements + oTextField = oTextFields.NextElement + If oTextField.PropertySetInfo.HasPropertybyName("NumberFormat") Then + If CheckFormatType(oTextField) Then + If oTextField.PropertySetInfo.HasPropertybyName("Value") Then + If Not oTextField.SupportsService("com.sun.star.text.TextField.GetExpression") Then + oTextField.Content = CStr(Round(oTextField.Value/CurrFactor,2)) + End If + ElseIf oTextField.TextFieldMaster.PropertySetInfo.HasPropertyByName("Value") Then + CurInstanceName = oTextField.TextFieldMaster.InstanceName + If Not FieldInArray(InstanceNames(), MaxIndex, CurInstanceName) Then + oTextField.TextFieldMaster.Content = CStr(Round(oTextField.TextFieldMaster.Value/CurrFactor,2)) + InstanceNames(MaxIndex) = CurInstanceName + MaxIndex = MaxIndex + 1 + End If + End If + SwitchNumberFormat(oTextField, oFormats, sEuroSign) + End If + End If + Wend + oDocument.GetTextFields.refresh() +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/euro/dialog.xlb b/wizards/source/euro/dialog.xlb new file mode 100644 index 000000000..c461ce54f --- /dev/null +++ b/wizards/source/euro/dialog.xlb @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Euro" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="DlgConvert"/> + <library:element library:name="DlgPassword"/> +</library:library> diff --git a/wizards/source/euro/script.xlb b/wizards/source/euro/script.xlb new file mode 100644 index 000000000..1bc4927c2 --- /dev/null +++ b/wizards/source/euro/script.xlb @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Euro" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="ConvertRun"/> + <library:element library:name="AutoPilotRun"/> + <library:element library:name="Hard"/> + <library:element library:name="Soft"/> + <library:element library:name="Init"/> + <library:element library:name="Common"/> + <library:element library:name="Writer"/> + <library:element library:name="Protect"/> +</library:library> diff --git a/wizards/source/formwizard/DBMeta.xba b/wizards/source/formwizard/DBMeta.xba new file mode 100644 index 000000000..b0fa20b7a --- /dev/null +++ b/wizards/source/formwizard/DBMeta.xba @@ -0,0 +1,347 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="DBMeta" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + + +Public iCommandTypes() as Integer +Public CurCommandType as Integer +Public oDataSource as Object +Public bEnableBinaryOptionGroup as Boolean +'Public bSelectContent as Boolean + + +Function GetDatabaseNames(baddFirstListItem as Boolean) +Dim sDatabaseList() + If oDBContext.HasElements Then + Dim LocDBList() as String + Dim MaxIndex as Integer + Dim i as Integer + LocDBList = oDBContext.ElementNames() + MaxIndex = Ubound(LocDBList()) + If baddfirstListItem Then + ReDim Preserve sDatabaseList(MaxIndex + 1) + sDatabaseList(0) = sSelectDatasource + a = 1 + Else + ReDim Preserve sDatabaseList(MaxIndex) + a = 0 + End If + For i = 0 To MaxIndex + sDatabaseList(a) = oDBContext.ElementNames(i) + a = a + 1 + Next i + End If + GetDatabaseNames() = sDatabaseList() +End Function + + +Sub GetSelectedDBMetaData(sDBName as String) +Dim OldsDBname as String +Dim DBIndex as Integer +Dim LocList() as String +' If bStartUp Then +' bStartUp = false +' Exit Sub +' End Sub + ToggleDatabasePage(False) + With DialogModel + If GetConnection(sDBName) Then + If GetDBMetaData() Then + LocList() = AddListToList(Array(sSelectDBTable), TableNames()) + .lstTables.StringItemList() = AddListToList(LocList(), QueryNames()) +' bSelectContent = True + .lstTables.SelectedItems() = Array(0) + iCommandTypes() = CreateCommandTypeList() + EmptyFieldsListboxes() + End If + End If + bEnableBinaryOptionGroup = False + .lstTables.Enabled = True + .lblTables.Enabled = True +' Else +' DialogModel.lstTables.StringItemList = Array(sSelectDBTable) +' EmptyFieldsListboxes() +' End If + ToggleDatabasePage(True) + End With +End Sub + + +Function GetConnection(sDBName as String) +Dim oInteractionHandler as Object +Dim bExitLoop as Boolean +Dim bGetConnection as Boolean +Dim iMsg as Integer +Dim Nulllist() + If Not IsNull(oDBConnection) Then + oDBConnection.Dispose() + End If + oDataSource = oDBContext.GetByName(sDBName) +' If Not oDBContext.hasbyName(sDBName) Then +' GetConnection() = False +' Exit Function +' End If + If Not oDataSource.IsPasswordRequired Then + oDBConnection = oDBContext.GetByName(sDBName).GetConnection("","") + GetConnection() = True + Else + oInteractionHandler = createUnoService("com.sun.star.task.InteractionHandler") + oDataSource = oDBContext.GetByName(sDBName) + On Local Error Goto NOCONNECTION + Do + bExitLoop = True + oDBConnection = oDataSource.ConnectWithCompletion(oInteractionHandler) + NOCONNECTION: + bGetConnection = Err = 0 + If bGetConnection Then + bGetConnection = Not IsNull(oDBConnection) + If Not bGetConnection Then + Exit Do + End If + End If + If Not bGetConnection Then + iMsg = Msgbox (sMsgNoConnection,32 + 2, sMsgWizardName) + bExitLoop = iMsg = SBCANCEL + Resume CLERROR + CLERROR: + End If + Loop Until bExitLoop + On Local Error Goto 0 + If Not bGetConnection Then + DialogModel.lstTables.StringItemList() = Array(sSelectDBTable) + DialogModel.lstFields.StringItemList() = NullList() + DialogModel.lstSelFields.StringItemList() = NullList() + End If + GetConnection() = bGetConnection + End If +End Function + + +Function GetDBMetaData() + If oDBContext.HasElements Then + Tablenames() = oDBConnection.Tables.ElementNames() + Querynames() = oDBConnection.Queries.ElementNames() + GetDBMetaData = True + Else + MsgBox(sMsgErrNoDatabase, 64, sMsgWizardName) + GetDBMetaData = False + End If +End Function + + +Sub GetTableMetaData() +Dim iType as Long +Dim m as Integer +Dim Found as Boolean +Dim i as Integer +Dim sFieldName as String +Dim n as Integer +Dim WidthIndex as Integer +Dim oField as Object + MaxIndex = Ubound(DialogModel.lstSelFields.StringItemList()) + Dim ColumnMap(MaxIndex)as Integer + FieldNames() = DialogModel.lstSelFields.StringItemList() + ' Build a structure which maps the position of a selected field (within the selection) to the column position within + ' the table. So we ensure that the controls are placed in the same order the according fields are selected. + For i = 0 To Ubound(FieldNames()) + sFieldName = FieldNames(i) + Found = False + n = 0 + While (n< MaxIndex And (Not Found)) + If (FieldNames(n) = sFieldName) Then + Found = True + ColumnMap(n) = i + End If + n = n + 1 + Wend + Next i + For n = 0 to MaxIndex + sFieldname = FieldNames(n) + oField = oColumns.GetByName(sFieldName) + iType = oField.Type + FieldMetaValues(n,0) = oField.Type + FieldMetaValues(n,1) = AssignFieldLength(oField.Precision) + FieldMetaValues(n,2) = GetValueoutofList(iType, WidthList(),1, WidthIndex) + FieldMetaValues(n,3) = WidthList(WidthIndex,3) + FieldMetaValues(n,4) = oField.FormatKey + FieldMetaValues(n,5) = oField.DefaultValue + FieldMetaValues(n,6) = oField.IsCurrency + FieldMetaValues(n,7) = oField.Scale +' If oField.Description <> "" Then +'' Todo: What's wrong with this line? +' Msgbox oField.Helptext +' End If + FieldMetaValues(n,8) = oField.Description + Next + ReDim oDBShapeList(MaxIndex) as Object + ReDim oTCShapeList(MaxIndex) as Object + ReDim oDBModelList(MaxIndex) as Object + ReDim oGroupShapeList(MaxIndex) as Object +End Sub + + +Function GetSpecificFieldNames() as Integer +Dim n as Integer +Dim m as Integer +Dim s as Integer +Dim iType as Integer +Dim oField as Object +Dim MaxIndex as Integer +Dim EmptyList() + If Ubound(DialogModel.lstTables.StringItemList()) > -1 Then + FieldNames() = oColumns.GetElementNames() + MaxIndex = Ubound(FieldNames()) + If MaxIndex <> -1 Then + Dim ResultFieldNames(MaxIndex) + ReDim ImgFieldNames(MaxIndex) + m = 0 + For n = 0 To MaxIndex + oField = oColumns.GetByName(FieldNames(n)) + iType = oField.Type + If GetIndexInMultiArray(WidthList(), iType, 0) <> -1 Then + ResultFieldNames(m) = FieldNames(n) + m = m + 1 + End If + If GetIndexInMultiArray(ImgWidthList(), iType, 0) <> -1 Then + ImgFieldNames(s) = FieldNames(n) + s = s + 1 + End If + Next n + If s <> 0 Then + Redim Preserve ImgFieldNames(s-1) + bEnableBinaryOptionGroup = True + Else + bEnableBinaryOptionGroup = False + End If + If (DialogModel.optBinariesasGraphics.State = 1) And (s <> 0) Then + ResultFieldNames() = AddListToList(ResultFieldNames(), ImgFieldNames()) + Else + Redim Preserve ResultFieldNames(m-1) + End If + FieldNames() = ResultFieldNames() + DialogModel.lstFields.StringItemList = FieldNames() + InitializeListboxProcedures(DialogModel, DialogModel.lstFields, DialogModel.lstSelFields) + End If + GetSpecificFieldNames = MaxIndex + Else + GetSpecificFieldNames = -1 + End If +End Function + + +Sub CreateDBForm() + If oDrawPage.Forms.Count = 0 Then + oDBForm = oDocument.CreateInstance("com.sun.star.form.component.Form") + oDrawpage.Forms.InsertByIndex (0, oDBForm) + Else + oDBForm = oDrawPage.Forms.GetByIndex(0) + End If + oDBForm.Name = "Standard" + oDBForm.DataSourceName = sDBName + oDBForm.Command = TableName + oDBForm.CommandType = CurCommandType +End Sub + + +Sub AddOrRemoveBinaryFieldsToWidthList() +Dim LocWidthList() +Dim MaxIndex as Integer +Dim OldMaxIndex as Integer +Dim s as Integer +Dim n as Integer +Dim m as Integer + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + If DialogModel.optBinariesasGraphics.State = 1 Then + OldMaxIndex = Ubound(WidthList(),1) + If OldMaxIndex = 15 Then + MaxIndex = Ubound(WidthList(),1) + Ubound(ImgWidthList(),1) + 1 + ReDim Preserve WidthList(MaxIndex,4) + s = 0 + For n = OldMaxIndex + 1 To MaxIndex + For m = 0 To 3 + WidthList(n,m) = ImgWidthList(s,m) + Next m + s = s + 1 + Next n + MergeList(DialogModel.lstFields, ImgFieldNames()) + End If + Else + ReDim Preserve WidthList(15, 4) + RemoveListItems(DialogModel.lstFields(), DialogModel.lstSelFields(), ImgFieldNames()) + End If + DialogModel.lstSelFields.Tag = True +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + +Function CreateCommandTypeList() +Dim MaxTableIndex as Integer +Dim MaxQueryIndex as Integer +Dim MaxIndex as Integer +Dim i as Integer +Dim a as Integer + MaxTableIndex = Ubound(TableNames()) + MaxQueryIndex = Ubound(QueryNames()) + MaxIndex = MaxTableIndex + MaxQueryIndex + 1 + If MaxIndex > -1 Then + Dim LocCommandTypes(MaxIndex) as Integer + For i = 0 To MaxTableIndex + LocCommandTypes(i) = com.sun.star.sdb.CommandType.TABLE + Next i + a = i + For i = 0 To MaxQueryIndex + LocCommandTypes(a) = com.sun.star.sdb.CommandType.QUERY + a = a + 1 + Next i + End If + CreateCommandTypeList() = LocCommandTypes() +End Function + + +Sub GetCurrentMetaValues(Index as Integer) + CurFieldType = FieldMetaValues(Index,0) + CurFieldLength = FieldMetaValues(Index,1) + CurControlType = FieldMetaValues(Index,2) + CurControlName = FieldMetaValues(Index,3) + CurFormatKey = FieldMetaValues(Index,4) + CurDefaultValue = FieldMetaValues(Index,5) + CurIsCurrency = FieldMetaValues(Index,6) + CurScale = FieldMetaValues(Index,7) + CurHelpText = FieldMetaValues(Index,8) + CurFieldName = FieldNames(Index) +End Sub + + +Function AssignFieldLength(FieldLength as Long) as Integer + If FieldLength >= 65535 Then + AssignFieldLength() = -1 + Else + AssignFieldLength() = FieldLength + End If +End Function +</script:module> diff --git a/wizards/source/formwizard/DlgFormDB.xdl b/wizards/source/formwizard/DlgFormDB.xdl new file mode 100644 index 000000000..debb8bf38 --- /dev/null +++ b/wizards/source/formwizard/DlgFormDB.xdl @@ -0,0 +1,111 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DlgFormDB" dlg:left="96" dlg:top="28" dlg:width="270" dlg:height="210" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_DIALOG" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblSelFields" dlg:tab-index="10" dlg:left="154" dlg:top="70" dlg:width="110" dlg:height="8" dlg:page="1" dlg:value="lblSelFields"/> + <dlg:menulist dlg:id="lstTables" dlg:tab-index="3" dlg:left="6" dlg:top="51" dlg:width="110" dlg:height="12" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_MASTER_LBTABLES" dlg:spin="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:FormWizard.FormWizard.FormGetFields?language=Basic&location=application" script:language="Script"/> + <script:event script:event-name="on-mousedown" script:macro-name="vnd.sun.star.script:FormWizard.FormWizard.DeleteFirstTableListBoxEntry?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:img dlg:id="imgTheme" dlg:tab-index="1" dlg:left="6" dlg:top="6" dlg:width="258" dlg:height="26" dlg:scale-image="false"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="33" dlg:left="6" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:34401" dlg:value="cmdCancel" dlg:button-type="cancel"/> + <dlg:button dlg:id="cmdHelp" dlg:tab-index="34" dlg:left="63" dlg:top="190" dlg:width="53" dlg:height="14" dlg:tag="34400" dlg:value="cmdHelp" dlg:button-type="help"/> + <dlg:button dlg:id="cmdBack" dlg:tab-index="35" dlg:left="155" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGFORM_CMDPREV" dlg:value="cmdBack"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.FormWizard.PreviousStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="36" dlg:left="211" dlg:top="190" dlg:width="53" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGFORM_CMDNEXT" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.FormWizard.NextStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="lblTables" dlg:tab-index="2" dlg:left="6" dlg:top="40" dlg:width="72" dlg:height="8" dlg:page="1" dlg:value="lblTables"/> + <dlg:text dlg:id="lblFields" dlg:tab-index="4" dlg:left="6" dlg:top="70" dlg:width="109" dlg:height="8" dlg:page="1" dlg:value="lblFields"/> + <dlg:button dlg:id="cmdMoveSelected" dlg:tab-index="6" dlg:left="122" dlg:top="84" dlg:width="25" dlg:height="14" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_OPTONEXISTINGRELATION" dlg:value="->"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormMoveSelected?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdMoveAll" dlg:tab-index="7" dlg:left="122" dlg:top="101" dlg:width="25" dlg:height="14" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_OPTSELECTMANUALLY" dlg:value="=>>"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormMoveAll?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdRemoveSelected" dlg:tab-index="8" dlg:left="122" dlg:top="118" dlg:width="25" dlg:height="14" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_lstRELATIONS" dlg:value="<-"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormRemoveSelected?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdRemoveAll" dlg:tab-index="9" dlg:left="122" dlg:top="135" dlg:width="25" dlg:height="14" dlg:page="1" dlg:help-url="HID:34425" dlg:value="<<="> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormRemoveAll?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:radiogroup> + <dlg:radio dlg:id="optIgnoreBinaries" dlg:tab-index="14" dlg:left="122" dlg:top="169" dlg:width="104" dlg:height="10" dlg:page="1" dlg:help-url="HID:34427" dlg:value="optIgnoreBinaries" dlg:checked="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.DBMeta.AddOrRemoveBinaryFieldsToWidthList?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optBinariesasGraphics" dlg:tab-index="13" dlg:left="12" dlg:top="169" dlg:width="104" dlg:height="10" dlg:page="1" dlg:help-url="HID:34426" dlg:value="optBinariesasGraphics"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.DBMeta.AddOrRemoveBinaryFieldsToWidthList?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:menulist dlg:id="lstFields" dlg:tab-index="5" dlg:left="6" dlg:top="81" dlg:width="110" dlg:height="70" dlg:page="1" dlg:help-url="HID:34420" dlg:multiselection="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormMoveSelected?language=Basic&location=application" script:language="Script"/> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormSetMoveRights?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:menulist dlg:id="lstSelFields" dlg:tab-index="11" dlg:left="154" dlg:top="81" dlg:width="110" dlg:height="70" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_CHKCREATESUBFORM" dlg:multiselection="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormRemoveSelected?language=Basic&location=application" script:language="Script"/> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Tools.Listbox.FormSetMoveRights?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:text dlg:id="lblStyles" dlg:tab-index="25" dlg:left="150" dlg:top="39" dlg:width="114" dlg:height="8" dlg:page="2" dlg:value="lblStyles"/> + <dlg:button dlg:id="cmdArrange1" dlg:tab-index="16" dlg:left="12" dlg:top="50" dlg:width="23" dlg:height="25" dlg:page="2" dlg:tag="1" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_LBTABLES"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeArrangemode?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdArrange2" dlg:tab-index="17" dlg:left="39" dlg:top="50" dlg:width="23" dlg:height="25" dlg:page="2" dlg:tag="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_FIELDSAVAILABLE"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeArrangemode?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdArrange3" dlg:tab-index="18" dlg:left="66" dlg:top="50" dlg:width="23" dlg:height="25" dlg:page="2" dlg:tag="3" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVESELECTED"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeArrangemode?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdArrange4" dlg:tab-index="19" dlg:left="93" dlg:top="50" dlg:width="23" dlg:height="25" dlg:page="2" dlg:tag="4" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEALL"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeArrangemode?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdArrange5" dlg:tab-index="20" dlg:left="120" dlg:top="50" dlg:width="23" dlg:height="25" dlg:page="2" dlg:tag="5" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_CMDREMOVESELECTED"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeArrangemode?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:menulist dlg:id="lstStyles" dlg:tab-index="26" dlg:left="150" dlg:top="50" dlg:width="114" dlg:height="86" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK2"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:FormWizard.tools.ImportStyles?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + <dlg:radiogroup> + <dlg:radio dlg:id="optBorder0" dlg:tab-index="22" dlg:left="12" dlg:top="95" dlg:width="131" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEUP" dlg:value="optBorder0"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeBorderLayouts?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optBorder1" dlg:tab-index="23" dlg:left="12" dlg:top="109" dlg:width="131" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_SUB_CMDMOVEDOWN" dlg:value="optBorder1"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeBorderLayouts?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optBorder2" dlg:tab-index="24" dlg:left="12" dlg:top="123" dlg:width="131" dlg:height="10" dlg:page="2" dlg:help-url="HID:34440" dlg:value="optBorder2"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeBorderLayouts?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:fixedline dlg:id="hlnBinaries" dlg:tab-index="12" dlg:left="6" dlg:top="158" dlg:width="258" dlg:height="8" dlg:page="1" dlg:value="hlnBinaries"/> + <dlg:fixedline dlg:id="hlnBackground" dlg:tab-index="30" dlg:left="150" dlg:top="143" dlg:width="114" dlg:height="8" dlg:page="2" dlg:value="hlnBackground"/> + <dlg:fixedline dlg:id="hlnAlign" dlg:tab-index="27" dlg:left="6" dlg:top="143" dlg:width="137" dlg:height="8" dlg:page="2" dlg:value="hlnAlign"/> + <dlg:fixedline dlg:id="hlnBorderLayout" dlg:tab-index="21" dlg:left="6" dlg:top="83" dlg:width="137" dlg:height="8" dlg:page="2" dlg:value="hlnBorderLayout"/> + <dlg:fixedline dlg:id="hlnArrangements" dlg:tab-index="15" dlg:left="6" dlg:top="39" dlg:width="137" dlg:height="8" dlg:page="2" dlg:value="hlnArrangements"/> + <dlg:radiogroup> + <dlg:radio dlg:id="optAlign0" dlg:tab-index="28" dlg:left="12" dlg:top="154" dlg:width="131" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_LINKER_LSTSLAVELINK1" dlg:value="optAlign0"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeLabelAlignments?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="optAlign2" dlg:tab-index="29" dlg:left="12" dlg:top="168" dlg:width="131" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGFORM_LINKER_LSTMASTERLINK1" dlg:value="optAlign2"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:FormWizard.Layouter.ChangeLabelAlignments?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:fixedline dlg:id="FixedLine1" dlg:tab-index="0" dlg:left="6" dlg:top="180" dlg:width="258" dlg:height="6"/> + </dlg:bulletinboard> +</dlg:window> diff --git a/wizards/source/formwizard/FormWizard.xba b/wizards/source/formwizard/FormWizard.xba new file mode 100644 index 000000000..68a80ff88 --- /dev/null +++ b/wizards/source/formwizard/FormWizard.xba @@ -0,0 +1,440 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="FormWizard" script:language="StarBasic">Option Explicit + +Public DocumentName as String +Public FormPath as String +Public WizardPath as String +Public WorkPath as String +Public TempPath as String +Public TexturePath as String +Public sQueryName as String +Public oDBConnection as Object +Public bWithBackGraphic as Boolean +Public bNeedFieldRefresh as Boolean +Public oDBForm as Object +Public oColumns() as Object +Public sDatabaseList() as String +Public TableNames() as String +Public QueryNames() as String +Public FieldNames() as String +Public ImgFieldNames() as String +Public oDBContext as Object +Public oUcb as Object +Public oDocInfo as Object +Public WidthList(15,3) +Public ImgWidthList(3,3) +Public sDBName as String +Public Tablename as String +Public Const SBSIZETEXT = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog." +Public bDisposeDoc as Boolean +Public bDebug as Boolean +'Public bStartUp as Boolean +Public bConnectionIsovergiven as Boolean +Public FormName As String +Public sFormUrl as String +Public oFormDocuments + + +' The macro can be called in 4 possible scenarios: +' Scenario 1. No parameters at given +' Scenario 2: Only Datasourcename is given, but no connection and no Content +' Scenario 3: a data source and a connection are given +' Scenario 4: all parameters (data source name, connection, object type and object) are given + +Sub Main() +Dim oLocDBContext as Object +Dim oLocConnection as Object + +' Scenario 1. No parameters at given + MainWithDefault() + +' Scenario 2: Only Datasourcename is given, but no connection and no Content +' MainWithDefault("Bibliography") + +' Scenario 3: a data source and a connection are given +' oLocDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") +' oLocConnection = oLocDBContext.GetByName("Bibliography").GetConnection("","") +' MainWithDefault("Bibliography", oLocConnection) + +' Scenario 4: all parameters (data source name, connection, object type and object) are given +' oLocDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") +' oLocConnection = oLocDBContext.GetByName("Bibliography").GetConnection("","") +' MainWithDefault("Bibliography", oLocConnection, com.sun.star.sdb.CommandType.TABLE, "biblio") +End Sub + + +Sub MainWithDefault(Optional DatasourceName as String, Optional oConnection as Object, Optional CommandType as Integer, Optional sContent as String) +Dim i as Integer +Dim SelCount as Integer +Dim RetValue as Integer +Dim SelList(0) as Integer +Dim LocList() as String + SelList(0) = 0 + BasicLibraries.LoadLibrary("Tools") + bDebug = False + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + OpenFormDocument() + CurArrangement = 0 + bControlsareCreated = False + bEnableBinaryOptionGroup = False + bDisposeDoc = True + MaxIndex = -1 + If Not InitResources("Formwizard") Then + Exit Sub + End If + oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + If GetFormWizardPaths() = False Then + Exit Sub + End If + oDocument.GetCurrentController().Frame.ComponentWindow.Enable = False + oProgressBar.Value = 10 + LoadLanguage() + oProgressBar.Value = 20 + InitializeWidthList() + oProgressBar.Value = 30 + Styles() = getListBoxArrays(oUcb, "/stl") + CurIndex = GetCurIndex(DialogModel, Styles(), 2) + oProgressBar.Value = 40 + ConfigurePageStyle() + oProgressBar.Value = 50 + InitializeLabelValues() + bNeedFieldRefresh = True + SetDialogLanguage() +' bStartUp = true + With DialogModel + .cmdBack.Enabled = False + .cmdGoOn.Enabled = False + .lblTables.Enabled = False + .lstSelFields.Tag = False + .Step = 1 + End With + oProgressBar.Value = 60 + bConnectionIsovergiven = Not IsMissing(oConnection) + If Not IsMissing(DataSourceName) Then + sDBName = DataSourceName + If Not IsMissing(oConnection) Then + ' Scenario 3: a data source and a connection are given + Set oDBConnection = oConnection + oDataSource = oDBContext.GetByName(DataSourceName) + DialogModel.lstTables.Enabled = True + DialogModel.lblTables.Enabled = True + If GetDBMetaData() Then + LocList() = AddListToList(TableNames(), QueryNames()) + iCommandTypes = CreateCommandTypeList() + If Not IsMissing(sContent) Then + ' Scenario 4: all parameters (data source name, connection, object type and object) are given + DialogModel.lstTables.StringItemList() = LocList() + iCommandTypes() = CreateCommandTypeList() + SelCount = CountItemsInArray(DialogModel.lstTables.StringItemList(), sContent) + If SelCount = 1 Then + DlgFormDB.GetControl("lstTables").SelectItem(sContent, True) + Else + If CommandType = com.sun.star.sdb.CommandType.QUERY Then + SelIndex = IndexInArray(sContent, QueryNames()) + DlgFormDB.GetControl("lstTables").SelectItemPos(SelIndex, True) + ElseIf CommandType = com.sun.star.sdb.CommandType.TABLE Then + SelIndex = IndexInArray(sContent, TableNames()) + DlgFormDB.GetControl("lstTables").SelectItemPos(Ubound(QueryNames()+1 + SelIndex, True)) + End If + End If + CurCommandType = CommandType + FillUpFieldsListbox(False) + Else + LocList() = AddListToList(Array(sSelectDBTable), LocList()) + DialogModel.lstTables.StringItemList() = LocList() +' bSelectContent = True + DialogModel.lstTables.SelectedItems() = Array(0) + + End If + End If + Else + ' Scenario 2: Only Datasourcename is given, but no connection and no Content + GetSelectedDBMetaData(sDBName) + End If + Else + ' Scenario 1: No parameters are given + ToggleListboxControls(DialogModel, False) + End If + oProgressBar.Value = 80 + bWithBackGraphic = LoadNewStyles(oDocument, DialogModel, CurIndex, Styles(CurIndex, 8), Styles(), TexturePath) + DlgFormDB.Title = WizardTitle(1) + DialogModel.lstStyles.StringItemList() = ArrayfromMultiArray(Styles, 1) + DialogModel.lstStyles.SelectedItems() = SelList() + ControlCaptionsToStandardLayout() + oDocument.GetCurrentController().Frame.ComponentWindow.Enable = True + oProgressBar.Value = 90 + DialogModel.imgTheme.ImageURL = FormPath & "FormWizard_1.png" + DialogModel.imgTheme.BackGroundColor = RGB(0,60,126) + ToggleDatabasePage(True) + oProgressBar.Value = 100 + DlgFormDB.GetControl("lstTables").SetFocus() + oProgressbar.End + RetValue = DlgFormDB.Execute() + DlgFormDB.Dispose() + If bDisposeDoc Then + Dim aPropertyValues(2) as new com.sun.star.beans.PropertyValue + oFormDocuments = oDataSource.getFormDocuments() + DlgFormDB.Dispose() + oDocument.dispose() + Dim bLinkExists as Boolean + i = 1 + Dim FormBaseName as String + FormBaseName = FormName + Do + bLinkExists = oFormDocuments.HasbyHierarchicalName(FormName) + If bLinkExists Then + i = i + 1 + FormName = FormBaseName & "_" & i + End If + Loop Until Not bLinkExists + aPropertyValues(0).Name = "Name" + aPropertyValues(0).Value = FormName + aPropertyValues(1).Name = "Parent" + aPropertyValues(1).Value = oFormDocuments() + aPropertyValues(2).Name = "URL" + aPropertyValues(2).Value = sFormUrl + Dim oDBDocument + oDBDocument = oFormDocuments.createInstanceWithArguments("com.sun.star.sdb.DocumentDefinition", aPropertyValues()) + oFormDocuments.insertbyName(FormName, oDBDocument) + ElseIf RetValue = 0 Then + RemoveNirwanaShapes() + End If + If ((Not IsNull(oDBConnection)) And (Not bConnectionIsovergiven)) Then + oDBConnection.Dispose() + End If +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + +Sub FormGetFields() +Dim i as Integer +' If bSelectContent Then +' bSelectContent = False +' Exit Sub +' End If + DeleteFirstListBoxEntry("lstTables", sSelectDBTable) + ToggleDatabasePage(False) + FillUpFieldsListbox(True) + ToggleDatabasePage(True) +End Sub + + +Sub FillUpFieldsListbox(bGetCommandType as Boolean) +Dim SelIndex as Integer +Dim QueryIndex as Integer + If Not bDebug Then + On Local Error GoTo NOFIELDS + End If + SelIndex = DlgFormDB.GetControl("lstTables").getSelectedItemPos() '.SelectedItems()) + If SelIndex > -1 Then + If bGetCommandType Then + CurCommandType = iCommandTypes(SelIndex) + End If + If CurCommandType = com.sun.star.sdb.CommandType.QUERY Then + QueryIndex = SelIndex - Ubound(Tablenames()) - 1 + Tablename = QueryNames(QueryIndex) + oColumns = oDBConnection.Queries.GetByName(TableName).Columns + Else + Tablename = Tablenames(SelIndex) + oColumns = oDBConnection.Tables.GetByName(Tablename).Columns + End If + If GetSpecificFieldNames() <> -1 Then + ToggleListboxControls(DialogModel, True) + Exit Sub + End If + End If + EmptyFieldsListboxes() +NOFIELDS: + If Err <> 0 Then + MsgBox sMsgErrCouldNotOpenObject, 16, sMsgWizardName + End If +End Sub + + +Sub PreviousStep() + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + With DialogModel + .Step = 1 + .cmdBack.Enabled = False + .cmdGoOn.Enabled = True + .lstSelFields.Tag = Not bControlsareCreated + .cmdGoOn.Label = sGoOn + .imgTheme.ImageUrl = FormPath & "FormWizard_1.png" + End With + FormSetMoveRights() +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + +Sub NextStep() + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + Select Case DialogModel.Step + Case 1 + bControlsAreCreated = Not (cBool(DialogModel.lstSelFields.Tag)) + If Not bControlsAreCreated Then + GetTableMetaData() + CreateDBForm() + RemoveShapes() + InitializeLayoutSettings() + oDBForm.Load + End If + DialogModel.cmdGoOn.Label = sReady + DialogModel.cmdBack.Enabled = True + DialogModel.Step = 2 + bDisposeDoc = False + Case 2 + StoreForm() + DlgFormDB.EndExecute() + exit Sub + End Select + DialogModel.imgTheme.ImageUrl = FormPath & "FormWizard_" & DialogModel.Step & ".png" + DlgFormDB.Title = WizardTitle(DialogModel.Step) +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + +Sub InitializeLayoutSettings() + SwitchArrangementButtons(cTabled) + SwitchAlignMode(SBALIGNLEFT) + SwitchBorderMode(SB3DBORDER) + ToggleBorderGroup(bControlsAreCreated) + ToggleAlignGroup(bControlsAreCreated) + ArrangeControls() + If OldAlignMode <> 0 Then + DlgFormDB.GetControl("optAlign2").Model.State = 0 + End If +End Sub + + +Sub ToggleDatabasePage(bDoEnable as Boolean) + With DialogModel + .cmdBack.Enabled = False + .cmdHelp.Enabled = bDoEnable + .cmdGoOn.Enabled = Ubound(DialogModel.lstSelFields.StringItemList()) <> -1 + .hlnBinaries.Enabled = ((bDoEnable = True) And (bEnableBinaryOptionGroup = True)) + .optIgnoreBinaries.Enabled = ((bDoEnable = True) And (bEnableBinaryOptionGroup = True)) + .optBinariesasGraphics.Enabled = ((bDoEnable = True) And (bEnableBinaryOptionGroup = True)) + End With +End Sub + + +' This Sub is called from the Procedure "StoreDocument" in the "Tools" Library +Sub CommitLastDocumentChanges(sTargetPath as String) +Dim i as Integer +Dim sBookmarkName as String +Dim oDBBookmarks as Object +Dim bLinkExists as Boolean +Dim sBaseBookmarkName as String + sBookmarkName = GetFileNamewithoutExtension(FileNameoutofPath(sTargetPath)) + sBaseBookmarkName = sBookmarkName + oDBBookmarks = oDataSource.GetBookmarks() + i = 1 + Do + bLinkExists = oDBBookmarks.HasbyName(sBookmarkName) + If bLinkExists Then + i = i + 1 + sBookmarkName = sBaseBookmarkName & "_" & i + Else + oDBBookmarks.insertByName(sBookmarkName, sTargetPath) + End If + Loop Until Not bLinkExists + bDisposeDoc = False + GroupShapesTogether() + ToggleDesignMode(oDocument) + oDBForm.Reload() +End Sub + + +Sub StoreFormInDatabase() + Dim NoArgs() as new com.sun.star.beans.PropertyValue + FormName = "Form_" & sDBName & "_" & TableName & ".sxw" + sFormUrl = TempPath & "/" & FormName + oDocument.StoreAsUrl(sFormUrl, NoArgs()) + bdisposeDoc = true + DlgFormDB.Endexecute() +End Sub + + +Sub StoreForm() +Dim sTargetPath as String +Dim TypeNames(0,2) as String +Dim oMasterKey as Object +Dim oTypes() as Object + oMasterKey = GetRegistryKeyContent("org.openoffice.TypeDetection.Types/") + oTypes() = oMasterKey.Types + TypeNames(0,0) = GetFilterName("StarOffice XML (Writer)") + TypeNames(0,1) = "*.sxw" + TypeNames(0,2) = "" + StoreFormInDatabase() +' sTargetPath = StoreDocument(oDocument, TypeNames(), "Form_" & sDBName & "_" & TableName & ".sxw", WorkPath, 1) +End Sub + + +Sub EmptyFieldsListboxes() +Dim NullList() as String + ToggleListboxControls(DialogModel, False) + DialogModel.lstFields.StringItemList() = NullList() + DialogModel.lstSelFields.StringItemList() = NullList() + bEnableBinaryOptionGroup = False +End Sub + + +Sub DeleteFirstTableListBoxEntry() + DeleteFirstListBoxEntry("lstTables", sSelectDBTable) +End Sub + +Sub DeleteFirstListboxEntry(ListBoxName as String, DelEntryName as String) +Dim oListbox as Object +Dim sFirstItem as String +dim iSelPos as Integer + oListBox = DlgFormDB.getControl(ListBoxName) + sFirstItem = oListBox.getItem(0) + If sFirstItem = DelEntryName Then + iSelPos = oListBox.getSelectedItemPos() + oListBox.removeItems(0, 1) + If iSelPos > 0 Then + oListBox.selectItemPos(iSelPos-1, True) + End If + End If +End Sub +</script:module> diff --git a/wizards/source/formwizard/Language.xba b/wizards/source/formwizard/Language.xba new file mode 100644 index 000000000..6346f8bae --- /dev/null +++ b/wizards/source/formwizard/Language.xba @@ -0,0 +1,297 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Language" script:language="StarBasic">Option Explicit + + +Public Const SBCANCEL = 2 +Public Const SBREPEAT = 4 +Public LabelDiffHeight as Long +Public BasicLabelDiffHeight as Long + +Public WizardTitle(1 To 3) as String +Public DlgFormDB as Object +Public DialogModel as Object + +Dim sMsgWizardName as String +Dim sMsgErrMsg as String +Dim sMsgErrNoDatabase as String +Dim sMsgErrNoTableInDatabase as String +Dim sMsgErrTitleSuggestedExist as String +Dim sMsgErrTitleSyntaxError as String +Dim sMsgErrTitleAsTableExist as String +Dim sMsgProgressText as String +Dim sMsgCreatedForm as String +Dim sMsgErrCouldNotOpenObject as String +Dim sMsgErrNameToLong as String +Dim sTimeAppendix as String +Dim sDateAppendix as String +Public sGoOn as String +Public sReady as String +Public sMsgNoConnection as String +Public XPixelFactor as Long +Public YPixelFactor as Long +Public sSelectDatasource as String +Public sSelectDBTable as String + + + +Sub LoadLanguage () + sMsgWizardName = GetResText("RID_FORM_0") + sMsgErrMsg = GetResText("RID_DB_COMMON_6") + sMsgErrNoDatabase = GetResText("RID_DB_COMMON_8") + sMsgErrNoTableInDatabase = GetResText("RID_DB_COMMON_9") + sMsgErrTitleSuggestedExist = GetResText("RID_DB_COMMON_10") + sMsgErrTitleAsTableExist = GetResText("RID_DB_COMMON_10") + sMsgErrTitleSyntaxError = GetResText("RID_DB_COMMON_11") + sMsgNoConnection = GetResText("RID_DB_COMMON_14") + sMsgProgressText = GetResText("RID_FORM_2") + sMsgCreatedForm = GetResText("RID_FORM_26") + sMsgErrNameToLong = GetResText("RID_FORM_27") + sMsgErrCouldNotOpenObject = GetResText("RID_DB_COMMON_13") + + ' Internal Logic + sDateAppendix = GetResText("RID_FORM_4") + sTimeAppendix = GetResText("RID_FORM_5") + + sReady = GetResText("RID_DB_COMMON_0") +End Sub + + +Sub SetDialogLanguage () +Dim i as Integer +Dim ButtonHelpText as String +Dim CmdButton as Object +Dim IDArray as Variant +Dim FNameAddOn as String +Dim slblSelFields as String +Dim slblFields as String + + DlgFormDB = LoadDialog("FormWizard", "DlgFormDB") + DialogModel = DlgFormDB.Model + + With DialogModel + .cmdCancel.Label = GetResText("RID_DB_COMMON_1") + .cmdBack.Label = GetResText("RID_DB_COMMON_2") + .cmdHelp.Label = GetResText("RID_DB_COMMON_20") + sGoOn = GetResText("RID_DB_COMMON_3") + .cmdGoOn.Label = sGoOn + .lblTables.Label = GetResText("RID_FORM_6") + + slblFields = GetResText("RID_FORM_12") + slblSelFields = GetResText("RID_FORM_13") + .lblFields.Label = slblFields + .lblSelFields.Label = slblSelFields + + .lblStyles.Label = GetResText("RID_FORM_21") + .hlnBorderLayout.Label = GetResText("RID_FORM_28") + .hlnAlign.Label = GetResText("RID_FORM_32") + .hlnArrangements.Label = GetResText("RID_FORM_35") + + WizardTitle(1) = sMsgWizardName & " - " & GetResText("RID_FORM_45") + WizardTitle(2) = sMsgWizardName & " - " & GetResText("RID_FORM_46") + WizardTitle(3) = sMsgWizardName & " - " & GetResText("RID_FORM_47") + + .hlnBinaries.Label = GetResText("RID_FORM_50") + .optIgnoreBinaries.Label = GetResText("RID_FORM_51") + .optBinariesasGraphics.Label = GetResText("RID_FORM_52") + + .hlnBackground.Label = GetResText("RID_FORM_55") + .optTiled.Label = GetResText("RID_FORM_56") + .optArea.Label = GetResText("RID_FORM_57") + + .optBorder0.Label = GetResText("RID_FORM_29") + .optBorder1.Label = GetResText("RID_FORM_30") + .optBorder2.Label = GetResText("RID_FORM_31") + .optBorder1.State = 1 + + .optAlign0.Label = GetResText("RID_FORM_33") + .optAlign2.Label = GetResText("RID_FORM_34") + .optAlign0.State = 1 + + REM//FIXME: Remove this unused FNameAddOn through the file + FNameAddOn = "" + + IDArray = Array("RID_FORM_36", "RID_FORM_37", "RID_FORM_40", "RID_FORM_38", "RID_FORM_39") + For i = 1 To 5 + ButtonHelpText = GetResText(IDArray(i-1)) + cmdButton = DlgFormDB.getControl("cmdArrange" & i) + cmdButton.Model.ImageURL = FormPath & "Arrange_" & i & FNameAddOn & ".gif" + cmdButton.Model.HelpText = ButtonHelpText + cmdButton.getPeer().setProperty("AccessibleName", ButtonHelpText) + Next i +' .cmdArrange1.ImageURL = FormPath & "Arrange_1" & FNameAddOn & ".gif" +' .cmdArrange1.HelpText = GetResText("RID_FORM_36") +' +' .cmdArrange2.ImageURL = FormPath & "Arrange_2" & FNameAddOn & ".gif" +' .cmdArrange2.HelpText = GetResText("RID_FORM_37") +' +' .cmdArrange3.ImageURL = FormPath & "Arrange_3" & FNameAddOn & ".gif" +' .cmdArrange3.HelpText = GetResText("RID_FORM_40") +' +' .cmdArrange4.ImageURL = FormPath & "Arrange_4" & FNameAddOn & ".gif" +' .cmdArrange4.HelpText = GetResText("RID_FORM_38") +' +' .cmdArrange5.ImageURL = FormPath & "Arrange_5" & FNameAddOn & ".gif" +' .cmdArrange5.HelpText = GetResText("RID_FORM_39") + End With + DlgFormDB.GetControl("cmdMoveSelected").getPeer().setProperty("AccessibleName", GetResText("RID_DB_COMMON_39")) + DlgFormDB.GetControl("cmdRemoveSelected").getPeer().setProperty("AccessibleName", GetResText("RID_DB_COMMON_40")) + DlgFormDB.GetControl("cmdMoveAll").getPeer().setProperty("AccessibleName", GetResText("RID_DB_COMMON_41")) + DlgFormDB.GetControl("cmdRemoveAll").getPeer().setProperty("AccessibleName", GetResText("RID_DB_COMMON_42")) + DlgFormDB.getControl("lstFields").getPeer().setProperty("AccessibleName", DeleteStr(slblFields, "~")) + DlgFormDB.getControl("lstSelFields").getPeer().setProperty("AccessibleName", DeleteStr(slblSelFields, "~")) + + sSelectDatasource = GetResText("RID_DB_COMMON_37") + sSelectDBTable = GetResText("RID_DB_COMMON_38") +End Sub + + + +Sub InitializeWidthList() + + If Ubound(WidthList(),1) > 16 Then + ReDim WidthList(16,4) + End If + + WidthList(0,0) = com.sun.star.sdbc.DataType.BIT ' = -7; + WidthList(0,1) = cCheckbox + WidthList(0,2) = False + WidthList(0,3) = "CheckBox" + + WidthList(1,0) = com.sun.star.sdbc.DataType.TINYINT ' = -6; + WidthList(1,1) = cNumericBox + WidthList(1,2) = False + WidthList(1,3) = "FormattedField" + + WidthList(2,0) = com.sun.star.sdbc.DataType.SMALLINT ' = 5; + WidthList(2,1) = cNumericBox + WidthList(2,2) = False + WidthList(2,3) = "FormattedField" + + WidthList(3,0) = com.sun.star.sdbc.DataType.INTEGER ' = 4; + WidthList(3,1) = cNumericBox + WidthList(3,2) = False + WidthList(3,3) = "FormattedField" + + WidthList(4,0) = com.sun.star.sdbc.DataType.BIGINT ' = -5; + WidthList(4,1) = cNumericBox + WidthList(4,2) = False + WidthList(4,3) = "FormattedField" + + WidthList(5,0) = com.sun.star.sdbc.DataType.FLOAT ' = 6; + WidthList(5,1) = cNumericBox + WidthList(5,2) = False + WidthList(5,3) = "FormattedField" + + WidthList(6,0) = com.sun.star.sdbc.DataType.REAL ' = 7; + WidthList(6,1) = cNumericBox + WidthList(6,2) = False + WidthList(6,3) = "FormattedField" + + WidthList(7,0) = com.sun.star.sdbc.DataType.DOUBLE ' = 8; + WidthList(7,1) = cNumericBox + WidthList(7,2) = False + WidthList(7,3) = "FormattedField" + + WidthList(8,0) = com.sun.star.sdbc.DataType.NUMERIC ' = 2; + WidthList(8,1) = cNumericBox + WidthList(8,2) = False + WidthList(8,3) = "FormattedField" + + WidthList(9,0) = com.sun.star.sdbc.DataType.DECIMAL ' = 3; (including decimal places) + WidthList(9,1) = cNumericBox + WidthList(9,2) = False + WidthList(9,3) = "FormattedField" + + WidthList(10,0) = com.sun.star.sdbc.DataType.CHAR ' = 1; + WidthList(10,1) = cTextBox + WidthList(10,2) = False + WidthList(10,3) = "TextField" + + WidthList(11,0) = com.sun.star.sdbc.DataType.VARCHAR ' = 12; + WidthList(11,1) = cTextBox + WidthList(11,2) = True + WidthList(11,3) = "TextField" + + WidthList(12,0) = com.sun.star.sdbc.DataType.LONGVARCHAR ' = -1; + WidthList(12,1) = cTextBox + WidthList(12,2) = True + WidthList(12,3) = "TextField" + + WidthList(13,0) = com.sun.star.sdbc.DataType.DATE ' = 91; + WidthList(13,1) = cDateBox + WidthList(13,2) = False + WidthList(13,3) = "DateField" + + WidthList(14,0) = com.sun.star.sdbc.DataType.TIME ' = 92; + WidthList(14,1) = cTimeBox + WidthList(14,2) = False + WidthList(14,3) = "TimeField" + + WidthList(15,0) = com.sun.star.sdbc.DataType.TIMESTAMP ' = 93; + WidthList(15,1) = cDateBox + WidthList(15,2) = False + WidthList(15,3) = "DateField" + + WidthList(16,0) = com.sun.star.sdbc.DataType.BOOLEAN ' = 16; + WidthList(16,1) = cCheckbox + WidthList(16,2) = False + WidthList(16,3) = "CheckBox" + + ImgWidthList(0,0) = com.sun.star.sdbc.DataType.BINARY ' = -2; + ImgWidthList(0,1) = cImageControl + ImgWidthList(0,2) = False + ImgWidthList(0,3) = "ImageControl" + + ImgWidthList(1,0) = com.sun.star.sdbc.DataType.VARBINARY ' = -3; + ImgWidthList(1,1) = cImageControl + ImgWidthList(1,2) = False + ImgWidthList(1,3) = "ImageControl" + + ImgWidthList(2,0) = com.sun.star.sdbc.DataType.LONGVARBINARY ' = -4; + ImgWidthList(2,1) = cImageControl + ImgWidthList(2,2) = False + ImgWidthList(2,3) = "ImageControl" + + ImgWidthList(3,0) = com.sun.star.sdbc.DataType.BLOB ' = 2004; + ImgWidthList(3,1) = cImageControl + ImgWidthList(3,2) = False + ImgWidthList(3,3) = "ImageControl" + +' Note: the following Fieldtypes are ignored +'ExcludeList(0) = com.sun.star.sdbc.DataType.SQLNULL +'ExcludeList(1) = com.sun.star.sdbc.DataType.OTHER +'ExcludeList(2) = com.sun.star.sdbc.DataType.OBJECT +'ExcludeList(3) = com.sun.star.sdbc.DataType.DISTINCT +'ExcludeList(4) = com.sun.star.sdbc.DataType.STRUCT +'ExcludeList(5) = com.sun.star.sdbc.DataType.ARRAY +'ExcludeList(6) = com.sun.star.sdbc.DataType.CLOB +'ExcludeList(7) = com.sun.star.sdbc.DataType.REF + + oModelService(cLabel) = "com.sun.star.form.component.FixedText" + oModelService(cTextBox) = "com.sun.star.form.component.TextField" + oModelService(cCheckBox) = "com.sun.star.form.component.CheckBox" + oModelService(cDateBox) = "com.sun.star.form.component.DateField" + oModelService(cTimeBox) = "com.sun.star.form.component.TimeField" + oModelService(cNumericBox) = "com.sun.star.form.component.FormattedField" + oModelService(cGridControl) = "com.sun.star.form.component.GridControl" + oModelService(cImageControl) = "com.sun.star.form.component.DatabaseImageControl" +End Sub +</script:module> diff --git a/wizards/source/formwizard/Layouter.xba b/wizards/source/formwizard/Layouter.xba new file mode 100644 index 000000000..24b209ad6 --- /dev/null +++ b/wizards/source/formwizard/Layouter.xba @@ -0,0 +1,397 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Layouter" script:language="StarBasic">Option Explicit + +Public oProgressbar as Object +Public ProgressValue as Integer +Public oDocument as Object +Public oController as Object +Public oForm as Object +Public oDrawPage as Object +Public oPageStyle as Object + +Public nMaxColRightX as Long +Public nMaxTCWidth as Long +Public nMaxRowRightX as Long +Public nMaxRowY as Long +Public nSecMaxRowY as Long +Public MaxIndex as Integer +Public CurIndex as Integer + +Public Const cVertDistance = 200 +Public Const cHoriDistance = 300 + +Public nPageWidth as Long +Public nPageHeight as Long +Public nFormWidth as Long +Public nFormHeight as Long +Public nMaxHoriPos as Long +Public nMaxVertPos as Long + +Public CONST SBALIGNLEFT = 0 +Public CONST SBALIGNRIGHT = 2 + +Public Const SBNOBORDER = 0 +Public Const SB3DBORDER = 1 +Public Const SBSIMPLEBORDER = 2 + +Public CurArrangement as Integer +Public CurBorderType as Integer +Public CurAlignmode as Integer + +Public OldAlignMode as Integer +Public OldBorderType as Integer +Public OldArrangement as Integer + +Public Const cColumnarLeft = 1 +Public Const cColumnarTop = 2 +Public Const cTabled = 3 +Public Const cLeftJustified = 4 +Public Const cTopJustified = 5 + +Public Const cXOffset = 1000 +Public Const cYOffset = 700 +' This is the viewed space that we lose because of the symbol bars +Public Const cSymbolMargin = 2000 +Public Const MaxFieldIndex = 200 + +Public Const cControlCollectionCount = 9 +Public Const cLabel = 1 +Public Const cTextBox = 2 +Public Const cCheckBox = 3 +Public Const cDateBox = 4 +Public Const cTimeBox = 5 +Public Const cNumericBox = 6 +Public Const cCurrencyBox = 7 +Public Const cGridControl = 8 +Public Const cImageControl = 9 + +Public Styles(100, 8) as String + +Public CurControlType as Integer +Public CurFieldlength as Double +Public CurFieldType as Integer +Public CurFieldName as String +Public CurControlName as String +Public CurFormatKey as Long +Public CurDefaultValue +Public CurIsCurrency as Boolean +Public CurScale as Integer +Public CurHelpText as String + +Public FieldMetaValues(MaxFieldIndex, 8) +' Description of this List: +' CurFieldType = FieldMetaValues(Index,0) +' CurFieldLength = FieldMetaValues(Index,1) +' CurControlType = FieldMetaValues(Index,2) (ControlType, e.g., cLabel, cTextbox, etc.) +' CurControlName = FieldMetaValues(Index,3) +' CurFormatKey = FieldMetaValues(Index,4) +' CurDefaultValue = FieldMetaValues(Index,5) +' CurIsCurrency = FieldMetaValues(Index,6) +' CurScale = FieldMetaValues(Index,7) +' CurHelpText = FieldMetaValues(Index,8) + +Public FieldNames(MaxFieldIndex) as string +Public oModelService(cControlCollectionCount) as String +Public oGridModel as Object + + +Function InsertControl(oContainer as Object, oControlObject as object, aPoint as Object, aSize as Object) +Dim oShape as object + oShape = oDocument.CreateInstance ("com.sun.star.drawing.ControlShape") + oShape.Size = aSize + oShape.Position = aPoint + oShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH + oShape.control = oControlObject + oContainer.Add(oShape) + InsertControl() = oShape +End Function + + +Function ArrangeControls() +Dim oShape as Object +Dim i as Integer + oProgressbar = oDocument.GetCurrentController.GetFrame.CreateStatusIndicator + oProgressbar.Start("", MaxIndex) + If oDBForm.HasbyName("Grid1") Then + RemoveShapes() + End If + ToggleLayoutPage(False) + Select Case CurArrangement + Case cTabled + PositionGridControl(MaxIndex) + Case Else + PositionControls(MaxIndex) + End Select + ToggleLayoutPage(True) + oProgressbar.End +End Function + + +Sub OpenFormDocument() +Dim NoArgs() as new com.sun.star.beans.PropertyValue +Dim oViewSettings as Object + oDocument = CreateNewDocument("swriter") + oProgressbar = oDocument.GetCurrentController.GetFrame.CreateStatusIndicator() + oProgressbar.Start("", 100) + oDocument.ApplyFormDesignMode = False + oController = oDocument.GetCurrentController + oViewSettings = oDocument.CurrentController.ViewSettings + oViewSettings.ShowTableBoundaries = False + oViewSettings.ShowOnlineLayout = True + oDrawPage = oDocument.DrawPage + oPageStyle = oDocument.StyleFamilies.GetByName("PageStyles").GetByName("Standard") +End Sub + + +Sub InitializeLabelValues() +Dim oLabelModel as Object +Dim oTBModel as Object +Dim oLabelShape as Object +Dim oTBShape as Object +Dim aTBSize As New com.sun.star.awt.Size +Dim aLabelSize As New com.sun.star.awt.Size +Dim aPoint As New com.sun.star.awt.Point +Dim aSize As New com.sun.star.awt.Size +Dim oLocControl as Object +Dim oLocPeer as Object + oLabelModel = CreateUnoService("com.sun.star.form.component.FixedText") + oTBModel = CreateUnoService("com.sun.star.form.component.TextField") + + Set oLabelShape = InsertControl(oDrawPage, oLabelModel, aPoint, aLabelSize) + Set oTBShape = InsertControl(oDrawPage, oTBModel, aPoint, aSize) + + oLocPeer = oController.GetControl(oLabelModel).Peer + XPixelFactor = 100000/oLocPeer.GetInfo.PixelPerMeterX + YPixelFactor = 100000/oLocPeer.GetInfo.PixelPerMeterY + aLabelSize = GetPeerSize(oLabelModel, oLocControl, "The quick brown fox...") + nTCHeight = (aLabelSize.Height+1) * YPixelFactor + aTBSize = GetPeerSize(oTBModel, oLocControl, "The quick brown fox...") + nDBRefHeight = (aTBSize.Height+1) * YPixelFactor + BasicLabelDiffHeight = Clng((nDBRefHeight - nTCHeight)/2) + oDrawPage.Remove(oLabelShape) + oDrawPage.Remove(oTBShape) +End Sub + + +Sub ConfigurePageStyle() +Dim aPageSize As New com.sun.star.awt.Size +Dim aSize As New com.sun.star.awt.Size + oPageStyle.IsLandscape = True + aPageSize = oPageStyle.Size + nPageWidth = aPageSize.Width + nPageHeight = aPageSize.Height + aSize.Width = nPageHeight + aSize.Height = nPageWidth + oPageStyle.Size = aSize + nPageWidth = nPageHeight + nPageHeight = oPageStyle.Size.Height + nFormWidth = nPageWidth - oPageStyle.RightMargin - oPageStyle.LeftMargin - 2 * cXOffset + nFormHeight = nPageHeight - oPageStyle.TopMargin - oPageStyle.BottomMargin - 2 * cYOffset - cSymbolMargin +End Sub + + +' Modify the Borders of the Controls +Sub ChangeBorderLayouts(oEvent as Object) +Dim oModel as Object +Dim i as Integer +Dim oCurModel as Object +Dim sLocText as String +Dim oGroupShape as Object +Dim s as Integer + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + oModel = oEvent.Source.Model + SwitchBorderMode(Val(Right(oModel.Name,1))) + ToggleLayoutPage(False) + If CurArrangement = cTabled Then + oGridModel.Border = CurBorderType + Else + If OldBorderType <> CurBorderType Then + For i = 0 To MaxIndex + If oDBShapeList(i).SupportsService("com.sun.star.drawing.GroupShape") Then + oGroupShape = oDBShapeList(i) + For s = 0 To oGroupShape.Count-1 + oGroupShape(s).Control.Border = CurBorderType + Next s + Else + If oDBModelList(i).PropertySetInfo.HasPropertyByName("Border") Then + oDBModelList(i).Border = CurBorderType + End If + End If + Next i + End If + End If + ToggleLayoutPage(True) +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + DlgFormDB.Dispose() + End If +End Sub + + +Sub ChangeLabelAlignments(oEvent as Object) +Dim i as Integer +Dim oSize as New com.sun.star.awt.Size +Dim oModel as Object + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + oModel = oEvent.Source.Model + SwitchAlignMode(Val(Right(oModel.Name,1))) + ToggleLayoutPage(False) + If OldAlignMode <> CurAlignMode Then + For i = 0 To MaxIndex + oTCShapeList(i).GetControl.Align = CurAlignmode + Next i + End If + If CurAlignmode = com.sun.star.awt.TextAlign.RIGHT Then + For i = 0 To Ubound(oTCShapeList()) + oSize = oTCShapeList(i).Size + oSize.Width = oDBShapeList(i).Position.X - oTCShapeList(i).Position.X - cHoriDistance + oTCShapeList(i).Size = oSize + Next i + End If + +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If + ToggleLayoutPage(True) +End Sub + + +Sub ChangeArrangemode(oEvent as Object) +Dim oModel as Object + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + oModel = oEvent.Source.Model + SwitchArrangementButtons(Val(Right(oModel.Name,1))) + oModel.State = 1 + DlgFormDB.GetControl("cmdArrange" & OldArrangement).Model.State = 0 + If CurArrangement <> OldArrangement Then + ArrangeControls() + Select Case CurArrangement + Case cTabled + ToggleBorderGroup(False) + ToggleAlignGroup(False) + Case Else ' cColumnarTop,cLeftJustified, cTopJustified + ToggleAlignGroup(CurArrangement = cColumnarLeft) + If CurArrangement = cColumnarTop Then + If CurAlignMode = com.sun.star.awt.TextAlign.RIGHT Then + DialogModel.optAlign0.State = 1 + CurAlignMode = com.sun.star.awt.TextAlign.LEFT + OldAlignMode = com.sun.star.awt.TextAlign.RIGHT + End If + End If + ControlCaptionstoStandardLayout() + oDBForm.Load + End Select + End If +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + +Sub ToggleBorderGroup(bDoEnable as Boolean) + With DialogModel + .hlnBorderLayout.Enabled = bDoEnable + .optBorder0.Enabled = bDoEnable ' 0: No border + .optBorder1.Enabled = bDoEnable ' 1: 3D border + .optBorder2.Enabled = bDoEnable ' 2: simple border + End With +End Sub + + +Sub ToggleAlignGroup(ByVal bDoEnable as Boolean) + With DialogModel + If bDoEnable Then + bDoEnable = CurArrangement = cColumnarLeft + End If + .hlnAlign.Enabled = bDoEnable + .optAlign0.Enabled = bDoEnable + .optAlign2.Enabled = bDoEnable + End With +End Sub + + +Sub ToggleLayoutPage(bDoEnable as Boolean, Optional FocusControlName as String) + DialogModel.Enabled = bDoEnable + If bDoEnable Then + If Not bDebug Then + oDocument.UnlockControllers() + End If + ToggleOptionButtons(DialogModel,(bWithBackGraphic = True)) + ToggleAlignGroup(bDoEnable) + ToggleBorderGroup(bDoEnable) + Else + If Not bDebug Then + oDocument.LockControllers() + End If + End If + If Not IsMissing(FocusControlName) Then + DlgFormDB.GetControl(FocusControlName).SetFocus() + End If +End Sub + + +Sub DestroyControlShapes(oDrawPage as Object) +Dim i as Integer +Dim oShape as Object + For i = oDrawPage.Count-1 To 0 Step -1 + oShape = oDrawPage.GetByIndex(i) + If oShape.ShapeType = "com.sun.star.drawing.ControlShape" Then + oShape.Dispose() + End If + Next i +End Sub + + +Sub SwitchArrangementButtons(ByVal LocArrangement as Integer) + OldArrangement = CurArrangement + CurArrangement = LocArrangement + If OldArrangement <> 0 Then + DlgFormDB.GetControl("cmdArrange" & OldArrangement).Model.State = 0 + End If + DlgFormDB.GetControl("cmdArrange" & CurArrangement).Model.State = 1 +End Sub + + +Sub SwitchBorderMode(ByVal LocBorderType as Integer) + OldBorderType = CurBorderType + CurBorderType = LocBorderType +End Sub + + +Sub SwitchAlignMode(ByVal LocAlignMode as Integer) + OldAlignMode = CurAlignMode + CurAlignMode = LocAlignMode +End Sub</script:module>
\ No newline at end of file diff --git a/wizards/source/formwizard/develop.xba b/wizards/source/formwizard/develop.xba new file mode 100644 index 000000000..ce5730f58 --- /dev/null +++ b/wizards/source/formwizard/develop.xba @@ -0,0 +1,550 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="develop" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit + +Public oDBShapeList() as Object +Public oTCShapeList() as Object +Public oDBModelList() as Object +Public oGroupShapeList() as Object + +Public oGridShape as Object +Public a as Integer +Public StartA as Integer +Public bIsFirstRun as Boolean +Public bIsVeryFirstRun as Boolean +Public bControlsareCreated as Boolean +Public nDBRefHeight as Long +Public nXTCPos&, nYTCPos&, nXDBPos&, nYDBPos&, nTCHeight&, nTCWidth&, nDBHeight&, nDBWidth& + +Dim iReduceWidth as Integer + +Function PositionControls(Maxindex as Integer) +Dim oTCModel as Object +Dim oDBModel as Object +Dim i as Integer + InitializePosSizes() + bIsFirstRun = True + bIsVeryFirstRun = True + a = 0 + StartA = 0 + nMaxRowY = 0 + nSecMaxRowY = 0 + If CurArrangement = cLeftJustified Or cTopJustified Then + DialogModel.optAlign0.State = 1 + End If + For i = 0 To MaxIndex + GetCurrentMetaValues(i) + oTCModel = InsertTextControl(i) + If CurFieldType = com.sun.star.sdbc.DataType.TIMESTAMP Then + InsertTimeStampShape(i) + Else + InsertDBControl(i) + bIsVeryFirstRun = False + oDBModelList(i).LabelControl = oTCModel + End If + GetLabelDiffHeight(i+1) + ResetPosSizes(i) + oProgressbar.Value = i + Next i + ControlCaptionstoStandardLayout() + bControlsareCreated = True +End Function + + +Sub ResetPosSizes(LastIndex as Integer) + Select Case CurArrangement + Case cColumnarLeft + nYDBPos = nYDBPos + nDBHeight + cVertDistance + If (nYDBPos > cYOffset + nFormHeight) Or (LastIndex = MaxIndex) Then + RepositionColumnarLeftControls(LastIndex) + nXTCPos = nMaxColRightX + 2 * cHoriDistance + nXDBPos = nXTCPos + cHoriDistance + nMaxTCWidth + nYDBPos = cYOffset + bIsFirstRun = True + StartA = LastIndex + 1 + a = 0 + Else + a = a + 1 + End If + nYTCPos = nYDBPos + LABELDIFFHEIGHT + Case cColumnarTop + nYTCPos = nYDBPos + nDBHeight + cVertDistance + If nYTCPos > cYOffset + nFormHeight Then + nXDBPos = nMaxColRightX + cHoriDistance + nXTCPos = nXDBPos + nYDBPos = cYOffset + nTCHeight + cVertDistance + nYTCPos = cYOffset + bIsFirstRun = True + StartA = LastIndex + 1 + a = 0 + Else + a = a + 1 + End If + Case cLeftJustified,cTopJustified + If nMaxColRightX > cXOffset + nFormWidth Then + Dim nOldYTCPos as Long + nOldYTCPos = nYTCPos + CheckJustifiedPosition() + Else + nXTCPos = nMaxColRightX + CHoriDistance + If CurArrangement = cLeftJustified Then + nYTCPos = nYDBPos + LabelDiffHeight + End If + End If + a = a + 1 + End Select +End Sub + + +Sub RepositionColumnarLeftControls(LastIndex as Integer) +Dim aSize As New com.sun.star.awt.Size +Dim aPoint As New com.sun.star.awt.Point +Dim i as Integer + aSize = GetSize(nMaxTCWidth, nTCHeight) + bIsFirstRun = True + For i = StartA To LastIndex + If i = StartA Then + nXTCPos = oTCShapeList(i).Position.X + nXDBPos = nXTCPos + nMaxTCWidth + cHoriDistance + End If + ResetDBShape(oDBShapeList(i), nXDBPos) + CheckOuterPoints(nXDBPos, nDBWidth, nYDBPos, nDBHeight, True) + Next i +End Sub + + +Sub ResetDBShape(oLocDBShape as Object, iXPos as Long) +Dim aSize As New com.sun.star.awt.Size +Dim aPoint As New com.sun.star.awt.Point + nYDBPos = oLocDBShape.Position.Y + nDBWidth = oLocDBShape.Size.Width + nDBHeight = oLocDBShape.Size.Height + aPoint = GetPoint(iXPos,nYDBPos) + oLocDBShape.SetPosition(aPoint) +End Sub + + +Sub InitializePosSizes() + nXTCPos = cXOffset + nTCWidth = 2000 + nDBWidth = 2000 + nDBHeight = nDBRefHeight + iReduceWidth = 0 + Select Case CurArrangement + Case cColumnarLeft, cLeftJustified + GetLabelDiffHeight(0) + nYTCPos = cYOffset + LABELDIFFHEIGHT + nXDBPos = cXOffset + 3050 + nYDBPos = cYOffset + Case cColumnarTop, cTopJustified + nXDBPos = cXOffset + nYTCPos = cYOffset + End Select +End Sub + + +Function InsertTextControl(i as Integer) as Object +Dim oShape as Object +Dim oModel as Object +Dim aPoint as New com.sun.star.awt.Point +Dim aSize As New com.sun.star.awt.Size + If bControlsareCreated Then + Set oShape = oTCShapeList(i) + Set oModel = oShape.GetControl + If CurArrangement = cLeftJustified Then + nTCWidth = GetPreferredWidth(oModel, True, CurFieldname) + Else + nTCWidth = oShape.Size.Width + End If + oShape.Position = GetPoint(nXTCPos, nYTCPos) + If CurArrangement = cColumnarTop Then + oModel.Align = com.sun.star.awt.TextAlign.LEFT + End If + Else + oModel = CreateUnoService(oModelService(cLabel)) + aPoint = GetPoint(nXTCPos, nYTCPos) + aSize = GetSize(nTCWidth,nTCHeight) + Set oShape = InsertControl(oDrawPage, oModel, aPoint, aSize) + Set oTCShapeList(i)= oShape + If bIsVeryFirstRun Then + If CurArrangement = cColumnarTop Then + nYDBPos = nYTCPos + nTCHeight + End If + End If + nTCWidth = GetPreferredWidth(oModel, True, CurFieldName) + End If + If CurArrangement = cColumnarLeft Then + ' Note This If Sequence must be called before retrieving the outer Points + If bIsFirstRun Then + nMaxTCWidth = nTCWidth + bIsFirstRun = False + ElseIf nTCWidth > nMaxTCWidth Then + nMaxTCWidth = nTCWidth + End If + End If + CheckOuterPoints(oShape.Position.X, nTCWidth, nYTCPos, nTCHeight, False) + Select Case CurArrangement + Case cLeftJustified + nXDBPos = nMaxColRightX + Case cColumnarTop,cTopJustified + oModel.Align = com.sun.star.awt.TextAlign.LEFT + nXDBPos = nXTCPos + nYDBPos = nYTCPos + nTCHeight + If CurFieldLength = 20 And nDBWidth > 2 * nTCWidth Then + iReduceWidth = iReduceWidth + 1 + End If + End Select + oShape.SetSize(GetSize(nTCWidth,nTCHeight)) + If CurHelpText <> "" Then + oModel.HelpText = CurHelptext + End If + InsertTextControl = oModel +End Function + + +Sub InsertDBControl(i as Integer) +Dim aPoint as New com.sun.star.awt.Point +Dim aSize As New com.sun.star.awt.Size +Dim oControl as Object +Dim iColRightX as Long + + aPoint = GetPoint(nXDBPos, nYDBPos) + If bControlsAreCreated Then + oDBShapeList(i).Position = aPoint + Else + oDBModelList(i) = CreateUnoService(oModelService(CurControlType)) + oDBShapeList(i) = InsertControl(oDrawPage, oDBModelList(i), aPoint, aSize) + SetNumerics(oDBModelList(i), CurFieldType) + If CurControlType = cCheckBox Then + oDBModelList(i).Label = "" + End If + oDBModelList(i).DataField = CurFieldName + End If + nDBHeight = GetDBHeight(oDBModelList(i)) + nDBWidth = GetPreferredWidth(oDBModelList(i),True) + aSize = GetSize(nDBWidth,nDBHeight) + oDBShapeList(i).SetSize(aSize) + CheckOuterPoints(nXDBPos, nDBWidth, nYDBPos, nDBHeight, True) +End Sub + + +Function InsertTimeStampShape(i as Integer) as Object +Dim oDateModel as Object +Dim oTimeModel as Object +Dim oDateShape as Object +Dim oTimeShape as Object +Dim oDateTimeShape as Object +Dim aPoint as New com.sun.star.awt.Point +Dim aSize as New com.sun.star.awt.Size +Dim nDateWidth as Long +Dim nTimeWidth as Long +Dim oGroupShape as Object + aPoint = GetPoint(nXDBPos, nYDBPos) + If bControlsAreCreated Then + oDBShapeList(i).Position = aPoint + nDBWidth = oDBShapeList(i).Size.Width + nDBHeight = oDBShapeList(i).Size.Height + Else + oGroupShape = oDocument.CreateInstance("com.sun.star.drawing.GroupShape") + oGroupShape.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH + oDrawPage.Add(oGroupShape) + CurFieldType = com.sun.star.sdbc.DataType.DATE + oDateModel = CreateUnoService("com.sun.star.form.component.DateField") + oDateModel.DataField = CurFieldName + oDateShape = InsertControl(oGroupShape, oDateModel, aPoint, aSize) + SetNumerics(oDateModel, CurFieldType) + nDBHeight = GetDBHeight(oDateModel) + nDateWidth = GetPreferredWidth(oDateModel,True) + aSize = GetSize(nDateWidth,nDBHeight) + oDateShape.SetSize(aSize) + + CurFieldType = com.sun.star.sdbc.DataType.TIME + oTimeModel = CreateUnoService("com.sun.star.form.component.TimeField") + oTimeModel.DataField = CurFieldName + oTimeShape = InsertControl(oGroupShape, oTimeModel, aPoint, aSize) + oTimeShape.Position = GetPoint(nXDBPos + 10 + nDateWidth,nYDBPos) + nTimeWidth = GetPreferredWidth(oTimeModel) + aSize = GetSize(nTimeWidth,nDBHeight) + oTimeShape.SetSize(aSize) + nDBWidth = nDateWidth + nTimeWidth + 10 + oGroupShape.Position = aPoint + oGroupShape.Size = GetSize(nDBWidth, nDBHeight) + Set oDBShapeList(i)= oGroupShape + End If + CheckOuterPoints(nXDBPos, nDBWidth, nYDBPos, nDBHeight, True) + InsertTimeStampShape() = oDBShapeList(i) +End Function + + +' Note: on all Controls except for the checkbox the Label has to be set +' a bit under the DBControl because its Height is also smaller +Sub GetLabelDiffHeight(Index as Integer) + If (CurArrangement = cLeftJustified) Or (CurArrangement = cColumnarLeft) Then + If Index <= Ubound(FieldMetaValues()) Then + If FieldMetaValues(Index,2) = cCheckBox Then + LabelDiffHeight = 0 + Else + LabelDiffHeight = BasicLabelDiffHeight + End If + End If + End If +End Sub + + +Sub CheckJustifiedPosition() +Dim nLeftDist as Long +Dim nRightDist as Long +Dim oLocDBShape as Object +Dim oLocTextShape as Object +Dim nBaseWidth as Long + nBaseWidth = nFormWidth + cXOffset + nLeftDist = nMaxColRightX - nBaseWidth + nRightDist = nBaseWidth - nXTCPos + cHoriDistance + If nLeftDist < 0.5 * nRightDist and iReduceWidth > 2 Then + ' Fieldwidths in the line can be made smaller + AdjustLineWidth(StartA, a, nLeftDist, - 1) + If CurArrangement = cLeftjustified Then + nYDBPos = nMaxRowY + cVertDistance + nYTCPos = nYDBPos + LABELDIFFHEIGHT + nXTCPos = cXOffset + Else + nYTCPos = nMaxRowY + cVertDistance + nYDBPos = nYTCPos + nTCHeight + nXTCPos = cXOffset + nXDBPos = cXOffset + End If + bIsFirstRun = True + StartA = a + 1 + Else + Set oLocDBShape = oDBShapeList(a) + Set oLocTextShape = oTCShapeList(a) + If CurArrangement = cLeftJustified Then + If nYDBPos + nDBHeight = nMaxRowY Then + ' The last Control was the highest in the row + nYDBPos = nSecMaxRowY + cVertDistance + Else + nYDBPos = nMaxRowY + cVertDistance + End If + nYTCPos = nYDBPos + LABELDIFFHEIGHT + nXDBPos = cXOffset + nTCWidth + oLocTextShape.Position = GetPoint(cXOffset, nYTCPos) + oLocDBShape.Position = GetPoint(nXDBPos, nYDBPos) + ' PosSizes for the next two Controls + nXTCPos = oLocDBShape.Position.X + oLocDBShape.Size.Width + cHoriDistance + bIsFirstRun = True + CheckOuterPoints(nXDBPos, nDBWidth, nYDBPos, nDBHeight, True) + nXDBPos = nMaxColRightX + cHoriDistance + Else ' cTopJustified + If nYDBPos + nDBHeight = nMaxRowY Then + ' The last Control was the highest in the row + nYTCPos = nSecMaxRowY + cVertDistance + Else + nYTCPos = nMaxRowY + cVertDistance + End If + nYDBPos = nYTCPOS + nTCHeight + nXDBPos = cXOffset + nXTCPos = cXOffset + oLocTextShape.Position = GetPoint(cXOffset, nYTCPos) + oLocDBShape.Position = GetPoint(cXOffset, nYDBPos) + bIsFirstRun = True + If nDBWidth > nTCWidth Then + CheckOuterPoints(nXDBPos, nDBWidth, nYDBPos, nDBHeight, True) + Else + CheckOuterPoints(nXDBPos, nTCWidth, nYDBPos, nDBHeight, True) + End If + nXTCPos = nMaxColRightX + cHoriDistance + nXDBPos = nXTCPos + End If + AdjustLineWidth(StartA, a-1, nRightDist, 1) + StartA = a + End If + iReduceWidth = 0 +End Sub + + + +Function GetCorrWidth(StartIndex as Integer, EndIndex as Integer, nDist as Long, Widthfactor as Integer) as Integer +Dim ShapeCount as Integer + If WidthFactor > 0 Then + ShapeCount = EndIndex-StartIndex + 1 + Else + ShapeCount = iReduceWidth + End If + GetCorrWidth() = (nDist)/ShapeCount +End Function + + +Sub AdjustLineWidth(StartIndex as Integer, EndIndex as Integer, nDist as Long, Widthfactor as Integer) +Dim i as Integer +Dim oLocDBShape as Object +Dim oLocTCShape as Object +Dim CorrWidth as Integer +Dim bAdjustPos as Boolean +Dim iLocTCPosX as Long +Dim iLocDBPosX as Long + CorrWidth = GetCorrWidth(StartIndex, EndIndex, nDist, Widthfactor) + bAdjustPos = False + iLocTCPosX = cXOffset + For i = StartIndex To EndIndex + Set oLocDBShape = oDBShapeList(i) + Set oLocTCShape = oTCShapeList(i) + If bAdjustPos Then + oLocTCShape.Position = GetPoint(iLocTCPosX, oLocTCShape.Position.Y) + If CurArrangement = cLeftJustified Then + iLocDBPosX = oLocTCShape.Position.X + oLocTCShape.Size.Width + oLocDBShape.Position = GetPoint(iLocDBPosX, oLocDBShape.Position.Y) + Else + oLocDBShape.Position = GetPoint(iLocTCPosX, oLocTCShape.Position.Y + nTCHeight) + End If + Else + bAdjustPos = True + End If + If CDbl(FieldMetaValues(i,1)) > 20 or WidthFactor > 0 Then + If (CurArrangement = cTopJustified) And (oLocTCShape.Size.Width > oLocDBShape.Size.Width) Then + oLocDBShape.Size = GetSize(oLocTCShape.Size.Width + WidthFactor * CorrWidth, oLocDBShape.Size.Height) + Else + oLocDBShape.Size = GetSize(oLocDBShape.Size.Width + WidthFactor * CorrWidth, oLocDBShape.Size.Height) + End If + End If + iLocTCPosX = oLocDBShape.Position.X + oLocDBShape.Size.Width + cHoriDistance + If CurArrangement = cTopJustified Then + If oLocTCShape.Size.Width > oLocDBShape.Size.Width Then + iLocTCPosX = oLocDBShape.Position.X + oLocTCShape.Size.Width + cHoriDistance + End If + End If + Next i +End Sub + + +Sub CheckOuterPoints(nXPos, nWidth, nYPos, nHeight, bIsDBField as Boolean) +Dim nColRightX as Long +Dim nRowY as Long +Dim nOldMaxRowY as Long + If CurArrangement = cLeftJustified Or CurArrangement = cTopJustified Then + If bIsDBField Then + ' Only at DBControls you can measure the Value of nMaxRowY + If bIsFirstRun Then + nMaxRowY = nYPos + nHeight + nSecMaxRowY = nMaxRowY + Else + nRowY = nYPos + nHeight + If nRowY >= nMaxRowY Then + nOldMaxRowY = nMaxRowY + nSecMaxRowY = nOldMaxRowY + nMaxRowY = nRowY + End If + End If + End If + End If + ' Find the outer right point + If bIsFirstRun Then + nMaxColRightX = nXPos + nWidth + bIsFirstRun = False + Else + nColRightX = nXPos + nWidth + If nColRightX > nMaxColRightX Then + nMaxColRightX = nColRightX + End If + End If +End Sub + + +Function PositionGridControl(MaxIndex as Integer) +Dim oControl as Object +Dim n as Integer +Dim oColumn as Object +Dim aPoint as New com.sun.star.awt.Point +Dim aSize as New com.sun.star.awt.Size + If bControlsareCreated Then + ShapesToNirwana() + End If + oGridModel = CreateUnoService(oModelService(cGridControl)) + oGridModel.Name = "Grid1" + aPoint = GetPoint(cXOffset, cYOffset) + aSize = GetSize(nFormWidth, nFormHeight) + oDBForm.InsertByName (oGridModel.Name, oGridModel) + oGridShape = InsertControl(oDrawPage, oGridModel, aPoint, aSize) + For n = 0 to MaxIndex + GetCurrentMetaValues(n) + If CurFieldType = com.sun.star.sdbc.DataType.TIMESTAMP Then + oColumn = SetupGridColumn(oGridModel,"DateField", False, com.sun.star.sdbc.DataType.DATE, CurFieldName & " " & sDateAppendix) + oColumn = SetupGridColumn(oGridModel,"TimeField", False, com.sun.star.sdbc.DataType.TIME, CurFieldName & " " & sTimeAppendix) + Else + If CurControlType = cImageControl Then + oColumn = SetupGridColumn(oGridModel,"TextField", True, CurFieldType, CurFieldName) + Else + oColumn = SetupGridColumn(oGridModel, CurControlName, False, CurFieldType, CurFieldName) + End If + End If + oProgressbar.Value = n + next n +End Function + + +Function SetupGridColumn(oGridModel as Object, ControlName as String, bHidden as Boolean, iLocFieldType as Integer, ColName as String) as Object +Dim oColumn as Object + CurControlName = ControlName + oColumn = oGridModel.CreateColumn(CurControlName) + oColumn.Name = CalcUniqueContentName(oGridModel, CurControlName) + oColumn.Hidden = bHidden + SetNumerics(oColumn, iLocFieldType) + oColumn.DataField = CurFieldName + oColumn.Label = ColName + oColumn.Width = 0 ' Width of column is adjusted to Columname + oGridModel.insertByName(oColumn.Name, oColumn) +End Function + + +Sub ControlCaptionstoStandardLayout() +Dim i as Integer +Dim iBorderType as Integer +Dim oCurModel as Object +Dim oStyle as Object +Dim iStandardColor as Long + If CurArrangement <> cTabled Then + oStyle = oDocument.StyleFamilies.GetByName("ParagraphStyles").GetByName("Standard") + iStandardColor = oStyle.CharColor + For i = 0 To MaxIndex + oCurModel = oTCShapeList(i).GetControl + If i = 0 Then + If oCurModel.TextColor = iStandardColor Then + Exit Sub + End If + End If + oCurModel.TextColor = iStandardColor + Next i + End If +End Sub + + +Sub GroupShapesTogether() +Dim i as Integer + If CurArrangement <> cTabled Then + For i = 0 To MaxIndex + oGroupShapeList(i) = CreateUnoService("com.sun.star.drawing.ShapeCollection") + oGroupShapeList(i).Add(oTCShapeList(i)) + oGroupShapeList(i).Add(oDBShapeList(i)) + oDrawPage.Group(oGroupShapeList(i)) + Next i + Else + RemoveNirwanaShapes() + End If +End Sub</script:module> diff --git a/wizards/source/formwizard/dialog.xlb b/wizards/source/formwizard/dialog.xlb new file mode 100644 index 000000000..d680f2929 --- /dev/null +++ b/wizards/source/formwizard/dialog.xlb @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="FormWizard" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="DlgFormDB"/> +</library:library> diff --git a/wizards/source/formwizard/script.xlb b/wizards/source/formwizard/script.xlb new file mode 100644 index 000000000..0b79b7f07 --- /dev/null +++ b/wizards/source/formwizard/script.xlb @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="FormWizard" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="FormWizard"/> + <library:element library:name="Layouter"/> + <library:element library:name="Language"/> + <library:element library:name="DBMeta"/> + <library:element library:name="tools"/> + <library:element library:name="develop"/> +</library:library> diff --git a/wizards/source/formwizard/tools.xba b/wizards/source/formwizard/tools.xba new file mode 100644 index 000000000..35a2436e2 --- /dev/null +++ b/wizards/source/formwizard/tools.xba @@ -0,0 +1,363 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="tools" script:language="StarBasic">REM ***** BASIC ***** +Option Explicit +Public Const SBMAXTEXTSIZE = 50 + + +Function SetProgressValue(iValue as Integer) + If iValue = 0 Then + oProgressbar.End + End If + ProgressValue = iValue + oProgressbar.Value = iValue +End Function + + +Function GetPreferredWidth(oModel as Object, bGetMaxWidth as Boolean, Optional LocText) +Dim aPeerSize as new com.sun.star.awt.Size +Dim nWidth as Integer +Dim oControl as Object + If Not IsMissing(LocText) Then + ' Label + aPeerSize = GetPeerSize(oModel, oControl, LocText) + ElseIf CurControlType = cImageControl Then + GetPreferredWidth() = 2000 + Exit Function + Else + aPeerSize = GetPeerSize(oModel, oControl) + End If + nWidth = aPeerSize.Width + ' We increase the preferred Width a bit so that the control does not become too small + ' when we change the border from "3D" to "Flat" + GetPreferredWidth = (nWidth + 10) * XPixelFactor ' PixelTo100thmm(nWidth) +End Function + + +Function GetPreferredHeight(oModel as Object, Optional LocText) +Dim aPeerSize as new com.sun.star.awt.Size +Dim nHeight as Integer +Dim oControl as Object + If Not IsMissing(LocText) Then + ' Label + aPeerSize = GetPeerSize(oModel, oControl, LocText) + ElseIf CurControlType = cImageControl Then + GetPreferredHeight() = 2000 + Exit Function + Else + aPeerSize = GetPeerSize(oModel, oControl) + End If + nHeight = aPeerSize.Height + ' We increase the preferred Height a bit so that the control does not become too small + ' when we change the border from "3D" to "Flat" + GetPreferredHeight = (nHeight+1) * YPixelFactor ' PixelTo100thmm(nHeight) +End Function + + +Function GetPeerSize(oModel as Object, oControl as Object, Optional LocText) +Dim oPeer as Object +Dim aPeerSize as new com.sun.star.awt.Size +Dim NullValue + oControl = oController.GetControl(oModel) + oPeer = oControl.GetPeer() + If oControl.Model.PropertySetInfo.HasPropertybyName("EffectiveMax") Then + If oControl.Model.EffectiveMax = 0 Then + ' This is relevant for decimal fields + oControl.Model.EffectiveValue = 999.9999 + Else + oControl.Model.EffectiveValue = oControl.Model.EffectiveMax + End If + GetPeerSize() = oPeer.PreferredSize() + oControl.Model.EffectiveValue = NullValue + ElseIf Not IsMissing(LocText) Then + oControl.Text = LocText + GetPeerSize() = oPeer.PreferredSize() + ElseIf CurFieldType = com.sun.star.sdbc.DataType.BIT Then + GetPeerSize() = oPeer.PreferredSize() + ElseIf CurFieldType = com.sun.star.sdbc.DataType.BOOLEAN Then + GetPeerSize() = oPeer.PreferredSize() + ElseIf CurFieldType = com.sun.star.sdbc.DataType.DATE Then + oControl.Model.Date = Date + GetPeerSize() = oPeer.PreferredSize() + oControl.Model.Date = NullValue + ElseIf CurFieldType = com.sun.star.sdbc.DataType.TIME Then + oControl.Time = Time + GetPeerSize() = oPeer.PreferredSize() + oControl.Time = NullValue + Else + If oControl.MaxTextLen > SBMAXTEXTSIZE Then + oControl.Text = Mid(SBSIZETEXT,1, SBMAXTEXTSIZE) + Else + oControl.Text = Mid(SBSIZETEXT,1, oControl.MaxTextLen) + End If + GetPeerSize() = oPeer.PreferredSize() + oControl.Text = "" + End If +End Function + + +Function TwipToCM(BYVAL nValue as long) as String + TwipToCM = trim(str(nValue / 567)) + "cm" +End function + + +Function TwipTo100telMM(BYVAL nValue as long) as long + TwipTo100telMM = nValue / 0.567 +End function + + +Function TwipToPixel(BYVAL nValue as long) as long ' not an exact calculation + TwipToPixel = nValue / 15 +End function + + +Function PixelTo100thMMX(oControl as Object) as long + oPeer = oControl.GetPeer() + PixelTo100mmX = Clng(Peer.GetInfo.PixelPerMeterX/100000) + +' PixelTo100thMM = nValue * 28 ' not an exact calculation +End function + + +Function PixelTo100thMMY(oControl as Object) as long + oPeer = oControl.GetPeer() + PixelTo100mmX = Clng(Peer.GetInfo.PixelPerMeterY/100000) + +' PixelTo100thMM = nValue * 28 ' not an exact calculation +End function + + +Function GetPoint(xPos, YPos) as New com.sun.star.awt.Point +Dim aPoint as New com.sun.star.awt.Point + aPoint.X = xPos + aPoint.Y = yPos + GetPoint() = aPoint +End Function + + +Function GetSize(iWidth, iHeight) As New com.sun.star.awt.Size +Dim aSize As New com.sun.star.awt.Size + aSize.Width = iWidth + aSize.Height = iHeight + GetSize() = aSize +End Function + + +Sub ImportStyles() +Dim OldIndex as Integer + If Not bDebug Then + On Local Error GoTo WIZARDERROR + End If + OldIndex = CurIndex + CurIndex = GetCurIndex(DialogModel.lstStyles, Styles(),8) + If CurIndex <> OldIndex Then + ToggleLayoutPage(False) + Dim sImportPath as String + sImportPath = Styles(CurIndex, 8) + bWithBackGraphic = LoadNewStyles(oDocument, DialogModel, CurIndex, sImportPath, Styles(), TexturePath) + ControlCaptionsToStandardLayout() + ToggleLayoutPage(True, "lstStyles") + End If +WIZARDERROR: + If Err <> 0 Then + Msgbox(sMsgErrMsg, 16, GetProductName()) + Resume LOCERROR + LOCERROR: + End If +End Sub + + + +Function SetNumerics(ByVal oLocObject as Object, iLocFieldType as Integer) as Object + If CurControlType = cNumericBox Then + oLocObject.TreatAsNumber = True + Select Case iLocFieldType + Case com.sun.star.sdbc.DataType.BIGINT + oLocObject.EffectiveMax = 2147483647 * 2147483647 + oLocObject.EffectiveMin = -(-2147483648 * -2147483648) +' oLocObject.DecimalAccuracy = 0 + Case com.sun.star.sdbc.DataType.INTEGER + oLocObject.EffectiveMax = 2147483647 + oLocObject.EffectiveMin = -2147483648 + Case com.sun.star.sdbc.DataType.SMALLINT + oLocObject.EffectiveMax = 32767 + oLocObject.EffectiveMin = -32768 + Case com.sun.star.sdbc.DataType.TINYINT + oLocObject.EffectiveMax = 127 + oLocObject.EffectiveMin = -128 + Case com.sun.star.sdbc.DataType.FLOAT, com.sun.star.sdbc.DataType.REAL, com.sun.star.sdbc.DataType.DOUBLE, com.sun.star.sdbc.DataType.DECIMAL, com.sun.star.sdbc.DataType.NUMERIC +'Todo: oLocObject.DecimalAccuracy = ... + oLocObject.EffectiveDefault = CurDefaultValue +' Todo: HelpText??? + End Select + If oLocObject.PropertySetinfo.HasPropertyByName("Width")Then ' Note: an Access AutoincrementField does not provide this property Width + oLocObject.Width = CurFieldLength + CurScale + 1 + End If + If CurIsCurrency Then +'Todo: How do you set currencies? + End If + ElseIf CurControlType = cTextBox Then 'com.sun.star.sdbc.DataType.CHAR, com.sun.star.sdbc.DataType.VARCHAR, com.sun.star.sdbc.DataType.LONGVARCHAR + If CurFieldLength = 0 Then 'Or oLocObject.MaxTextLen > SBMAXTEXTSIZE + oLocObject.MaxTextLen = SBMAXTEXTSIZE + CurFieldLength = SBMAXTEXTSIZE + Else + oLocObject.MaxTextLen = CurFieldLength + End If + oLocObject.DefaultText = CurDefaultValue + ElseIf CurControlType = cDateBox Then +' Todo Why does this not work?: oLocObject.DefaultDate = CurDefaultValue + ElseIf CurControlType = cTimeBox Then ' com.sun.star.sdbc.DataType.DATE, com.sun.star.sdbc.DataType.TIME + oLocObject.DefaultTime = CurDefaultValue +' Todo: Property TimeFormat? from where? + ElseIf CurControlType = cCheckBox Then +' Todo Why does this not work?: oLocObject.DefaultState = CurDefaultValue + End If + If oLocObject.PropertySetInfo.HasPropertybyName("FormatKey") Then + On Local Error Resume Next + oLocObject.FormatKey = CurFormatKey + End If +End Function + + +' Destroy all Shapes in Nirwana +Sub RemoveShapes() +Dim n as Integer +Dim oControl as Object +Dim oShape as Object + For n = oDrawPage.Count-1 To 0 Step -1 + oShape = oDrawPage(n) + If oShape.Position.Y > -2000 Then + oDrawPage.Remove(oShape) + End If + Next n +End Sub + + +' Destroy all Shapes in Nirwana +Sub RemoveNirwanaShapes() +Dim n as Integer +Dim oControl as Object +Dim oShape as Object + For n = oDrawPage.Count-1 To 0 Step -1 + oShape = oDrawPage(n) + If oShape.Position.Y < -2000 Then + oDrawPage.Remove(oShape) + End If + Next n +End Sub + + + +' Note: as Shapes cannot be removed from the DrawPage without destroying +' the object we have to park them somewhere beyond the visible area of the page +Sub ShapesToNirwana() +Dim n as Integer +Dim oControl as Object + For n = 0 To oDrawPage.Count-1 + oDrawPage(n).Position = GetPoint(-20, -10000) + Next n +End Sub + + +Function CalcUniqueContentName(BYVAL oContainer as Object, sBaseName as String) as String + +Dim nPostfix as Integer +Dim sReturn as String + nPostfix = 2 + sReturn = sBaseName + while (oContainer.hasByName(sReturn)) + sReturn = sBaseName & nPostfix + nPostfix = nPostfix + 1 + Wend + CalcUniqueContentName = sReturn +End Function + + +Function CountItemsInArray(BigArray(), SearchItem) +Dim i as Integer +Dim MaxIndex as Integer +Dim ResCount as Integer + ResCount = 0 + MaxIndex = Ubound(BigArray()) + For i = 0 To MaxIndex + If SearchItem = BigArray(i) Then + ResCount = ResCount + 1 + End If + Next i + CountItemsInArray() = ResCount +End Function + + +Function GetDBHeight(oDBModel as Object) + If CurControlType = cImageControl Then + nDBHeight = 2000 + Else + If CurFieldType = com.sun.star.sdbc.DataType.LONGVARCHAR Then + oDBModel.MultiLine = True + nDBHeight = nDBRefHeight * 4 + Else + nDBHeight = nDBRefHeight + End If + End If + GetDBHeight() = nDBHeight +End Function + + +Function GetFormWizardPaths() as Boolean + FormPath = GetOfficeSubPath("Template","../wizard/bitmap") + If FormPath <> "" Then + WizardPath = GetOfficeSubPath("Template","wizard/") + If Wizardpath <> "" Then + TexturePath = GetOfficeSubPath("Gallery", "backgrounds/") + If TexturePath <> "" Then + WorkPath = GetPathSettings("Work") + If WorkPath <> "" Then + TempPath = GetPathSettings("Temp") + If TempPath <> "" Then + GetFormWizardPaths = True + Exit Function + End If + End If + End If + End If + End If + DisposeDocument(oDocument) + GetFormWizardPaths() = False +End Function + + +Function GetFilterName(sApplicationKey as String) as String +Dim oArgs() +Dim oFactory +Dim i as Integer +Dim Maxindex as Integer +Dim UIName as String + oFactory = createUnoService("com.sun.star.document.FilterFactory") + oArgs() = oFactory.getByName(sApplicationKey) + MaxIndex = Ubound(oArgs()) + For i = 0 to MaxIndex + If (oArgs(i).Name="UIName") Then + UIName = oArgs(i).Value + Exit For + End If + next i + GetFilterName() = UIName +End Function +</script:module> diff --git a/wizards/source/gimmicks/AutoText.xba b/wizards/source/gimmicks/AutoText.xba new file mode 100644 index 000000000..a25d1eed9 --- /dev/null +++ b/wizards/source/gimmicks/AutoText.xba @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="AutoText" script:language="StarBasic">' BASIC +Option Explicit +Dim oDocument as Object +Dim sDocumentTitle as String + + +Sub Main() +Dim oTable as Object +Dim oRows as Object +Dim oDocuText as Object +Dim oAutoTextCursor as Object +Dim oAutoTextContainer as Object +Dim oAutogroup as Object +Dim oAutoText as Object +Dim oCharStyles as Object +Dim oContentStyle as Object +Dim oHeaderStyle as Object +Dim oGroupTitleStyle as Object +Dim n, m, iAutoCount as Integer + BasicLibraries.LoadLibrary("Tools") + sDocumentTitle = "Installed AutoTexts" + + ' Open a new empty document + oDocument = CreateNewDocument("swriter") + If Not IsNull(oDocument) Then + oDocument.DocumentProperties.Title = sDocumentTitle + oDocuText = oDocument.Text + + ' Create The Character-templates + oCharStyles = oDocument.StyleFamilies.GetByName("CharacterStyles") + + ' The Characterstyle for the Header that describes the Title of Autotextgroups + oGroupTitleStyle = oDocument.createInstance("com.sun.star.style.CharacterStyle") + oCharStyles.InsertbyName("AutoTextGroupTitle", oGroupTitleStyle) + + oGroupTitleStyle.CharWeight = com.sun.star.awt.FontWeight.BOLD + oGroupTitleStyle.CharHeight = 14 + + ' The Characterstyle for the Header that describes the Title of Autotextgroups + oHeaderStyle = oDocument.createInstance("com.sun.star.style.CharacterStyle") + oCharStyles.InsertbyName("AutoTextHeading", oHeaderStyle) + oHeaderStyle.CharWeight = com.sun.star.awt.FontWeight.BOLD + + ' "Ordinary" Table Content + oContentStyle = oDocument.createInstance("com.sun.star.style.CharacterStyle") + oCharStyles.InsertbyName("TableContent", oContentStyle) + + oAutoTextContainer = CreateUnoService("com.sun.star.text.AutoTextContainer") + + oAutoTextCursor = oDocuText.CreateTextCursor() + + oAutoTextCursor.CharStyleName = "AutoTextGroupTitle" + ' Link the Title with the following table + oAutoTextCursor.ParaKeepTogether = True + + For n = 0 To oAutoTextContainer.Count - 1 + oAutoGroup = oAutoTextContainer.GetByIndex(n) + + oAutoTextCursor.SetString(oAutoGroup.Title) + oAutoTextCursor.CollapseToEnd() + oDocuText.insertControlCharacter(oAutoTextCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + oTable = oDocument.CreateInstance("com.sun.star.text.TextTable") + ' Divide the table if necessary + oTable.Split = True +' oTable.KeepTogether = False + oTable.RepeatHeadLine = True + oAutoTextCursor.Text.InsertTextContent(oAutoTextCursor,oTable,False) + InsertStringToCell("AutoText Name",oTable.GetCellbyPosition(0,0), "AutoTextHeading") + InsertStringToCell("AutoText Shortcut",oTable.GetCellbyPosition(1,0), "AutoTextHeading") + ' Insert one row at the bottom of the table + oRows = oTable.Rows + iAutoCount = oAutoGroup.Count + For m = 0 To iAutoCount-1 + ' Insert the name and the title of all Autotexts + oAutoText = oAutoGroup.GetByIndex(m) + InsertStringToCell(oAutoGroup.Titles(m), oTable.GetCellbyPosition(0, m + 1), "TableContent") + InsertStringToCell(oAutoGroup.ElementNames(m), oTable.GetCellbyPosition(1, m + 1), "TableContent") + If m < iAutoCount-1 Then + oRows.InsertbyIndex(m + 2,1) + End If + Next m + oDocuText.insertControlCharacter(oAutoTextCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + oAutoTextCursor.CollapseToEnd() + Next n + End If +End Sub + + +Sub InsertStringToCell(sCellString as String, oCell as Object, sCellStyle as String) +Dim oCellCursor as Object + oCellCursor = oCell.CreateTextCursor() + oCellCursor.CharStyleName = sCellStyle + oCell.Text.insertString(oCellCursor,sCellString,False) + oDocument.CurrentController.Select(oCellCursor) +End Sub</script:module> diff --git a/wizards/source/gimmicks/ChangeAllChars.xba b/wizards/source/gimmicks/ChangeAllChars.xba new file mode 100644 index 000000000..cdcbc9623 --- /dev/null +++ b/wizards/source/gimmicks/ChangeAllChars.xba @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ChangeAllChars" script:language="StarBasic">' This macro replaces all characters in a writer-document through "x" or "X" signs. +' It works on the currently activated document. +Private const UPPERREPLACECHAR = "X" +Private const LOWERREPLACECHAR = "x" + +Private MSGBOXTITLE +Private NOTSAVEDTEXT +Private WARNING + +Sub ChangeAllChars ' Change all chars in the active document +Dim oSheets, oPages as Object +Dim i as Integer +Const MBYES = 6 +Const MBABORT = 2 +Const MBNO = 7 + BasicLibraries.LoadLibrary("Tools") + MSGBOXTITLE = "Change All Characters to an '" & UPPERREPLACECHAR & "'" + NOTSAVEDTEXT = "This document has already been modified: All characters will be changed to an " & UPPERREPLACECHAR & "'. Should the document be saved now?" + WARNING = "This macro changes all characters and numbers to an '" & UPPERREPLACECHAR & "' in this document." + + On Local Error GoTo NODOCUMENT + oDocument = StarDesktop.ActiveFrame.Controller.Model + NODOCUMENT: + If Err <> 0 Then + Msgbox(WARNING & chr(13) & "First, activate a Writer document." , 16, GetProductName()) + Exit Sub + End If + On Local Error Goto 0 + + sDocType = GetDocumentType(oDocument) + + If oDocument.IsModified And oDocument.Url <> "" Then + Status = MsgBox(NOTSAVEDTEXT, 3+32, MSGBOXTITLE) + Select Case Status + Case MBYES + oDocument.Store + Case MBABORT, MBNO + End + End Select + Else + Status = MsgBox(WARNING, 3+32, MSGBOXTITLE) + If Status = MBNO Or Status = MBABORT Then ' No, Abort + End + End If + End If + + Select Case sDocType + Case "swriter" + ReplaceAllStrings(oDocument) + + Case Else + Msgbox("This macro only works with Writer documents.", 16, GetProductName()) + End Select +End Sub + + +Sub ReplaceAllStrings(oContainer as Object) + ReplaceStrings(oContainer, "[a-z]", LOWERREPLACECHAR) + ReplaceStrings(oContainer, "[à-þ]", LOWERREPLACECHAR) + ReplaceStrings(oContainer, "[A-Z]", UPPERREPLACECHAR) + ReplaceStrings(oContainer, "[À-ß]", UPPERREPLACECHAR) + ReplaceStrings(oContainer, "[0-9]", UPPERREPLACECHAR) +End Sub + + +Sub ReplaceStrings(oContainer as Object, sSearchString, sReplaceString as String) + oReplaceDesc = oContainer.createReplaceDescriptor() + oReplaceDesc.SearchCaseSensitive = True + oReplaceDesc.SearchRegularExpression = True + oReplaceDesc.Searchstring = sSearchString + oReplaceDesc.ReplaceString = sReplaceString + oReplCount = oContainer.ReplaceAll(oReplaceDesc) +End Sub</script:module> diff --git a/wizards/source/gimmicks/GetTexts.xba b/wizards/source/gimmicks/GetTexts.xba new file mode 100644 index 000000000..af93738fd --- /dev/null +++ b/wizards/source/gimmicks/GetTexts.xba @@ -0,0 +1,536 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="GetTexts" script:language="StarBasic">Option Explicit +' Description: +' This macro extracts the strings out of the currently active document and inserts them into a log document. +' The aim of the macro is to provide the programmer an insight into the OpenOffice API. +' It focuses on how document objects are accessed. +' Therefore not only texts of the document body are retrieved but also texts of general +' document objects like, annotations, charts and general document information. + +Public oLogDocument, oLogText, oLogCursor, oLogHeaderStyle, oLogBodyTextStyle as Object +Public oDocument as Object +Public LogArray(1000) as String +Public LogIndex as Integer +Public oLocHeaderStyle as Object + +Sub Main +Dim sDocType as String +Dim oHyperCursor as Object +Dim oCharStyles as Object + BasicLibraries.LoadLibrary("Tools") + On Local Error GoTo NODOCUMENT + oDocument = StarDesktop.ActiveFrame.Controller.Model + sDocType = GetDocumentType(oDocument) + NODOCUMENT: + If Err <> 0 Then + Msgbox("This macro extracts all data from the active Writer, Calc or Draw/Impress document." & chr(13) &_ + "To start this macro you have to activate a document first." , 16, GetProductName) + Exit Sub + End If + On Local Error Goto 0 + + ' Open a new document where all the texts are inserted + oLogDocument = CreateNewDocument("swriter") + If Not IsNull(oLogDocument) Then + oLogText = oLogDocument.Text + + ' create and define the character styles of the log document + oCharStyles = oLogDocument.StyleFamilies.GetByName("CharacterStyles") + oLogHeaderStyle = oLogDocument.createInstance("com.sun.star.style.CharacterStyle") + oCharStyles.InsertbyName("Log Header", oLogHeaderStyle) + + oLogHeaderStyle.charWeight = com.sun.star.awt.FontWeight.BOLD + oLogBodyTextStyle = oLogDocument.createInstance("com.sun.star.style.CharacterStyle") + oCharStyles.InsertbyName("Log Body", oLogBodyTextStyle) + + ' Insert the title of the activated document as a hyperlink + oHyperCursor = oLogText.createTextCursor() + oHyperCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD + oHyperCursor.gotoStart(False) + oHyperCursor.HyperLinkURL = oDocument.URL + oHyperCursor.HyperLinkTarget = oDocument.URL + If oDocument.DocumentProperties.Title <> "" Then + oHyperCursor.HyperlinkName = oDocument.DocumentProperties.Title + End If + oLogText.insertString(oHyperCursor, oDocument.DocumentProperties.Title, False) + oLogText.insertControlCharacter(oHyperCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + + oLogCursor = oLogText.createTextCursor() + oLogCursor.GotoEnd(False) + ' "Switch off" the Hyperlink - Properties + oLogCursor.SetPropertyToDefault("HyperLinkURL") + oLogCursor.SetPropertyToDefault("HyperLinkTarget") + oLogCursor.SetPropertyToDefault("HyperLinkName") + LogIndex = 0 + + ' Get the Properties of the document + GetDocumentProps() + + Select Case sDocType + Case "swriter" + GetWriterStrings() + Case "scalc" + GetCalcStrings() + Case "sdraw", "simpress" + GetDrawStrings() + Case Else + Msgbox("This macro only works with a Writer, Calc or Draw/Impress document.", 16, GetProductName()) + End Select + End If +End Sub + + +' ***********************************************Calc documents************************************************** + +Sub GetCalcStrings() +Dim i, n as integer +Dim oSheet as Object +Dim SheetName as String +Dim oSheets as Object + ' Create a sequence of all sheets within the document + oSheets = oDocument.Sheets + + For i = 0 to osheets.Count - 1 + oSheet = osheets.GetbyIndex(i) + SheetName = oSheet.Name + MakeLogHeadLine("Sheet No. " & i & " (" & SheetName & ")" ) + + ' Check the "body" of the sheet + GetCellTexts(oSheet) + + If oSheet.IsScenario then + MakeLogHeadLine("Scenario Comments from " & SheetName & "'") + WriteStringtoLogFile(osheet.ScenarioComment) + End if + + GetAnnotations(oSheet, "Annotations from '" & SheetName & "'") + + GetChartStrings(oSheet, "Charts from '" & SheetName & "'") + + GetControlStrings(oSheet.DrawPage, "Controls from '" & SheetName & "'") + Next + + ' Pictures + GetCalcGraphicNames() + + GetNamedRanges() +End Sub + + +Sub GetCellTexts(oSheet as Object) +Dim BigRange, BigEnum, oCell as Object + BigRange = oDocument.CreateInstance("com.sun.star.sheet.SheetCellRanges") + BigRange.InsertbyName("",oSheet) + BigEnum = BigRange.GetCells.CreateEnumeration + While BigEnum.hasmoreElements + oCell = BigEnum.NextElement + If oCell.String <> "" And Val(oCell.String) = 0then + WriteStringtoLogFile(oCell.String) + End If + Wend +End Sub + + +Sub GetAnnotations(oSheet as Object, HeaderLine as String) +Dim oNotes as Object +Dim n as Integer + oNotes = oSheet.getAnnotations + If oNotes.hasElements() then + MakeLogHeadLine(HeaderLine) + For n = 0 to oNotes.Count-1 + WriteStringtoLogFile(oNotes.GetbyIndex(n).String) + Next + End if +End Sub + + +Sub GetNamedRanges() +Dim i as integer + MakeLogHeadLine("Named Ranges") + For i = 0 To oDocument.NamedRanges.Count - 1 + WriteStringtoLogFile(oDocument.NamedRanges.GetbyIndex(i).Name) + Next +End Sub + + +Sub GetCalcGraphicNames() +Dim n,m as integer + MakeLogHeadLine("Graphics") + For n = 0 To oDocument.Drawpages.count-1 + For m = 0 To oDocument.Drawpages.GetbyIndex(n).Count - 1 + WriteStringtoLogFile(oDocument.DrawPages.GetbyIndex(n).GetbyIndex(m).Text.String) + Next m + Next n +End Sub + + +' ***********************************************Writer documents************************************************** + +Sub GetParagraphTexts(oParaObject as Object, HeadLine as String) +Dim ParaEnum as Object +Dim oPara as Object +Dim oTextPortEnum as Object +Dim oTextPortion as Object +Dim i as integer +Dim oCellNames() +Dim oCell as Object + + MakeLogHeadLine(HeadLine) + ParaEnum = oParaObject.Text.CreateEnumeration + + While ParaEnum.HasMoreElements + oPara = ParaEnum.NextElement + + ' Note: The enumeration ParaEnum lists all tables and paragraphs. + ' Therefore we have to find out what kind of object "oPara" actually is + If oPara.supportsService("com.sun.star.text.Paragraph") Then + ' "oPara" is a Paragraph + oTextPortEnum = oPara.createEnumeration + While oTextPortEnum.hasmoreElements + oTextPortion = oTextPortEnum.nextElement() + WriteStringToLogFile(oTextPortion.String) + Wend + Else + ' "oPara" is a table + oCellNames = oPara.CellNames + For i = 0 To Ubound(oCellNames()) + If oCellNames(i) <> "" Then + oCell = oPara.getCellByName(oCellNames(i)) + WriteStringToLogFile(oCell.String) + End If + Next + End If + Wend +End Sub + + +Sub GetChartStrings(oSheet as Object, HeaderLine as String) +Dim i as Integer +Dim aChartObject as Object +Dim aChartDiagram as Object + + MakeLogHeadLine(HeaderLine) + + For i = 0 to oSheet.Charts.Count-1 + aChartObject = oSheet.Charts.GetByIndex(i).EmbeddedObject + If aChartObject.HasSubTitle then + WriteStringToLogFile(aChartObject.SubTitle.String) + End If + + If aChartObject.HasMainTitle then + WriteStringToLogFile(aChartObject.Title.String) + End If + + aChartDiagram = aChartObject.Diagram + + If aChartDiagram.hasXAxisTitle Then + WriteStringToLogFile(aChartDiagram.XAxisTitle) + End If + + If aChartDiagram.hasYAxisTitle Then + WriteStringToLogFile(aChartDiagram.YAxisTitle) + End If + + If aChartDiagram.hasZAxisTitle Then + WriteStringToLogFile(aChartDiagram.ZAxisTitle) + End If + Next i +End Sub + + +Sub GetFrameTexts() +Dim i as integer +Dim oTextFrame as object +Dim oFrameEnum as Object +Dim oFramePort as Object +Dim oFrameTextEnum as Object +Dim oFrameTextPort as Object + + MakeLogHeadLine("Text Frames") + For i = 0 to oDocument.TextFrames.Count-1 + oTextFrame = oDocument.TextFrames.GetbyIndex(i) + WriteStringToLogFile(oTextFrame.Name) + + ' Is the frame bound to the page? + If oTextFrame.AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE Then + GetParagraphTexts(oTextFrame, "Text Frame Contents") + End If + + oFrameEnum = oTextFrame.CreateEnumeration + While oFrameEnum.HasMoreElements + oFramePort = oFrameEnum.NextElement + If oFramePort.supportsService("com.sun.star.text.Paragraph") then + oFrameTextEnum = oFramePort.createEnumeration + While oFrameTextEnum.HasMoreElements + oFrameTextPort = oFrameTextEnum.NextElement + If oFrameTextPort.SupportsService("com.sun.star.text.TextFrame") Then + WriteStringtoLogFile(oFrameTextPort.String) + End If + Wend + Else + WriteStringtoLogFile(oFramePort.Name) + End if + Wend + Next +End Sub + + +Sub GetTextFieldStrings() +Dim aTextField as Object +Dim i as integer +Dim CurElement as Object + MakeLogHeadLine("Text Fields") + aTextfield = oDocument.getTextfields.CreateEnumeration + While aTextField.hasmoreElements + CurElement = aTextField.NextElement + If CurElement.PropertySetInfo.hasPropertybyName("Content") Then + WriteStringtoLogFile(CurElement.Content) + ElseIf CurElement.PropertySetInfo.hasPropertybyName("PlaceHolder") Then + WriteStringtoLogFile(CurElement.PlaceHolder) + WriteStringtoLogFile(CurElement.Hint) + ElseIf Curelement.TextFieldMaster.PropertySetInfo.HasPropertybyName("Content") then + WriteStringtoLogFile(CurElement.TextFieldMaster.Content) + End If + Wend +End Sub + + +Sub GetLinkedFileNames() +Dim oDocSections as Object +Dim LinkedFileName as String +Dim i as Integer + If Right(oDocument.URL,3) = "sgl" Then + MakeLogHeadLine("Sub-documents") + oDocSections = oDocument.TextSections + For i = 0 to oDocSections.Count - 1 + LinkedFileName = oDocSections.GetbyIndex(i).FileLink.FileURL + If LinkedFileName <> "" Then + WriteStringToLogFile(LinkedFileName) + End If + Next i + End If +End Sub + + +Sub GetSectionNames() +Dim i as integer +Dim oDocSections as Object + MakeLogHeadLine("Sections") + oDocSections = oDocument.TextSections + For i = 0 to oDocSections.Count-1 + WriteStringtoLogFile(oDocSections.GetbyIndex(i).Name) + Next +End Sub + + +Sub GetWriterStrings() + GetParagraphTexts(oDocument, "Document Body") + GetGraphicNames() + GetStyles() + GetControlStrings(oDocument.DrawPage, "Controls") + GetTextFieldStrings() + GetSectionNames() + GetFrameTexts() + GetHyperLinks + GetLinkedFileNames() +End Sub + + +' ***********************************************Draw/Impress documents************************************************** + +Sub GetDrawPageTitles(LocObject as Object) +Dim n as integer +Dim oPage as Object + + For n = 0 to LocObject.Count - 1 + oPage = LocObject.GetbyIndex(n) + WriteStringtoLogFile(oPage.Name) + ' Is the page a DrawPage and not a MasterPage? + If oPage.supportsService("com.sun.star.drawing.DrawPage")then + ' Get the name of the NotesPage (only relevant for Impress documents) + If oDocument.supportsService("com.sun.star.presentation.PresentationDocument") then + WriteStringtoLogFile(oPage.NotesPage.Name) + End If + End If + Next +End Sub + + +Sub GetPageStrings(oPages as Object) +Dim m, n, s as Integer +Dim oPage, oPageElement, oShape as Object + For n = 0 to oPages.Count-1 + oPage = oPages.GetbyIndex(n) + If oPage.HasElements then + For m = 0 to oPage.Count-1 + oPageElement = oPage.GetByIndex(m) + If HasUnoInterfaces(oPageElement,"com.sun.star.container.XIndexAccess") Then + ' The Object "oPageElement" a group of Shapes, that can be accessed by their index + For s = 0 To oPageElement.Count - 1 + WriteStringToLogFile(oPageElement.GetByIndex(s).String) + Next s + ElseIf HasUnoInterfaces(oPageElement, "com.sun.star.text.XText") Then + WriteStringtoLogFile(oPageElement.String) + End If + Next + End If + Next +End Sub + + +Sub GetDrawStrings() +Dim oDPages, oMPages as Object + + oDPages = oDocument.DrawPages + oMPages = oDocument.Masterpages + + MakeLogHeadLine("Titles") + GetDrawPageTitles(oDPages) + GetDrawPageTitles(oMPages) + + MakeLogHeadLine("Document Body") + GetPageStrings(oDPages) + GetPageStrings(oMPages) +End Sub + + +' ***********************************************Misc************************************************** + +Sub GetDocumentProps() +Dim oDocuProps as Object + MakeLogHeadLine("Document Properties") + oDocuProps = oDocument.DocumentProperties + WriteStringToLogFile(oDocuProps.Title) + WriteStringToLogFile(oDocuProps.Description) + WriteStringToLogFile(oDocuProps.Subject) + WriteStringToLogFile(oDocuProps.Author) + ' WriteStringToLogFile(oDocuProps.UserDefinedProperties.ReplyTo) + ' WriteStringToLogFile(oDocuProps.UserDefinedProperties.Recipient) + ' WriteStringToLogFile(oDocuProps.UserDefinedProperties.References) + ' WriteStringToLogFile(oDocuProps.Keywords) +End Sub + + +Sub GetHyperlinks() +Dim i as integer +Dim oCrsr as Object +Dim oAllHyperLinks as Object +Dim SrchAttributes(0) as new com.sun.star.beans.PropertyValue +Dim oSearchDesc as Object + + MakeLogHeadLine("Hyperlinks") + ' create a Search-Descriptor + oSearchDesc = oDocument.CreateSearchDescriptor + oSearchDesc.Valuesearch = False + + ' define the Search-attributes + srchattributes(0).Name = "HyperLinkURL" + srchattributes(0).Value = "" + oSearchDesc.SetSearchAttributes(SrchAttributes()) + + oAllHyperLinks = oDocument.findAll(oSearchDesc()) + + For i = 0 to oAllHyperLinks.Count - 1 + oFound = oAllHyperLinks(i) + oCrsr = oFound.Text.createTextCursorByRange(oFound) + WriteStringToLogFile(oCrs.HyperLinkURL) 'Url + WriteStringToLogFile(oCrs.HyperLinkTarget) 'Name + WriteStringToLogFile(oCrs.HyperLinkName) 'Frame + Next i +End Sub + + +Sub GetGraphicNames() +Dim i as integer +Dim oDocGraphics as Object + MakeLogHeadLine("Graphics") + oDocGraphics = oDocument.GraphicObjects + For i = 0 to oDocGraphics.count - 1 + WriteStringtoLogFile(oDocGraphics.GetbyIndex(i).Name) + Next +End Sub + + +Sub GetStyles() +Dim m,n as integer + MakeLogHeadLine("User-defined Templates") + + ' Check all StyleFamilies(i.e. PageStyles, ParagraphStyles, CharacterStyles, cellStyles) + For n = 0 to oDocument.StyleFamilies.Count - 1 + For m = 0 to oDocument.StyleFamilies.getbyIndex(n).Count-1 + If oDocument.StyleFamilies.GetbyIndex(n).getbyIndex(m).IsUserDefined then + WriteStringtoLogFile(oDocument.StyleFamilies.GetbyIndex(n).getbyIndex(m).Name) + End If + Next + Next +End Sub + + +Sub GetControlStrings(oDPage as Object, HeaderLine as String) +Dim aForm as Object +Dim m,n as integer + MakeLogHeadLine(HeaderLine) + 'SearchFor all possible Controls + For n = 0 to oDPage.Forms.Count - 1 + aForm = oDPage.Forms(n) + For m = 0 to aForm.Count-1 + GetControlContent(aForm.GetbyIndex(m)) + Next + Next +End Sub + + +Sub GetControlContent(LocControl as Object) +Dim i as integer + + If LocControl.PropertySetInfo.HasPropertybyName("Label") then + WriteStringtoLogFile(LocControl.Label) + + ElseIf LocControl.SupportsService("com.sun.star.form.component.ListBox") then + For i = 0 to Ubound(LocControl.StringItemList()) + WriteStringtoLogFile(LocControl.StringItemList(i)) + Next + End If + If LocControl.PropertySetInfo.HasPropertybyName("HelpText") then + WriteStringtoLogFile(LocControl.Helptext) + End If +End Sub + +' ***********************************************Log document************************************************** + +Sub WriteStringtoLogFile( sString as String) + If (Not FieldInArray(LogArray(),LogIndex,sString))AND (NOT ISNULL(sString)) Then + LogArray(LogIndex) = sString + LogIndex = LogIndex + 1 + oLogText.insertString(oLogCursor,sString,False) + oLogText.insertControlCharacter(oLogCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + End If +End Sub + + +Sub MakeLogHeadLine(HeadText as String) + oLogCursor.CharStyleName = "Log Header" + oLogText.insertControlCharacter(oLogCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + oLogText.insertString(oLogCursor,HeadText,False) + oLogText.insertControlCharacter(oLogCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + oLogCursor.CharStyleName = "Log Body" +End Sub +</script:module> diff --git a/wizards/source/gimmicks/ReadDir.xba b/wizards/source/gimmicks/ReadDir.xba new file mode 100644 index 000000000..b60469508 --- /dev/null +++ b/wizards/source/gimmicks/ReadDir.xba @@ -0,0 +1,322 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ReadDir" script:language="StarBasic">Option Explicit +Public Const SBPAGEX = 800 +Public Const SBPAGEY = 800 +Public Const SBRELDIST = 1.3 + +' Names of the second Dimension of the Array iLevelPos +Public Const SBBASEX = 0 +Public Const SBBASEY = 1 + +Public Const SBOLDSTARTX = 2 +Public Const SBOLDSTARTY = 3 + +Public Const SBOLDENDX = 4 +Public Const SBOLDENDY = 5 + +Public Const SBNEWSTARTX = 6 +Public Const SBNEWSTARTY = 7 + +Public Const SBNEWENDX = 8 +Public Const SBNEWENDY = 9 + +Public ConnectLevel As Integer +Public iLevelPos(1,9) As Long +Public Source as String +Public iCurLevel as Integer +Public nConnectLevel as Integer +Public nOldWidth, nOldHeight As Long +Public nOldX, nOldY, nOldLevel As Integer +Public oOldLeavingLine As Object +Public oOldArrivingLine As Object +Public DlgReadDir as Object +Dim oProgressBar as Object +Dim oDocument As Object +Dim oPage As Object + + +Sub Main() +Dim oStandardTemplate as Object + BasicLibraries.LoadLibrary("Tools") + oDocument = CreateNewDocument("sdraw") + If Not IsNull(oDocument) Then + oPage = oDocument.DrawPages(0) + oStandardTemplate = oDocument.StyleFamilies.GetByName("graphics").GetByName("standard") + oStandardTemplate.CharHeight = 10 + oStandardTemplate.TextLeftDistance = 100 + oStandardTemplate.TextRightDistance = 100 + oStandardTemplate.TextUpperDistance = 50 + oStandardTemplate.TextLowerDistance = 50 + DlgReadDir = LoadDialog("Gimmicks","ReadFolderDlg") + oProgressBar = DlgReadDir.Model.ProgressBar1 + DlgReadDir.Model.TextField1.Text = ConvertFromUrl(GetPathSettings("Work")) + DlgReadDir.Model.cmdGoOn.DefaultButton = True + DlgReadDir.GetControl("TextField1").SetFocus() + DlgReadDir.Execute + End If +End Sub + + +Sub TreeInfo() +Dim oCurTextShape As Object +Dim i as Integer +Dim bStartUpRun As Boolean +Dim CurFilename as String +Dim BaseLevel as Integer +Dim oController as Object +Dim MaxFileIndex as Integer +Dim FileNames() as String + ToggleDialogControls(False) + oProgressBar.ProgressValueMin = 0 + oProgressBar.ProgressValueMax = 100 + bStartUpRun = True + nOldHeight = 200 + nOldY = SBPAGEY + nOldX = SBPAGEX + nOldWidth = SBPAGEX + oController = oDocument.GetCurrentController + Source = ConvertToURL(DlgReadDir.Model.TextField1.Text) + BaseLevel = CountCharsInString(Source, "/", 1) + oProgressBar.ProgressValue = 5 + DlgReadDir.Model.Label3.Enabled = True + FileNames() = ReadSourceDirectory(Source) + DlgReadDir.Model.Label4.Enabled = True + DlgReadDir.Model.Label3.Enabled = False + oProgressBar.ProgressValue = 12 + FileNames() = BubbleSortList(FileNames()) + DlgReadDir.Model.Label5.Enabled = True + DlgReadDir.Model.Label4.Enabled = False + oProgressBar.ProgressValue = 20 + MaxFileIndex = Ubound(FileNames(),1) + For i = 0 To MaxFileIndex + oProgressBar.ProgressValue = 20 + (i/MaxFileIndex * 80) + CurFilename = FileNames(i,1) + SetNewLevels(FileNames(i,0), BaseLevel) + oCurTextShape = CreateTextShape(oPage, CurFilename) + CheckPageWidth(oCurTextShape.Size.Width) + iLevelPos(iCurLevel,SBBASEY) = oCurTextShape.Position.Y + If i = 0 Then + AdjustPageHeight(oCurTextShape.Size.Height, MaxFileIndex + 1) + End If + ' The Current TextShape has To be connected with a TextShape one Level higher + ' except for a TextShape In Level 0: + If Not bStartUpRun Then + ' A leaving Line Is only drawn when level is not 0 + If iCurLevel<> 0 Then + ' Determine the Coordinates of the arriving Line + iLevelPos(iCurLevel,SBOLDSTARTX) = iLevelPos(nConnectLevel,SBNEWSTARTX) + iLevelPos(iCurLevel,SBOLDSTARTY) = oCurTextShape.Position.Y + 0.5 * oCurTextShape.Size.Height + + iLevelPos(iCurLevel,SBOLDENDX) = iLevelPos(iCurLevel,SBBASEX) + iLevelPos(iCurLevel,SBOLDENDY) = oCurTextShape.Position.Y + 0.5 * oCurTextShape.Size.Height + + oOldArrivingLine = DrawLine(iCurLevel, SBOLDSTARTX, SBOLDSTARTY, SBOLDENDX, SBOLDENDY, oPage) + + ' Determine the End-Coordinates of the last leaving Line + iLevelPos(nConnectLevel,SBNEWENDX) = iLevelPos(nConnectLevel,SBNEWSTARTX) + iLevelPos(nConnectLevel,SBNEWENDY) = oCurTextShape.Position.Y + 0.5 * oCurTextShape.Size.Height + Else + ' On Level 0 the last Leaving Line's Endpoint is the upper edge of the TextShape + iLevelPos(nConnectLevel,SBNEWENDY) = oCurTextShape.Position.Y + iLevelPos(nConnectLevel,SBNEWENDX) = iLevelPos(nConnectLevel,SBNEWSTARTX) + End If + ' Draw the Connectors To the previous TextShapes + oOldLeavingLine = DrawLine(nConnectLevel, SBNEWSTARTX, SBNEWSTARTY, SBNEWENDX, SBNEWENDY, oPage) + Else + ' StartingPoint of the leaving Edge + bStartUpRun = FALSE + End If + + ' Determine the beginning Coordinates of the leaving Line + iLevelPos(iCurLevel,SBNEWSTARTX) = iLevelPos(iCurLevel,SBBASEX) + 0.5 * oCurTextShape.Size.Width + iLevelPos(iCurLevel,SBNEWSTARTY) = iLevelPos(iCurLevel,SBBASEY) + oCurTextShape.Size.Height + + ' Save the values For the Next run + nOldHeight = oCurTextShape.Size.Height + nOldX = oCurTextShape.Position.X + nOldWidth = oCurTextShape.Size.Width + nOldLevel = iCurLevel + Next i + ToggleDialogControls(True) + DlgReadDir.Model.cmdGoOn.Enabled = False +End Sub + + +Function CreateTextShape(oPage as Object, Filename as String) +Dim oTextShape As Object +Dim aPoint As New com.sun.star.awt.Point + + aPoint.X = CalculateXPoint() + aPoint.Y = nOldY + SBRELDIST * nOldHeight + nOldY = aPoint.Y + + oTextShape = oDocument.createInstance("com.sun.star.drawing.TextShape") + oTextShape.LineStyle = 1 + oTextShape.Position = aPoint + + oPage.add(oTextShape) + oTextShape.TextAutoGrowWidth = TRUE + oTextShape.TextAutoGrowHeight = TRUE + oTextShape.String = FileName + + ' Configure Size And Position of the TextShape according to its Scripting + aPoint.X = iLevelPos(iCurLevel,SBBASEX) + oTextShape.Position = aPoint + CreateTextShape() = oTextShape +End Function + + +Function CalculateXPoint() + ' The current level Is lower than the Old one + If (iCurLevel< nOldLevel) And (iCurLevel<> 0) Then + ' ClearArray(iLevelPos(),iCurLevel+1) + Elseif iCurLevel= 0 Then + iLevelPos(iCurLevel,SBBASEX) = SBPAGEX + ' The current level Is higher than the old one + Elseif iCurLevel> nOldLevel Then + iLevelPos(iCurLevel,SBBASEX) = iLevelPos(iCurLevel-1,SBBASEX) + nOldWidth + 100 + End If + CalculateXPoint = iLevelPos(iCurLevel,SBBASEX) +End Function + + +Function DrawLine(nLevel, nStartX, nStartY, nEndX, nEndY As Integer, oPage as Object) +Dim oConnect As Object +Dim aPoint As New com.sun.star.awt.Point +Dim aSize As New com.sun.star.awt.Size + aPoint.X = iLevelPos(nLevel,nStartX) + aPoint.Y = iLevelPos(nLevel,nStartY) + aSize.Width = iLevelPos(nLevel,nEndX) - iLevelPos(nLevel,nStartX) + aSize.Height = iLevelPos(nLevel,nEndY) - iLevelPos(nLevel,nStartY) + oConnect = oDocument.createInstance("com.sun.star.drawing.LineShape") + oConnect.Position = aPoint + oConnect.Size = aSize + oPage.Add(oConnect) + DrawLine() = oConnect +End Function + + +Sub GetSourceDirectory() + GetFolderName(DlgReadDir.Model.TextField1) +End Sub + + +Function ReadSourceDirectory(ByVal Source As String) +Dim i as Integer +Dim m as Integer +Dim n as Integer +Dim s as integer +Dim FileName as string +Dim FileNameList(100,1) as String +Dim DirList(0) as String +Dim oUCBobject as Object +Dim DirContent() as String +Dim SystemPath as String +Dim PathSeparator as String +Dim MaxFileIndex as Integer + PathSeparator = GetPathSeparator() + oUcbobject = createUnoService("com.sun.star.ucb.SimpleFileAccess") + m = 0 + s = 0 + DirList(0) = Source + FileNameList(n,0) = Source + SystemPath = ConvertFromUrl(Source) + FileNameList(n,1) = FileNameoutofPath(SystemPath, PathSeparator) + n = 1 + Do + Source = DirList(m) + m = m + 1 + DirContent() = oUcbObject.GetFolderContents(Source,True) + If Ubound(DirContent()) <> -1 Then + MaxFileIndex = Ubound(DirContent()) + For i = 0 to MaxFileIndex + FileName = DirContent(i) + FileNameList(n,0) = FileName + SystemPath = ConvertFromUrl(FileName) + FileNameList(n,1) = FileNameOutofPath(SystemPath, PathSeparator) + n = n + 1 + If n > Ubound(FileNameList(),1) Then + ReDim Preserve FileNameList(n + 10,1) as String + End If + If oUcbObject.IsFolder(FileName) Then + s = s + 1 + ReDim Preserve DirList(s) as String + DirList(s) = FileName + End If + Next i + End If + Loop Until m > Ubound(DirList()) + ReDim Preserve FileNameList(n-1,1) as String + ReadSourceDirectory() = FileNameList() +End Function + + +Sub CloseDialog + DlgReadDir.EndExecute +End Sub + + +Sub AdjustPageHeight(lShapeHeight, FileCount) +Dim lNecHeight as Long +Dim lBorders as Long + oDocument.LockControllers + lBorders = oPage.BorderTop + oPage.BorderBottom + lNecHeight = SBPAGEY + (FileCount * SBRELDIST * lShapeHeight) + If lNecHeight > (oPage.Height - lBorders) Then + oPage.Height = lNecHeight + lBorders + 500 + End If + oDocument.UnlockControllers +End Sub + + +Sub SetNewLevels(FileName as String, BaseLevel as Integer) + iCurLevel= CountCharsInString(FileName, "/", 1) - BaseLevel + If iCurLevel <> 0 Then + nConnectLevel = iCurLevel- 1 + Else + nConnectLevel = iCurLevel + End If + If iCurLevel > Ubound(iLevelPos(),1) Then + ReDim Preserve iLevelPos(iCurLevel,9) as Long + End If +End Sub + + +Sub CheckPageWidth(TextWidth as Long) +Dim PageWidth as Long +Dim BaseX as Long + PageWidth = oPage.Width + BaseX = iLevelPos(iCurLevel,SBBASEX) + If BaseX + TextWidth > PageWidth - 1000 Then + oPage.Width = 1000 + BaseX + TextWidth + End If +End Sub + + +Sub ToggleDialogControls(bDoEnable as Boolean) + With DlgReadDir.Model + .cmdGoOn.Enabled = bDoEnable + .cmdGetDir.Enabled = bDoEnable + .Label1.Enabled = bDoEnable + .Label2.Enabled = bDoEnable + .TextField1.Enabled = bDoEnable + End With +End Sub</script:module> diff --git a/wizards/source/gimmicks/ReadFolderDlg.xdl b/wizards/source/gimmicks/ReadFolderDlg.xdl new file mode 100644 index 000000000..797e97755 --- /dev/null +++ b/wizards/source/gimmicks/ReadFolderDlg.xdl @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="ReadFolderDlg" dlg:left="161" dlg:top="81" dlg:width="180" dlg:height="136" dlg:closeable="true" dlg:moveable="true" dlg:title="Read and Design Recursively"> + <dlg:bulletinboard> + <dlg:button dlg:id="cmdGetDir" dlg:tab-index="0" dlg:left="161" dlg:top="49" dlg:width="14" dlg:height="14" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.ReadDir.GetSourceDirectory?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:textfield dlg:id="TextField1" dlg:tab-index="1" dlg:left="6" dlg:top="50" dlg:width="147" dlg:height="12"/> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="2" dlg:left="49" dlg:top="115" dlg:width="35" dlg:height="14" dlg:value="~Cancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.ReadDir.CloseDialog?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="3" dlg:left="95" dlg:top="115" dlg:width="35" dlg:height="14" dlg:value="~GoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.ReadDir.TreeInfo?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="Label1" dlg:tab-index="4" dlg:left="6" dlg:top="38" dlg:width="122" dlg:height="8" dlg:value="Top level path"/> + <dlg:text dlg:id="Label2" dlg:tab-index="5" dlg:left="6" dlg:top="4" dlg:width="168" dlg:height="26" dlg:value="This macro will create a drawing document and design a complete tree view of all subdirectories from a given path." dlg:multiline="true"/> + <dlg:progressmeter dlg:id="ProgressBar1" dlg:tab-index="6" dlg:left="6" dlg:top="101" dlg:width="170" dlg:height="10"/> + <dlg:text dlg:id="Label3" dlg:tab-index="7" dlg:disabled="true" dlg:left="6" dlg:top="69" dlg:width="170" dlg:height="8" dlg:value="Getting the files and subdirectories..."/> + <dlg:text dlg:id="Label4" dlg:tab-index="8" dlg:disabled="true" dlg:left="6" dlg:top="80" dlg:width="170" dlg:height="8" dlg:value="Sorting the files and subdirectories..."/> + <dlg:text dlg:id="Label5" dlg:tab-index="9" dlg:disabled="true" dlg:left="6" dlg:top="91" dlg:width="170" dlg:height="8" dlg:value="Drawing the filestructure..."/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/gimmicks/UserfieldDlg.xdl b/wizards/source/gimmicks/UserfieldDlg.xdl new file mode 100644 index 000000000..efa0eff7e --- /dev/null +++ b/wizards/source/gimmicks/UserfieldDlg.xdl @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="UserfieldDlg" dlg:left="161" dlg:top="57" dlg:width="281" dlg:height="214" dlg:closeable="true" dlg:moveable="true" dlg:title="Modify User Data"> + <dlg:bulletinboard> + <dlg:text dlg:id="Label1" dlg:tab-index="0" dlg:left="6" dlg:top="48" dlg:width="57" dlg:height="8" dlg:value="Label1"/> + <dlg:text dlg:id="Label2" dlg:tab-index="1" dlg:left="6" dlg:top="64" dlg:width="57" dlg:height="8" dlg:value="Label2"/> + <dlg:text dlg:id="Label3" dlg:tab-index="2" dlg:left="6" dlg:top="80" dlg:width="57" dlg:height="8" dlg:value="Label3"/> + <dlg:text dlg:id="Label4" dlg:tab-index="3" dlg:left="6" dlg:top="96" dlg:width="57" dlg:height="8" dlg:value="Label4"/> + <dlg:text dlg:id="Label5" dlg:tab-index="4" dlg:left="6" dlg:top="112" dlg:width="57" dlg:height="8" dlg:value="Label5"/> + <dlg:text dlg:id="Label6" dlg:tab-index="5" dlg:left="6" dlg:top="128" dlg:width="57" dlg:height="8" dlg:value="Label6"/> + <dlg:text dlg:id="Label7" dlg:tab-index="6" dlg:left="6" dlg:top="144" dlg:width="57" dlg:height="8" dlg:value="Label7"/> + <dlg:text dlg:id="Label8" dlg:tab-index="7" dlg:left="6" dlg:top="160" dlg:width="57" dlg:height="8" dlg:value="Label8"/> + <dlg:text dlg:id="Label9" dlg:tab-index="8" dlg:left="6" dlg:top="176" dlg:width="57" dlg:height="8" dlg:value="Label9"/> + <dlg:textfield dlg:id="TextField1" dlg:tab-index="9" dlg:left="65" dlg:top="46" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField2" dlg:tab-index="10" dlg:left="65" dlg:top="62" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField3" dlg:tab-index="11" dlg:left="65" dlg:top="78" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField4" dlg:tab-index="12" dlg:left="65" dlg:top="94" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField5" dlg:tab-index="13" dlg:left="65" dlg:top="110" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField6" dlg:tab-index="14" dlg:left="65" dlg:top="126" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField7" dlg:tab-index="15" dlg:left="65" dlg:top="142" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField8" dlg:tab-index="16" dlg:left="65" dlg:top="158" dlg:width="193" dlg:height="12"/> + <dlg:textfield dlg:id="TextField9" dlg:tab-index="17" dlg:left="65" dlg:top="174" dlg:width="193" dlg:height="12"/> + <dlg:scrollbar dlg:id="ScrollBar1" dlg:tab-index="18" dlg:left="263" dlg:top="46" dlg:width="12" dlg:height="140" dlg:align="vertical"> + <script:event script:event-name="on-adjustmentvaluechange" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.ScrollControls?language=Basic&location=application" script:language="Script"/> + </dlg:scrollbar> + <dlg:button dlg:id="cmdQuit" dlg:tab-index="19" dlg:left="6" dlg:top="193" dlg:width="35" dlg:height="14" dlg:help-text="Exit Macro" dlg:value="Exit"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.StopMacro?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdSave" dlg:tab-index="20" dlg:left="45" dlg:top="193" dlg:width="35" dlg:height="14" dlg:help-text="Save All Data of All Users to File" dlg:value="~Save"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.SaveSettings?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdSelect" dlg:tab-index="21" dlg:left="84" dlg:top="193" dlg:width="35" dlg:height="14" dlg:help-text="Replace the User Data in <PRODUCTNAME> With the User Data Above" dlg:value="Se~lect"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.SelectCurrentFields?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdNextUser" dlg:tab-index="22" dlg:left="162" dlg:top="193" dlg:width="35" dlg:height="14" dlg:tag="1" dlg:help-text="Show Data of Next User" dlg:value="Next >>"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.StepToRecord?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdPrevUser" dlg:tab-index="23" dlg:left="123" dlg:top="193" dlg:width="35" dlg:height="14" dlg:tag="-1" dlg:help-text="Show Data of Previous User" dlg:value="<<Previous"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.StepToRecord?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="CommandButton1" dlg:tab-index="24" dlg:left="201" dlg:top="193" dlg:width="35" dlg:height="14" dlg:help-text="Add Data for New User" dlg:value="~New"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.AddRecord?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="Label10" dlg:tab-index="25" dlg:left="6" dlg:top="6" dlg:width="269" dlg:height="34" dlg:value="This macro lets you easily administrate several user profiles.
The user data of several users may be stored in a single file in the directory <ConfigDir>. From there, you can select a particular user whose data is then the current user data in <PRODUCTNAME>." dlg:multiline="true"/> + <dlg:button dlg:id="cmdDelete" dlg:tab-index="26" dlg:left="240" dlg:top="193" dlg:width="35" dlg:height="14" dlg:help-text="Delete Data of Current User" dlg:value="Delete"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Gimmicks.Userfields.DeleteCurrentSettings?language=Basic&location=application" script:language="Script"/> + </dlg:button> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/gimmicks/Userfields.xba b/wizards/source/gimmicks/Userfields.xba new file mode 100644 index 000000000..17426cb49 --- /dev/null +++ b/wizards/source/gimmicks/Userfields.xba @@ -0,0 +1,236 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Userfields" script:language="StarBasic">Option Explicit +'Todo: Controlling Scrollbar via Keyboard + +Public Const SBMAXFIELDINDEX = 14 + +Public DlgUserFields as Object +Public oDocument as Object +Public UserFieldDataType(SBMAXFIELDINDEX,1) as String +Public ScrollBarValue as Integer +Public UserFieldFamily(0, SBMAXfIELDINDEX) as String +Public Const SBTBCOUNT = 9 +Public oUserDataAccess as Object +Public CurFieldIndex as Integer +Public FilePath as String + +Sub StartChangesUserfields +Dim SystemPath as String + BasicLibraries.LoadLibrary("Tools") + UserFieldDatatype(0,0) = "COMPANY" + UserFieldDatatype(0,1) = "o" + UserFieldDatatype(1,0) = "FIRSTNAME" + UserFieldDatatype(1,1) = "givenname" + UserFieldDatatype(2,0) = "LASTNAME" + UserFieldDatatype(2,1) = "sn" + UserFieldDatatype(3,0) = "INITIALS" + UserFieldDatatype(3,1) = "initials" + UserFieldDatatype(4,0) = "STREET" + UserFieldDatatype(4,1) = "street" + UserFieldDatatype(5,0) = "COUNTRY" + UserFieldDatatype(5,1) = "c" + UserFieldDatatype(6,0) = "ZIP" + UserFieldDatatype(6,1) = "postalcode" + UserFieldDatatype(7,0) = "CITY" + UserFieldDatatype(7,1) = "l" + UserFieldDatatype(8,0) = "TITLE" + UserFieldDatatype(8,1) = "title" + UserFieldDatatype(9,0) = "POSITION" + UserFieldDatatype(9,1) = "position" + UserFieldDatatype(10,0) = "PHONE_HOME" + UserFieldDatatype(10,1) = "homephone" + UserFieldDatatype(11,0) = "PHONE_WORK" + UserFieldDatatype(11,1) = "telephonenumber" + UserFieldDatatype(12,0) = "FAX" + UserFieldDatatype(12,1) = "facsimiletelephonenumber" + UserFieldDatatype(13,0) = "E-MAIL" + UserFieldDatatype(13,1) = "mail" + UserFieldDatatype(14,0) = "STATE" + UserFieldDatatype(14,1) = "st" + FilePath = GetPathSettings("Config", False) & "/" & "UserData.dat" + DlgUserFields = LoadDialog("Gimmicks","UserfieldDlg") + SystemPath = ConvertFromUrl(FilePath) + DlgUserFields.Model.Label10.Label = ReplaceString(DlgUserFields.Model.Label10.Label, "'" & SystemPath & "'", "<ConfigDir>") + DlgUserFields.Model.Label10.Label = ReplaceString(DlgUserFields.Model.Label10.Label, GetProductName(), "<PRODUCTNAME>") + DlgUserFields.Model.cmdSelect.HelpText = ReplaceString(DlgUserFields.Model.cmdSelect.HelpText, GetProductName(), "<PRODUCTNAME>") + ScrollBarValue = 0 + oUserDataAccess = GetRegistryKeyContent("org.openoffice.UserProfile/Data", True) + InitializeUserFamily() + FillDialog() + DlgUserFields.Execute + DlgUserFields.Dispose() +End Sub + + +Sub FillDialog() +Dim a as Integer + With DlgUserFields + For a = 1 To SBTBCount + .GetControl("Label" & a).Model.Label = UserFieldDataType(a-1,0) + .GetControl("TextField" & a).Model.Text = UserFieldFamily(CurFieldIndex, a-1) + Next a + .Model.ScrollBar1.ScrollValueMax = (SBMAXFIELDINDEX+1) - SBTBCOUNT + .Model.ScrollBar1.BlockIncrement = SBTBCOUNT + .Model.ScrollBar1.LineIncrement = 1 + .Model.ScrollBar1.ScrollValue = ScrollBarValue + End With +End Sub + + +Sub ScrollControls() + ScrollTextFieldInfo(ScrollBarValue) + ScrollBarValue = DlgUserFields.Model.ScrollBar1.ScrollValue + If (ScrollBarValue + SBTBCOUNT) >= SBMAXFIELDINDEX + 1 Then + ScrollBarValue = (SBMAXFIELDINDEX + 1) - SBTBCOUNT + End If + FillupTextFields() +End Sub + + +Sub ScrollTextFieldInfo(ByVal iScrollValue as Integer) +Dim a as Integer +Dim CurIndex as Integer + For a = 1 To SBTBCOUNT + CurIndex = (a-1) + iScrollValue + UserFieldFamily(CurFieldIndex,CurIndex) = DlgUserFields.GetControl("TextField" & a).Model.Text + Next a +End Sub + + +Sub StopMacro() + DlgUserFields.EndExecute +End Sub + + +Sub SaveSettings() +Dim n as Integer +Dim m as Integer +Dim MaxIndex as Integer + ScrollTextFieldInfo(DlgUserFields.Model.ScrollBar1.ScrollValue) + MaxIndex = Ubound(UserFieldFamily(), 1) + Dim FileStrings(MaxIndex) as String + For n = 0 To MaxIndex + FileStrings(n) = "" + For m = 0 To SBMAXFIELDINDEX + FileStrings(n) = FileStrings(n) & UserFieldFamily(n,m) & ";" + Next m + Next n + SaveDataToFile(FilePath, FileStrings(), True) +End Sub + + +Sub ToggleButtons(ByVal Index as Integer) +Dim i as Integer + CurFieldIndex = Index + DlgUserFields.Model.cmdNextUser.Enabled = CurFieldIndex <> Ubound(UserFieldFamily(), 1) + DlgUserFields.Model.cmdPrevUser.Enabled = CurFieldIndex <> 0 +End Sub + + +Sub InitializeUserFamily() +Dim FirstIndex as Integer +Dim UserFieldstrings() as String +Dim LocStrings() as String +Dim bFileExists as Boolean +Dim n as Integer +Dim m as Integer + bFileExists = LoadDataFromFile(GetPathSettings("Config", False) & "/" & "UserData.dat", UserFieldStrings()) + If bFileExists Then + FirstIndex = Ubound(UserFieldStrings()) + ReDim Preserve UserFieldFamily(FirstIndex, SBMAXFIELDINDEX) as String + For n = 0 To FirstIndex + LocStrings() = ArrayOutofString(UserFieldStrings(n), ";") + For m = 0 To SBMAXFIELDINDEX + UserFieldFamily(n,m) = LocStrings(m) + Next m + Next n + Else + ReDim Preserve UserFieldFamily(0,SBMAXFIELDINDEX) as String + For m = 0 To SBMAXFIELDINDEX + UserFieldFamily(0,m) = oUserDataAccess.GetByName(UserFieldDataType(m,1)) + Next m + End If + ToggleButtons(0) +End Sub + + +Sub AddRecord() +Dim i as Integer +Dim MaxIndex as Integer + For i = 1 To SBTBCount + DlgUserFields.GetControl("TextField" & i).Model.Text = "" + Next i + MaxIndex = Ubound(UserFieldFamily(),1) + ReDim Preserve UserFieldFamily(MaxIndex + 1, SBMAXFIELDINDEX) as String + ToggleButtons(MaxIndex + 1, 1) +End Sub + + +Sub FillupTextFields() +Dim a as Integer +Dim CurIndex as Integer + For a = 1 To SBTBCOUNT + CurIndex = (a-1) + ScrollBarValue + DlgUserFields.GetControl("Label" & a).Model.Label = UserFieldDataType(CurIndex,0) + DlgUserFields.GetControl("TextField" & a).Model.Text = UserFieldFamily(CurFieldIndex, CurIndex) + Next a +End Sub + + +Sub StepToRecord(aEvent as Object) +Dim iStep as Integer + iStep = CInt(aEvent.Source.Model.Tag) + ScrollTextFieldInfo(ScrollBarValue) + ToggleButtons(CurFieldIndex + iStep) + FillUpTextFields() +End Sub + + +Sub SelectCurrentFields() +Dim MaxIndex as Integer +Dim i as Integer + ScrollTextFieldInfo(ScrollBarValue) + MaxIndex = Ubound(UserFieldFamily(),2) + For i = 0 To MaxIndex + oUserDataAccess.ReplaceByName(UserFieldDataType(i,1), UserFieldFamily(CurFieldIndex, i)) + Next i + oUserDataAccess.commitChanges() +End Sub + + +Sub DeleteCurrentSettings() +Dim n as Integer +Dim m as Integer +Dim MaxIndex as Integer + MaxIndex = Ubound(UserFieldFamily(),1) + If CurFieldIndex < MaxIndex Then + For n = CurFieldIndex To MaxIndex - 1 + For m = 0 To SBMAXFIELDINDEX + UserFieldFamily(n,m) = UserFieldFamily(n + 1,m) + Next m + Next n + Else + CurFieldIndex = MaxIndex - 1 + End If + ReDim Preserve UserFieldFamily(MaxIndex-1, SBMAXfIELDINDEX) as String + FillupTextFields() + ToggleButtons(CurFieldIndex) +End Sub</script:module>
\ No newline at end of file diff --git a/wizards/source/gimmicks/dialog.xlb b/wizards/source/gimmicks/dialog.xlb new file mode 100644 index 000000000..22271dacb --- /dev/null +++ b/wizards/source/gimmicks/dialog.xlb @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Gimmicks" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="UserfieldDlg"/> + <library:element library:name="ReadFolderDlg"/> +</library:library> diff --git a/wizards/source/gimmicks/readdirs.dlg b/wizards/source/gimmicks/readdirs.dlg Binary files differnew file mode 100644 index 000000000..20a89426d --- /dev/null +++ b/wizards/source/gimmicks/readdirs.dlg diff --git a/wizards/source/gimmicks/script.xlb b/wizards/source/gimmicks/script.xlb new file mode 100644 index 000000000..5c820ba43 --- /dev/null +++ b/wizards/source/gimmicks/script.xlb @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Gimmicks" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="GetTexts"/> + <library:element library:name="Userfields"/> + <library:element library:name="ChangeAllChars"/> + <library:element library:name="AutoText"/> + <library:element library:name="ReadDir"/> +</library:library> diff --git a/wizards/source/imagelists/imagelists.ilst b/wizards/source/imagelists/imagelists.ilst new file mode 100644 index 000000000..0a6714c65 --- /dev/null +++ b/wizards/source/imagelists/imagelists.ilst @@ -0,0 +1,7 @@ +%MODULE%/dbaccess/res/exinfo.png +%MODULE%/wizards/res/portrait_32.png +%MODULE%/wizards/res/landscape_32.png +%MODULE%/wizards/res/formarrangelistside_42.png +%MODULE%/wizards/res/formarrangelisttop_42.png +%MODULE%/wizards/res/formarrangetable_42.png +%MODULE%/wizards/res/formarrangefree_42.png diff --git a/wizards/source/importwizard/API.xba b/wizards/source/importwizard/API.xba new file mode 100644 index 000000000..97111aeca --- /dev/null +++ b/wizards/source/importwizard/API.xba @@ -0,0 +1,216 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="API" script:language="StarBasic">Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" _ + (ByVal hKey As Long, _ + ByVal lpSubKey As String, _ + ByVal ulOptions As Long, _ + ByVal samDesired As Long, _ + phkResult As Long) As Long + +Declare Function RegQueryValueExString Lib "advapi32.dll" Alias "RegQueryValueExA" _ + (ByVal hKey As Long, _ + ByVal lpValueName As String, _ + ByVal lpReserved As Long, _ + lpType As Long, _ + lpData As String, _ + lpcbData As Long) As Long + +Declare Function RegQueryValueExLong Lib "advapi32.dll" Alias "RegQueryValueExA" _ + (ByVal hKey As Long, _ + ByVal lpValueName As String, _ + ByVal lpReserved As Long, _ + lpType As Long, _ + lpData As Long, _ + lpcbData As Long) As Long + +Declare Function RegQueryValueExNULL Lib "advapi32.dll" Alias "RegQueryValueExA" _ + (ByVal hKey As Long, _ + ByVal lpValueName As String, _ + ByVal lpReserved As Long, _ + lpType As Long, _ + ByVal lpData As Long, _ + lpcbData As Long) As Long + +Declare Function RegCloseKeyA Lib "advapi32.dll" Alias "RegCloseKey" _ + (ByVal hKey As Long) As Long + + +Public Const HKEY_CLASSES_ROOT = &H80000000 +Public Const HKEY_CURRENT_USER = &H80000001 +Public Const HKEY_LOCAL_MACHINE = &H80000002 +Public Const HKEY_USERS = &H80000003 +Public Const KEY_ALL_ACCESS = &H3F +Public Const REG_OPTION_NON_VOLATILE = 0 +Public Const REG_SZ As Long = 1 +Public Const REG_DWORD As Long = 4 +Public Const ERROR_NONE = 0 +Public Const ERROR_BADDB = 1 +Public Const ERROR_BADKEY = 2 +Public Const ERROR_CANTOPEN = 3 +Public Const ERROR_CANTREAD = 4 +Public Const ERROR_CANTWRITE = 5 +Public Const ERROR_OUTOFMEMORY = 6 +Public Const ERROR_INVALID_PARAMETER = 7 +Public Const ERROR_ACCESS_DENIED = 8 +Public Const ERROR_INVALID_PARAMETERS = 87 +Public Const ERROR_NO_MORE_ITEMS = 259 +'Public Const KEY_READ = &H20019 + + +Function OpenRegKey(lBaseKey As Long, sKeyName As String) As Variant +Dim LocKeyValue +Dim hKey as Long +Dim lRetValue as Long + lRetValue = RegOpenKeyEx(lBaseKey, sKeyName, 0, KEY_ALL_ACCESS, hKey) +' lRetValue = QueryValue(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Outlook Express\5.0\Default Settings", "Revocation Checking") + If hKey <> 0 Then + RegCloseKeyA (hKey) + End If + OpenRegKey() = lRetValue +End Function + + +Function GetDefaultPath(CurOffice as Integer) As String +Dim sPath as String +Dim Index as Integer + Select Case Wizardmode + Case SBMICROSOFTMODE + Index = Applications(CurOffice,SBAPPLKEY) + If GetGUIType = 1 Then ' Windows + sPath = QueryValue(HKEY_LOCAL_MACHINE, sKeyName(Index), sValueName(Index)) + Else + sPath = "" + End If + If sPath = "" Then + sPath = SOWorkPath + End If + GetDefaultPath = sPath + End Select +End Function + + +Function GetTemplateDefaultPath(Index as Integer) As String +Dim sLocTemplatePath as String +Dim sLocProgrampath as String +Dim Progstring as String +Dim PathList()as String +Dim Maxindex as Integer +Dim OldsLocTemplatePath +Dim sTemplateKeyName as String +Dim sTemplateValueName as String + On Local Error Goto NOVAlIDSYSTEMPATH + Select Case WizardMode + Case SBMICROSOFTMODE + If GetGUIType = 1 Then ' Windows + ' Template directory of Office 97 + sTemplateKeyName = "Software\Microsoft\Office\8.0\Common\FileNew\LocalTemplates" + sTemplateValueName = "" + sLocTemplatePath = QueryValue(HKEY_LOCAL_MACHINE, sTemplateKeyName, sTemplateValueName) + + If sLocTemplatePath = "" Then + ' Retrieve the template directory of Office 2000 + ' Unfortunately there is no existing note about the template directory in + ' the whole registry. + + ' Programdirectory of Office 2000 + sTemplateKeyName = "Software\Microsoft\Office\9.0\Common\InstallRoot" + sTemplateValueName = "Path" + sLocProgrampath = QueryValue(HKEY_LOCAL_MACHINE, sTemplateKeyName, sTemplateValueName) + If sLocProgrampath <> "" Then + If Right(sLocProgrampath, 1) <> "\" Then + sLocProgrampath = sLocProgrampath & "\" + End If + PathList() = ArrayoutofString(sLocProgrampath,"\",Maxindex) + Progstring = "\" & PathList(Maxindex-1) & "\" + OldsLocTemplatePath = DeleteStr(sLocProgramPath,Progstring) + + sLocTemplatePath = OldsLocTemplatePath & "\" & "Templates" + + ' Does this subdirectory "templates" exist at all + If oUcb.Exists(sLocTemplatePath) Then + ' If Not the main directory of the office is the base + sLocTemplatePath = OldsLocTemplatePath + End If + Else + sLocTemplatePath = SOWorkPath + End If + End If + GetTemplateDefaultPath = ConvertToUrl(sLocTemplatePath) + Else + GetTemplateDefaultPath = SOWorkPath + End If + End Select +NOVALIDSYSTEMPATH: + If Err <> 0 Then + GetTemplateDefaultPath() = SOWorkPath + Resume ONITGOES + ONITGOES: + End If +End Function + + +Function QueryValueEx(ByVal lhKey, ByVal szValueName As String, vValue As String) As Long +Dim cch As Long +Dim lrc As Long +Dim lType As Long +Dim lValue As Long +Dim sValue As String +Dim Empty + + On Error GoTo QueryValueExError + + lrc = RegQueryValueExNULL(lhKey, szValueName, 0&, lType, 0&, cch) + If lrc <> ERROR_NONE Then Error 5 + Select Case lType + Case REG_SZ: + sValue = String(cch, 0) + lrc = RegQueryValueExString(lhKey, szValueName, 0&, lType, sValue, cch) + If lrc = ERROR_NONE Then + vValue = Left$(sValue, cch) + Else + vValue = Empty + End If + Case REG_DWORD: + lrc = RegQueryValueExLong(lhKey, szValueName, 0&, lType, lValue, cch) + If lrc = ERROR_NONE Then + vValue = lValue + End If + Case Else + lrc = -1 + End Select +QueryValueExExit: + QueryValueEx = lrc + Exit Function +QueryValueExError: + Resume QueryValueExExit +End Function + + +Function QueryValue(BaseKey As Long, sKeyName As String, sValueName As String) As Variant +Dim lRetVal As Long ' Returnvalue API-Call +Dim hKey As Long ' One key handle +Dim vValue As String ' Key value + + lRetVal = RegOpenKeyEx(BaseKey, sKeyName, 0, KEY_ALL_ACCESS, hKey) + lRetVal = QueryValueEx(hKey, sValueName, vValue) + RegCloseKeyA (hKey) + QueryValue = vValue +End Function +</script:module> diff --git a/wizards/source/importwizard/DialogModul.xba b/wizards/source/importwizard/DialogModul.xba new file mode 100644 index 000000000..0bf782c6b --- /dev/null +++ b/wizards/source/importwizard/DialogModul.xba @@ -0,0 +1,484 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="DialogModul" script:language="StarBasic">Option Explicit + +Public Const bDebugWizard = True + +Public Const SBFIRSTAPPLCHECKED = 0 +Public Const SBSECONDAPPLCHECKED = 1 +Public Const SBTHIRDAPPLCHECKED = 2 +Public Const SBFOURTHAPPLCHECKED = 3 +Public WizardMode as String +Public Const SBMICROSOFTMODE = "MS" +' The absolute maximal Number of possible Applications +Public Const SBMAXAPPLCOUNT = 4 +Public Const Twip = 425 +Public MaxApplCount as Integer +Public CurOffice As Integer +Public SOBitmapPath As String +Public SOWorkPath As String +Public SOTemplatePath as String +Public bCancelTask As Boolean +Public bDoKeepApplValues as Boolean +Public oUcb as Object +Public PathSeparator as String + +Public ApplCount as Integer +Public sKeyName(SBMAXAPPLCOUNT-1) as String +Public sValueName(SBMAXAPPLCOUNT-1) as String +Public sCRLF as String +Public MSFilterName(5,4) as String + +Public Applications(SBMAXAPPLCOUNT-1,9) + +Public Const SBAPPLCONVERT = 0 +Public Const SBDOCCONVERT = 1 +Public Const SBDOCRECURSIVE = 2 +Public Const SBDOCSOURCE = 3 +Public Const SBDOCTARGET = 4 +Public Const SBTEMPLCONVERT = 5 +Public Const SBTEMPLRECURSIVE = 6 +Public Const SBTEMPLSOURCE = 7 +Public Const SBTEMPLTARGET = 8 +Public Const SBAPPLKEY = 9 +Public XMLTemplateList() + +' Application-relating Data are stored in this Array +' according to the following structure: +' Applications(X,0) = True/False (Application is to be converted) +' Applications(X,1) = True/False (Documents are to be converted) +' Applications(X,2) = True/False (Including Subdirectories) +' Applications(X,3) = "File:///..." (SourceUrl of the documents) +' Applications(X,4) = "File///:..." (TargetUrl of the documents) +' Applications(X,5) = True/False (Templates are to be converted) +' Applications(X,6) = True/False (Including Subdirectories) +' Applications(X,7) = "File:///..." (SourceUrl of the templates) +' Applications(X,8) = "File:///..." (TargetUrl of the templates) +' Applications(X,9) = 0 (Key to the original Index of the Applications) + + +Sub FillStep_Welcome() +Dim i as Integer +' bDoKeepApplValues = False + ImportDialogArea.Title = sTitle + With ImportDialog + .cmdHelp.Label = sHelpButton + .cmdCancel.Label = sCancelButton + .cmdBack.Label = sBackButton + .cmdGoOn.Label = sNextButton + .WelcomeTextLabel.Label = sWelcomeTextLabel1 + .WelcomeTextLabel3.Label = sWelcomeTextLabel3 + + .optMSDocuments.Label = sContainerName(0) + .chkMSApplication1.Label = sMsDocumentCheckbox(0) + .chkMSApplication2.Label = sMsDocumentCheckbox(1) + .chkMSApplication3.Label = sMsDocumentCheckbox(2) + + .cmdBack.Enabled = False + .Step = 1 + + If Not oFactoryKey.hasbyName("com.sun.star.text.TextDocument") Then + .chkLogfile.State = 0 + .chkLogfile.Enabled = False + End If + End With + CheckModuleInstallation() + ToggleNextButton() +End Sub + + +Sub FillStep_InputPaths(OfficeIndex as Integer, bStartup as Boolean) +Dim Index as Integer +Dim oNullObject as Object + If bStartup And Not bDoKeepApplValues Then + If ImportDialog.optMSDocuments.State = 1 Then + SetupMSConfiguration() + Else + 'Not supposed to happen - is there an assert in BASIC... + End If + FillUpApplicationList() + End If + CurOffice = OfficeIndex + Index = Applications(CurOffice,SBAPPLKEY) + InitializePathsforCurrentApplication(Index) + With ImportDialog + .chkTemplatePath.Label = sTemplateCheckbox(Index) + .chkDocumentPath.State = Abs(Applications(CurOffice,SBDOCCONVERT)) + .chkDocumentSearchSubDir.State = Abs(Applications(CurOffice,SBDOCRECURSIVE)) + .txtDocumentImportPath.Text = ConvertFromUrl(Applications(CurOffice,SBDOCSOURCE)) + .txtDocumentExportPath.Text = ConvertFromUrl(Applications(CurOffice,SBDOCTARGET)) + .hlnDocuments.Label = sProgressMoreDocs + If WizardMode = SBMICROSOFTMODE Then + ImportDialogArea.Title = sTitle & " - " & sMSDocumentCheckBox(Index) + End If + .chkTemplatePath.Enabled = True + .chkDocumentPath.Enabled = True + .chkTemplatePath.Label = sTemplateCheckbox(Index) + .chkDocumentPath.Label = sDocumentCheckbox(Index) + .hlnTemplates.Label = sProgressMoreTemplates + .chkTemplatePath.State = Abs(Applications(CurOffice,SBTEMPLCONVERT)) + ToggleInputPaths(oNullObject,"Template") + ToggleInputPaths(oNullObject,"Document") + .chkTemplateSearchSubDir.State = Abs(Applications(CurOffice,SBTEMPLRECURSIVE)) + .txtTemplateImportPath.Text = ConvertFromUrl(Applications(CurOffice,SBTEMPLSOURCE)) + .txtTemplateExportPath.Text = ConvertFromUrl(Applications(CurOffice,SBTEMPLTARGET)) + .cmdGoOn.Label = sNextButton + .cmdBack.Enabled = True + ImportDialog.Step = 2 + End With + ImportDialogArea.GetControl("chkTemplatePath").SetFocus() + ToggleNextButton() +End Sub + + +Sub FillUpApplicationList() +Dim i as Integer +Dim a as Integer +Dim BoolValue as Boolean + If Not bDoKeepApplValues Then + a = 0 + For i = 1 To ApplCount + If ImportDialog.optMSDocuments.State = 1 Then + BoolValue = ImportDialogArea.GetControl("chkMSApplication" & i).Model.State = 1 + End If + Applications(a,SBAPPLCONVERT) = BoolValue + Applications(a,SBDOCCONVERT) = BoolValue + Applications(a,SBDOCRECURSIVE) = BoolValue + Applications(a,SBDOCSOURCE) = "" ' GetDefaultPath(i) + Applications(a,SBDOCTARGET) = "" ' SOWorkPath + Applications(a,SBTEMPLCONVERT) = BoolValue + Applications(a,SBTEMPLRECURSIVE) = BoolValue + Applications(a,SBTEMPLSOURCE) = "" ' GetTemplateDefaultPath(i) + Applications(a,SBTEMPLTARGET) = "" ' GetTargetTemplatePath(i) + Applications(a,SBAPPLKEY) = i-1 + If BoolValue Then + a = a + 1 + End If + Next i + ApplCount = a + End If +End Sub + + +Sub InitializePathsforCurrentApplication(i as Integer) + AssignPathToCurrentApplication(SBDOCSOURCE, GetDefaultPath(i)) + AssignPathToCurrentApplication(SBDOCTARGET, SOWorkPath) + AssignPathToCurrentApplication(SBTEMPLSOURCE, GetTemplateDefaultPath(i)) + AssignPathToCurrentApplication(SBTEMPLTARGET, GetTargetTemplatePath(i)) +End Sub + + +Sub AssignPathToCurrentApplication(Index as Integer, NewPath as String) + If Applications(CurOffice,Index) = "" Then + If CurOffice > 0 Then + Applications(CurOffice,Index) = Applications(CurOffice-1,Index) + Else + Applications(CurOffice,Index) = NewPath + End If + End If +End Sub + + +Sub SaveStep_InputPath() + Applications(CurOffice,SBDOCCONVERT) = ImportDialog.chkDocumentPath.State = 1 + Applications(CurOffice,SBDOCRECURSIVE) = ImportDialog.chkDocumentSearchSubDir.State = 1 + Applications(CurOffice,SBDOCSOURCE) = ConvertToURL(ImportDialog.txtDocumentImportPath.Text) + Applications(CurOffice,SBDOCTARGET) = ConvertToUrl(ImportDialog.txtDocumentExportPath.Text) + Applications(CurOffice,SBTEMPLCONVERT) = ImportDialog.chkTemplatePath.State = 1 + Applications(CurOffice,SBTEMPLRECURSIVE) = ImportDialog.chkTemplateSearchSubDir.State = 1 + Applications(CurOffice,SBTEMPLSOURCE) = ConvertToURL(ImportDialog.txtTemplateImportPath.Text) + Applications(CurOffice,SBTEMPLTARGET) = ConvertToURL(ImportDialog.txtTemplateExportPath.Text) +End Sub + + +Sub ToggleInputPaths(aEvent as Object, Optional sDocType) +Dim bDoEnable as Boolean +Dim sLocDocType as String +Dim oCheckBox as Object + If Not IsNull(aEvent) Then + sLocDocType = aEvent.Source.Model.Tag + Else + sLocDocType = sDocType + End If + With ImportDialogArea + oCheckBox = .GetControl("chk" & sLocDocType & "Path").Model + bDoEnable = oCheckBox.State = 1 And oCheckBox.Enabled + .GetControl("lbl" & sLocDocType & "Import").Model.Enabled = bDoEnable + .GetControl("lbl" & sLocDocType & "Export").Model.Enabled = bDoEnable + .GetControl("txt" & sLocDocType & "ImportPath").Model.Enabled = bDoEnable + .GetControl("txt" & sLocDocType & "ExportPath").Model.Enabled = bDoEnable + .GetControl("chk" & sLocDocType & "SearchSubDir").Model.Enabled = bDoEnable + .GetControl("cmd" & sLocDocType & "Import").Model.Enabled = bDoEnable + .GetControl("cmd" & sLocDocType & "Export").Model.Enabled = bDoEnable + End With + ToggleNextButton() +End Sub + + +Function MakeSummaryString() +Dim sTmpText As String +Dim i as Integer +Dim Index as Integer +Dim sAddText as String + For i = 0 To ApplCount -1 + Index = Applications(i,SBAPPLKEY) + If Applications(i,SBTEMPLCONVERT) Then + ' Templates are to be converted + sAddText = "" + If WizardMode = SBMICROSOFTMODE Then + sAddText = sSumMSTemplates(Index) & sCRLF + End If + sTmpText = sTmpText & sAddText & ConvertFromUrl(Applications(i,SBTEMPLSOURCE)) & sCRLF + If Applications(i,SBTEMPLRECURSIVE) Then + ' Including Subdirectories + sTmpText = sTmpText & sSumInclusiveSubDir & sCRLF + End If + sTmpText = sTmpText & sSumSaveDocuments & sCRLF + sTmpText = sTmpText & ConvertFromUrl(Applications(i,SBTEMPLTARGET)) & sCRLF + sTmpText = sTmpText & sCRLF + End If + + If Applications(i,SBDOCCONVERT) Then + ' Documents are to be converted + If WizardMode = SBMICROSOFTMODE Then + sAddText = sSumMSDocuments(Index) & sCRLF + End If + sTmpText = sTmpText & sAddText & ConvertFromUrl(Applications(i,SBDOCSOURCE)) & sCRLF + + If Applications(i,SBDOCRECURSIVE) Then + ' Including Subdirectories + sTmpText = sTmpText & sSumInclusiveSubDir & sCRLF + End If + + sTmpText = sTmpText & sSumSaveDocuments & sCRLF + sTmpText = sTmpText & ConvertFromUrl(Applications(i,SBDOCTARGET)) & sCRLF + sTmpText = sTmpText & sCRLF + End If + Next i + MakeSummaryString = sTmpText +End Function + + +Sub FillStep_Summary() + ImportDialogArea.Title = sTitle + With ImportDialog + .SummaryTextbox.Text = MakeSummaryString() + .cmdGoOn.Enabled = .SummaryTextbox.Text <> "" + .cmdGoOn.Label = sBeginButton + .SummaryHeaderLabel.Label = sSummaryHeader + .Step = 3 + End With + ImportDialogArea.GetControl("SummaryHeaderLabel").SetFocus() +End Sub + + +Sub FillStep_Progress() + With ImportDialog + .cmdBack.Enabled = False + .cmdGoOn.Enabled = False + .hlnProgress.Label = sProgressPage_1 + .LabelRetrieval.FontWeight = com.sun.star.awt.FontWeight.BOLD + .LabelRetrieval.Label = sProgressPage_2 + .LabelCurProgress.Label = sProgressPage_3 + .LabelCurDocumentRetrieval.Label = "" + .LabelCurTemplateRetrieval.Label = "" + .LabelCurDocument.Label = "" + .Step = 4 + End With + ImportDialogArea.GetControl("LabelRetrieval").SetFocus() + If ImportDialog.chkLogfile.State = 1 Then + ImportDialog.cmdShowLogFile.DefaultButton = True + End If +End Sub + + +Sub SetupMSConfiguration() + Wizardmode = SBMICROSOFTMODE + MaxApplCount = 3 + ApplCount = 3 + ' chkTemplatePath-Captions + sTemplateCheckBox(0) = GetResText("MSTemplateCheckbox_1_") + sTemplateCheckBox(1) = GetResText("MSTemplateCheckbox_2_") + sTemplateCheckBox(2) = GetResText("MSTemplateCheckbox_3_") + ' DocumentCheckbox- Captions + sDocumentCheckBox(0) = GetResText("MSDocumentCheckbox_1_") + sDocumentCheckBox(1) = GetResText("MSDocumentCheckbox_2_") + sDocumentCheckBox(2) = GetResText("MSDocumentCheckbox_3_") + + sKeyName(0) = "Software\Microsoft\Office\8.0\Word\Options" + sKeyName(1) = "Software\Microsoft\Office\8.0\Excel\Microsoft Excel" + sKeyName(2) = "Software\Microsoft\Office\8.0\PowerPoint\Recent Folder List\Default" + + sValueName(0) = "DOC-PATH" + sValueName(1) = "DefaultPath" + sValueName(2) = "" + +' See definition of Filtername-Array about meaning of fields + MSFilterName(0,0) = "doc|docx|docm" + MSFilterName(0,1) = "writer8|writer8|writer8" + MSFilterName(0,2) = "odt|odt|odt" + MSFilterName(0,3) = sMSDocumentCheckBox(0) + MSFilterName(0,4) = "Word" + + + MSFilterName(1,0) = "xls|xlsx|xlsm" + MSFilterName(1,1) = "calc8|calc8|calc8" + MSFilterName(1,2) = "ods|ods|ods" + MSFilterName(1,3) = sMSDocumentCheckBox(1) + MSFilterName(1,4) = "Excel" + + MSFilterName(2,0) = "ppt|pps|pptx|pub|pptm|ppsx|ppsm" + MSFilterName(2,1) = "impress8|impress8|impress8|impress8|impress8|impress8|impress8" + MSFilterName(2,2) = "odp|odp|odp|odp|odp|odp|odp" + MSFilterName(2,3) = sMSDocumentCheckBox(2) + MSFilterName(2,4) = "PowerPoint/Publisher" + + MSFilterName(3,0) = "dot|dotx|dotm" + MSFilterName(3,1) = "writer8_template|writer8_template|writer8_template" + MSFilterName(3,2) = "ott|ott|ott" + MSFilterName(3,3) = sMSTemplateCheckBox(0) + MSFilterName(3,4) = "Word" + + MSFilterName(4,0) = "xlt|xltx|xltm" + MSFilterName(4,1) = "calc8_template|calc8_template|calc8_template" + MSFilterName(4,2) = "ots|ots|ots" + MSFilterName(4,3) = sMSTemplateCheckBox(1) + MSFilterName(4,4) = "Excel" + + MSFilterName(5,0) = "pot|potx|potm" + MSFilterName(5,1) = "impress8_template|impress8_template|impress8_template" + MSFilterName(5,2) = "otp|otp|otp" + MSFilterName(5,3) = sMSTemplateCheckBox(2) + MSFilterName(5,4) = "PowerPoint" +End Sub + + +Function CheckControlPath(oCheckbox as Object, oTextBox as Object, ByVal bDoEnable as Boolean) +Dim sPath as String + If Not bDoEnable Then + CheckControlPath = False + ElseIf oCheckbox.State = 0 Then + CheckControlPath = True + Else + sPath = ConvertToUrl(Trim(oTextBox.Text)) + CheckControlPath = oUcb.Exists(sPath) + End If +End Function + + +Function CheckInputPaths() as Boolean +Dim bChangePage as Boolean + bChangePage = CheckTextBoxPath(ImportDialog.txtTemplateImportPath, True, False, sTitle, False) + bChangePage = CheckTextBoxPath(ImportDialog.txtTemplateExportPath, bChangePage, True, sTitle, False) + bChangePage = CheckTextBoxPath(ImportDialog.txtDocumentImportPath, bChangePage, False, sTitle, False) + bChangePage = CheckTextBoxPath(ImportDialog.txtDocumentExportPath, bChangePage, True, sTitle, False) + CheckInputPaths = bChangePage +End Function + + +Function CheckTextBoxPath(oTextBox as Object, ByVal bCheck as Boolean, bCreateNew as Boolean, sTitle as String, bgetResources as Boolean) as Boolean +Dim iCreate as Integer +Dim sQueryMessage as String +Dim sUrlPath as String +Dim sMessageNoDir as String +Dim sShowPath as String +Dim oLocUcb as Object + oLocUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + If bGetResources Then + If InitResources("ImportWizard") then + sNoDirCreation = GetResText("NoDirCreation") + sMsgDirNotThere = GetResText("MsgDirNotThere") + sQueryForNewCreation = GetResText("QueryfornewCreation") + Else + CheckTextBoxPath() = False + Exit Function + End If + End If + If oTextBox.Enabled Then + If bCheck Then + sShowPath = oTextBox.Text + sUrlPath = ConvertToUrl(sShowPath) + If Not oLocUcb.Exists(sUrlPath) Then + If Not bCreateNew Then + ' Sourcedirectories must be existing, Targetdirectories may be created new + sQueryMessage = ReplaceString(sMsgDirNotThere, sShowPath,"%1") + Msgbox(sQueryMessage,16,sTitle) + CheckTextBoxPath() = False + Exit Function + Else + sQueryMessage = ReplaceString(sMsgDirNotThere, sShowPath,"%1") + sQueryMessage = sQueryMessage & Chr(13) & sQueryForNewCreation + iCreate = Msgbox (sQueryMessage, 36, sTitle) + If iCreate = 6 Then + On Local Error Goto NOVALIDPATH + CreateFolder(sUrlPath) + If Not oLocUcb.Exists(sUrlPath) Then + Goto NOVALIDPATH + End If + Else + CheckTextBoxPath() = False + Exit Function + End If + End If + End If + CheckTextBoxPath() = True + Else + CheckTextBoxPath() = False + End If + Else + CheckTextBoxPath() = True + End If + Exit Function +NOVALIDPATH: + sMessageNoDir = ReplaceString(sNoDirCreation, sShowPath, "%1") + Msgbox(sMessageNoDir, 16, sTitle) + CheckTextBoxPath() = False +End Function + + +Sub InitializeProgressPage(oDialog as Object) + oDialog.LabelRetrieval.FontWeight = com.sun.star.awt.FontWeight.NORMAL + oDialog.LabelCurProgress.FontWeight = com.sun.star.awt.FontWeight.BOLD +End Sub + + +Sub SetProgressDisplay(AbsFound as Integer) + ImportDialog.LabelRetrieval.Label = sProgressPage_2 & " " & ReplaceString(sProgressPage_5, Str(AbsFound) & " ", "%1") + ImportDialog.LabelCurDocumentRetrieval.Label = sProgressFound & " " & CStr(AbsDocuFound) & " " & sProgressMoreDocs + ImportDialog.LabelCurTemplateRetrieval.Label = sProgressFound & " " & CStr(AbsTemplateFound) & " " & sProgressMoreTemplates +End Sub + +Sub TakoverFolderName(aEvent as Object) +Dim RefControlName as String +Dim oRefControl + RefControlName = aEvent.Source.Model.Tag + oRefControl = ImportDialogArea.GetControl(RefControlName) + GetFolderName(oRefControl.Model) + ToggleNextButton() +End Sub + + +Sub FinalizeDialogButtons() + ImportDialog.cmdShowLogFile.Enabled = ((Isnull(oLogDocument) = False) And (ImportDialog.chkLogfile.State = 1)) + ImportDialog.cmdCancel.Enabled = False + ImportDialog.cmdGoOn.Label = sCloseButton + ImportDialog.cmdGoOn.Enabled = True +End Sub +</script:module> diff --git a/wizards/source/importwizard/FilesModul.xba b/wizards/source/importwizard/FilesModul.xba new file mode 100644 index 000000000..cfac77dfe --- /dev/null +++ b/wizards/source/importwizard/FilesModul.xba @@ -0,0 +1,783 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="FilesModul" script:language="StarBasic">Option Explicit + +Public AbsTemplateFound as Integer +Public AbsDocuFound as Integer +Public oLogDocument as Object +Public oLogTable as Object +Public bLogExists as Boolean +Public sComment as String +Public MaxCollectIndex as Integer +Public bInsertRow as Boolean +Public sLogUrl as String +Public sCurPassWord as String +Public FileCount as Integer +Public XMLTemplateCount as Integer +Public PathCollection(7,3) as String +Public bIsFirstLogTable as Boolean + + +Function ReadCollectionPaths(FilesList() as String, sFilterName() as String) +Dim FilterIndex as Integer +Dim bRecursive as Boolean +Dim SearchDir as String +Dim i as Integer +Dim n as Integer +Dim a as Integer +Dim s as Integer +Dim t as Integer +Dim sFileContent() as String +Dim NewList(0,1) as String +Dim Index as Integer +Dim CurFileName as String +Dim CurExtension as String +Dim CurFileContent as String +Dim XMLTemplateContentList() as String +Dim bIsTemplatePath as Boolean +Dim MaxIndex as Integer +Dim NewContentList() as String +Dim XMLTemplateContentString as String +Dim ApplIndex as Integer +Dim bAssignFileName as Boolean +Dim bInterruptSearch as Boolean + bInterruptSearch = False + For i = 0 To MaxCollectIndex + SearchDir = PathCollection(i,0) + bRecursive = PathCollection(i,1) + sFileContent() = ArrayoutofString(PathCollection(i,2), "|") + NewList() = ReadDirectories(SearchDir, bRecursive, False, False, sFileContent(), "") + If InterruptProcess Then + ReadCollectionPaths() = False + Exit Function + End If + If Ubound(NewList()) > -1 Then + bIsTemplatePath = FieldInList("vor", sFileContent) + If bIsTemplatePath Then + XMLTemplateContentString = PathCollection(i,3) + XMLTemplateContentList() = ArrayoutofString(XMLTemplateContentString, "|") + If Ubound(XMLTemplateContentList()) > -1 Then + MaxIndex = Ubound(NewList()) + ReDim Preserve NewList(MaxIndex, 1) as String + ReDim Preserve NewContentList(MaxIndex) as String + a = -1 + For n = 0 To MaxIndex + bAssignFileName = True + If InterruptProcess() Then + ReadCollectionPaths() = False + Exit Function + End If + CurFileContent = "" + CurFileName = NewList(n,0) + If (FieldInList(NewList(n,1), XMLTemplateList())) Then + CurFileContent = GetRealFileContent(CurFileName) + t = SearchArrayforPartString(CurFileContent, XMLTemplateContentList()) + bAssignFileName = (t > -1) + If bAssignFileName Then + CurFileContent = XMLTemplateContentList(t) + End If + NewList(n,1) = CurFileContent + End If + CurExtension = NewList(n,1) + If bAssignFileName Then + If a < n Then + a = a + 1 + NewList(a,0) = CurFileName + NewList(a,1) = CurExtension + If CurFileContent = "" Then + CurFileContent = CurExtension + End If + ApplIndex = GetApplicationIndex(CurFileContent, sFiltername()) + NewContentList(a) = ApplIndex + End If + End If + Next n + If a < MaxIndex And a > -1 Then + ReDim Preserve NewList(a, 1) as String + End If + If a > -1 Then + AddListtoFilesList(FilesList(), NewList(), NewContentList()) + End If + End If + Else + MaxIndex = Ubound(NewList()) + ReDim Preserve NewContentList(MaxIndex) as String + For s = 0 To MaxIndex + CurExtension = NewList(s,1) + NewContentList(s) = GetApplicationIndex(CurExtension, sFiltername()) + Next s + AddListtoFilesList(FilesList(), NewList(), NewContentList()) + End If + End If + Next i + ReadCollectionPaths() = Ubound(FilesList()) > -1 +End Function + + +Function GetApplicationIndex(CurFileContent as String, sFilterName() as String) as Integer +Dim Index as Integer +Dim i as Integer + Index = GetIndexForPartStringinMultiArray(sFilterName(), CurFileContent, 0) + If Index >= MaxApplCount Then + Index = Index - MaxApplCount + End If + For i = 0 To MaxApplCount - 1 + If Applications(i, SBAPPLKEY) = Index Then + GetApplicationIndex() = i + Exit Function + End If + Next i + GetApplicationIndex() = - 1 +End Function + + +Function InterruptProcess() as Boolean + If bCancelTask Or RetValue = 0 Then + bConversionIsRunning = False + InterruptProcess() = True + Exit Function + End if + InterruptProcess() = False +End Function + + +Sub AddCollectionPath(ApplIndex as Integer, DocIndex as Integer, RecursiveIndex as Integer, sFiltername() as String, DistIndex as Integer) + MaxCollectIndex = MaxCollectIndex + 1 + PathCollection(MaxCollectIndex, 0) = Applications(ApplIndex, DocIndex) + PathCollection(MaxCollectIndex, 1) = Applications(ApplIndex, RecursiveIndex) + AddFilterNameToPathItem(ApplIndex, MaxCollectIndex, sFiltername(), DistIndex) +End Sub + + +Function SetExtension(LocExtension) as String + if (Instr(LocExtension, "vnd.sun.xml.impress")) > 0 then + SetExtension() = "vor|sti|std" + elseif (Instr(LocExtension, "vnd.sun.xml.writer")) > 0 then + SetExtension() = "vor|stw" + elseif (Instr(LocExtension, "vnd.sun.xml.calc")) > 0 then + SetExtension() = "vor|stc" + elseif (Instr(LocExtension, "vnd.sun.xml.draw")) > 0 then + SetExtension() = "vor|std|sti" + endif +End Function + +Sub AddFilterNameToPathItem(ApplIndex as Integer, CollectIndex as Integer, sFiltername() as String, DistIndex as Integer) +Dim iKey as Integer +Dim CurListString as String +Dim LocExtension as String +Dim LocContentString as String +Dim LocXMLTemplateContent as String + iKey = Applications(ApplIndex, SBAPPLKEY) + CurListString = PathCollection(CollectIndex, 2) + LocExtension = sFilterName(iKey +DistIndex, 0) + If Instr(LocExtension, "vnd.sun.xml.") = 1 Then + LocExtension = SetExtension(LocExtension) + LocContentString = sFilterName(iKey +DistIndex, 0) + LocContentString = ReplaceString(LocContentString, "|", ";") + LocXMLTemplateContent = PathCollection(CollectIndex, 3) + If LocXMLTemplateContent = "" Then + LocXMLTemplateContent = LocContentString + Else + LocXMLTemplateContent = LocXMLTemplateContent & "|" & LocContentString + End If + PathCollection(CollectIndex, 3) = LocXMLTemplateContent + End If + If CurListString = "" Then + PathCollection(CollectIndex, 2) = LocExtension + Else + If Instr(CurListString, LocExtension) = 0 Then + PathCollection(CollectIndex, 2) = CurListString & "|" & LocExtension + End If + End If +End Sub + + +Sub CheckIfToAddPathToCollection(ApplIndex as Integer, bDoConvertIndex as Integer, DocIndex as Integer, RecursiveIndex as Integer, sFiltername() as String, DistIndex as Integer) +Dim CollectIndex as Integer +Dim bCheckDocuType as Boolean + bCheckDocuType = Applications(ApplIndex, bDoConvertIndex) + If bCheckDocuType Then + CollectIndex = GetIndexInMultiArray(PathCollection(), Applications(ApplIndex,DocIndex), 0) + If (CollectIndex >-1) Then + If Applications(ApplIndex, RecursiveIndex) <> PathCollection(CollectIndex, 1) Then + AddCollectionPath(ApplIndex, DocIndex, RecursiveIndex, sFilterName(), DistIndex) + Else + AddFilterNameToPathItem(ApplIndex, CollectIndex, sFilterName(), DistIndex) + End If + Else + AddCollectionPath(ApplIndex, DocIndex, RecursiveIndex, sFilterName(), DistIndex) + End If + End If +End Sub + + +Sub CollectPaths(sFiltername() as String) +Dim i as Integer +Dim XMLTemplateContentString as String + MaxCollectIndex = -1 + For i = 0 To ApplCount-1 + CheckIfToAddPathToCollection(i, SBDOCCONVERT, SBDOCSOURCE, SBDOCRECURSIVE, sFilterName(), 0) + Next i + XMLTemplateCount = 0 + XMLTemplateContentString = "" + For i = 0 To ApplCount-1 + CheckIfToAddPathToCollection(i, SBTEMPLCONVERT, SBTEMPLSOURCE, SBTEMPLRECURSIVE, sFilterName(), MaxApplCount) + Next i +End Sub + + +Sub ConvertAllDocuments(sFilterName() as String) +Dim FileProperties(1) as new com.sun.star.beans.PropertyValue +Dim PWFileProperties(2) as New com.sun.star.beans.PropertyValue +Dim WriterWebProperties(0) as new com.sun.star.beans.PropertyValue +Dim OpenProperties(4) as new com.sun.star.beans.PropertyValue +Dim oInteractionHandler as Object +Dim InteractionTypes(0) as Long +Dim FilesList(0,2) as String +Dim sViewPath as String +Dim i as Integer +Dim FilterIndex as Integer +Dim sSourceUrl as String +Dim CurFilename as String +Dim oDocument as Object +Dim sExtension as String +Dim OldExtension as String +Dim CurFound as Integer +Dim TotFound as Integer +Dim TargetStemDir as String +Dim SourceStemDir as String +Dim TargetDir as String +Dim sTargetUrl as String +Dim CurFilterName as String +Dim ApplIndex as Integer +Dim Index as Integer +Dim bIsDocument as Boolean +Dim bDoSave as Boolean +Dim sCurFileExists as String +Dim MaxFileIndex as Integer +Dim bContainsBasicMacro as Boolean +Dim bIsPassWordProtected as Boolean +Dim iOverwrite as Integer +Dim sMimeTypeorExtension as String +Dim sPrevMimeTypeorExtension as String + bConversionisrunning = True + InteractionTypes(0) = com.sun.star.task.PasswordRequestMode.PASSWORD_REENTER + oInteractionHandler = createUnoService("com.sun.star.task.InteractionHandler") + oInteractionHandler.initialize(InteractionTypes()) + iGeneralOverwrite = SBOVERWRITEUNDEFINED + bConversionIsRunning = True + bLogExists = false + AbsTemplateFound = 0 + AbsDocuFound = 0 + CollectPaths(sFiltername()) + If Not ReadCollectionPaths(FilesList(), sFilterName()) Then + TotFound = 0 + SetProgressDisplay(0) + bConversionisrunning = false + FinalizeDialogButtons() + Exit Sub + End If + TotFound = Ubound(FilesList()) + 1 + If FilesList(0,0) = "" Then ' Querying the number of fields in a multidimensional Array is unsecure + TotFound = 0 ' because it will return the value 0 (and not -1) even when the Array is empty + SetProgressDisplay(0) + End If + BubbleSortList(FilesList(), true) + If TotFound > 0 Then + CreateLogDocument(OpenProperties()) + InitializeProgressPage(ImportDialog) + OpenProperties(0).Name = "Hidden" + OpenProperties(0).Value = True + OpenProperties(1).Name = "AsTemplate" + OpenProperties(1).Value = False + OpenProperties(2).Name = "MacroExecutionMode" + OpenProperties(2).Value = com.sun.star.document.MacroExecMode.NEVER_EXECUTE + OpenProperties(3).Name = "UpdateDocMode" + OpenProperties(3).Value = com.sun.star.document.UpdateDocMode.NO_UPDATE + OpenProperties(4).Name = "InteractionHandler" + OpenProperties(4).Value = oInteractionHandler + MaxFileIndex = Ubound(FilesList(),1) + FileCount = 0 + For i = 0 To MaxFileIndex + sComment = "" + If InterruptProcess() Then + Exit For + End If + bDoSave = True + sSourceUrl = FilesList(i,0) + sPrevMimeTypeorExtension = sMimeTypeorExtension + sMimeTypeorExtension = FilesList(i,1) + CurFiltername = GetFilterName(sMimeTypeorExtension, sFilterName(), sExtension, FilterIndex) + ApplIndex = FilesList(i,2) + If sMimeTypeorExtension <> sPrevMimeTypeorExtension Then + CreateLogTable(ApplIndex, sMimeTypeOrExtension, sFiltername()) + End If + If ApplIndex > Ubound(Applications) or (ApplIndex < 0) Then + Msgbox "Applicationindex out of bounds:" & sSourcUrl + End If + sViewPath = ConvertFromUrl(sSourceUrl) ' CutPathView(sSourceUrl, 70) + ImportDialog.LabelCurDocument.Label = Str(i+1) & "/" & MaxFileIndex + 1 & " (" & sViewPath & ")" + Select Case lcase(sExtension) + Case "odt", "ods", "odp", "odg", "odm", "odf" + SourceStemDir = RTrimStr(Applications(ApplIndex,SBDOCSOURCE), "/") + TargetStemDir = RTrimStr(Applications(ApplIndex,SBDOCTARGET), "/") + Case Else ' Templates and Helper-Applications remain + SourceStemDir = RTrimStr(Applications(ApplIndex,SBTEMPLSOURCE), "/") + TargetStemDir = RTrimStr(Applications(ApplIndex,SBTEMPLTARGET), "/") + End Select + sTargetUrl = ReplaceString(sSourceUrl, TargetStemDir, SourceStemDir) + CurFilename = GetFileNameWithoutExtension(sTargetUrl, "/") + OldExtension = GetFileNameExtension(sTargetUrl) + sTargetUrl = RTrimStr(sTargetUrl, OldExtension) + sTargetUrl = sTargetUrl & sExtension + TargetDir = RTrimStr(sTargetUrl, CurFilename & "." & sExtension) + If (oUcb.Exists(sTargetUrl)) Then + If (iGeneralOverwrite <> SBOVERWRITEALWAYS) Then + If (iGeneralOverwrite = SBOVERWRITEUNDEFINED) Then + ShowOverwriteAllDialog(sTargetUrl, sTitle) + bDoSave = (iGeneralOverwrite = SBOVERWRITEQUERY) Or (iGeneralOverwrite = SBOVERWRITEALWAYS) + Elseif iGeneralOverwrite = SBOVERWRITENEVER Then + bDoSave = False + ElseIf ((iGeneralOverWrite = SBOVERWRITEQUERY) OR (iGeneralOverwrite = SBOVERWRITECANCEL)) Then + ' Todo: According to AS there might come a new feature that storeasUrl could possibly rise a UI dialog. + ' In this case my own UI becomes obsolete + sCurFileExists = ReplaceString(sFileExists, ConvertFromUrl(sTargetUrl), "<1>") + sCurFileExists = ReplaceString(sCurFileExists, chr(13), "<CR>") + iOverWrite = Msgbox (sCurFileExists, 32 + 3, sTitle) + Select Case iOverWrite + Case 1 ' OK + ' In the FileProperty-Bean this is already default + bDoSave = True + Case 2 ' Abort + CancelTask(False) + bDoSave = False + Case 7 ' No + bDoSave = False + End Select + End If + End If + End If + If bDoSave Then + If Not oUcb.Exists(TargetDir) Then + bDoSave = CreateFolder(TargetDir) + End If + If bDoSave Then + oDocument = StarDesktop.LoadComponentFromURL(sSourceUrl, "_default", 0, OpenProperties()) + If Not IsNull(oDocument) Then + InsertSourceUrlToLogDocument(sSourceUrl, "") + bIsPassWordProtected = CheckPassWordProtection(oDocument) + CheckIfMacroExists(oDocument.BasicLibraries, sComment) + On Local Error Goto NOSAVING + If bIsPassWordProtected Then + PWFileProperties(0).Name = "FilterName" + PWFileProperties(0).Value = CurFilterName + PWFileProperties(1).Name = "Overwrite" + PWFileProperties(1).Value = True + PWFileProperties(2).Name = "Password" + PWFileProperties(2).Value = sCurPassWord + oDocument.StoreAsUrl(sTargetUrl, PWFileProperties()) + Else + FileProperties(0).Name = "FilterName" + FileProperties(0).Value = CurFilterName + FileProperties(1).Name = "Overwrite" + FileProperties(1).Value = True + oDocument.StoreAsUrl(sTargetUrl,FileProperties()) + End If + ' Todo: Make sure that an errorbox pops up when saving fails + NOSAVING: + If Err <> 0 Then + sCurcouldnotsaveDocument = ReplaceString(scouldnotsaveDocument, ConvertFromUrl(sTargetUrl), "<1>") + sComment = ConcatComment(sComment, sCurCouldnotsaveDocument) + Resume LETSGO + LETSGO: + Else + FileCount = FileCount + 1 + End If + oDocument.Dispose() + InsertTargetUrlToLogDocument(sTargetUrl, sComment) + Else + sCurcouldnotopenDocument = ReplaceString(scouldnotopenDocument, ConvertFromUrl(sSourceUrl), "<1>") + sComment = ConcatComment(sComment, sCurCouldnotopenDocument) + InsertSourceUrlToLogDocument(sSourceUrl, sComment) + End If + End If + End If + Next i + End If + AddLogStatistics() + FinalizeDialogButtons() + bConversionIsRunning = False + Exit Sub +RTError: + Msgbox sRTErrorDesc, 16, sRTErrorHeader +End Sub + + + +Sub AddListtoFilesList(FirstList(), SecList(), NewContentList() as String) +Dim sLocExtension as String +Dim FirstStart as Integer +Dim FirstEnd as Integer +Dim i as Integer +Dim s as Integer + If FirstList(0,0) = "" Then + FirstStart = Ubound(FirstList(),1) + Else + FirstStart = Ubound(FirstList(),1) + 1 + End If + FirstEnd = FirstStart + Ubound(SecList(),1) + ReDim Preserve FirstList(FirstEnd,2) + s = 0 + For i = FirstStart To FirstEnd + FirstList(i,0) = SecList(s,0) + FirstList(i,1) = SecList(s,1) + sLocExtension = lcase(FirstList(i,1)) + Select Case sLocExtension + Case "sdw", "sdc", "sda", "sdd", "smf", "sgl", "doc", "docx", "docm", "xls", "xlsx", "xlsm", "ppt", "pps", "pptx", "pptm", "ppsx", "ppsm", "pub", "sxi", "sxw", "sxd", "sxg", "sxm", "sxc" + AbsDocuFound = AbsDocuFound + 1 + Case else + AbsTemplateFound = AbsTemplateFound + 1 + End Select + FirstList(i,2) = CStr(NewContentList(s)) + s = s + 1 + Next i + SetProgressDisplay(Ubound(FirstList()) + 1) +End Sub + + + +Function GetTargetTemplatePath(Index as Integer) + Select Case WizardMode + Case SBMICROSOFTMODE + GetTargetTemplatePath() = SOTemplatePath & "/" & sTemplateGroupName + End Select +End Function + + +' Retrieves the second value for a next to 'SearchString' in +' a two-dimensional string-Array +Function GetFilterName(sMimetypeorExtension as String, sFilterName(), sExtension as string, FilterIndex as Integer) as String +Dim i as Integer +Dim MaxIndex as Integer +Dim sLocFilterlist() as String + For i = 0 To Ubound(sFiltername(),1) + If Instr(1,sFilterName(i,0),sMimeTypeOrExtension) <> 0 Then + sLocFilterList() = ArrayoutofString(sFiltername(i,0),"|", MaxIndex) + If MaxIndex = 0 Then + sExtension = sFiltername(i,2) + GetFilterName = sFilterName(i,1) + Else + Dim b as Integer + Dim sLocExtensionList() as String + b = SearchArrayForPartString(sMimetypeOrExtension, sLocFilterList()) + sLocFilterList() = ArrayoutofString(sFiltername(i,1),"|", MaxIndex) + GetFilterName = sLocFilterList(b) + sLocExtensionList() = ArrayoutofString(sFilterName(i,2), "|", MaxIndex) + sExtension = sLocExtensionList(b) + End If + Exit For + End If + Next + FilterIndex = i +End Function + + +Function SearchArrayforPartString(SearchString as String, LocList()) as Integer +Dim i as Integer +Dim a as Integer +Dim StringList() as String + For i = Lbound(LocList(),1) to Ubound(LocList(),1) + StringList() = ArrayoutofString(LocList(i), "|") + For a = 0 To Ubound(StringList()) + If (Instr(1, SearchString, StringList(a)) <> 0) Then + SearchArrayForPartString() = i + Exit Function + End If + Next a + Next i + SearchArrayForPartString() = -1 +End Function + + +Sub CreateLogTable(ApplIndex as Integer, CurFileContent as String, sFilterName() as String) +Dim oLogCursor as Object +Dim oLogRows as Object +Dim FilterIndex as Integer +Dim sDocumentType as String +Dim oTextCursor +Dim oCell + If Not bLogExists Then + Exit Sub + End If + FilterIndex = GetIndexForPartStringinMultiArray(sFilterName(), CurFileContent, 0) + sDocumentType = sFiltername(FilterIndex,3) + oLogCursor = oLogDocument.Text.createTextCursor() + oLogCursor.GotoEnd(False) + If Not bIsFirstLogTable Then + oLogDocument.Text.insertControlCharacter(oLogCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) + Else + bisFirstLogTable = False + End If + oLogCursor.HyperLinkURL = "" + oLogCursor.HyperLinkName = "" + oLogCursor.HyperLinkTarget = "" + oLogCursor.ParaStyleName = "Heading 1" + oLogCursor.setString(sDocumentType) + oLogCursor.CollapsetoEnd() + oLogDocument.Text.insertControlCharacter(oLogCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) + oLogTable = oLogDocument.CreateInstance("com.sun.star.text.TextTable") + oLogTable.RepeatHeadline = true + oLogCursor.Text.InsertTextContent(oLogCursor, oLogTable, True) + oTextCursor = oLogTable.GetCellbyPosition(0,0).createTextCursor() + oTextCursor.SetString(sSourceDocuments) + oTextCursor = oLogTable.GetCellbyPosition(1,0).createTextCursor() + oTextCursor.SetString(sTargetDocuments) + bInsertRow = False +End Sub + + +Function GetSize(iWidth, iHeight) As New com.sun.star.awt.Size +Dim aSize As New com.sun.star.awt.Size + aSize.Width = iWidth + aSize.Height = iHeight + GetSize() = aSize +End Function + + +Sub InsertCommandButtonatViewCursor(oLocDocument, oLocCursor, TargetUrl as String, Optional aSize) +Dim oDocument +Dim oController +Dim oCommandButton +Dim oShape +Dim oDrawPage +Dim oCommandControl +Dim oEvent +Dim oCell + oCommandButton = oLocDocument.createInstance("com.sun.star.form.component.CommandButton") + oShape = oLocDocument.CreateInstance ("com.sun.star.drawing.ControlShape") + If IsMissing(aSize) Then + oShape.Size = GetSize(4000, 600) + End If + oCommandButton.Label = FileNameoutofPath(Targeturl) + oCommandButton.TargetFrame = "_default" + oCommandButton.ButtonType = com.sun.star.form.FormButtonType.URL + oCommandbutton.DispatchUrlInternal = True + oCommandButton.TargetURL = ConverttoUrl(TargetUrl) + oShape.Control = oCommandbutton + oLocCursor.Text.InsertTextContent(oLocCursor, oShape, True) +End Sub + + + +Sub CreateLogDocument(HiddenProperties()) +Dim OpenProperties(0) as new com.sun.star.beans.PropertyValue +Dim NoArgs() +Dim i as Integer +Dim bLogIsThere as Boolean + If ImportDialog.chkLogfile.State = 1 Then + i = 2 + OpenProperties(0).Name = "Hidden" + OpenProperties(0).Value = True + oLogDocument = StarDesktop.LoadComponentFromURL("private:factory/swriter", "_default", 4, OpenProperties()) + SOWorkPath = RTrimStr(SOWorkPath,"/") + sLogUrl = SOWorkPath & "/Logfile.odt" + Do + bLogIsThere = oUcb.Exists(sLogUrl) + If bLogIsThere Then + If i = 2 Then + sLogUrl = ReplaceString(sLogUrl, "/Logfile_2.odt", "/Logfile.odt") + Else + sLogUrl = ReplaceString(sLogUrl, "/Logfile_" & cStr(i) & ".odt", "/Logfile_" & cStr(i-1) & ".odt") + End If + i = i + 1 + End If + Loop Until Not bLogIsThere + bLogExists = True + oLogDocument.StoreAsUrl(sLogUrl, NoArgs()) + End If +End Sub + + +Sub InsertTargetUrlToLogDocument(sTargetUrl as String, sComment as String) +Dim oCell +Dim oTextCursor +Dim CurFilterTracingpath as String + If (bLogExists) And (sTargetUrl <> "") Then + If sTargetUrl <> "" Then + oCell = oLogTable.GetCellbyPosition(1,oLogTable.Rows.Count-1) + InsertCommentToLogCell(sComment, oCell) + InsertHyperLinkToLogCell(sTargetUrl, oCell) + oLogDocument.Store() + End If + End If +End Sub + + +Sub InsertSourceUrlToLogDocument(SourceUrl as String, sComment) ' +Dim oCell as Object + If bLogExists Then + If bInsertRow Then + oLogTable.Rows.InsertByIndex(oLogTable.Rows.Count,1) + Else + bInsertRow = True + End If + oCell = oLogTable.GetCellbyPosition(0,oLogTable.Rows.Count-1) + InsertCommentToLogCell(sComment, oCell) + InsertHyperLinkToLogCell(SourceUrl, oCell) + oLogDocument.Store() + End If +End Sub + + +Sub InsertHyperLinkToLogCell(sUrl as String, oCell as Object) +Dim oLogCursor as Object +Dim LocFileName as String + oLogCursor = oCell.createTextCursor() + oLogCursor.CollapseToStart() + oLogCursor.HyperLinkURL = sUrl + oLogCursor.HyperLinkName = sUrl + oLogCursor.HyperLinkTarget = sUrl + LocFileName = FileNameOutOfPath(sUrl) + oCell.InsertString(oLogCursor, LocFileName,False) +End Sub + + +Sub InsertCommentToLogCell(sComment as string, oCell as Object) +Dim oCommentCursor as Object + If sComment <> "" Then + oCommentCursor = oCell.createTextCursor() + oCell.insertControlCharacter(oCommentCursor, com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False) + oCell.insertString(oCommentCursor, sComment, false) + End If +End Sub + + +Sub AddLogStatistics() +Dim oCell as Object +Dim oLogCursor as Object +Dim MaxRowIndex as Integer + If bLogExists Then + MaxRowIndex = oLogTable.Rows.Count + sLogSummary = ReplaceString(sLogSummary, FileCount, "<COUNT>") +' oLogTable.Rows.InsertByIndex(MaxRowIndex, 1) +' oCell = oLogTable.GetCellbyPosition(0, MaxRowIndex) +' oLogCursor = oCell.createTextCursor() +' oCell.InsertString(oLogCursor, sLogSummary,False) +' MergeRange(oLogTable, oCell, 1) + + oLogCursor = oLogDocument.Text.CreateTextCursor + oLogCursor.gotoEnd(False) + oLogCursor.HyperLinkURL = "" + oLogCursor.HyperLinkName = "" + oLogCursor.HyperLinkTarget = "" + oLogCursor.SetString(sLogSummary) + oLogDocument.Store() + oLogDocument.Dispose() + bLogExists = False + End If +End Sub + + + +Function CheckIfMacroExists(oBasicLibraries as Object, sComment as String) as Boolean +Dim ModuleNames() as String +Dim ModuleName as String +Dim MaxLibIndex as Integer +Dim MaxModuleIndex as Integer +Dim bMacroExists as Boolean +Dim n as Integer +Dim m as Integer +Dim LibName as String +Dim sBasicCode as String +Dim oLibrary as Object + bMacroExists = False + bMacroExists = oBasicLibraries.hasElements + If bMacroExists Then + MaxLibIndex = Ubound(oBasicLibraries.ElementNames()) + For n = 0 To MaxLibIndex + LibName = oBasicLibraries.ElementNames(n) + If oBasicLibraries.isLibraryLoaded(LibName) Then + oLibrary = oBasicLibraries.getbyName(LibName) + If oLibrary.hasElements() Then + MaxModuleIndex = Ubound(oLibrary.ElementNames()) + For m = 0 To MaxModuleIndex + ModuleName = oLibrary.ElementNames(m) + sBasicCode = oLibrary.getbyName(ModuleName) + If sBasicCode <> "" Then + ConcatComment(sComment, sReeditMacro) + CheckIfMacroExists() = True + Exit Function + End If + Next m + End If + End If + Next n + End If + CheckIfMacroExists() = False +End Function + + + +Function CheckPassWordProtection(oDocument as Object) +Dim bIsPassWordProtected as Boolean +Dim i as Integer +Dim oArgs() +Dim MaxIndex as Integer +Dim sblabla as String + bIsPassWordProtected = false + oArgs() = oDocument.getArgs() + MaxIndex = Ubound(oArgs()) + For i = 0 To MaxIndex + sblabla = oArgs(i).Name + If oArgs(i).Name = "Password" Then + bIsPassWordProtected = True + sCurPassWord = oArgs(i).Value + Exit For + End If + Next i + CheckPassWordProtection() = bIsPassWordProtected +End Function + + +Sub OpenLogDocument() + + bShowLogFile = True + ImportDialogArea.endexecute() + +End Sub + + +Sub MergeRange(oTable as Object, oCell as Object, MergeCount as Integer) +Dim oTableCursor as Object + oTableCursor = oTable.createCursorByCellName(oCell.CellName) + oTableCursor.goRight(MergeCount, True) + oTableCursor.mergeRange() +End Sub + + +Function ConcatComment(sComment as String, AdditionalComment as String) + If sComment = "" Then + sComment = AdditionalComment + Else + sComment = sComment & chr(13) + AdditionalComment + End If + ConcatComment = sComment +End Function +</script:module> diff --git a/wizards/source/importwizard/ImportDialog.xdl b/wizards/source/importwizard/ImportDialog.xdl new file mode 100644 index 000000000..1f3fc71ff --- /dev/null +++ b/wizards/source/importwizard/ImportDialog.xdl @@ -0,0 +1,97 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="ImportDialog" dlg:left="96" dlg:top="28" dlg:width="270" dlg:height="210" dlg:page="4" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_DIALOG" dlg:closeable="true" dlg:moveable="true" dlg:title="ImportDialog"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblTemplateExport" dlg:tab-index="0" dlg:left="12" dlg:top="94" dlg:width="60" dlg:height="8" dlg:page="2" dlg:value="lblTemplateExport"/> + <dlg:textfield dlg:id="txtTemplateImportPath" dlg:tab-index="1" dlg:left="73" dlg:top="76" dlg:width="170" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_LBTEMPLATEPATH"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleNextButton?language=Basic&location=application" script:language="Script"/> + </dlg:textfield> + <dlg:textfield dlg:id="txtTemplateExportPath" dlg:tab-index="2" dlg:left="73" dlg:top="92" dlg:width="170" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_EDTEMPLATEPATH"/> + <dlg:checkbox dlg:id="chkDocumentPath" dlg:tab-index="3" dlg:left="12" dlg:top="121" dlg:width="240" dlg:height="10" dlg:page="2" dlg:tag="Document" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENT" dlg:value="chkDocumentPath" dlg:checked="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.ToggleInputPaths?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:checkbox dlg:id="chkDocumentSearchSubDir" dlg:tab-index="4" dlg:left="12" dlg:top="134" dlg:width="240" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CBDOCUMENTRECURSE" dlg:value="chkDocumentSearchSubDir" dlg:checked="false"/> + <dlg:text dlg:id="lblDocumentImport" dlg:tab-index="5" dlg:left="10" dlg:top="151" dlg:width="60" dlg:height="8" dlg:page="2" dlg:value="lblDocumentImport"/> + <dlg:text dlg:id="lblDocumentExport" dlg:tab-index="6" dlg:left="10" dlg:top="167" dlg:width="60" dlg:height="8" dlg:page="2" dlg:value="lblDocumentExport"/> + <dlg:textfield dlg:id="txtDocumentImportPath" dlg:tab-index="7" dlg:left="73" dlg:top="149" dlg:width="170" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_LBDOCUMENTPATH"> + <script:event script:event-name="on-textchange" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleNextButton?language=Basic&location=application" script:language="Script"/> + </dlg:textfield> + <dlg:textfield dlg:id="txtDocumentExportPath" dlg:tab-index="8" dlg:left="73" dlg:top="165" dlg:width="170" dlg:height="12" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_EDDOCUMENTPATH"/> + <dlg:text dlg:id="SummaryHeaderLabel" dlg:tab-index="9" dlg:left="6" dlg:top="37" dlg:width="258" dlg:height="8" dlg:page="3" dlg:value="SummaryHeaderLabel"/> + <dlg:textfield dlg:id="SummaryTextbox" dlg:tab-index="10" dlg:left="5" dlg:top="48" dlg:width="259" dlg:height="125" dlg:page="3" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_3_TBSUMMARY" dlg:vscroll="true" dlg:multiline="true" dlg:readonly="true"/> + <dlg:text dlg:id="LabelRetrieval" dlg:tab-index="11" dlg:left="10" dlg:top="67" dlg:width="255" dlg:height="8" dlg:page="4" dlg:value="LabelRetrieval"/> + <dlg:text dlg:id="LabelCurTemplateRetrieval" dlg:tab-index="12" dlg:left="15" dlg:top="79" dlg:width="249" dlg:height="8" dlg:page="4" dlg:value="LabelCurTemplateRetrieval"/> + <dlg:text dlg:id="LabelCurDocumentRetrieval" dlg:tab-index="13" dlg:left="15" dlg:top="91" dlg:width="249" dlg:height="8" dlg:page="4" dlg:value="LabelCurDocumentRetrieval"/> + <dlg:text dlg:id="LabelCurProgress" dlg:tab-index="14" dlg:left="10" dlg:top="106" dlg:width="255" dlg:height="8" dlg:page="4" dlg:value="LabelCurProgress"/> + <dlg:text dlg:id="LabelCurDocument" dlg:tab-index="15" dlg:left="15" dlg:top="118" dlg:width="249" dlg:height="20" dlg:page="4" dlg:value="LabelCurDocument" dlg:multiline="true"/> + <dlg:img dlg:id="ImportPreview" dlg:tab-index="16" dlg:left="6" dlg:top="6" dlg:width="258" dlg:height="26" dlg:scale-image="false"/> + <dlg:button dlg:id="cmdBack" dlg:tab-index="17" dlg:left="155" dlg:top="190" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_0_CMDPREV" dlg:value="cmdBack"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.Main.PrevStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="18" dlg:left="6" dlg:top="190" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_0_CMDCANCEL" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.Main.CancelTask?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdHelp" dlg:tab-index="19" dlg:left="65" dlg:top="190" dlg:width="50" dlg:height="14" dlg:value="cmdHelp" dlg:button-type="help"/> + <dlg:button dlg:id="cmdGoOn" dlg:tab-index="20" dlg:left="214" dlg:top="190" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_0_CMDNEXT" dlg:value="cmdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.Main.NextStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="WelcomeTextLabel" dlg:tab-index="21" dlg:left="6" dlg:top="38" dlg:width="258" dlg:height="20" dlg:page="1" dlg:value="WelcomeTextLabel" dlg:multiline="true"/> + <dlg:text dlg:id="WelcomeTextLabel3" dlg:tab-index="22" dlg:left="6" dlg:top="58" dlg:width="258" dlg:height="12" dlg:page="1" dlg:value="WelcomeTextLabel3"/> + <dlg:button dlg:id="cmdTemplateImport" dlg:tab-index="23" dlg:left="248" dlg:top="75" dlg:width="14" dlg:height="14" dlg:page="2" dlg:tag="txtTemplateImportPath" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.TakoverFolderName?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdTemplateExport" dlg:tab-index="24" dlg:left="248" dlg:top="91" dlg:width="14" dlg:height="14" dlg:page="2" dlg:tag="txtTemplateExportPath" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CMDTEMPLATEPATHSELECT2" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.TakoverFolderName?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdDocumentImport" dlg:tab-index="25" dlg:left="248" dlg:top="148" dlg:width="14" dlg:height="14" dlg:page="2" dlg:tag="txtDocumentImportPath" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.TakoverFolderName?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdDocumentExport" dlg:tab-index="26" dlg:left="248" dlg:top="164" dlg:width="14" dlg:height="14" dlg:page="2" dlg:tag="txtDocumentExportPath" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CMDDOCUMENTPATHSELECT2" dlg:value="..."> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.TakoverFolderName?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:radiogroup> + <dlg:radio dlg:id="optMSDocuments" dlg:tab-index="27" dlg:left="6" dlg:top="72" dlg:width="258" dlg:height="9" dlg:page="1" dlg:tag="MS" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_0_OPTMSDOCUMENTS" dlg:value="optMSDocuments" dlg:checked="true"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleCheckboxes?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:checkbox dlg:id="chkMSApplication1" dlg:tab-index="29" dlg:disabled="true" dlg:left="12" dlg:top="85" dlg:width="141" dlg:height="9" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CHKWORD" dlg:value="chkMSApplication1" dlg:checked="false"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleNextButton?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:checkbox dlg:id="chkMSApplication2" dlg:tab-index="30" dlg:disabled="true" dlg:left="155" dlg:top="85" dlg:width="109" dlg:height="9" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CHKEXCEL" dlg:value="chkMSApplication2" dlg:checked="false"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleNextButton?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:checkbox dlg:id="chkMSApplication3" dlg:tab-index="31" dlg:disabled="true" dlg:left="12" dlg:top="98" dlg:width="141" dlg:height="9" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CHKPOWERPOINT" dlg:value="chkMSApplication3" dlg:checked="false"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:ImportWizard.Main.ToggleNextButton?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:checkbox dlg:id="chkTemplatePath" dlg:tab-index="36" dlg:left="12" dlg:top="48" dlg:width="240" dlg:height="10" dlg:page="2" dlg:tag="Template" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATE" dlg:value="chkTemplatePath" dlg:checked="true"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:ImportWizard.DialogModul.ToggleInputPaths?language=Basic&location=application" script:language="Script"/> + </dlg:checkbox> + <dlg:checkbox dlg:id="chkTemplateSearchSubDir" dlg:tab-index="37" dlg:left="12" dlg:top="61" dlg:width="240" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_2_CBTEMPLATERECURSE" dlg:value="chkTemplateSearchSubDir" dlg:checked="false"/> + <dlg:text dlg:id="lblTemplateImport" dlg:tab-index="38" dlg:left="12" dlg:top="78" dlg:width="60" dlg:height="8" dlg:page="2" dlg:value="lblTemplateImport"/> + <dlg:checkbox dlg:id="chkLogfile" dlg:tab-index="39" dlg:left="6" dlg:top="171" dlg:width="136" dlg:height="9" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGIMPORT_0_CHKLOGFILE" dlg:value="chkLogfile" dlg:checked="true"/> + <dlg:fixedline dlg:id="hlnTemplates" dlg:tab-index="40" dlg:left="6" dlg:top="37" dlg:width="258" dlg:height="8" dlg:page="2" dlg:value="hlnTemplates"/> + <dlg:fixedline dlg:id="hlnDocuments" dlg:tab-index="41" dlg:left="6" dlg:top="110" dlg:width="258" dlg:height="8" dlg:page="2" dlg:value="hlnDocuments"/> + <dlg:fixedline dlg:id="FixedLine1" dlg:tab-index="42" dlg:left="6" dlg:top="181" dlg:width="258" dlg:height="6"/> + <dlg:fixedline dlg:id="hlnProgress" dlg:tab-index="43" dlg:left="6" dlg:top="55" dlg:width="258" dlg:height="8" dlg:page="4" dlg:value="hlnProgress"/> + <dlg:button dlg:id="cmdShowLogFile" dlg:tab-index="44" dlg:disabled="true" dlg:left="75" dlg:top="142" dlg:width="120" dlg:height="14" dlg:page="4" dlg:value="cmdShowLogFile"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:ImportWizard.FilesModul.OpenLogDocument?language=Basic&location=application" script:language="Script"/> + </dlg:button> + </dlg:bulletinboard> +</dlg:window> diff --git a/wizards/source/importwizard/Language.xba b/wizards/source/importwizard/Language.xba new file mode 100644 index 000000000..bd890ed63 --- /dev/null +++ b/wizards/source/importwizard/Language.xba @@ -0,0 +1,150 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Language" script:language="StarBasic">Option Explicit + +Public sMSTemplateCheckbox(2) As String +Public sMSDocumentCheckbox(2) As String +Public sTemplateCheckbox(SBMAXAPPLCOUNT-1) As String +Public sDocumentCheckbox(SBMAXAPPLCOUNT-1) As String +Public sTemplateGroupName As String +Public sSearchInSubDir as String +Public sPathErrorTemplates(SBMAXAPPLCOUNT-1) As String +Public sPathErrorDocument(SBMAXAPPLCOUNT-1) As String +Public sPathErrorStarDoc(SBMAXAPPLCOUNT-1) As String +Public sStarDocLabel(SBMAXAPPLCOUNT-1) As String +Public sImportLabel As String, sExportLabel As String +Public SOApplicationName(5) As String +Public sHelpButton As String, sCancelButton As String, sBackButton As String, sNextButton As String +Public sSumInclusiveSubDir As String, sSumSaveDocuments As String +Public sSummaryHeader As String +Public sWelcometextLabel1 As String, sWelcometextLabel3 As String +Public sBeginButton As String, sMsgDirNotThere As String +Public sQueryForNewCreation As String, sPathError3 As String +Public sNoDirCreation As String +Public sProgressMoreDocs As String, sProgressMoreTemplates as String +Public sFileExists As String, sMorePathsError3 As String +Public sConvertError1 As String, sConvertError2 As String, sPathDialogMessage As String +Public sRTErrorDesc As String, sRTErrorHeader As String +Public sProgressPage_1 As String, sProgressPage_2 As String, sProgressPage_3 as String +Public sProgressFound as String, sProgresspage_5 as String +Public sContainerName(1) as String +Public sReady as String, sTitle as String +Public sCloseButton as String +Public sSourceDocuments as String +Public sTargetDocuments as String +Public sSumMSDocuments(3) as String +Public sSumMSTemplates(3) as String +Public ModuleList(3) as String +Public sLogSummary as String +Public sReeditMacro as String +Public sOverwriteallFiles as String +Public sCouldnotopenDocument as String +Public sCurcouldnotopenDocument as String +Public sCouldnotsaveDocument as String +Public sCurcouldnotsaveDocument as String + + +Sub LoadLanguage() + If InitResources("ImportWizard") then + sHelpButton = GetResText("HelpButton") + sCancelButton = GetResText("CancelButton") + sBackButton = GetResText("BackButton") + sNextButton = GetResText("NextButton") + sBeginButton = GetResText("BeginButton") + sCloseButton = GetResText("CloseButton") + + sWelcometextLabel1 = ReplaceString(GetResText("WelcometextLabel1"), GetProductName(),"%PRODUCTNAME") + sWelcometextLabel3 = GetResText("WelcometextLabel3") + + ' Microsoft Documents + sMSTemplateCheckBox(0) = GetResText("MSTemplateCheckbox_1_") + sMSTemplateCheckBox(1) = GetResText("MSTemplateCheckbox_2_") + sMSTemplateCheckBox(2) = GetResText("MSTemplateCheckbox_3_") + + ' DocumentCheckbox- Captions + sMSDocumentCheckBox(0) = GetResText("MSDocumentCheckbox_1_") + sMSDocumentCheckBox(1) = GetResText("MSDocumentCheckbox_2_") + sMSDocumentCheckBox(2) = GetResText("MSDocumentCheckbox_3_") + + 'StarOffice Applicationnames + + sContainerName(0) = GetResText("MSContainerName") + + sSummaryHeader = GetResText("SummaryHeader") + + sTemplateGroupName = GetResText("GroupnameDefault") + + sProgressMoreDocs = GetResText("ProgressMoreDocs") + sProgressMoreTemplates = GetResText("ProgressMoreTemplates") + sNoDirCreation = GetResText("NoDirCreation") + sMsgDirNotThere = GetResText("MsgDirNotThere") + sQueryForNewCreation = GetResText("QueryfornewCreation") + sFileExists = GetResText("FileExists") + sMorePathsError3 = GetResText("MorePathsError3") + sConvertError1 = GetResText("ConvertError1") + sConvertError2 = GetResText("ConvertError2") + sRTErrorDesc = GetResText("RTErrorDesc") + sRTErrorHeader = GetResText("RTErrorHeader") + sOverwriteallFiles = GetResText("OverwriteallFiles") + sReeditMacro = GetResText("ReeditMacro") + sCouldnotsaveDocument = GetResText("CouldNotsaveDocument") + sCouldnotopenDocument = GetResText("CouldNotopenDocument") + sPathDialogMessage = GetResText("PathDialogMessage") + sTitle = GetResText("DialogTitle") + + sProgressPage_1 = GetResText("ProgressPage1") + sProgressPage_2 = GetResText("ProgressPage2") + sProgressPage_3 = GetResText("ProgressPage3") + sProgressFound = GetResText("ProgressFound") + sProgressPage_5 = GetResText("ProgressPage5") + sReady = GetResText("Ready") + sSourceDocuments = GetResText("SourceDocuments") + sTargetDocuments = GetResText("TargetDocuments") + sLogSummary = GetResText("LogfileSummary") + sSumInclusiveSubDir = GetResText("SumInclusiveSubDir") + sSumSaveDocuments = GetResText("SumSaveDokumente") + sSumMSDocuments(0) = GetResText("SumMSTextDocuments") + sSumMSDocuments(1) = GetResText("SumMSTableDocuments") + sSumMSDocuments(2) = GetResText("SumMSDrawDocuments") + sSumMSTemplates(0) = GetResText("SumMSTextTemplates") + sSumMSTemplates(1) = GetResText("SumMSTableTemplates") + sSumMSTemplates(2) = GetResText("SumMSDrawTemplates") + With ImportDialog + sImportLabel = GetResText("TextImportLabel") + sExportLabel = GetResText("TextExportLabel") + sSearchInSubDir = GetResText("SearchInSubDir") + .chkTemplateSearchSubDir.Label = sSearchInSubDir + .lblDocumentImport.Label = sImportLabel + .lblDocumentExport.Label = sExportLabel + .chkDocumentSearchSubDir.Label = sSearchInSubDir + .lblTemplateImport.Label = sImportLabel + .lblTemplateExport.Label = sExportLabel + .chkLogfile.Label = GetResText("CreateLogfile") + .chkLogfile.Helptext = GetResText("LogfileHelpText") + .cmdShowLogFile.Label = GetResText("ShowLogfile") + End With + ModuleList(0) = "com.sun.star.text.TextDocument" + ModuleList(1) = "com.sun.star.sheet.SpreadsheetDocument" + ModuleList(2) = "com.sun.star.drawing.DrawingDocument/com.sun.star.presentation.PresentationDocument" + ModuleList(3) = "com.sun.star.formula.FormulaProperties/com.sun.star.text.GlobalDocument" + End If +End Sub + +</script:module> diff --git a/wizards/source/importwizard/Main.xba b/wizards/source/importwizard/Main.xba new file mode 100644 index 000000000..b8cc8211e --- /dev/null +++ b/wizards/source/importwizard/Main.xba @@ -0,0 +1,291 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Main" script:language="StarBasic">Option Explicit +REM ***** BASIC ***** + +Public HeaderPreviews(4) as Object +Public ImportDialog as Object +Public ImportDialogArea as Object +Public oFactoryKey as Object +Public bShowLogFile as Boolean + +' If the ProgressPage is already on Top The Dialog will be immediately closed when this flag is +' set to False +Public bConversionIsRunning as Boolean +Public RetValue as Integer + +Sub Main() + Dim NoArgs() as New com.sun.star.beans.PropertyValue + bShowLogFile=FALSE + If Not bDebugWizard Then + On Local Error Goto RTError + End If + BasicLibraries.LoadLibrary("Tools") + RetValue = 10 + bIsFirstLogTable = True + bConversionIsRunning = False + sCRLF = CHR(13) & CHR(10) + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + oFactoryKey = GetRegistryKeyContent("org.openoffice.Setup/Office/Factories") + If GetImportWizardPaths() = False Then + Exit Sub + End If + bCancelTask = False + bDoKeepApplValues = False + CurOffice = 0 + ImportDialogArea = LoadDialog("ImportWizard","ImportDialog") + ImportDialog = ImportDialogArea.Model + LoadLanguage() + WizardMode = SBMICROSOFTMODE + MaxApplCount = 3 + FillStep_Welcome() + RepaintHeaderPreview() + ImportDialog.ImportPreview.BackGroundColor = RGB(0,60,126) + ImportDialog.cmdGoOn.DefaultButton = True + ImportDialogArea.GetControl("optMSDocuments").SetFocus() + ToggleCheckboxesWithBoolean(True) + + RetValue = ImportDialogArea.Execute() + If bShowLogFile=TRUE Then + OpenDocument(sLogUrl, NoArgs()) + End if + If RetValue = 0 Then + CancelTask() + End If + ImportDialogArea.Dispose() + End + Exit Sub +RTError: + Msgbox sRTErrorDesc, 16, sRTErrorHeader +End Sub + + +Sub NextStep() +Dim iCurStep as Integer + If Not bDebugWizard Then + On Error Goto RTError + End If + bConversionIsRunning = False + iCurStep = ImportDialog.Step + Select Case iCurStep + Case 1 + FillStep_InputPaths(0, True) + Case 2 + If CheckInputPaths Then + SaveStep_InputPath + If CurOffice < ApplCount - 1 Then + CurOffice = CurOffice + 1 + TakeOverPathSettings() + FillStep_InputPaths(CurOffice, False) + Else + FillStep_Summary() + End If + End If + Case 3 + FillStep_Progress() + Select Case WizardMode + Case SBMICROSOFTMODE + Call ConvertAllDocuments(MSFilterName()) + End Select + Case 4 + CancelTask(True) + End Select + + If ((ImportDialog.chkLogfile.State <> 1) OR (iCurStep <> 3)) Then + ImportDialog.cmdGoOn.DefaultButton = True + End If + + RepaintHeaderPreview() + Exit Sub +RTError: + Msgbox sRTErrorDesc, 16, sRTErrorHeader +End Sub + + +Sub PrevStep() +Dim iCurStep as Integer + If Not bDebugWizard Then + On Error Goto RTError + End If + bConversionIsRunning = False + iCurStep = ImportDialog.Step + Select Case iCurStep + Case 4 + ImportDialog.cmdCancel.Label = sCancelButton + FillStep_Summary() + Case 3 + FillStep_InputPaths(Applcount-1, False) + Case 2 + SaveStep_InputPath + If CurOffice > 0 Then + CurOffice = CurOffice - 1 + FillStep_InputPaths(CurOffice, False) + Else + FillStep_Welcome() + ToggleCheckboxesWithBoolean(True) + bDoKeepApplValues = True + End If + End Select + ImportDialog.cmdGoOn.DefaultButton = True + RepaintHeaderPreview() + Exit Sub +RTError: + Msgbox sRTErrorDesc, 16, sRTErrorHeader +End Sub + + +Sub CancelTask() + If bConversionIsRunning Then + If Msgbox(sConvertError1, 36, sConvertError2) = 6 Then + bCancelTask = True + bInterruptSearch = True + Else + bCancelTask = False + ImportDialog.cmdCancel.Enabled = True + End If + Else + ImportDialogArea.EndExecute() + End If +End Sub + + +Sub TemplateDirSearchDialog() + CallDirSearchDialog(ImportDialog.TemplateImportPath) +End Sub + + +Sub RepaintHeaderPreview() +Dim Bitmap As Object +Dim CurStep as Integer +Dim sBitmapPath as String +Dim LocPrefix as String + CurStep = ImportDialog.Step + LocPrefix = WizardMode + LocPrefix = ReplaceString(LocPrefix,"XML", "SO") + If CurStep = 2 Then + sBitmapPath = SOBitmapPath & LocPrefix & "-Import_" & CurStep & "-" & Applications(CurOffice,SBAPPLKEY) + 1 & ".png" + Else + sBitmapPath = SOBitmapPath & "Import_" & CurStep & ".png" + End If + ImportDialog.ImportPreview.ImageURL = sBitmapPath +End Sub + + +Sub CheckModuleInstallation() +Dim i as Integer + For i = 1 To MaxApplCount + ImportDialogArea.GetControl("chk" & WizardMode & "Application" & i).Model.Enabled = Abs(CheckInstalledModule(i-1)) + Next i +End Sub + + +Function CheckInstalledModule(Index as Integer) as Boolean +Dim ModuleName as String +Dim NameList() as String +Dim MaxIndex as Integer +Dim i as Integer + ModuleName = ModuleList(Index) + If Instr(1,ModuleName,"/") <> 0 Then + CheckInstalledModule() = False + NameList() = ArrayoutOfString(ModuleName,"/", MaxIndex) + For i = 0 To MaxIndex + If oFactoryKey.HasByName(NameList(i)) Then + CheckInstalledModule() = True + End If + Next i + Else + CheckInstalledModule() = oFactoryKey.HasByName(ModuleName) + End If +End Function + + +Sub ToggleCheckboxes(oEvent as Object) +Dim bMSEnable as Boolean + WizardMode = oEvent.Source.Model.Tag + bMSEnable = WizardMode = "MS" + ToggleCheckboxesWithBoolean(bMSEnable) +End Sub + + +Sub ToggleCheckboxesWithBoolean(bMSEnable as Boolean) + If bMSEnable = True Then + WizardMode = SBMICROSOFTMODE + MaxApplCount = 3 + Else + 'Not supposed to happen - is there an assert in BASIC... + End If + With ImportDialogArea + .GetControl("chkMSApplication1").Model.Enabled = bMSEnable + .GetControl("chkMSApplication2").Model.Enabled = bMSEnable + .GetControl("chkMSApplication3").Model.Enabled = bMSEnable + End With + CheckModuleInstallation() + bDoKeepApplValues = False + ToggleNextButton() +End Sub + + +Sub ToggleNextButton() +Dim iCurStep as Integer +Dim bDoEnable as Boolean +Dim i as Integer + iCurStep = ImportDialog.Step + Select Case iCurStep + Case 1 + With ImportDialog + If .optMSDocuments.State = 1 Then + bDoEnable = .chkMSApplication1.State = 1 Or .chkMSApplication2.State = 1 Or .chkMSApplication3.State = 1 + End If + End With + bDoKeepApplValues = False + Case 2 + bDoEnable = CheckControlPath(ImportDialog.chkTemplatePath, ImportDialog.txtTemplateImportPath, True) + bDoEnable = CheckControlPath(ImportDialog.chkDocumentPath, ImportDialog.txtDocumentImportPath, bDoEnable) + End Select + ImportDialog.cmdGoOn.Enabled = bDoEnable +End Sub + + +Sub TakeOverPathSettings() +'Takes over the Pathsettings from the first selected application to the next applications + If Applications(CurOffice,SBDOCSOURCE) = "" Then + Applications(CurOffice,SBDOCSOURCE) = Applications(0,SBDOCSOURCE) + Applications(CurOffice,SBDOCTARGET) = Applications(0,SBDOCTARGET) + Applications(CurOffice,SBTEMPLSOURCE) = Applications(0,SBTEMPLSOURCE) + Applications(CurOffice,SBTEMPLTARGET) = Applications(0,SBTEMPLTARGET) + End If +End Sub + + +Function GetImportWizardPaths() as Boolean + SOBitmapPath = GetOfficeSubPath("Template", "../wizard/bitmap") + If SOBitmapPath <> "" Then + SOWorkPath = GetPathSettings("Work", False) + If SOWorkPath <> "" Then + SOTemplatePath = GetPathSettings("Template_writable",False,0) + If SOTemplatePath <> "" Then + GetImportWizardPaths() = True + Exit Function + End If + End If + End If + GetImportWizardPaths() = False +End Function +</script:module> diff --git a/wizards/source/importwizard/dialog.xlb b/wizards/source/importwizard/dialog.xlb new file mode 100644 index 000000000..f5cc021d5 --- /dev/null +++ b/wizards/source/importwizard/dialog.xlb @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="ImportWizard" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="ImportDialog"/> +</library:library> diff --git a/wizards/source/importwizard/script.xlb b/wizards/source/importwizard/script.xlb new file mode 100644 index 000000000..2d10f65cb --- /dev/null +++ b/wizards/source/importwizard/script.xlb @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="ImportWizard" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="Main"/> + <library:element library:name="DialogModul"/> + <library:element library:name="Language"/> + <library:element library:name="FilesModul"/> + <library:element library:name="API"/> +</library:library> diff --git a/wizards/source/resources/resources_en_US.properties b/wizards/source/resources/resources_en_US.properties new file mode 100644 index 000000000..b87e6aaa7 --- /dev/null +++ b/wizards/source/resources/resources_en_US.properties @@ -0,0 +1,579 @@ +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +# This file incorporates work covered by the following license notice: +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed +# with this work for additional information regarding copyright +# ownership. The ASF licenses this file to you under the Apache +# License, Version 2.0 (the "License; you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 . +# +# x-no-translate + +# +# resources.properties +# +# resources for com.sun.star.wizards +# +RID_COMMON_0=The directory '%1' could not be created.<BR>There may not be enough space left on your hard disk. +RID_COMMON_1=The text document could not be created.<BR>Please check if the module 'PRODUCTNAME Writer' is installed. +RID_COMMON_2=The spreadsheet could not be created.<BR>Please check if the module 'PRODUCTNAME Calc' is installed. +RID_COMMON_3=The presentation could not be created.<BR>Please check if the module 'PRODUCTNAME Impress' is installed. +RID_COMMON_4=The drawing could not be created.<BR>Please check if the module 'PRODUCTNAME Draw' is installed. +RID_COMMON_5=The formula could not be created.<BR>Please check if the module 'PRODUCTNAME Math' is installed. +RID_COMMON_6=The files required could not be found.<BR>Please start the %PRODUCTNAME Setup and choose 'Repair'. +RID_COMMON_7=The file '<PATH>' already exists.<BR><BR>Would you like to overwrite the existing file? +RID_COMMON_8=Yes +RID_COMMON_9=Yes to All +RID_COMMON_10=No +RID_COMMON_11=Cancel +RID_COMMON_12=~Finish +RID_COMMON_13=< ~Back +RID_COMMON_14=~Next > +RID_COMMON_15=~Help +RID_COMMON_16=Steps +RID_COMMON_17=Close +RID_COMMON_18=OK +RID_COMMON_19=The file already exists. Do you want to overwrite it? +RID_COMMON_20=Template created via <wizard_name> on <current_date>. +RID_COMMON_21=The wizard could not be run, because important files were not found.\nUnder 'Tools - Options - %PRODUCTNAME - Paths' click the 'Default' button to reset the paths to the original default settings.\nThen run the wizard again. +RID_REPORT_0=Report Wizard +RID_REPORT_3=~Table +RID_REPORT_4=Colu~mns +RID_REPORT_7=Report_ +RID_REPORT_8=- undefined - +RID_REPORT_9=~Fields in report +RID_REPORT_11=Grouping +RID_REPORT_12=Sort options +RID_REPORT_13=Choose layout +RID_REPORT_14=Create report +RID_REPORT_15=Layout of data +RID_REPORT_16=Layout of headers and footers +RID_REPORT_19=Fields +RID_REPORT_20=~Sort by +RID_REPORT_21=T~hen by +RID_REPORT_22=Orientation +RID_REPORT_23=Portrait +RID_REPORT_24=Landscape +RID_REPORT_28=Which fields do you want to have in your report? +RID_REPORT_29=Do you want to add grouping levels? +RID_REPORT_30=According to which fields do you want to sort the data? +RID_REPORT_31=How do you want your report to look? +RID_REPORT_32=Decide how you want to proceed +RID_REPORT_33=Title of report +RID_REPORT_34=Display report +RID_REPORT_35=Create report +RID_REPORT_36=Ascending +RID_REPORT_37=Descending +RID_REPORT_40=~Dynamic report +RID_REPORT_41=~Create report now +RID_REPORT_42=~Modify report layout +RID_REPORT_43=Static report +RID_REPORT_44=Save as +RID_REPORT_50=Groupings +RID_REPORT_51=Then b~y +RID_REPORT_52=~Then by +RID_REPORT_53=Asc~ending +RID_REPORT_54=Ascend~ing +RID_REPORT_55=Ascendin~g +RID_REPORT_56=De~scending +RID_REPORT_57=Des~cending +RID_REPORT_58=De~scending +RID_REPORT_60=Binary fields cannot be displayed in the report. +RID_REPORT_61=The table '<TABLENAME>' does not exist. +RID_REPORT_62=Creating Report... +RID_REPORT_63=Number of records inserted: <COUNT> +RID_REPORT_64=The form '<REPORTFORM>' does not exist. +RID_REPORT_65=The query with the statement <BR>'<STATEMENT>' <BR> could not be run. <BR> Check your data source. +RID_REPORT_66=The following hidden control in the form '<REPORTFORM>' could not be read: '<CONTROLNAME>'. +RID_REPORT_67=Importing data... +RID_REPORT_68=Labeling fields +RID_REPORT_69=How do you want to label the fields? +RID_REPORT_70=Label +RID_REPORT_71=Field +RID_REPORT_72=An error occurred in the wizard.<BR>The template '%PATH' could be erroneous.<BR>Either the required sections or tables do not exist or exist under the wrong name.<BR>See the Help for more detailed information.<BR>Please select another template. +RID_REPORT_73=There is an invalid user field in a table. +RID_REPORT_74=The sort criterion '<FIELDNAME>' was chosen twice. Each criterion can only be chosen once. +RID_REPORT_75=Note: The dummy text will be replaced by data from the database when the report is created. +RID_REPORT_76=A report '%REPORTNAME' already exists in the database. Please assign another name. +RID_REPORT_78=How do you want to proceed after creating the report? +RID_REPORT_79=What kind of report do you want to create? +RID_REPORT_80=Tabular +RID_REPORT_81=Columnar, single-column +RID_REPORT_82=Columnar, two columns +RID_REPORT_83=Columnar, three columns +RID_REPORT_84=In blocks, labels left +RID_REPORT_85=In blocks, labels above +RID_REPORT_86=Title: +RID_REPORT_87=Author: +RID_REPORT_88=Date: +# Please don't translate the words #page# and #count#, these are placeholders. +RID_REPORT_89=Page #page# of #count# +RID_REPORT_90=Page number: +RID_REPORT_91=Page count: +RID_REPORT_92=No valid report template was found. +RID_REPORT_93=Page: +RID_REPORT_94=Align Left - Border +RID_REPORT_95=Align Left - Compact +RID_REPORT_96=Align Left - Elegant +RID_REPORT_97=Align Left - Highlighted +RID_REPORT_98=Align Left - Modern +RID_REPORT_99=Align Left - Red & Blue +RID_REPORT_100=Default +RID_REPORT_101=Outline - Borders +RID_REPORT_102=Outline - Compact +RID_REPORT_103=Outline - Elegant +RID_REPORT_104=Outline - Highlighted +RID_REPORT_105=Outline - Modern +RID_REPORT_106=Outline - Red & Blue +RID_REPORT_107=Outline, indented - Borders +RID_REPORT_108=Outline, indented - Compact +RID_REPORT_109=Outline, indented - Elegant +RID_REPORT_110=Outline, indented - Highlighted +RID_REPORT_111=Outline, indented - Modern +RID_REPORT_112=Outline, indented - Red & Blue +RID_REPORT_113=Bubbles +RID_REPORT_114=Cinema +RID_REPORT_115=Controlling +RID_REPORT_116=Default +RID_REPORT_117=Drafting +RID_REPORT_118=Finances +RID_REPORT_119=Flipchart +RID_REPORT_120=Formal with Company Logo +RID_REPORT_121=Generic +RID_REPORT_122=Worldmap +RID_DB_COMMON_0=C~reate +RID_DB_COMMON_1=~Cancel +RID_DB_COMMON_2=< ~Back +RID_DB_COMMON_3=~Next > +RID_DB_COMMON_4=~Database +RID_DB_COMMON_5=~Table name +RID_DB_COMMON_6=An error occurred while running the wizard. The wizard will be terminated. +RID_DB_COMMON_8=No database has been installed. At least one database is required before the wizard for forms can be started. +RID_DB_COMMON_9=The database does not contain any tables. +RID_DB_COMMON_10=This title already exists in the database. Please enter another name. +RID_DB_COMMON_11=The title must not contain any spaces or special characters. +RID_DB_COMMON_12=The database service (com.sun.data.DatabaseEngine) could not be instantiated. +RID_DB_COMMON_13=The selected table or query could not be opened. +RID_DB_COMMON_14=No connection to the database could be established. +RID_DB_COMMON_20=~Help +RID_DB_COMMON_21=~Stop +RID_DB_COMMON_30=The document could not be saved. +RID_DB_COMMON_33=Exiting the wizard +RID_DB_COMMON_34=Connecting to data source... +RID_DB_COMMON_35=The connection to the data source could not be established. +RID_DB_COMMON_36=The file path entered is not valid. +RID_DB_COMMON_37=Please select a data source +RID_DB_COMMON_38=Please select a table or query +RID_DB_COMMON_39=Add field +RID_DB_COMMON_40=Remove field +RID_DB_COMMON_41=Add all fields +RID_DB_COMMON_42=Remove all fields +RID_DB_COMMON_43=Move field up +RID_DB_COMMON_44=Move field down +RID_DB_COMMON_45=The field names from '%NAME' could not be retrieved. +RID_QUERY_0=Query Wizard +RID_QUERY_1=Query +RID_QUERY_2=Query Wizard +RID_QUERY_3=~Tables +RID_QUERY_4=A~vailable fields +RID_QUERY_5=Name ~of the query +RID_QUERY_6=Display ~Query +RID_QUERY_7=~Modify Query +RID_QUERY_8=~How do you want to proceed after creating the query? +RID_QUERY_9=Match ~all of the following +RID_QUERY_10=~Match any of the following +RID_QUERY_11=~Detailed query (Shows all records of the query.) +RID_QUERY_12=~Summary query (Shows only results of aggregate functions.) +RID_QUERY_16=Aggregate functions +RID_QUERY_17=Fields +RID_QUERY_18=~Group by +RID_QUERY_19=Field +RID_QUERY_20=Alias +RID_QUERY_21=Table: +RID_QUERY_22=Query: +RID_QUERY_24=Condition +RID_QUERY_25=Value +RID_QUERY_26=is equal to +RID_QUERY_27=is not equal to +RID_QUERY_28=is smaller than +RID_QUERY_29=is greater than +RID_QUERY_30=is equal or less than +RID_QUERY_31=is equal or greater than +RID_QUERY_32=like +RID_QUERY_33=not like +RID_QUERY_34=is null +RID_QUERY_35=is not null +RID_QUERY_36=true +RID_QUERY_37=false +RID_QUERY_38=and +RID_QUERY_39=or +RID_QUERY_40=get the sum of +RID_QUERY_41=get the average of +RID_QUERY_42=get the minimum of +RID_QUERY_43=get the maximum of +RID_QUERY_44=get the count of +RID_QUERY_48=(none) +RID_QUERY_50=Fie~lds in the Query: +RID_QUERY_51=Sorting order: +RID_QUERY_52=No sorting fields were assigned. +RID_QUERY_53=Search conditions: +RID_QUERY_54=No conditions were assigned. +RID_QUERY_55=Aggregate functions: +RID_QUERY_56=No aggregate functions were assigned. +RID_QUERY_57=Grouped by: +RID_QUERY_58=No Groups were assigned. +RID_QUERY_59=Grouping conditions: +RID_QUERY_60=No grouping conditions were assigned. +RID_QUERY_70=Select the fields (columns) for your query +RID_QUERY_71=Select the sorting order +RID_QUERY_72=Select the search conditions +RID_QUERY_73=Select the type of query +RID_QUERY_74=Select the groups +RID_QUERY_75=Select the grouping conditions +RID_QUERY_76=Assign aliases if desired +RID_QUERY_77=Check the overview and decide how to proceed +RID_QUERY_80=Field selection +RID_QUERY_81=Sorting order +RID_QUERY_82=Search conditions +RID_QUERY_83=Detail or summary +RID_QUERY_84=Grouping +RID_QUERY_85=Grouping conditions +RID_QUERY_86=Aliases +RID_QUERY_87=Overview +RID_QUERY_88=A field that has not been assigned an aggregate function must be used in a group. +RID_QUERY_89=The condition '<FIELDNAME> <LOGICOPERATOR> <VALUE>' was chosen twice. Each condition can only be chosen once +RID_QUERY_90=The aggregate function <FUNCTION> has been assigned twice to the fieldname '<NUMERICFIELD>'. +RID_QUERY_91=, +RID_QUERY_92=<FIELDTITLE> (<FIELDNAME>) +RID_QUERY_93=<FIELDNAME> (<SORTMODE>) +RID_QUERY_94=<FIELDNAME> <LOGICOPERATOR> <VALUE> +RID_QUERY_95=<CALCULATEDFUNCTION> <FIELDNAME> +RID_QUERY_96=<FIELDNAME> <LOGICOPERATOR> <VALUE> +RID_FORM_0=Form Wizard +RID_FORM_1=Fields in ~the form +RID_FORM_2=Binary fields are always listed and selectable from the left list.\nIf possible, they are interpreted as images. +RID_FORM_3=A subform is a form that is inserted in another form.\nUse subforms to show data from tables or queries with a one-to-many relationship. +RID_FORM_4=~Add Subform +RID_FORM_5=~Subform based on existing relation +RID_FORM_6=Tables or queries +RID_FORM_7=Subform based on ~manual selection of fields +RID_FORM_8=~Which relation do you want to add? +RID_FORM_9=Fields in the ~subform +RID_FORM_12=~Available fields +RID_FORM_13=Fields in form +RID_FORM_19=The join '<FIELDNAME1>' and '<FIELDNAME2>' has been selected twice.\nBut joins may only be used once. +RID_FORM_20=~First joined subform field +RID_FORM_21=~Second joined subform field +RID_FORM_22=~Third joined subform field +RID_FORM_23=~Fourth joined subform field +RID_FORM_24=F~irst joined main form field +RID_FORM_25=S~econd joined main form field +RID_FORM_26=T~hird joined main form field +RID_FORM_27=F~ourth joined main form field +RID_FORM_28=Field border +RID_FORM_29=No border +RID_FORM_30=3D look +RID_FORM_31=Flat +RID_FORM_32=Label placement +RID_FORM_33=Align left +RID_FORM_34=Align right +RID_FORM_35=Arrangement of DB fields +RID_FORM_36=Columnar - Labels Left +RID_FORM_37=Columnar - Labels on Top +RID_FORM_38=In Blocks - Labels Left +RID_FORM_39=In Blocks - Labels Above +RID_FORM_40=As Data Sheet +RID_FORM_41=Arrangement of the main form +RID_FORM_42=Arrangement of the subform +RID_FORM_44=The form is to be ~used for entering new data only. +RID_FORM_45=Existing data will not be displayed +RID_FORM_46=T~he form is to display all data +RID_FORM_47=Do not allow ~modification of existing data +RID_FORM_48=Do not allow ~deletion of existing data +RID_FORM_49=Do not allow ~addition of new data +RID_FORM_50=Name of ~the form +RID_FORM_51=How do you want to proceed after creating the form? +RID_FORM_52=~Work with the form +RID_FORM_53=~Modify the form +RID_FORM_55=~Page Styles +RID_FORM_80=Field selection +RID_FORM_81=Set up a subform +RID_FORM_82=Add subform fields +RID_FORM_83=Get joined fields +RID_FORM_84=Arrange controls +RID_FORM_85=Set data entry +RID_FORM_86=Apply styles +RID_FORM_87=Set name +RID_FORM_88=(Date) +RID_FORM_89=(Time) +RID_FORM_90=Select the fields of your form +RID_FORM_91=Decide if you want to set up a subform +RID_FORM_92=Select the fields of your subform +RID_FORM_93=Select the joins between your forms +RID_FORM_94=Arrange the controls on your form +RID_FORM_95=Select the data entry mode +RID_FORM_96=Apply the style of your form +RID_FORM_97=Set the name of the form +RID_FORM_98=A form with the name '%FORMNAME' already exists.\nChoose another name. +RID_TABLE_1=Table Wizard +RID_TABLE_2=Select fields +RID_TABLE_3=Set types and formats +RID_TABLE_4=Set primary key +RID_TABLE_5=Create table +RID_TABLE_8=Select fields for your table +RID_TABLE_9=Set field types and formats +RID_TABLE_10=Set primary key +RID_TABLE_11=Create table +RID_TABLE_14=This wizard helps you to create a table for your database. After selecting a table category and a sample table, choose the fields you want to include in your table. You can include fields from more than one sample table. +RID_TABLE_15=Ca~tegory +RID_TABLE_16=B~usiness +RID_TABLE_17=P~ersonal +RID_TABLE_18=~Sample tables +RID_TABLE_19=A~vailable fields +RID_TABLE_20=Field information +RID_TABLE_21=+ +RID_TABLE_22=- +RID_TABLE_23=Field name +RID_TABLE_24=Field type +RID_TABLE_25=~Selected fields +RID_TABLE_26=A primary key uniquely identifies each record in a database table. Primary keys ease the linking of information in separate tables, and it is recommended that you have a primary key in every table. Without a primary key, it will not be possible to enter data into this table. +RID_TABLE_27=~Create a primary key +RID_TABLE_28=~Automatically add a primary key +RID_TABLE_29=~Use an existing field as a primary key +RID_TABLE_30=Define p~rimary key as a combination of several fields +RID_TABLE_31=F~ieldname +RID_TABLE_32=~Primary key fields +RID_TABLE_33=Auto ~value +RID_TABLE_34=What do you want to name your table? +RID_TABLE_35=Congratulations. You have entered all the information needed to create your table. +RID_TABLE_36=What do you want to do next? +RID_TABLE_37=Modify the table design +RID_TABLE_38=Insert data immediately +RID_TABLE_39=C~reate a form based on this table +RID_TABLE_40=The table you have created could not be opened. +RID_TABLE_41=The table name '%TABLENAME' contains a character ('%SPECIALCHAR') that might not be supported by the database. +RID_TABLE_42=The field name '%FIELDNAME' contains a special character ('%SPECIALCHAR') that might not be supported by the database. +RID_TABLE_43=Field +RID_TABLE_44=MyTable +RID_TABLE_45=Add a Field +RID_TABLE_46=Remove the selected Field +RID_TABLE_47=The field cannot be inserted because this would exceed the maximum number of %COUNT possible fields in the database table +RID_TABLE_48=The name '%TABLENAME' already exists.\nPlease enter another name. +RID_TABLE_49=Catalog of the table +RID_TABLE_50=Schema of the table +RID_TABLE_51=The field '%FIELDNAME' already exists. +STEP_ZERO_0=~Cancel +STEP_ZERO_1=~Help +STEP_ZERO_2=< ~Back +STEP_ZERO_3=~Convert +STEP_ZERO_4=Note: Currency amounts from external links and currency conversion factors in formulas cannot be converted. +STEP_ZERO_5=First, unprotect all sheets. +STEP_ZERO_6=Currencies: +STEP_ZERO_7=C~ontinue > +STEP_ZERO_8=C~lose +STEP_CONVERTER_0=~Entire document +STEP_CONVERTER_1=Selection +STEP_CONVERTER_2=Cell S~tyles +STEP_CONVERTER_3=Currency cells in the current ~sheet +STEP_CONVERTER_4=Currency cells in the entire ~document +STEP_CONVERTER_5=~Selected range +STEP_CONVERTER_6=Select Cell Styles +STEP_CONVERTER_7=Select currency cells +STEP_CONVERTER_8=Currency ranges: +STEP_CONVERTER_9=Templates: +STEP_AUTOPILOT_0=Extent +STEP_AUTOPILOT_1=~Single %PRODUCTNAME Calc document +STEP_AUTOPILOT_2=Complete ~directory +STEP_AUTOPILOT_3=Source Document: +STEP_AUTOPILOT_4=Source directory: +STEP_AUTOPILOT_5=~Including subfolders +STEP_AUTOPILOT_6=Target directory: +STEP_AUTOPILOT_7=Temporarily unprotect sheet without query +STEP_AUTOPILOT_10=Also convert fields and tables in text documents +STATUSLINE_0=Conversion status: +STATUSLINE_1=Conversion status of the cell templates: +STATUSLINE_2=Registration of the relevant ranges: Sheet %1Number%1 of %2TotPageCount%2 +STATUSLINE_3=Entry of the ranges to be converted... +STATUSLINE_4=Sheet protection for each sheet will be restored... +STATUSLINE_5=Conversion of the currency units in the cell templates... +MESSAGES_0=~Finish +MESSAGES_1=Select directory +MESSAGES_2=Select file +MESSAGES_3=Select target directory +MESSAGES_4=non-existent +MESSAGES_5=Euro Converter +MESSAGES_6=Should protected spreadsheets be temporarily unprotected? +MESSAGES_7=Enter the password to unprotect the table %1TableName%1 +MESSAGES_8=Wrong Password! +MESSAGES_9=Protected Sheet +MESSAGES_10=Warning! +MESSAGES_11=Protection for the sheets will not be removed. +MESSAGES_12=Sheet cannot be unprotected +MESSAGES_13=The Wizard cannot edit this document as cell formats cannot be modified in documents containing protected spreadsheets. +MESSAGES_14=Please note that the Euro Converter will, otherwise, not be able to edit this document! +MESSAGES_15=Please choose a currency to be converted first! +MESSAGES_16=Password: +MESSAGES_17=OK +MESSAGES_18=Cancel +MESSAGES_19=Please select a %PRODUCTNAME Calc document for editing! +MESSAGES_20='<1>' is not a directory! +MESSAGES_21=Document is read-only! +MESSAGES_22=The '<1>' file already exists.<CR>Do you want to overwrite it? +MESSAGES_23=Do you really want to terminate conversion at this point? +MESSAGES_24=Cancel Wizard +CURRENCIES_0=Portuguese Escudo +CURRENCIES_1=Dutch Guilder +CURRENCIES_2=French Franc +CURRENCIES_3=Spanish Peseta +CURRENCIES_4=Italian Lira +CURRENCIES_5=German Mark +CURRENCIES_6=Belgian Franc +CURRENCIES_7=Irish Punt +CURRENCIES_8=Luxembourg Franc +CURRENCIES_9=Austrian Schilling +CURRENCIES_10=Finnish Mark +CURRENCIES_11=Greek Drachma +CURRENCIES_12=Slovenian Tolar +CURRENCIES_13=Cypriot Pound +CURRENCIES_14=Maltese Lira +CURRENCIES_15=Slovak Koruna +CURRENCIES_16=Estonian Kroon +CURRENCIES_17=Latvian Lats +CURRENCIES_18=Lithuanian Litas +STEP_LASTPAGE_0=Progress +STEP_LASTPAGE_1=Retrieving the relevant documents... +STEP_LASTPAGE_2=Converting the documents... +STEP_LASTPAGE_3=Settings: +STEP_LASTPAGE_4=Sheet is always unprotected +STYLES_0=Theme Selection +STYLES_1=Error while saving the document to the clipboard! The following action cannot be undone. +STYLES_2=~Cancel +STYLES_3=~OK +STYLENAME_0=(Standard) +STYLENAME_1=Autumn Leaves +STYLENAME_2=Be +STYLENAME_3=Black and White +STYLENAME_4=Blackberry Bush +STYLENAME_5=Blue Jeans +STYLENAME_6=Fifties Diner +STYLENAME_7=Glacier +STYLENAME_8=Green Grapes +STYLENAME_9=Marine +STYLENAME_10=Millennium +STYLENAME_11=Nature +STYLENAME_12=Neon +STYLENAME_13=Night +STYLENAME_14=PC Nostalgia +STYLENAME_15=Pastel +STYLENAME_16=Pool Party +STYLENAME_17=Pumpkin +CorrespondenceDialog_0=Addressee +CorrespondenceDialog_1=One recipient +CorrespondenceDialog_2=Several recipients (address database) +CorrespondenceDialog_3=Use of This Template +CorrespondenceMsgError=An error has occurred. +CorrespondenceFields_0=Click placeholder and overwrite +CorrespondenceFields_1=Company +CorrespondenceFields_2=Department +CorrespondenceFields_3=First Name +CorrespondenceFields_4=Last Name +CorrespondenceFields_5=Street +CorrespondenceFields_6=Country +CorrespondenceFields_7=ZIP/Postal Code +CorrespondenceFields_8=City +CorrespondenceFields_9=Title +CorrespondenceFields_10=Position +CorrespondenceFields_11=Form of Address +CorrespondenceFields_12=Initials +CorrespondenceFields_13=Salutation +CorrespondenceFields_14=Home Phone +CorrespondenceFields_15=Work Phone +CorrespondenceFields_16=Fax +CorrespondenceFields_17=E-Mail +CorrespondenceFields_18=URL +CorrespondenceFields_19=Notes +CorrespondenceFields_20=Alt. Field 1 +CorrespondenceFields_21=Alt. Field 2 +CorrespondenceFields_22=Alt. Field 3 +CorrespondenceFields_23=Alt. Field 4 +CorrespondenceFields_24=ID +CorrespondenceFields_25=State +CorrespondenceFields_26=Office Phone +CorrespondenceFields_27=Pager +CorrespondenceFields_28=Mobile Phone +CorrespondenceFields_29=Other Phone +CorrespondenceFields_30=Calendar URL +CorrespondenceFields_31=Invite +CorrespondenceNoTextmark_0=The bookmark 'Recipient' is missing. +CorrespondenceNoTextmark_1=Form letter fields can not be included. +AgendaDlgName=Minutes Template +AgendaDlgNoCancel=An option must be confirmed. +AgendaDlgFrame=Minutes Type +AgendaDlgButton1=Results Minutes +AgendaDlgButton2=Evaluation Minutes +TextField=User data field is not defined! +NoDirCreation=The '%1' directory cannot be created: +MsgDirNotThere=The '%1' directory does not exist. +QueryfornewCreation=Do you want to create it now? +HelpButton=~Help +CancelButton=~Cancel +BackButton=< ~Back +NextButton=Ne~xt > +BeginButton=~Convert +CloseButton=~Close +WelcometextLabel1=This wizard convert legacy format documents to Open Document Format for Office Applications. +WelcometextLabel3=Select the document type for conversion: +MSTemplateCheckbox_1_=Word templates +MSTemplateCheckbox_2_=Excel templates +MSTemplateCheckbox_3_=PowerPoint templates +MSDocumentCheckbox_1_=Word documents +MSDocumentCheckbox_2_=Excel documents +MSDocumentCheckbox_3_=PowerPoint/Publisher documents +MSContainerName=Microsoft Office +SummaryHeader=Summary: +GroupnameDefault=Imported_Templates +ProgressMoreDocs=Documents +ProgressMoreTemplates=Templates +FileExists=The '<1>' file already exists.<CR>Do you want to overwrite it? +MorePathsError3=Directories do not exist +ConvertError1=Do you really want to terminate conversion at this point? +ConvertError2=Cancel Wizard +RTErrorDesc=An error has occurred in the wizard. +RTErrorHeader=Error +OverwriteallFiles=Do you want to overwrite documents without being asked? +ReeditMacro=Document macro has to be revised. +CouldNotsaveDocument=Document '<1>' could not be saved. +CouldNotopenDocument=Document '<1>' could not be opened. +PathDialogMessage=Select a directory +DialogTitle=Document Converter +SearchInSubDir=Including subdirectories +ProgressPage1=Progress +ProgressPage2=Retrieving the relevant documents: +ProgressPage3=Converting the documents +ProgressFound=Found: +ProgressPage5="%1 found +Ready=Finished +SourceDocuments=Source documents +TargetDocuments=Target documents +LogfileSummary=<COUNT> documents converted +SumInclusiveSubDir=All subdirectories will be taken into account +SumSaveDokumente=These will be exported to the following directory: +TextImportLabel=Import from: +TextExportLabel=Save to: +CreateLogfile=Create log file +LogfileHelpText=A log file will be created in your work directory +ShowLogfile=Show log file +SumMSTextDocuments=All Word documents contained in the following directory will be imported: +SumMSTableDocuments=All Excel documents contained in the following directory will be imported: +SumMSDrawDocuments=All PowerPoint/Publisher documents contained in the following directory will be imported: +SumMSTextTemplates=All Word templates contained in the following directory will be imported: +SumMSTableTemplates=All Excel templates contained in the following directory will be imported: +SumMSDrawTemplates=All PowerPoint templates contained in the following directory will be imported: diff --git a/wizards/source/standard/Module1.xba b/wizards/source/standard/Module1.xba new file mode 100644 index 000000000..3424c168e --- /dev/null +++ b/wizards/source/standard/Module1.xba @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Module1" script:language="StarBasic">REM ***** BASIC ***** + +Sub Main + +End Sub</script:module>
\ No newline at end of file diff --git a/wizards/source/standard/dialog.xlb b/wizards/source/standard/dialog.xlb new file mode 100644 index 000000000..669529dbc --- /dev/null +++ b/wizards/source/standard/dialog.xlb @@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Standard" library:readonly="false" library:passwordprotected="false"/> diff --git a/wizards/source/standard/script.xlb b/wizards/source/standard/script.xlb new file mode 100644 index 000000000..67c9503b7 --- /dev/null +++ b/wizards/source/standard/script.xlb @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Standard" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="Module1"/> +</library:library> diff --git a/wizards/source/template/Autotext.xba b/wizards/source/template/Autotext.xba new file mode 100644 index 000000000..35b3fdf62 --- /dev/null +++ b/wizards/source/template/Autotext.xba @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Autotext" script:language="StarBasic">Option Explicit + +Public UserfieldDataType(14) as String +Public oDocAuto as Object +Public BulletList(7) as Integer +Public sTextFieldNotDefined as String +Public sGeneralError as String + + +Sub Main() + Dim oCursor as Object + Dim oStyles as Object + Dim oSearchDesc as Object + Dim oFoundall as Object + Dim oFound as Object + Dim i as Integer + Dim sFoundString as String + Dim sFoundContent as String + Dim FieldStringThere as String + Dim ULStringThere as String + Dim PHStringThere as String + On Local Error Goto GENERALERROR + ' Initialization... + BasicLibraries.LoadLibrary("Tools") + If InitResources("'Template'") Then + sGeneralError = GetResText("CorrespondenceMsgError") + sTextFieldNotDefined = GetResText("TextField") + End If + + UserfieldDatatype(0) = "COMPANY" + UserfieldDatatype(1) = "FIRSTNAME" + UserfieldDatatype(2) = "NAME" + UserfieldDatatype(3) = "SHORTCUT" + UserfieldDatatype(4) = "STREET" + UserfieldDatatype(5) = "COUNTRY" + UserfieldDatatype(6) = "ZIP" + UserfieldDatatype(7) = "CITY" + UserfieldDatatype(8) = "TITLE" + UserfieldDatatype(9) = "POSITION" + UserfieldDatatype(10) = "PHONE_PRIVATE" + UserfieldDatatype(11) = "PHONE_COMPANY" + UserfieldDatatype(12) = "FAX" + UserfieldDatatype(13) = "EMAIL" + UserfieldDatatype(14) = "STATE" + BulletList(0) = 149 + BulletList(1) = 34 + BulletList(2) = 65 + BulletList(3) = 61 + BulletList(4) = 49 + BulletList(5) = 47 + BulletList(6) = 79 + BulletList(7) = 58 + + oDocAuto = ThisComponent + oStyles = oDocAuto.Stylefamilies.GetByName("NumberingStyles") + + ' Prepare the Search-Descriptor + oSearchDesc = oDocAuto.createsearchDescriptor() + oSearchDesc.SearchRegularExpression = True + oSearchDesc.SearchWords = True + oSearchDesc.SearchString = "<[^>]+>" + oFoundall = oDocAuto.FindAll(oSearchDesc) + + 'Loop over the foundings + For i = 0 To oFoundAll.Count - 1 + oFound = oFoundAll.GetByIndex(i) + sFoundString = oFound.String + 'Extract the string inside the brackets + sFoundContent = FindPartString(sFoundString,"<",">",1) + sFoundContent = LTrim(sFoundContent) + + ' Define the Cursor and place it on the founding + oCursor = oFound.Text.CreateTextCursorbyRange(oFound) + + ' Find out, which object is to be created... + FieldStringThere = Instr(1,sFoundContent,"Field") + ULStringThere = Instr(1,sFoundContent,"UL") + PHStringThere = Instr(1,sFoundContent,"Placeholder") + If FieldStringThere = 1 Then + CreateUserDatafield(oCursor, sFoundContent) + ElseIf ULStringThere = 1 Then + CreateBullet(oCursor, oStyles) + ElseIf PHStringThere = 1 Then + CreatePlaceholder(oCursor, sFoundContent) + End If + Next i + + GENERALERROR: + If Err <> 0 Then + Msgbox(sGeneralError,16, GetProductName()) + Resume LETSGO + End If + LETSGO: +End Sub + + +' creates a User - datafield out of a string with the following structure +' "<field:Company>" +Sub CreateUserDatafield(oCursor, sFoundContent as String) + Dim MaxIndex as Integer + Dim sFoundList(3) + Dim oUserfield as Object + Dim UserInfo as String + Dim UserIndex as Integer + + oUserfield = oDocAuto.CreateInstance("com.sun.star.text.TextField.ExtendedUser") + sFoundList() = ArrayoutofString(sFoundContent,":",MaxIndex) + UserInfo = UCase(LTrim(sFoundList(1))) + UserIndex = IndexInArray(UserInfo, UserfieldDatatype()) + If UserIndex <> -1 Then + oUserField.UserDatatype = UserIndex + oCursor.Text.InsertTextContent(oCursor,oUserField,True) + oUserField.IsFixed = True + Else + Msgbox(UserInfo &": " & sTextFieldNotDefined,16, GetProductName()) + End If +End Sub + + +' Creates a Bullet by setting a soft Formatation on the first unsorted List-Templates with a defined +' Bullet Id +Sub CreateBullet(oCursor, oStyles as Object) + Dim n, m, s as Integer + Dim StyleSet as Boolean + Dim ostyle as Object + Dim StyleName as String + Dim alevel() + StyleSet = False + For s = 0 To Ubound(BulletList()) + For n = 0 To oStyles.Count - 1 + ostyle = oStyles.getbyindex(n) + StyleName = oStyle.Name + alevel() = ostyle.NumberingRules.getbyindex(0) + ' The properties of the style are stored in a Name-Value-Array() + For m = 0 to Ubound(alevel()) + ' Set the first Numbering template without a bulletID + If (aLevel(m).Name = "BulletId") Then + If alevel(m).Value = BulletList(s) Then + oCursor.NumberingStyle = StyleName + oCursor.SetString("") + exit Sub + End if + End If + Next m + Next n + Next s + If Not StyleSet Then + ' The Template with the demanded BulletID is not available, so take the first style in the sequence + ' that has a defined Bullet ID + oCursor.NumberingStyleName = oStyles.GetByIndex(5).Name + oCursor.SetString("") + End If +End Sub + + +' Creates a placeholder out of a string with the following structure: +'<placeholder:Showtext:Helptext> +Sub CreatePlaceholder(oCursor as Object, sFoundContent as String) + Dim oPlaceholder as Object + Dim MaxIndex as Integer + Dim sFoundList(3) + oPlaceholder = oDocAuto.CreateInstance("com.sun.star.text.TextField.JumpEdit") + sFoundList() = ArrayoutofString(sFoundContent, ":" & chr(34),MaxIndex) + ' Delete The Double-quotes + oPlaceholder.Hint = DeleteStr(sFoundList(2),chr(34)) + oPlaceholder.placeholder = DeleteStr(sFoundList(1),chr(34)) + oCursor.Text.InsertTextContent(oCursor,oPlaceholder,True) +End Sub + + +</script:module> diff --git a/wizards/source/template/Correspondence.xba b/wizards/source/template/Correspondence.xba new file mode 100644 index 000000000..01da7f3d8 --- /dev/null +++ b/wizards/source/template/Correspondence.xba @@ -0,0 +1,303 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Correspondence" script:language="StarBasic">Option Explicit + +Public msgNoTextmark$, msgError$ +Public sAddressbook$ +Public Table +Public sCompany$, sFirstName$, sLastName$, sStreet$, sPostalCode$, sCity$, sState$, sInitials$, sPosition$ +Public DialogExited +Public oDocument, oText, oBookMarks, oBookMark, oBookMarkCursor, oBookText as Object +Public bTemplate, bDBFields as Boolean + +Sub Main + bTemplate = true + BasicLibraries.LoadLibrary("Tools") + TemplateDialog = LoadDialog("Template", "TemplateDialog") + DialogModel = TemplateDialog.Model + DialogModel.Step = 2 + DialogModel.Optmerge.State = True + LoadLanguageCorrespondence() + TemplateDialog.Execute + TemplateDialog.Dispose() +End Sub + + +Sub Placeholder + bTemplate = false + BasicLibraries.LoadLibrary("Tools") + LoadLanguageCorrespondence() + bDBFields = false + OK() +End Sub + + +Sub Database + bTemplate = false + BasicLibraries.LoadLibrary("Tools") + LoadLanguageCorrespondence() + bDBFields = true + OK() +End Sub + + +Function LoadLanguageCorrespondence() as Boolean + If InitResources("'Template'") Then + msgNoTextmark$ = GetResText("CorrespondenceDialog_0") & Chr(13) & Chr(10) & GetResText("CorrespondenceNoTextmark_1") + msgError$ = GetResText("CorrespondenceMsgError") + If bTemplate Then + DialogModel.Title = GetResText("CorrespondenceDialog_3") + DialogModel.CmdCancel.Label = GetResText("STYLES_2") + DialogModel.CmdCorrGoOn.Label = GetResText("STYLES_3") + DialogModel.OptSingle.Label = GetResText("CorrespondenceDialog_1") + DialogModel.Optmerge.Label = GetResText("CorrespondenceDialog_2") + DialogModel.FrmLetter.Label = GetResText("CorrespondenceDialog_0") + End If + LoadLanguageCorrespondence() = True + Else + msgbox("Warning: Resource could not be loaded!") + End If +End Function + + +Function GetFieldName(oFieldKnot as Object, GeneralFieldName as String) + If oFieldKnot.HasByName(GeneralFieldName) Then + GetFieldName = oFieldKnot.GetByName(GeneralFieldName).AssignedFieldName + Else + GetFieldName = "" + End If +End Function + + +Sub OK +Dim ParaBreak +Dim sDocLang as String +Dim oSearchDesc as Object +Dim oFoundAll as Object +Dim oFound as Object +Dim sFoundContent as String +Dim sFoundString as String +Dim sDBField as String +Dim i as Integer +Dim oDBAccess as Object +Dim oAddressDialog as Object +Dim oAddressPilot as Object +Dim oFields as Object +Dim oDocSettings as Object +Dim oContext as Object +Dim bDBvalid as Boolean + 'On Local Error Goto GENERALERROR + + If bTemplate Then + bDBFields = DialogModel.Optmerge.State 'database or placeholder + TemplateDialog.EndExecute() + DialogExited = TRUE + End If + + If bDBFields Then + oDBAccess = GetRegistryKeyContent("org.openoffice.Office.DataAccess/AddressBook/") + sAddressbook = oDBAccess.DataSourceName + + bDBvalid = false + oContext = createUnoService( "com.sun.star.sdb.DatabaseContext" ) + + If (not isNull(oContext)) Then + 'Is the previously assigned address data source still valid? + bDBvalid = oContext.hasByName(sAddressbook) + end if + + If (bDBvalid = false) Then + oAddressPilot = createUnoService("com.sun.star.ui.dialogs.AddressBookSourcePilot") + oAddressPilot.execute + + oDBAccess = GetRegistryKeyContent("org.openoffice.Office.DataAccess/AddressBook/") + sAddressbook = oDBAccess.DataSourceName + If sAddressbook = "" Then + MsgBox(GetResText("CorrespondenceNoTextmark_1")) + Exit Sub + End If + End If + oFields = oDBAccess.GetByName("Fields") + Table = oDBAccess.GetByName("Command") + End If + + ParaBreak = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK + oDocument = ThisComponent + If bDBFields Then + 'set the address db as current db at the document + oDocSettings = oDocument.createInstance("com.sun.star.document.Settings") + oDocSettings.CurrentDatabaseDataSource = sAddressbook + oDocSettings.CurrentDatabaseCommand = Table + oDocSettings.CurrentDatabaseCommandType = 0 + End If + oBookmarks = oDocument.Bookmarks + oText = oDocument.Text + + oSearchDesc = oDocument.createsearchDescriptor() + oSearchDesc.SearchRegularExpression = True + oSearchDesc.SearchWords = True + oSearchDesc.SearchString = "<[^>]+>" + oFoundall = oDocument.FindAll(oSearchDesc) + + 'Loop over the foundings + For i = oFoundAll.Count -1 To 0 Step -1 + oFound = oFoundAll.GetByIndex(i) + sFoundString = oFound.String + 'Extract the string inside the brackets + sFoundContent = FindPartString(sFoundString,"<",">",1) + sFoundContent = LTrim(sFoundContent) + ' Define the Cursor and place it on the founding + oBookmarkCursor = oFound.Text.CreateTextCursorbyRange(oFound) + oBookText = oFound.Text + If bDBFields Then + sDBField = GetFieldname(oFields, sFoundContent) + If sDBField <> "" Then + InsertDBField(sAddressbook, Table, sDBField) + Else + InsertPlaceholder(sFoundContent) + End If + Else + InsertPlaceholder(sFoundContent) + End If + Next i + If bDBFields Then + 'Open the DB beamer with the right DB + Dim oDisp as Object + Dim oTransformer + Dim aURL as new com.sun.star.util.URL + aURL.complete = ".component:DB/DataSourceBrowser" + oTransformer = createUnoService("com.sun.star.util.URLTransformer") + oTransformer.parseStrict(aURL) + oDisp = oDocument.getCurrentController.getFrame.queryDispatch(aURL, "_beamer", com.sun.star.frame.FrameSearchFlag.CHILDREN + com.sun.star.frame.FrameSearchFlag.CREATE) + Dim aArgs(3) as new com.sun.star.beans.PropertyValue + aArgs(1).Name = "DataSourceName" + aArgs(1).Value = sAddressbook + aArgs(2).Name = "CommandType" + aArgs(2).Value = com.sun.star.sdb.CommandType.TABLE + aArgs(3).Name = "Command" + aArgs(3).Value = Table + oDisp.dispatch(aURL, aArgs()) + End If + + GENERALERROR: + If Err <> 0 Then + Msgbox(msgError$,16, GetProductName()) + Resume LETSGO + End If + LETSGO: + +End Sub + + +Sub InsertDBField(sDBName as String, sTableName as String, sColName as String) +Dim oFieldMaster, oField as Object + If sColname <> "" Then + oFieldMaster = oDocument.createInstance("com.sun.star.text.FieldMaster.Database") + oField = oDocument.createInstance("com.sun.star.text.TextField.Database") + oFieldMaster.DataBaseName = sDBName + oFieldMaster.DataBaseName = sDBName + oFieldMaster.DataTableName = sTableName + oFieldMaster.DataColumnName = sColName + oField.AttachTextfieldmaster (oFieldMaster) + oBookText.InsertTextContent(oBookMarkCursor, oField, True) + oField.Content = "<" & sColName & ">" + End If +End Sub + + +Sub InsertPlaceholder(sColName as String) +Dim oFieldMaster as Object +Dim bCorrectField as Boolean + If sColname <> "" Then + bCorrectField = True + oFieldMaster = oDocument.createInstance("com.sun.star.text.TextField.JumpEdit") + Select Case sColName + Case "Company" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_1") + Case "Department" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_2") + Case "FirstName" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_3") + Case "LastName" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_4") + Case "Street" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_5") + Case "Country" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_6") + Case "Zip" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_7") + Case "City" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_8") + Case "Title" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_9") + Case "Position" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_10") + Case "AddrForm" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_11") + Case "Code" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_12") + Case "AddrFormMail" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_13") + Case "PhonePriv" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_14") + Case "PhoneComp" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_15") + Case "Fax" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_16") + Case "EMail" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_17") + Case "URL" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_18") + Case "Note" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_19") + Case "Altfield1" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_20") + Case "Altfield2" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_21") + Case "Altfield3" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_22") + Case "Altfield4" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_23") + Case "Id" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_24") + Case "State" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_25") + Case "PhoneOffice" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_26") + Case "Pager" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_27") + Case "PhoneCell" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_28") + Case "PhoneOther" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_29") + Case "CalendarURL" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_30") + Case "InviteParticipant" + oFieldMaster.PlaceHolder = getResText("CorrespondenceFields_31") + Case Else + bCorrectField = False + End Select + If bCorrectField Then + oFieldMaster.Hint = getResText("CorrespondenceFields_0") + oBookText.InsertTextContent(oBookMarkCursor, oFieldMaster, True) + End If + End If +End Sub +</script:module> diff --git a/wizards/source/template/DialogStyles.xdl b/wizards/source/template/DialogStyles.xdl new file mode 100644 index 000000000..ec5f71423 --- /dev/null +++ b/wizards/source/template/DialogStyles.xdl @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DialogStyles" dlg:left="170" dlg:top="93" dlg:width="120" dlg:height="169" dlg:help-url="HID:WIZARDS_HID_DLGSTYLES_DIALOG" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="0" dlg:left="5" dlg:top="150" dlg:width="50" dlg:height="13" dlg:help-url="HID:WIZARDS_HID_DLGSTYLES_CANCEL" dlg:value="cmdCancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Template.Samples.RestoreCurrentStyles?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdOk" dlg:tab-index="1" dlg:left="65" dlg:top="150" dlg:width="50" dlg:height="12" dlg:help-url="HID:WIZARDS_HID_DLGSTYLES_OKAY" dlg:value="cmdOk"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Template.Samples.CloseStyleDialog?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:menulist dlg:id="lbStyles" dlg:tab-index="2" dlg:left="5" dlg:top="5" dlg:width="110" dlg:height="133" dlg:help-url="HID:WIZARDS_HID_DLGSTYLES_LISTBOX"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Template.Samples.SelectStyle?language=Basic&location=application" script:language="Script"/> + </dlg:menulist> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/template/ModuleAgenda.xba b/wizards/source/template/ModuleAgenda.xba new file mode 100644 index 000000000..a17fb68cd --- /dev/null +++ b/wizards/source/template/ModuleAgenda.xba @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ModuleAgenda" script:language="StarBasic">' All variables must be declared before use +Option Explicit + +' Used for "disabling" the cancel button of the dialog +Public DialogExited As Boolean +Dim DlgAgenda_gMyName as String +Public TemplateDialog as Object +Public DialogModel as Object +Public sTrueContent as String +Public Bookmarkname as String + + + +Sub Initialize() +' User sets the type of minutes + BasicLibraries.LoadLibrary( "Tools" ) + TemplateDialog = LoadDialog("Template", "TemplateDialog") + DialogModel = TemplateDialog.Model + DialogModel.Step = 1 + LoadLanguageAgenda() + DialogModel.OptAgenda2.State = TRUE + GetOptionValues() + DialogExited = FALSE + TemplateDialog.Execute +End Sub + + +Sub LoadLanguageAgenda() + If InitResources("'Template'") Then + DlgAgenda_gMyName = GetResText("AgendaDlgName") + DialogModel.CmdCancel.Label = GetResText("STYLES_2") + DialogModel.CmdAgdGoon.Label = GetResText("STYLES_3") +' DlgAgenda_gMsgNoCancel$ = GetResText("AgendaDlgNoCancel") + DialogModel.FrmAgenda.Label = GetResText("AgendaDlgFrame") + DialogModel.OptAgenda1.Label = GetResText("AgendaDlgButton1") + DialogModel.OptAgenda2.Label = GetResText("AgendaDlgButton2") +' DialogModel.OptAgenda1.State = 1 + End If +End Sub + + +Sub ModifyTemplate() +Dim oDocument, oBookmarks, oBookmark, oBookmarkCursor, oTextField as Object +Dim i as Integer + + oDocument = ThisComponent + oBookMarks = oDocument.Bookmarks + + On Local Error Goto NOBOOKMARK + TemplateDialog.EndExecute + DialogExited = TRUE + oBookmarkCursor = CreateBookmarkCursor(oDocument, BookmarkName) + oBookmarkCursor.Text.insertString(oBookmarkCursor,"",True) + ' Delete all the Bookmarks except for the one named "NextTopic" + For i = oBookmarks.Count-1 To 0 Step -1 + oBookMark = oBookMarks.GetByIndex(i) + If oBookMark.Name <> "NextTopic" Then + oBookMark.Dispose() + End If + Next i + oBookMarkCursor = CreateBookmarkCursor(oDocument, "NextTopic") + If Not IsNull(oBookMarkCursor) Then + oTextField = oBookMarkCursor.TextField +' oTextField.TrueContent = sTrueContent + oTextField.Content = sTrueContent + End If + + NOBOOKMARK: + If Err <> 0 Then + RESUME NEXT + End If +End Sub + + +Sub NewTopic +' Add a new topic to the agenda +Dim oDocument, oBookmarks, oBookmark, oBookmarkCursor, oTextField as Object +Dim oBaustein, oAutoText, oAutoGroup as Object +Dim i as Integer + + oDocument = ThisComponent + oBookMarkCursor = CreateBookMarkCursor(oDocument, "NextTopic") + oTextField = oBookMarkCursor.TextField + oAutoText = CreateUnoService("com.sun.star.text.AutoTextContainer") + If oAutoText.HasbyName("template") Then + oAutoGroup = oAutoText.GetbyName("template") + If oAutoGroup.HasbyName(oTextField.Content) Then + oBaustein = oAutoGroup.GetbyName(oTextField.Content) + oBaustein.ApplyTo(oBookMarkCursor) + Else + Msgbox("AutoText '" & oTextField.Content & "' is not existing. Cannot insert additional topic!") + End If + Else + Msgbox("AutoGroupField template is not existing. Cannot insert additional topic!", 16, DlgAgenda_gMyName ) + End If +End Sub + + + +' Add initials, date and time at bottom of agenda, disable and hide command buttons +Sub FinishAgenda +Dim BtnAddAgendaTopic As Object +Dim BtnFinishAgenda As Object +Dim oUserField, oDateTimeField as Object +Dim oBookmarkCursor as Object +Dim oFormats, oLocale as Object +Dim iDateTimeKey as Integer + + BasicLibraries.LoadLibrary( "Tools" ) + oDocument = ThisComponent + + oUserField = oDocument.CreateInstance("com.sun.star.text.TextField.ExtendedUser") + oUserField.UserDatatype = com.sun.star.text.UserDataPart.SHORTCUT + + oDateTimeField = oDocument.CreateInstance("com.sun.star.text.TextField.DateTime") + + ' Assign Standardformat to Datetime-Textfield + oFormats = oDocument.Numberformats + oLocale = oDocument.CharLocale + iDateTimeKey = oFormats.GetStandardFormat(com.sun.star.util.NumberFormat.DATETIME,oLocale) + oDateTimeField.NumberFormat = iDateTimeKey + + oBookmarkCursor = CreateBookmarkCursor(oDocument, "NextTopic") + oBookmarkCursor.Text.InsertTextContent(oBookmarkCursor,oUserField,False) + oBookmarkCursor.Text.InsertString(oBookmarkCursor," ",False) + oBookmarkCursor.Text.InsertTextContent(oBookmarkCursor,oDateTimeField,False) + BtnAddAgendaTopic = getControlModel(oDocument, "BtnAddAgendaTopic") + BtnFinishAgenda = getControlModel(oDocument, "BtnFinishAgenda") + If Not IsNull(BtnAddAgendaTopic) Then BtnAddAgendaTopic.Enabled = FALSE + If Not IsNull(BtnFinishAgenda) Then BtnFinishAgenda.Enabled = FALSE +End Sub + + +Function CreateBookMarkCursor(oDocument as Object,sBookmarkName as String) + oBookMarks = oDocument.Bookmarks + If oBookmarks.HasbyName(sBookmarkName) Then + oBookMark = oBookMarks.GetbyName(sBookmarkName) + CreateBookMarkCursor = oBookMark.Anchor.Text.CreateTextCursorByRange(oBookMark.Anchor) + Else + Msgbox "Bookmark " & sBookmarkName & " is not defined!" + End If +End Function + + + +Sub DeleteButtons +Dim AgendaFinished As Boolean +Dim BtnAddAgendaTopic As Object +Dim BtnFinishAgenda As Object + + oDocument = ThisComponent + + BtnAddAgendaTopic = getControlModel(oDocument, "BtnAddAgendaTopic") + BtnFinishAgenda = getControlModel(oDocument, "BtnFinishAgenda") + + ' If buttons could be accessed: If at least one button is disabled, then agenda is finished + AgendaFinished = FALSE + If Not IsNull(BtnAddAgendaTopic) Then + AgendaFinished = (AgendaFinished Or (BtnAddAgendaTopic.Enabled = FALSE)) + End If + + If Not IsNull(BtnFinishAgenda) Then + AgendaFinished = (AgendaFinished Or (BtnFinishAgenda.Enabled = FALSE)) + End If + + ' Delete Buttons, empty rows at end of document & macro bindings if agenda is finished + If AgendaFinished Then + DisposeControl(oDocument, "BtnAddAgendaTopic") + DisposeControl(oDocument, "BtnFinishAgenda") + + oBookmarkCursor = CreateBookMarkCursor(oDocument,"NextTopic") + oBookMarkCursor.GotoEnd(True) + oBookmarkCursor.Text.insertString(oBookmarkCursor,"",True) + + AttachBasicMacroToEvent(oDocument,"OnNew", "") + AttachBasicMacroToEvent(oDocument,"OnSave", "") + AttachBasicMacroToEvent(oDocument,"OnSaveAs", "") + AttachBasicMacroToEvent(oDocument,"OnPrint", "") + End If +End Sub + + + +Sub GetOptionValues(Optional aEvent as Object) +Dim CurTag as String +Dim Taglist() as String + If Not IsMissing(aEvent) Then + CurTag = aEvent.Source.Model.Tag + Else + If DialogModel.OptAgenda1.State = TRUE Then + CurTag = DialogModel.OptAgenda1.Tag + Else + CurTag = DialogModel.OptAgenda2.Tag + End If + End If + Taglist() = ArrayoutOfString(CurTag, ";") + Bookmarkname = TagList(0) + sTrueContent = TagList(1) +End Sub + +</script:module> diff --git a/wizards/source/template/Samples.xba b/wizards/source/template/Samples.xba new file mode 100644 index 000000000..3009f4cba --- /dev/null +++ b/wizards/source/template/Samples.xba @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Samples" script:language="StarBasic">Option Explicit + +Const NumStyles = 18 +Const aTempFileName = "Berend_Ilko_Tom_Stella_Volker.stc" +Dim oUcbObject as Object +Public StylesDir as String +Public StylesDialog as Object +Public PathSeparator as String +Public oFamilies as Object +Public aOptions(0) as New com.sun.star.beans.PropertyValue +Public sQueryPath as String +Public NoArgs()as New com.sun.star.beans.PropertyValue +Public aTempURL as String + +Public Files(100) as String + +'-------------------------------------------------------------------------------------- +'Calc Style Section starts here + +Sub ShowStyles +'This sub displays the style selection dialog if the current document is a calc document. +Dim TemplateDir, ActFileTitle, DisplayDummy as String +Dim sFilterName(0) as String +Dim StyleNames() as String +Dim LocalizedStyleNames(NumStyles,2) As String +Dim LocalizedStyleName As String +Dim t as Integer +Dim MaxIndex as Integer +Dim StyleNameDef As Variant + BasicLibraries.LoadLibrary("Tools") + If InitResources("'Template'") then + oDocument = ThisComponent + If oDocument.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then + ToggleWindow(False) + oUcbObject = createUnoService("com.sun.star.ucb.SimpleFileAccess") + oFamilies = oDocument.StyleFamilies + SaveCurrentStyles(oDocument) + StylesDialog = LoadDialog("Template", "DialogStyles") + DialogModel = StylesDialog.Model + TemplateDir = GetPathSettings("Template", False, 0) + StylesDir = GetOfficeSubPath("Template", "wizard/styles/") + sQueryPath = GetOfficeSubPath("Template", "../wizard/bitmap/") + DialogModel.Title = GetResText("STYLES_0") + DialogModel.cmdCancel.Label = GetResText("STYLES_2") + DialogModel.cmdOk.Label = GetResText("STYLES_3") + StyleNameDef = Array("(Standard)", "Autumn Leaves", "Be", "Black and White", "Blackberry Bush", "Blue Jeans", "Fifties Diner", "Glacier", "Green Grapes", "Marine", "Millennium", "Nature", "Neon", "Night", "PC Nostalgia", "Pastel", "Pool Party", "Pumpkin") + For t = 0 to NumStyles - 1 + LocalizedStyleNames(t,0) = StyleNameDef(t) + LocalizedStyleNames(t,1) = GetResText("STYLENAME_" & Trim(Str(t))) + Next t + Stylenames() = ReadDirectories(StylesDir, False, False, True,) + MaxIndex = Ubound(Stylenames()) + For t = 0 to MaxIndex + LocalizedStyleName = StringInMultiArray(LocalizedStyleNames(), StyleNames(t,1), 0, 1) + If LocalizedStyleName <> "" Then + StyleNames(t,1) = LocalizedStyleName + End If + Next t + BubbleSortList(Stylenames(),True) + Dim cStyles(MaxIndex) + For t = 0 to MaxIndex + Files(t) = StyleNames(t,0) + cStyles(t) = StyleNames(t,1) + Next t + On Local Error Resume Next + DialogModel.lbStyles.StringItemList() = cStyles() + ToggleWindow(True) + StylesDialog.Execute + End If + End If +End Sub + + +Sub SelectStyle +'This sub loads the specific styles from a style document and loads them into the +'current document. +Dim StylePath as String +Dim NewStyle as String +Dim Position as Integer + Position = DialogModel.lbStyles.SelectedItems(0) + If Position > -1 Then + ToggleWindow(False) + StylePath = Files(Position) + aOptions(0).Name = "OverwriteStyles" + aOptions(0).Value = true + oFamilies.loadStylesFromURL(StylePath, aOptions()) + ToggleWindow(True) + End If +End Sub + + +Sub SaveCurrentStyles(oDocument as Object) +'This sub stores the current document in the directory to hold temporary files. + On Error Goto ErrorOcurred + aTempURL = GetPathSettings("Temp", False) + Dim aRightMost as String + aRightMost = Right(aTempURL, 1) + if aRightMost = "/" Then + aTempURL = aTempURL & aTempFileName + Else + aTempURL = aTempURL & "/" & aTempFileName + End If + + While FileExists(aTempURL) + aTempURL=Left(aTempURL,(Len(aTempURL)-4)) & "_1.stc" + Wend + oDocument.storeToURL(aTempURL, NoArgs()) + Exit Sub + +ErrorOcurred: + MsgBox(GetResText("STYLES_1"), 16, GetResText("STYLES_0")) + On Local Error Goto 0 +End Sub + + +Sub RestoreCurrentStyles +'This sub retrieves the styles from the temporarily save document + ToggleWindow(False) + On Local Error Goto NoFile + If FileExists(aTempURL) Then + aOptions(0).Name = "OverwriteStyles" + aOptions(0).Value = true + oFamilies.LoadStylesFromURL(aTempURL, aOptions()) + KillTempFile() + End If + StylesDialog.EndExecute + ToggleWindow(True) +NOFILE: + If Err <> 0 Then + Msgbox("Cannot load Document from " & aTempUrl, 64, GetProductname()) + End If + On Local Error Goto 0 +End Sub + + +Sub CloseStyleDialog + KillTempFile() + DialogExited = True + StylesDialog.Endexecute +End Sub + + +Sub KillTempFile() + If oUcbObject.Exists(aTempUrl) Then + oUcbObject.Kill(aTempUrl) + End If +End Sub + +</script:module> diff --git a/wizards/source/template/TemplateDialog.xdl b/wizards/source/template/TemplateDialog.xdl new file mode 100644 index 000000000..545b92f95 --- /dev/null +++ b/wizards/source/template/TemplateDialog.xdl @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="TemplateDialog" dlg:left="170" dlg:top="93" dlg:width="220" dlg:height="60" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_DIALOG" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:radiogroup> + <dlg:radio dlg:id="OptAgenda1" dlg:tab-index="0" dlg:left="12" dlg:top="20" dlg:width="144" dlg:height="10" dlg:page="1" dlg:tag="TOP2;PT1" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA1" dlg:value="OptAgenda1"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Template.ModuleAgenda.GetOptionValues?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + <dlg:radio dlg:id="OptAgenda2" dlg:tab-index="1" dlg:left="12" dlg:top="34" dlg:width="144" dlg:height="10" dlg:page="1" dlg:tag="TOP1;PT2" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONAGENDA2" dlg:value="OptAgenda2"> + <script:event script:event-name="on-itemstatechange" script:macro-name="vnd.sun.star.script:Template.ModuleAgenda.GetOptionValues?language=Basic&location=application" script:language="Script"/> + </dlg:radio> + </dlg:radiogroup> + <dlg:button dlg:id="CmdCorrGoOn" dlg:tab-index="2" dlg:left="164" dlg:top="11" dlg:width="50" dlg:height="14" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_LETTEROKAY" dlg:value="CmdCorrGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="Template.Correspondence.OK" script:language="StarBasic"/> + </dlg:button> + <dlg:radiogroup> + <dlg:radio dlg:id="OptSingle" dlg:tab-index="3" dlg:left="12" dlg:top="20" dlg:width="144" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER1" dlg:value="OptSingle"/> + <dlg:radio dlg:id="Optmerge" dlg:tab-index="4" dlg:left="12" dlg:top="34" dlg:width="144" dlg:height="10" dlg:page="2" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_OPTIONLETTER2" dlg:value="Optmerge"/> + </dlg:radiogroup> + <dlg:button dlg:id="CmdAgdGoon" dlg:tab-index="5" dlg:left="164" dlg:top="11" dlg:width="50" dlg:height="14" dlg:page="1" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_AGENDAOKAY" dlg:value="CmdAgdGoOn"> + <script:event script:event-name="on-performaction" script:macro-name="Template.ModuleAgenda.ModifyTemplate" script:language="StarBasic"/> + </dlg:button> + <dlg:button dlg:id="CmdCancel" dlg:tab-index="6" dlg:left="164" dlg:top="28" dlg:width="50" dlg:height="14" dlg:help-url="HID:WIZARDS_HID_DLGCORRESPONDENCE_CANCEL" dlg:value="CmdCancel" dlg:button-type="cancel"> + <script:event script:event-name="on-performaction" script:macro-name="Template.ModuleAgenda.DisposeDocument" script:language="StarBasic"/> + </dlg:button> + <dlg:fixedline dlg:id="FrmLetter" dlg:tab-index="7" dlg:left="6" dlg:top="6" dlg:width="150" dlg:height="10" dlg:page="2" dlg:value="FrmLetter"/> + <dlg:fixedline dlg:id="FrmAgenda" dlg:tab-index="8" dlg:left="6" dlg:top="6" dlg:width="150" dlg:height="10" dlg:page="1" dlg:value="FrmAgenda"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/template/dialog.xlb b/wizards/source/template/dialog.xlb new file mode 100644 index 000000000..c5eed37a2 --- /dev/null +++ b/wizards/source/template/dialog.xlb @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Template" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="DialogStyles"/> + <library:element library:name="DlgGreeting"/> + <library:element library:name="TemplateDialog"/> +</library:library> diff --git a/wizards/source/template/script.xlb b/wizards/source/template/script.xlb new file mode 100644 index 000000000..c89cc3788 --- /dev/null +++ b/wizards/source/template/script.xlb @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> + <library:library xmlns:library="http://openoffice.org/2000/library" library:name="Template" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="ModuleAgenda"/> + <library:element library:name="Correspondence"/> + <library:element library:name="Samples"/> + <library:element library:name="Autotext"/> + </library:library> diff --git a/wizards/source/tools/Debug.xba b/wizards/source/tools/Debug.xba new file mode 100644 index 000000000..fe909c5b8 --- /dev/null +++ b/wizards/source/tools/Debug.xba @@ -0,0 +1,253 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Debug" script:language="StarBasic">REM ***** BASIC ***** + +Sub ActivateReadOnlyFlag() + SetBasicReadOnlyFlag(True) +End Sub + + +Sub DeactivateReadOnlyFlag() + SetBasicReadOnlyFlag(False) +End Sub + + +Sub SetBasicReadOnlyFlag(bReadOnly as Boolean) +Dim i as Integer +Dim LibName as String +Dim BasicLibNames() as String + BasicLibNames() = BasicLibraries.ElementNames() + For i = 0 To Ubound(BasicLibNames()) + LibName = BasicLibNames(i) + If LibName <> "Standard" Then + BasicLibraries.SetLibraryReadOnly(LibName, bReadOnly) + End If + Next i +End Sub + + +Sub WritedbgInfo(LocObject as Object) +Dim locUrl as String +Dim oLocDocument as Object +Dim oLocText as Object +Dim oLocCursor as Object +Dim NoArgs() +Dim sObjectStrings(2) as String +Dim sProperties() as String +Dim n as Integer +Dim m as Integer +Dim MaxIndex as Integer + sObjectStrings(0) = LocObject.dbg_Properties + sObjectStrings(1) = LocObject.dbg_Methods + sObjectStrings(2) = LocObject.dbg_SupportedInterfaces + LocUrl = "private:factory/swriter" + oLocDocument = StarDesktop.LoadComponentFromURL(LocUrl,"_default",0,NoArgs) + oLocText = oLocDocument.text + oLocCursor = oLocText.createTextCursor() + oLocCursor.gotoStart(False) + If Vartype(LocObject) = 9 then ' an Object Variable + For n = 0 To 2 + sProperties() = ArrayoutofString(sObjectStrings(n),";", MaxIndex) + For m = 0 To MaxIndex + oLocText.insertString(oLocCursor,sProperties(m),False) + oLocText.insertControlCharacter(oLocCursor,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + Next m + Next n + Elseif Vartype(LocObject) = 8 Then ' a String Variable + oLocText.insertString(oLocCursor,LocObject,False) + ElseIf Vartype(LocObject) = 1 Then + Msgbox("Variable is Null!", 16, GetProductName()) + End If +End Sub + + +Sub WriteDbgString(LocString as string) +Dim oLocDesktop as object +Dim LocUrl as String +Dim oLocDocument as Object +Dim oLocCursor as Object +Dim oLocText as Object + + LocUrl = "private:factory/swriter" + oLocDocument = StarDesktop.LoadComponentFromURL(LocUrl,"_default",0,NoArgs) + oLocText = oLocDocument.text + oLocCursor = oLocText.createTextCursor() + oLocCursor.gotoStart(False) + oLocText.insertString(oLocCursor,LocString,False) +End Sub + + +Sub printdbgInfo(LocObject) + If Vartype(LocObject) = 9 then + Msgbox LocObject.dbg_properties + Msgbox LocObject.dbg_methods + Msgbox LocObject.dbg_supportedinterfaces + Elseif Vartype(LocObject) = 8 Then ' a String Variable + Msgbox LocObject + ElseIf Vartype(LocObject) = 0 Then + Msgbox("Variable is Null!", 16, GetProductName()) + Else + Msgbox("Type of Variable: " & Typename(LocObject), 48, GetProductName()) + End If +End Sub + + +Sub ShowArray(LocArray()) +Dim i as integer +Dim msgstring + msgstring = "" + For i = Lbound(LocArray()) to Ubound(LocArray()) + msgstring = msgstring + LocArray(i) + chr(13) + Next + Msgbox msgstring +End Sub + + +Sub ShowPropertyValues(oLocObject as Object) +Dim PropName as String +Dim sValues as String + On Local Error Goto NOPROPERTYSETINFO: + sValues = "" + For i = 0 To Ubound(oLocObject.PropertySetInfo.Properties) + Propname = oLocObject.PropertySetInfo.Properties(i).Name + sValues = sValues & PropName & chr(13) & " = " & oLocObject.GetPropertyValue(PropName) & chr(13) + Next i + Msgbox(sValues , 64, GetProductName()) + Exit Sub + +NOPROPERTYSETINFO: + Msgbox("Sorry, No PropertySetInfo attached to the object", 16, GetProductName()) + Resume LEAVEPROC + LEAVEPROC: +End Sub + + +Sub ShowNameValuePair(Pair()) +Dim i as Integer +Dim ShowString as String + ShowString = "" + On Local Error Resume Next + For i = 0 To Ubound(Pair()) + ShowString = ShowString & Pair(i).Name & " = " + ShowString = ShowString & Pair(i).Value & chr(13) + Next i + Msgbox ShowString +End Sub + + +' Retrieves all the Elements of aSequence of an object, with the +' possibility to define a filter(sfilter <> "") +Sub ShowElementNames(oLocElements() as Object, Optional sFiltername as String) +Dim i as Integer +Dim NameString as String + NameString = "" + For i = 0 To Ubound(oLocElements()) + If Not IsMissIng(sFilterName) Then + If Instr(1, oLocElements(i), sFilterName) Then + NameString = NameString & oLocElements(i) & chr(13) + End If + Else + NameString = NameString & oLocElements(i) & chr(13) + End If + Next i + Msgbox(NameString, 64, GetProductName()) +End Sub + + +' Retrieves all the supported servicenames of an object, with the +' possibility to define a filter(sfilter <> "") +Sub ShowSupportedServiceNames(oLocObject as Object, Optional sFilterName as String) + On Local Error Goto NOSERVICENAMES + If IsMissing(sFilterName) Then + ShowElementNames(oLocobject.SupportedServiceNames()) + Else + ShowElementNames(oLocobject.SupportedServiceNames(), sFilterName) + End If + Exit Sub + + NOSERVICENAMES: + Msgbox("Sorry, No 'SupportedServiceNames' - Property attached to the object", 16, GetProductName()) + Resume LEAVEPROC + LEAVEPROC: +End Sub + + +' Retrieves all the available Servicenames of an object, with the +' possibility to define a filter(sfilter <> "") +Sub ShowAvailableServiceNames(oLocObject as Object, Optional sFilterName as String) + On Local Error Goto NOSERVICENAMES + If IsMissing(sFilterName) Then + ShowElementNames(oLocobject.AvailableServiceNames) + Else + ShowElementNames(oLocobject.AvailableServiceNames, sFilterName) + End If + Exit Sub + + NOSERVICENAMES: + Msgbox("Sorry, No 'AvailableServiceNames' - Property attached to the object", 16, GetProductName()) + Resume LEAVEPROC + LEAVEPROC: +End Sub + + +Sub ShowCommands(oLocObject as Object) + On Local Error Goto NOCOMMANDS + ShowElementNames(oLocObject.QueryCommands) + Exit Sub + NOCOMMANDS: + Msgbox("Sorry, No 'QueryCommands' - Property attached to the object", 16, GetProductName()) + Resume LEAVEPROC + LEAVEPROC: +End Sub + + +Sub ProtectCurrentSheets() +Dim oDocument as Object +Dim sDocType as String +Dim iResult as Integer +Dim oSheets as Object +Dim i as Integer +Dim bDoProtect as Boolean + oDocument = StarDesktop.ActiveFrame.Controller.Model + sDocType = GetDocumentType(oDocument) + If sDocType = "scalc" Then + oSheets = oDocument.Sheets + bDoProtect = False + For i = 0 To oSheets.Count-1 + If Not oSheets(i).IsProtected Then + bDoProtect = True + End If + Next i + If bDoProtect Then + iResult = Msgbox( "Do you want to protect all sheets of this document?",35, GetProductName()) + If iResult = 6 Then + ProtectSheets(oDocument.Sheets) + End If + End If + End If +End Sub + + +Sub FillDocument() + oMyReport = createUNOService("com.sun.star.wizards.report.CallReportWizard") + oMyReport.trigger("fill") +End Sub + +</script:module>
\ No newline at end of file diff --git a/wizards/source/tools/DlgOverwriteAll.xdl b/wizards/source/tools/DlgOverwriteAll.xdl new file mode 100644 index 000000000..b241a9bcc --- /dev/null +++ b/wizards/source/tools/DlgOverwriteAll.xdl @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="DlgOverwriteAll" dlg:left="138" dlg:top="75" dlg:width="230" dlg:height="64" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:text dlg:id="lblQueryforSave" dlg:tab-index="0" dlg:left="6" dlg:top="6" dlg:width="218" dlg:height="36" dlg:value="lblQueryforSave" dlg:multiline="true"/> + <dlg:button dlg:id="cmdYes" dlg:tab-index="1" dlg:left="6" dlg:top="43" dlg:width="50" dlg:height="14" dlg:value="cmdYes"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.ModuleControls.SetOVERWRITEToQuery?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdYesToAll" dlg:tab-index="2" dlg:left="62" dlg:top="43" dlg:width="50" dlg:height="14" dlg:value="cmdYesToAll"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.ModuleControls.SetOVERWRITEToAlways?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdNo" dlg:tab-index="3" dlg:left="118" dlg:top="43" dlg:width="50" dlg:height="14" dlg:default="true" dlg:value="cmdNo"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tools.ModuleControls.SetOVERWRITEToNever?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="cmdCancel" dlg:tab-index="4" dlg:left="174" dlg:top="43" dlg:width="50" dlg:height="14" dlg:value="cmdCancel" dlg:button-type="cancel"/> + </dlg:bulletinboard> +</dlg:window> diff --git a/wizards/source/tools/Listbox.xba b/wizards/source/tools/Listbox.xba new file mode 100644 index 000000000..21f8f44c6 --- /dev/null +++ b/wizards/source/tools/Listbox.xba @@ -0,0 +1,370 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Listbox" script:language="StarBasic">Option Explicit +Dim OriginalList() +Dim oDialogModel as Object + + +Sub MergeList(SourceListBox() as Object, SecondList() as String) +Dim i as Integer +Dim MaxIndex as Integer + MaxIndex = Ubound(SecondList()) + OriginalList() = AddListToList(OriginalList(), SecondList()) + For i = 0 To MaxIndex + SourceListbox = AddSingleItemToListbox(SourceListbox, SecondList(i)) + Next i + Call FormSetMoveRights() +End Sub + + +Sub RemoveListItems(SourceListbox as Object, TargetListbox as Object, RemoveList() as String) +Dim i as Integer +Dim s as Integer +Dim MaxIndex as Integer +Dim CopyList() + MaxIndex = Ubound(RemoveList()) + For i = 0 To MaxIndex + RemoveListboxItemByName(SourceListbox, RemoveList(i)) + RemoveListboxItemByName(TargetListbox, RemoveList(i)) + Next i + CopyList() = OriginalList() + s = 0 + MaxIndex = Ubound(CopyList()) + For i = 0 To MaxIndex + If IndexInArray(CopyList(i),RemoveList())= -1 Then + OriginalList(s) = CopyList(i) + s = s + 1 + End If + Next i + ReDim Preserve OriginalList(s-1) + Call FormSetMoveRights() +End Sub + + +' Note Boolean Parameter +Sub InitializeListboxProcedures(oModel as Object, SourceListbox as Object, TargetListbox as Object) +Dim EmptyList() + Set oDialogModel = oModel + OriginalList()= SourceListbox.StringItemList() + TargetListbox.StringItemList() = EmptyList() +End Sub + + +Sub CopyListboxItems(SourceListbox as Object, TargetListbox As Object) +Dim NullArray() + TargetListbox.StringItemList() = OriginalList() + SourceListbox.StringItemList() = NullArray() +End Sub + + +Sub FormMoveSelected() + Call MoveSelectedListBox(oDialogModel.lstFields, oDialogModel.lstSelFields) + Call FormSetMoveRights() + oDialogModel.lstSelFields.Tag = True +End Sub + + +Sub FormMoveAll() + Call CopyListboxItems(oDialogModel.lstFields, oDialogModel.lstSelFields) + Call FormSetMoveRights() + oDialogModel.lstSelFields.Tag = True +End Sub + + +Sub FormRemoveSelected() + Call MoveOrderedSelectedListbox(oDialogModel.lstFields, oDialogModel.lstSelFields, False) + Call FormSetMoveRights() + oDialogModel.lstSelFields.Tag = True +End Sub + + +Sub FormRemoveAll() + Call MoveOrderedSelectedListbox(oDialogModel.lstFields, oDialogModel.lstSelFields, True) + Call FormSetMoveRights() + oDialogModel.lstSelFields.Tag = 1 +End Sub + + +Sub MoveSelectedListBox(SourceListbox as Object, TargetListbox as Object) +Dim MaxCurTarget as Integer +Dim MaxSourceSelected as Integer +Dim n as Integer +Dim m as Integer +Dim CurIndex +Dim iOldTargetSelect as Integer +Dim iOldSourceSelect as Integer + MaxCurTarget = Ubound(TargetListbox.StringItemList()) + MaxSourceSelected = Ubound(SourceListbox.SelectedItems()) + Dim TargetList(MaxCurTarget+MaxSourceSelected+1) + If MaxSourceSelected > -1 Then + iOldSourceSelect = SourceListbox.SelectedItems(0) + If Ubound(TargetListbox.SelectedItems()) > -1 Then + iOldTargetSelect = TargetListbox.SelectedItems(0) + Else + iOldTargetSelect = -1 + End If + For n = 0 To MaxCurTarget + TargetList(n) = TargetListbox.StringItemList(n) + Next n + For m = 0 To MaxSourceSelected + CurIndex = SourceListbox.SelectedItems(m) + TargetList(n) = SourceListbox.StringItemList(CurIndex) + n = n + 1 + Next m + TargetListBox.StringItemList() = TargetList() + SourceListbox.StringItemList() = RemoveSelected (SourceListbox) + SetNewSelection(SourceListbox, iOldSourceSelect) + SetNewSelection(TargetListbox, iOldTargetSelect) + End If +End Sub + + + +Sub MoveOrderedSelectedListbox(lstSource as Object, lstTarget as Object, bMoveAll as Boolean) +Dim NullArray() +Dim MaxSelected as Integer +Dim MaxSourceIndex as Integer +Dim MaxOriginalIndex as Integer +Dim MaxNewIndex as Integer +Dim n as Integer +Dim m as Integer +Dim CurIndex as Integer +Dim SearchString as String +Dim SourceList() as String +Dim iOldTargetSelect as Integer +Dim iOldSourceSelect as Integer + If bMoveAll Then + lstSource.StringItemList() = OriginalList() + lstTarget.StringItemList() = NullArray() + Else + MaxOriginalIndex = Ubound(OriginalList()) + MaxSelected = Ubound(lstTarget.SelectedItems()) + iOldTargetSelect = lstTarget.SelectedItems(0) + If Ubound(lstSource.SelectedItems()) > -1 Then + iOldSourceSelect = lstSource.SelectedItems(0) + End If + Dim SelList(MaxSelected) + For n = 0 To MaxSelected + CurIndex = lstTarget.SelectedItems(n) + SelList(n) = lstTarget.StringItemList(CurIndex) + Next n + SourceList() = lstSource.StringItemList() + MaxSourceIndex = Ubound(lstSource.StringItemList()) + MaxNewIndex = MaxSelected + MaxSourceIndex + 1 + Dim NewSourceList(MaxNewIndex) + m = 0 + For n = 0 To MaxOriginalIndex + SearchString = OriginalList(n) + If IndexInArray(SearchString, SelList()) <> -1 Then + NewSourceList(m) = SearchString + m = m + 1 + ElseIf IndexInArray(SearchString, SourceList()) <> -1 Then + NewSourceList(m) = SearchString + m = m + 1 + End If + Next n + lstSource.StringItemList() = NewSourceList() + lstTarget.StringItemList() = RemoveSelected(lstTarget) + End If + SetNewSelection(lstSource, iOldSourceSelect) + SetNewSelection(lstTarget, iOldTargetSelect) + +End Sub + + +Function RemoveSelected(oListbox as Object) +Dim MaxIndex as Integer +Dim MaxSelected as Integer +Dim n as Integer +Dim m as Integer +Dim CurIndex as Integer +Dim CurItem as String +Dim ResultArray() + MaxIndex = Ubound(oListbox.StringItemList()) + MaxSelected = Ubound(oListbox.SelectedItems()) + Dim LocItemList(MaxIndex) + LocItemList() = oListbox.StringItemList() + If MaxSelected > -1 Then + For n = 0 To MaxSelected + CurIndex = oListbox.SelectedItems(n) + LocItemList(CurIndex) = "" + Next n + If MaxIndex > 0 Then + ReDim ResultArray(MaxIndex - MaxSelected - 1) + m = 0 + For n = 0 To MaxIndex + CurItem = LocItemList(n) + If CurItem <> "" Then + ResultArray(m) = CurItem + m = m + 1 + End If + Next n + End If + RemoveSelected = ResultArray() + Else + RemoveSelected = oListbox.StringItemList() + End If +End Function + + +Sub SetNewSelection(oListBox as Object, iLastSelection as Integer) +Dim MaxIndex as Integer +Dim SelIndex as Integer +Dim SelList(0) as Integer + MaxIndex = Ubound(oListBox.StringItemList()) + If MaxIndex > -1 AND iLastSelection > -1 Then + If iLastSelection > MaxIndex Then + Selindex = MaxIndex + Else + SelIndex = iLastSelection + End If + Sellist(0) = SelIndex + oListBox.SelectedItems() = SelList() + End If +End Sub + + +Sub ToggleListboxControls(oDialogModel as Object, bDoEnable as Boolean) + With oDialogModel + .lblFields.Enabled = bDoEnable + .lblSelFields.Enabled = bDoEnable +' .lstTables.Enabled = bDoEnable + .lstFields.Enabled = bDoEnable + .lstSelFields.Enabled = bDoEnable + .cmdRemoveAll.Enabled = bDoEnable + .cmdRemoveSelected.Enabled = bDoEnable + .cmdMoveAll.Enabled = bDoEnable + .cmdMoveSelected.Enabled = bDoEnable + End With + If bDoEnable Then + FormSetMoveRights() + End If +End Sub + + +' Enable or disable the buttons used for moving the available +' fields between the two list boxes. +Sub FormSetMoveRights() +Dim bIsFieldSelected as Boolean +Dim bSelectSelected as Boolean +Dim FieldCount as Integer +Dim SelectCount as Integer + bIsFieldSelected = Ubound(oDialogModel.lstFields.SelectedItems()) <> -1 + FieldCount = Ubound(oDialogModel.lstFields.StringItemList()) + 1 + bSelectSelected = Ubound(oDialogModel.lstSelFields.SelectedItems()) > -1 + SelectCount = Ubound(oDialogModel.lstSelFields.StringItemList()) + 1 + oDialogModel.cmdRemoveAll.Enabled = SelectCount>=1 + oDialogModel.cmdRemoveSelected.Enabled = bSelectSelected + oDialogModel.cmdMoveAll.Enabled = FieldCount >=1 + oDialogModel.cmdMoveSelected.Enabled = bIsFieldSelected + oDialogModel.cmdGoOn.Enabled = SelectCount>=1 + ' This flag is set to '1' when the lstSelFields has been modified +End Sub + + +Function AddSingleItemToListbox(ByVal oListbox as Object, ListItem as String, Optional iSelIndex) as Object +Dim MaxIndex as Integer +Dim i as Integer + + MaxIndex = Ubound(oListbox.StringItemList()) +Dim LocList(MaxIndex + 1) +' Todo: This goes faster with the Redim LocList(MaxIndex + 1) Preserve function + For i = 0 To MaxIndex + LocList(i) = oListbox.StringItemList(i) + Next i + LocList(MaxIndex + 1) = ListItem + oListbox.StringItemList() = LocList() + If Not IsMissing(iSelIndex) Then + SelectListboxItem(oListbox, iSelIndex) + End If + AddSingleItemToListbox() = oListbox +End Function + + +Sub EmptyListbox(oListbox as Object) +Dim NullList() as String + oListbox.StringItemList() = NullList() +End Sub + + +Sub SelectListboxItem(oListbox as Object, iSelIndex as Integer) +Dim LocSelList(0) as Integer + If iSelIndex <> -1 Then + LocSelList(0) = iSelIndex + oListbox.SelectedItems() = LocSelList() + End If +End Sub + + +Function GetSelectedListboxItems(oListbox as Object) +Dim SelList(Ubound(oListBox.SelectedItems())) as String +Dim i as Integer +Dim CurIndex as Integer + For i = 0 To Ubound(oListbox.SelectedItems()) + CurIndex = oListbox.SelectedItems(i) + SelList(i) = oListbox.StringItemList(CurIndex) + Next i + GetSelectedListboxItems() = SelList() +End Function + + +' Note: When using this Sub it must be ensured that the +' 'RemoveItem' appears only once in the Listbox +Sub RemoveListboxItemByName(oListbox as Object, RemoveItem as String) +Dim OldList() as String +Dim NullList() as String +Dim i as Integer +Dim a as Integer +Dim MaxIndex as Integer + OldList = oListbox.StringItemList() + MaxIndex = Ubound(OldList()) + If IndexInArray(RemoveItem, OldList()) <> -1 Then + If MaxIndex > 0 Then + a = 0 + Dim NewList(MaxIndex -1) + For i = 0 To MaxIndex + If RemoveItem <> OldList(i) Then + NewList(a) = OldList(i) + a = a + 1 + End If + Next i + oListbox.StringItemList() = NewList() + Else + oListBox.StringItemList() = NullList() + End If + End If +End Sub + + +Function GetItemPos(oListBox as Object, sItem as String) +Dim ItemList() +Dim MaxIndex as Integer +Dim i as Integer + ItemList() = oListBox.StringItemList() + MaxIndex = Ubound(ItemList()) + For i = 0 To MaxIndex + If sItem = ItemList(i) Then + GetItemPos() = i + Exit Function + End If + Next i + GetItemPos() = -1 +End Function +</script:module> diff --git a/wizards/source/tools/Misc.xba b/wizards/source/tools/Misc.xba new file mode 100644 index 000000000..9b9e1dba6 --- /dev/null +++ b/wizards/source/tools/Misc.xba @@ -0,0 +1,841 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Misc" script:language="StarBasic">REM ***** BASIC ***** + +Const SBSHARE = 0 +Const SBUSER = 1 +Dim Taskindex as Integer +Dim oResSrv as Object + +Sub Main() +Dim PropList(3,1)' as String + PropList(0,0) = "URL" + PropList(0,1) = "sdbc:odbc:Erica_Test_Unicode" + PropList(1,0) = "User" + PropList(1,1) = "extra" + PropList(2,0) = "Password" + PropList(2,1) = "extra" + PropList(3,0) = "IsPasswordRequired" + PropList(3,1) = True +End Sub + + +Function RegisterNewDataSource(DSName as String, PropertyList(), Optional DriverProperties() as New com.sun.star.beans.PropertyValue) +Dim oDataSource as Object +Dim oDBContext as Object +Dim oPropInfo as Object +Dim i as Integer + oDBContext = createUnoService("com.sun.star.sdb.DatabaseContext") + oDataSource = createUnoService("com.sun.star.sdb.DataSource") + For i = 0 To Ubound(PropertyList(), 1) + sPropName = PropertyList(i,0) + sPropValue = PropertyList(i,1) + oDataSource.SetPropertyValue(sPropName,sPropValue) + Next i + If Not IsMissing(DriverProperties()) Then + oDataSource.Info() = DriverProperties() + End If + oDBContext.RegisterObject(DSName, oDataSource) + RegisterNewDataSource () = oDataSource +End Function + + +' Connects to a registered Database +Function ConnecttoDatabase(DSName as String, UserID as String, Password as String, Optional Propertylist(), Optional DriverProperties() as New com.sun.star.beans.PropertyValue) +Dim oDBContext as Object +Dim oDBSource as Object +' On Local Error Goto NOCONNECTION + oDBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext") + If oDBContext.HasbyName(DSName) Then + oDBSource = oDBContext.GetByName(DSName) + ConnectToDatabase = oDBSource.GetConnection(UserID, Password) + Else + If Not IsMissing(Namelist()) Then + If Not IsMissing(DriverProperties()) Then + RegisterNewDataSource(DSName, PropertyList(), DriverProperties()) + Else + RegisterNewDataSource(DSName, PropertyList()) + End If + oDBSource = oDBContext.GetByName(DSName) + ConnectToDatabase = oDBSource.GetConnection(UserID, Password) + Else + Msgbox("DataSource " & DSName & " is not registered" , 16, GetProductname()) + ConnectToDatabase() = NULL + End If + End If +NOCONNECTION: + If Err <> 0 Then + Msgbox(Error$, 16, GetProductName()) + Resume LEAVESUB + LEAVESUB: + End If +End Function + + +Function GetStarOfficeLocale() as New com.sun.star.lang.Locale +Dim aLocLocale As New com.sun.star.lang.Locale +Dim sLocale as String +Dim sLocaleList(1) +Dim oMasterKey + oMasterKey = GetRegistryKeyContent("org.openoffice.Setup/L10N/") + sLocale = oMasterKey.getByName("ooLocale") + sLocaleList() = ArrayoutofString(sLocale, "-") + aLocLocale.Language = sLocaleList(0) + If Ubound(sLocaleList()) > 0 Then + aLocLocale.Country = sLocaleList(1) + End If + If Ubound(sLocaleList()) > 1 Then + aLocLocale.Variant = sLocaleList(2) + End If + GetStarOfficeLocale() = aLocLocale +End Function + + +Function GetRegistryKeyContent(sKeyName as string, Optional bforUpdate as Boolean) +Dim oConfigProvider as Object +Dim aNodePath(0) as new com.sun.star.beans.PropertyValue + oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider") + aNodePath(0).Name = "nodepath" + aNodePath(0).Value = sKeyName + If IsMissing(bForUpdate) Then + GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath()) + Else + If bForUpdate Then + GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationUpdateAccess", aNodePath()) + Else + GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath()) + End If + End If +End Function + + +Function GetProductname() as String +Dim oProdNameAccess as Object +Dim sVersion as String +Dim sProdName as String + oProdNameAccess = GetRegistryKeyContent("org.openoffice.Setup/Product") + sProdName = oProdNameAccess.getByName("ooName") + sVersion = oProdNameAccess.getByName("ooSetupVersion") + GetProductName = sProdName & sVersion +End Function + + +' Opens a Document, checks beforehand, whether it has to be loaded +' or whether it is already on the desktop. +' If the parameter bDisposable is set to False then the returned document +' should not be disposed afterwards, because it is already opened. +Function OpenDocument(DocPath as String, Args(), Optional bDisposable as Boolean) +Dim oComponents as Object +Dim oComponent as Object + ' Search if one of the active Components is the one that you search for + oComponents = StarDesktop.Components.CreateEnumeration + While oComponents.HasmoreElements + oComponent = oComponents.NextElement + If hasUnoInterfaces(oComponent,"com.sun.star.frame.XModel") then + If UCase(oComponent.URL) = UCase(DocPath) then + OpenDocument() = oComponent + If Not IsMissing(bDisposable) Then + bDisposable = False + End If + Exit Function + End If + End If + Wend + If Not IsMissing(bDisposable) Then + bDisposable = True + End If + OpenDocument() = StarDesktop.LoadComponentFromURL(DocPath,"_default",0,Args()) +End Function + + +Function TaskonDesktop(DocPath as String) as Boolean +Dim oComponents as Object +Dim oComponent as Object + ' Search if one of the active Components is the one that you search for + oComponents = StarDesktop.Components.CreateEnumeration + While oComponents.HasmoreElements + oComponent = oComponents.NextElement + If hasUnoInterfaces(oComponent,"com.sun.star.frame.XModel") then + If UCase(oComponent.URL) = UCase(DocPath) then + TaskonDesktop = True + Exit Function + End If + End If + Wend + TaskonDesktop = False +End Function + + +' Retrieves a FileName out of a StarOffice-Document +Function RetrieveFileName(LocDoc as Object) +Dim LocURL as String +Dim LocURLArray() as String +Dim MaxArrIndex as integer + + LocURL = LocDoc.Url + LocURLArray() = ArrayoutofString(LocURL,"/",MaxArrIndex) + RetrieveFileName = LocURLArray(MaxArrIndex) +End Function + + +' Gets a special configured PathSetting +Function GetPathSettings(sPathType as String, Optional bshowall as Boolean, Optional ListIndex as integer) as String +Dim oSettings, oPathSettings as Object +Dim sPath as String +Dim PathList() as String +Dim MaxIndex as Integer +Dim oPS as Object + + oPS = createUnoService("com.sun.star.util.PathSettings") + + If Not IsMissing(bShowall) Then + If bShowAll Then + ShowPropertyValues(oPS) + Exit Function + End If + End If + sPath = oPS.getPropertyValue(sPathType) + If Not IsMissing(ListIndex) Then + ' Share and User-Directory + If Instr(1,sPath,";") <> 0 Then + PathList = ArrayoutofString(sPath,";", MaxIndex) + If ListIndex <= MaxIndex Then + sPath = PathList(ListIndex) + Else + Msgbox("String Cannot be analyzed!" & sPath , 16, GetProductName()) + End If + End If + End If + If Instr(1, sPath, ";") = 0 Then + GetPathSettings = ConvertToUrl(sPath) + Else + GetPathSettings = sPath + End If + +End Function + + + +' Gets the fully qualified path to a subdirectory of the +' Template Directory, e. g. with the parameter "wizard/bitmap" +' The parameter must be passed in Url notation +' The return-Value is in Url notation +Function GetOfficeSubPath(sOfficePath as String, ByVal sSubDir as String) +Dim sOfficeString as String +Dim sOfficeList() as String +Dim sOfficeDir as String +Dim sBigDir as String +Dim i as Integer +Dim MaxIndex as Integer +Dim oUcb as Object + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + sOfficeString = GetPathSettings(sOfficePath) + If Right(sSubDir,1) <> "/" Then + sSubDir = sSubDir & "/" + End If + sOfficeList() = ArrayoutofString(sOfficeString,";", MaxIndex) + For i = 0 To MaxIndex + sOfficeDir = ConvertToUrl(sOfficeList(i)) + If Right(sOfficeDir,1) <> "/" Then + sOfficeDir = sOfficeDir & "/" + End If + sBigDir = sOfficeDir & sSubDir + If oUcb.Exists(sBigDir) Then + GetOfficeSubPath() = sBigDir + Exit Function + End If + Next i + ShowNoOfficePathError() + GetOfficeSubPath = "" +End Function + + +Sub ShowNoOfficePathError() +Dim ProductName as String +Dim sError as String +Dim bResObjectexists as Boolean +Dim oLocResSrv as Object + bResObjectexists = not IsNull(oResSrv) + If bResObjectexists Then + oLocResSrv = oResSrv + End If + If InitResources("Tools") Then + ProductName = GetProductName() + sError = GetResText("RID_COMMON_6") + sError = ReplaceString(sError, ProductName, "%PRODUCTNAME") + sError = ReplaceString(sError, chr(13), "<BR>") + MsgBox(sError, 16, ProductName) + End If + If bResObjectexists Then + oResSrv = oLocResSrv + End If + +End Sub + + +Function InitResources(Description) as boolean +Dim xResource as Object +Dim sOfficeDir as String +Dim aArgs(5) as Any + On Error Goto ErrorOcurred + sOfficeDir = "$BRAND_BASE_DIR/$BRAND_SHARE_SUBDIR/wizards/" + sOfficeDir = GetDefaultContext.getByName("/singletons/com.sun.star.util.theMacroExpander").ExpandMacros(sOfficeDir) + aArgs(0) = sOfficeDir + aArgs(1) = true + aArgs(2) = GetStarOfficeLocale() + aArgs(3) = "resources" + aArgs(4) = "" + aArgs(5) = NULL + oResSrv = getProcessServiceManager().createInstanceWithArguments( "com.sun.star.resource.StringResourceWithLocation", aArgs() ) + If (IsNull(oResSrv)) then + InitResources = FALSE + MsgBox("could not initialize StringResourceWithLocation") + Else + InitResources = TRUE + End If + Exit Function +ErrorOcurred: + Dim nSolarVer + InitResources = FALSE + nSolarVer = GetSolarVersion() + MsgBox("Resource file missing", 16, GetProductName()) + Resume CLERROR + CLERROR: +End Function + + +Function GetResText( sID as String ) As string +Dim sString as String + On Error Goto ErrorOcurred + If Not IsNull(oResSrv) Then + sString = oResSrv.resolveString(sID) + GetResText = ReplaceString(sString, GetProductname(), "%PRODUCTNAME") + Else + GetResText = "" + End If + Exit Function +ErrorOcurred: + GetResText = "" + MsgBox("Resource with ID =" + sID + " not found!", 16, GetProductName()) + Resume CLERROR + CLERROR: +End Function + + +Function CutPathView(sDocUrl as String, Optional PathLen as Integer) +Dim sViewPath as String +Dim FileName as String +Dim iFileLen as Integer + sViewPath = ConvertfromURL(sDocURL) + iViewPathLen = Len(sViewPath) + If iViewPathLen > 60 Then + FileName = FileNameoutofPath(sViewPath, "/") + iFileLen = Len(FileName) + If iFileLen < 44 Then + sViewPath = Left(sViewPath,57-iFileLen-10) & "..." & Right(sViewPath,iFileLen + 10) + Else + sViewPath = Left(sViewPath,27) & " ... " & Right(sViewPath,28) + End If + End If + CutPathView = sViewPath +End Function + + +' Deletes the content of all cells that are softformatted according +' to the 'InputStyleName' +Sub DeleteInputCells(oSheet as Object, InputStyleName as String) +Dim oRanges as Object +Dim oRange as Object + oRanges = oSheet.CellFormatRanges.createEnumeration + While oRanges.hasMoreElements + oRange = oRanges.NextElement + If Instr(1,oRange.CellStyle, InputStyleName) <> 0 Then + Call ReplaceRangeValues(oRange, "") + End If + Wend +End Sub + + +' Inserts a certain string to all cells of a range that is passed +' either as an object or as the RangeName +Sub ChangeValueofRange(oSheet as Object, Range, ReplaceValue, Optional StyleName as String) +Dim oCellRange as Object + If Vartype(Range) = 8 Then + ' Get the Range out of the Rangename + oCellRange = oSheet.GetCellRangeByName(Range) + Else + ' The range is passed as an object + Set oCellRange = Range + End If + If IsMissing(StyleName) Then + ReplaceRangeValues(oCellRange, ReplaceValue) + Else + If Instr(1,oCellRange.CellStyle,StyleName) Then + ReplaceRangeValues(oCellRange, ReplaceValue) + End If + End If +End Sub + + +Sub ReplaceRangeValues(oRange as Object, ReplaceValue) +Dim oRangeAddress as Object +Dim ColCount as Integer +Dim RowCount as Integer +Dim i as Integer + oRangeAddress = oRange.RangeAddress + ColCount = oRangeAddress.EndColumn - oRangeAddress.StartColumn + RowCount = oRangeAddress.EndRow - oRangeAddress.StartRow + Dim FillArray(RowCount) as Variant + Dim sLine(ColCount) as Variant + For i = 0 To ColCount + sLine(i) = ReplaceValue + Next i + For i = 0 To RowCount + FillArray(i) = sLine() + Next i + oRange.DataArray = FillArray() +End Sub + + +' Returns the Value of the first cell of a Range +Function GetValueofCellbyName(oSheet as Object, sCellName as String) +Dim oCell as Object + oCell = GetCellByName(oSheet, sCellName) + GetValueofCellbyName = oCell.Value +End Function + + +Function DuplicateRow(oSheet as Object, RangeName as String) +Dim oRange as Object +Dim oCell as Object +Dim oCellAddress as New com.sun.star.table.CellAddress +Dim oRangeAddress as New com.sun.star.table.CellRangeAddress + oRange = oSheet.GetCellRangeByName(RangeName) + oRangeAddress = oRange.RangeAddress + oCell = oSheet.GetCellByPosition(oRangeAddress.StartColumn,oRangeAddress.StartRow) + oCellAddress = oCell.CellAddress + oSheet.Rows.InsertByIndex(oCellAddress.Row,1) + oRangeAddress = oRange.RangeAddress + oSheet.CopyRange(oCellAddress, oRangeAddress) + DuplicateRow = oRangeAddress.StartRow-1 +End Function + + +' Returns the String of the first cell of a Range +Function GetStringofCellbyName(oSheet as Object, sCellName as String) +Dim oCell as Object + oCell = GetCellByName(oSheet, sCellName) + GetStringofCellbyName = oCell.String +End Function + + +' Returns a named Cell +Function GetCellByName(oSheet as Object, sCellName as String) as Object +Dim oCellRange as Object +Dim oCellAddress as Object + oCellRange = oSheet.GetCellRangeByName(sCellName) + oCellAddress = oCellRange.RangeAddress + GetCellByName = oSheet.GetCellByPosition(oCellAddress.StartColumn,oCellAddress.StartRow) +End Function + + +' Changes the numeric Value of a cell by transmitting the String of the numeric Value +Sub ChangeCellValue(oCell as Object, ValueString as String) +Dim CellValue + oCell.Formula = "=Value(" & """" & ValueString & """" & ")" + CellValue = oCell.Value + oCell.Formula = "" + oCell.Value = CellValue +End Sub + + +Function GetDocumentType(oDocument) + On Local Error GoTo NODOCUMENTTYPE +' ShowSupportedServiceNames(oDocument) + If oDocument.SupportsService("com.sun.star.sheet.SpreadsheetDocument") Then + GetDocumentType() = "scalc" + ElseIf oDocument.SupportsService("com.sun.star.text.TextDocument") Then + GetDocumentType() = "swriter" + ElseIf oDocument.SupportsService("com.sun.star.drawing.DrawingDocument") Then + GetDocumentType() = "sdraw" + ElseIf oDocument.SupportsService("com.sun.star.presentation.PresentationDocument") Then + GetDocumentType() = "simpress" + ElseIf oDocument.SupportsService("com.sun.star.formula.FormulaProperties") Then + GetDocumentType() = "smath" + End If + NODOCUMENTTYPE: + If Err <> 0 Then + GetDocumentType = "" + Resume GOON + GOON: + End If +End Function + + +Function GetNumberFormatType(oDocFormats, oFormatObject as Object) as Integer +Dim ThisFormatKey as Long +Dim oObjectFormat as Object + On Local Error Goto NOFORMAT + ThisFormatKey = oFormatObject.NumberFormat + oObjectFormat = oDocFormats.GetByKey(ThisFormatKey) + GetNumberFormatType = oObjectFormat.Type + NOFORMAT: + If Err <> 0 Then + Msgbox("Numberformat of Object is not available!", 16, GetProductName()) + GetNumberFormatType = 0 + GOTO NOERROR + End If + NOERROR: + On Local Error Goto 0 +End Function + + +Sub ProtectSheets(Optional oSheets as Object) +Dim i as Integer +Dim oDocSheets as Object + If IsMissing(oSheets) Then + oDocSheets = StarDesktop.CurrentFrame.Controller.Model.Sheets + Else + Set oDocSheets = oSheets + End If + + For i = 0 To oDocSheets.Count-1 + oDocSheets(i).Protect("") + Next i +End Sub + + +Sub UnprotectSheets(Optional oSheets as Object) +Dim i as Integer +Dim oDocSheets as Object + If IsMissing(oSheets) Then + oDocSheets = StarDesktop.CurrentFrame.Controller.Model.Sheets + Else + Set oDocSheets = oSheets + End If + + For i = 0 To oDocSheets.Count-1 + oDocSheets(i).Unprotect("") + Next i +End Sub + + +Function GetRowIndex(oSheet as Object, RowName as String) +Dim oRange as Object + oRange = oSheet.GetCellRangeByName(RowName) + GetRowIndex = oRange.RangeAddress.StartRow +End Function + + +Function GetColumnIndex(oSheet as Object, ColName as String) +Dim oRange as Object + oRange = oSheet.GetCellRangeByName(ColName) + GetColumnIndex = oRange.RangeAddress.StartColumn +End Function + + +Function CopySheetbyName(oSheets as Object, OldName as String, NewName as String, DestPos as Integer) as Object +Dim oSheet as Object +Dim Count as Integer +Dim BasicSheetName as String + + BasicSheetName = NewName + ' Copy the last table. Assumption: The last table is the template + On Local Error Goto RENAMESHEET + oSheets.CopybyName(OldName, NewName, DestPos) + +RENAMESHEET: + oSheet = oSheets(DestPos) + If Err <> 0 Then + ' Test if renaming failed + Count = 2 + Do While oSheet.Name <> NewName + NewName = BasicSheetName & "_" & Count + oSheet.Name = NewName + Count = Count + 1 + Loop + Resume CL_ERROR +CL_ERROR: + End If + CopySheetbyName = oSheet +End Function + + +' Dis-or enables a Window and adjusts the mousepointer accordingly +Sub ToggleWindow(bDoEnable as Boolean) +Dim oWindow as Object + oWindow = StarDesktop.CurrentFrame.ComponentWindow + oWindow.Enable = bDoEnable +End Sub + + +Function CheckNewSheetname(oSheets as Object, Sheetname as String, Optional oLocale) as String +Dim nStartFlags as Long +Dim nContFlags as Long +Dim oCharService as Object +Dim iSheetNameLength as Integer +Dim iResultPos as Integer +Dim WrongChar as String +Dim oResult as Object + nStartFlags = com.sun.star.i18n.KParseTokens.ANY_LETTER_OR_NUMBER + com.sun.star.i18n.KParseTokens.ASC_UNDERSCORE + nContFlags = nStartFlags + oCharService = CreateUnoService("com.sun.star.i18n.CharacterClassification") + iSheetNameLength = Len(SheetName) + If IsMissing(oLocale) Then + oLocale = ThisComponent.CharLocale + End If + Do + oResult =oCharService.parsePredefinedToken(com.sun.star.i18n.KParseType.IDENTNAME, SheetName, 0, oLocale, nStartFlags, "", nContFlags, " ") + iResultPos = oResult.EndPos + If iResultPos < iSheetNameLength Then + WrongChar = Mid(SheetName, iResultPos+1,1) + SheetName = ReplaceString(SheetName,"_", WrongChar) + End If + Loop Until iResultPos = iSheetNameLength + CheckNewSheetname = SheetName +End Function + + +Sub AddNewSheetName(oSheets as Object, ByVal SheetName as String) +Dim Count as Integer +Dim bSheetIsThere as Boolean +Dim iSheetNameLength as Integer + iSheetNameLength = Len(SheetName) + Count = 2 + Do + bSheetIsThere = oSheets.HasByName(SheetName) + If bSheetIsThere Then + SheetName = Right(SheetName,iSheetNameLength) & "_" & Count + Count = Count + 1 + End If + Loop Until Not bSheetIsThere + AddNewSheetname = SheetName +End Sub + + +Function GetSheetIndex(oSheets, sName) as Integer +Dim i as Integer + For i = 0 To oSheets.Count-1 + If oSheets(i).Name = sName Then + GetSheetIndex = i + exit Function + End If + Next i + GetSheetIndex = -1 +End Function + + +Function GetLastUsedRow(oSheet as Object) as Long +Dim oCell As Object +Dim oCursor As Object +Dim aAddress As Variant + oCell = oSheet.GetCellbyPosition(0, 0) + oCursor = oSheet.createCursorByRange(oCell) + oCursor.GotoEndOfUsedArea(True) + aAddress = oCursor.RangeAddress + GetLastUsedRow = aAddress.EndRow +End Function + + +' Note To set a one lined frame you have to set the inner width to 0 +' In the API all Units that refer to pt-Heights are "1/100mm" +' The convert factor from 1pt to 1/100 mm is approximately 35 +Function ModifyBorderLineWidth(ByVal oStyleBorder, iInnerLineWidth as Integer, iOuterLineWidth as Integer) +Dim aBorder as New com.sun.star.table.BorderLine + aBorder = oStyleBorder + aBorder.InnerLineWidth = iInnerLineWidth + aBorder.OuterLineWidth = iOuterLineWidth + ModifyBorderLineWidth = aBorder +End Function + + +Sub AttachBasicMacroToEvent(oDocument as Object, EventName as String, SubPath as String) +Dim PropValue(1) as new com.sun.star.beans.PropertyValue + PropValue(0).Name = "EventType" + PropValue(0).Value = "StarBasic" + PropValue(1).Name = "Script" + PropValue(1).Value = "macro:///" & SubPath + oDocument.Events.ReplaceByName(EventName, PropValue()) +End Sub + + + +Function ModifyPropertyValue(oContent() as New com.sun.star.beans.PropertyValue, TargetProperties() as New com.sun.star.beans.PropertyValue) +Dim MaxIndex as Integer +Dim i as Integer +Dim a as Integer + MaxIndex = Ubound(oContent()) + bDoReplace = False + For i = 0 To MaxIndex + a = GetPropertyValueIndex(oContent(i).Name, TargetProperties()) + If a <> -1 Then + If Vartype(TargetProperties(a).Value) <> 9 Then + If TargetProperties(a).Value <> oContent(i).Value Then + oContent(i).Value = TargetProperties(a).Value + bDoReplace = True + End If + Else + If Not EqualUnoObjects(TargetProperties(a).Value, oContent(i).Value) Then + oContent(i).Value = TargetProperties(a).Value + bDoReplace = True + End If + End If + End If + Next i + ModifyPropertyValue() = bDoReplace +End Function + + +Function GetPropertyValueIndex(SearchName as String, TargetProperties() as New com.sun.star.beans.PropertyValue ) as Integer +Dim i as Integer + For i = 0 To Ubound(TargetProperties()) + If Searchname = TargetProperties(i).Name Then + GetPropertyValueIndex = i + Exit Function + End If + Next i + GetPropertyValueIndex() = -1 +End Function + + +Sub DispatchSlot(SlotID as Integer) +Dim oArg() as new com.sun.star.beans.PropertyValue +Dim oUrl as new com.sun.star.util.URL +Dim oTrans as Object +Dim oDisp as Object + oTrans = createUNOService("com.sun.star.util.URLTransformer") + oUrl.Complete = "slot:" & CStr(SlotID) + oTrans.parsestrict(oUrl) + oDisp = StarDesktop.ActiveFrame.queryDispatch(oUrl, "_self", 0) + oDisp.dispatch(oUrl, oArg()) +End Sub + + +'returns the type of the office application +'FatOffice = 0, WebTop = 1 +'This routine has to be changed if the Product Name is being changed! +Function IsFatOffice() As Boolean + If sProductname = "" Then + sProductname = GetProductname() + End If + IsFatOffice = TRUE + 'The following line has to include the current productname + If Instr(1,sProductname,"WebTop",1) <> 0 Then + IsFatOffice = FALSE + End If +End Function + + +Sub ToggleDesignMode(oDocument as Object) +Dim aSwitchMode as new com.sun.star.util.URL + aSwitchMode.Complete = ".uno:SwitchControlDesignMode" + aTransformer = createUnoService("com.sun.star.util.URLTransformer") + aTransformer.parseStrict(aSwitchMode) + oFrame = oDocument.currentController.Frame + oDispatch = oFrame.queryDispatch(aSwitchMode, oFrame.Name, 63) + Dim aEmptyArgs() as New com.sun.star.bean.PropertyValue + oDispatch.dispatch(aSwitchMode, aEmptyArgs()) + Erase aSwitchMode +End Sub + + +Function isHighContrast(oPeer as Object) + Dim UIColor as Long + Dim myRed as Integer + Dim myGreen as Integer + Dim myBlue as Integer + Dim myLuminance as Double + + UIColor = oPeer.getProperty( "DisplayBackgroundColor" ) + myRed = Red (UIColor) + myGreen = Green (UIColor) + myBlue = Blue (UIColor) + myLuminance = (( myBlue*28 + myGreen*151 + myRed*77 ) / 256 ) + isHighContrast = false + If myLuminance <= 25 Then isHighContrast = true +End Function + + +Function CreateNewDocument(sType as String, Optional sAddMsg as String) as Object +Dim NoArgs() as new com.sun.star.beans.PropertyValue +Dim oDocument as Object +Dim sUrl as String +Dim ErrMsg as String + On Local Error Goto NOMODULEINSTALLED + sUrl = "private:factory/" & sType + oDocument = StarDesktop.LoadComponentFromURL(sUrl,"_default",0, NoArgs()) +NOMODULEINSTALLED: + If (Err <> 0) OR IsNull(oDocument) Then + If InitResources("") Then + Select Case sType + Case "swriter" + ErrMsg = GetResText("RID_COMMON_1") + Case "scalc" + ErrMsg = GetResText("RID_COMMON_2") + Case "simpress" + ErrMsg = GetResText("RID_COMMON_3") + Case "sdraw" + ErrMsg = GetResText("RID_COMMON_4") + Case "smath" + ErrMsg = GetResText("RID_COMMON_5") + Case Else + ErrMsg = "Invalid Document Type!" + End Select + ErrMsg = ReplaceString(ErrMsg, chr(13), "<BR>") + If Not IsMissing(sAddMsg) Then + ErrMsg = ErrMsg & chr(13) & sAddMsg + End If + Msgbox(ErrMsg, 48, GetProductName()) + End If + If Err <> 0 Then + Resume GOON + End If + End If +GOON: + CreateNewDocument = oDocument +End Function + + +' This Sub has been used in order to ensure that after disposing a document +' from the backing window it is returned to the backing window, so the +' office won't be closed +Sub DisposeDocument(oDocument as Object) +Dim dispatcher as Object +Dim parser as Object +Dim disp as Object +Dim url as new com.sun.star.util.URL +Dim NoArgs() as New com.sun.star.beans.PropertyValue +Dim oFrame as Object + If Not IsNull(oDocument) Then + oDocument.setModified(false) + parser = createUnoService("com.sun.star.util.URLTransformer") + url.Complete = ".uno:CloseDoc" + parser.parseStrict(url) + oFrame = oDocument.CurrentController.Frame + disp = oFrame.queryDispatch(url,"_self", com.sun.star.util.SearchFlags.NORM_WORD_ONLY) + disp.dispatch(url, NoArgs()) + End If +End Sub + +'Function to calculate if the year is a leap year +Function CalIsLeapYear(ByVal iYear as Integer) as Boolean + CalIsLeapYear = ((iYear Mod 4 = 0) And ((iYear Mod 100 <> 0) Or (iYear Mod 400 = 0))) +End Function +</script:module> diff --git a/wizards/source/tools/ModuleControls.xba b/wizards/source/tools/ModuleControls.xba new file mode 100644 index 000000000..059956cb1 --- /dev/null +++ b/wizards/source/tools/ModuleControls.xba @@ -0,0 +1,387 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ModuleControls" script:language="StarBasic">Option Explicit + +Public DlgOverwrite as Object +Public Const SBOVERWRITEUNDEFINED as Integer = 0 +Public Const SBOVERWRITECANCEL as Integer = 2 +Public Const SBOVERWRITEQUERY as Integer = 7 +Public Const SBOVERWRITEALWAYS as Integer = 6 +Public Const SBOVERWRITENEVER as Integer = 8 +Public iGeneralOverwrite as Integer + + + +' Accepts the name of a control and returns the respective control model as object +' The Container can either be a whole document or a specific sheet of a Calc-Document +' 'CName' is the name of the Control +Function getControlModel(oContainer as Object, CName as String) +Dim aForm, oForms as Object +Dim i as Integer + oForms = oContainer.Drawpage.GetForms + For i = 0 To oForms.Count-1 + aForm = oForms.GetbyIndex(i) + If aForm.HasByName(CName) Then + GetControlModel = aForm.GetbyName(CName) + Exit Function + End If + Next i + Msgbox("No Control with the name '" & CName & "' found" , 16, GetProductName()) +End Function + + + +' Gets the Shape of a Control( e. g. to reset the size or Position of the control +' Parameters: +' The 'oContainer' is the Document or a specific sheet of a Calc - Document +' 'CName' is the Name of the Control +Function GetControlShape(oContainer as Object,CName as String) +Dim i as integer +Dim aShape as Object + For i = 0 to oContainer.DrawPage.Count-1 + aShape = oContainer.DrawPage(i) + If HasUnoInterfaces(aShape, "com.sun.star.drawing.XControlShape") then + If ashape.Control.Name = CName then + GetControlShape = aShape + exit Function + End If + End If + Next +End Function + + +' Returns the View of a Control +' Parameters: +' The 'oContainer' is the Document or a specific sheet of a Calc - Document +' The 'oController' is always directly attached to the Document +' 'CName' is the Name of the Control +Function getControlView(oContainer , oController as Object, CName as String) as Object +Dim aForm, oForms, oControlModel as Object +Dim i as Integer + oForms = oContainer.DrawPage.Forms + For i = 0 To oForms.Count-1 + aForm = oforms.GetbyIndex(i) + If aForm.HasByName(CName) Then + oControlModel = aForm.GetbyName(CName) + GetControlView = oController.GetControl(oControlModel) + Exit Function + End If + Next i + Msgbox("No Control with the name '" & CName & "' found" , 16, GetProductName()) +End Function + + + +' Parameters: +' The 'oContainer' is the Document or a specific sheet of a Calc - Document +' 'CName' is the Name of the Control +Function DisposeControl(oContainer as Object, CName as String) as Boolean +Dim aControl as Object + + aControl = GetControlModel(oContainer,CName) + If not IsNull(aControl) Then + aControl.Dispose() + DisposeControl = True + Else + DisposeControl = False + End If +End Function + + +' Returns a sequence of a group of controls like option buttons or checkboxes +' The 'oContainer' is the Document or a specific sheet of a Calc - Document +' 'sGroupName' is the Name of the Controlgroup +Function GetControlGroupModel(oContainer as Object, sGroupName as String ) +Dim aForm, oForms As Object +Dim aControlModel() As Object +Dim i as integer + + oForms = oContainer.DrawPage.Forms + For i = 0 To oForms.Count-1 + aForm = oForms(i) + If aForm.HasbyName(sGroupName) Then + aForm.GetGroupbyName(sGroupName,aControlModel) + GetControlGroupModel = aControlModel + Exit Function + End If + Next i + Msgbox("No Controlgroup with the name '" & sGroupName & "' found" , 16, GetProductName()) +End Function + + +' Returns the Referencevalue of a group of e.g. option buttons or check boxes +' 'oControlGroup' is a sequence of the Control objects +Function GetRefValue(oControlGroup() as Object) +Dim i as Integer + For i = 0 To Ubound(oControlGroup()) +' oControlGroup(i).DefaultState = oControlGroup(i).State + If oControlGroup(i).State Then + GetRefValue = oControlGroup(i).RefValue + exit Function + End If + Next + GetRefValue() = -1 +End Function + + +Function GetRefValueOfControlGroup(oContainer as Object, GroupName as String) +Dim oOptGroup() as Object +Dim iRef as Integer + oOptGroup() = GetControlGroupModel(oContainer, GroupName) + iRef = GetRefValue(oOptGroup()) + GetRefValueofControlGroup = iRef +End Function + + +Function GetOptionGroupValue(oContainer as Object, OptGroupName as String) as Boolean +Dim oRulesOptions() as Object + oRulesOptions() = GetControlGroupModel(oContainer, OptGroupName) + GetOptionGroupValue = oRulesOptions(0).State +End Function + + + +Function WriteOptValueToCell(oSheet as Object, OptGroupName as String, iCol as Integer, iRow as Integer) as Boolean +Dim bOptValue as Boolean +Dim oCell as Object + bOptValue = GetOptionGroupValue(oSheet, OptGroupName) + oCell = oSheet.GetCellByPosition(iCol, iRow) + oCell.SetValue(ABS(CInt(bOptValue))) + WriteOptValueToCell() = bOptValue +End Function + + +Function LoadDialog(Libname as String, DialogName as String, Optional oLibContainer) +Dim oLib as Object +Dim oLibDialog as Object +Dim oRuntimeDialog as Object + If IsMissing(oLibContainer ) then + oLibContainer = DialogLibraries + End If + oLibContainer.LoadLibrary(LibName) + oLib = oLibContainer.GetByName(Libname) + oLibDialog = oLib.GetByName(DialogName) + oRuntimeDialog = CreateUnoDialog(oLibDialog) + LoadDialog() = oRuntimeDialog +End Function + + +Sub GetFolderName(oRefModel as Object) +Dim oFolderDialog as Object +Dim iAccept as Integer +Dim sPath as String +Dim InitPath as String +Dim RefControlName as String +Dim oUcb as object + 'Note: The following services have to be called in the following order + ' because otherwise Basic does not remove the FileDialog Service + oFolderDialog = CreateUnoService("com.sun.star.ui.dialogs.FolderPicker") + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + InitPath = ConvertToUrl(oRefModel.Text) + If InitPath = "" Then + InitPath = GetPathSettings("Work") + End If + If oUcb.Exists(InitPath) Then + oFolderDialog.SetDisplayDirectory(InitPath) + End If + iAccept = oFolderDialog.Execute() + If iAccept = 1 Then + sPath = oFolderDialog.GetDirectory() + If oUcb.Exists(sPath) Then + oRefModel.Text = ConvertFromUrl(sPath) + End If + End If +End Sub + + +Sub GetFileName(oRefModel as Object, Filternames()) +Dim oFileDialog as Object +Dim iAccept as Integer +Dim sPath as String +Dim InitPath as String +Dim RefControlName as String +Dim oUcb as object +'Dim ListAny(0) + 'Note: The following services have to be called in the following order + ' because otherwise Basic does not remove the FileDialog Service + oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + 'ListAny(0) = com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE + 'oFileDialog.initialize(ListAny()) + AddFiltersToDialog(FilterNames(), oFileDialog) + InitPath = ConvertToUrl(oRefModel.Text) + If InitPath = "" Then + InitPath = GetPathSettings("Work") + End If + If oUcb.Exists(InitPath) Then + oFileDialog.SetDisplayDirectory(InitPath) + End If + iAccept = oFileDialog.Execute() + If iAccept = 1 Then + sPath = oFileDialog.Files(0) + If oUcb.Exists(sPath) Then + oRefModel.Text = ConvertFromUrl(sPath) + End If + End If + oFileDialog.Dispose() +End Sub + + +Function StoreDocument(oDocument as Object, FilterNames() as String, DefaultName as String, DisplayDirectory as String, Optional iAddProcedure as Integer) as String +Dim NoArgs() as New com.sun.star.beans.PropertyValue +Dim oStoreProperties(0) as New com.sun.star.beans.PropertyValue +Dim oStoreDialog as Object +Dim iAccept as Integer +Dim sPath as String +Dim ListAny(0) as Long +Dim UIFilterName as String +Dim FilterName as String +Dim FilterIndex as Integer + ListAny(0) = com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_AUTOEXTENSION_PASSWORD + oStoreDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker") + oStoreDialog.Initialize(ListAny()) + AddFiltersToDialog(FilterNames(), oStoreDialog) + oStoreDialog.SetDisplayDirectory(DisplayDirectory) + oStoreDialog.SetDefaultName(DefaultName) + oStoreDialog.setValue(com.sun.star.ui.dialogs.ExtendedFilePickerElementIds.CHECKBOX_AUTOEXTENSION,0, true) + + iAccept = oStoreDialog.Execute() + If iAccept = 1 Then + sPath = oStoreDialog.Files(0) + UIFilterName = oStoreDialog.GetCurrentFilter() + FilterIndex = IndexInArray(UIFilterName, FilterNames()) + FilterName = FilterNames(FilterIndex,2) + If Not IsMissing(iAddProcedure) Then + Select Case iAddProcedure + Case 1 + CommitLastDocumentChanges(sPath) + End Select + End If + On Local Error Goto NOSAVING + If FilterName = "" Then + ' Todo: Catch the case that a document that has to be overwritten is writeprotected (e.g. it is open) + oDocument.StoreAsUrl(sPath, NoArgs()) + Else + oStoreProperties(0).Name = "FilterName" + oStoreProperties(0).Value = FilterName + oDocument.StoreAsUrl(sPath, oStoreProperties()) + End If + End If + oStoreDialog.dispose() + StoreDocument() = sPath + Exit Function +NOSAVING: + If Err <> 0 Then +' Msgbox("Document cannot be saved under '" & ConvertFromUrl(sPath) & "'", 48, GetProductName()) + sPath = "" + oStoreDialog.dispose() + Resume NOERROR + NOERROR: + End If +End Function + + +Sub AddFiltersToDialog(FilterNames() as String, oDialog as Object) +Dim i as Integer +Dim MaxIndex as Integer +Dim ViewFiltername as String +Dim oProdNameAccess as Object +Dim sProdName as String + oProdNameAccess = GetRegistryKeyContent("org.openoffice.Setup/Product") + sProdName = oProdNameAccess.getByName("ooName") + MaxIndex = Ubound(FilterNames(), 1) + For i = 0 To MaxIndex + Filternames(i,0) = ReplaceString(Filternames(i,0), sProdName,"%productname%") + oDialog.AppendFilter(FilterNames(i,0), FilterNames(i,1)) + Next i + oDialog.SetCurrentFilter(FilterNames(0,0)) +End Sub + + +Sub SwitchMousePointer(oWindowPeer as Object, bDoEnable as Boolean) +Dim oWindowPointer as Object + oWindowPointer = CreateUnoService("com.sun.star.awt.Pointer") + If bDoEnable Then + oWindowPointer.SetType(com.sun.star.awt.SystemPointer.ARROW) + Else + oWindowPointer.SetType(com.sun.star.awt.SystemPointer.WAIT) + End If + oWindowPeer.SetPointer(oWindowPointer) +End Sub + + +Sub ShowOverwriteAllDialog(FilePath as String, sTitle as String) +Dim QueryString as String +Dim LocRetValue as Integer +Dim lblYes as String +Dim lblNo as String +Dim lblYesToAll as String +Dim lblCancel as String +Dim OverwriteModel as Object + If InitResources(GetProductName()) Then + QueryString = GetResText("RID_COMMON_7") + QueryString = ReplaceString(QueryString, ConvertFromUrl(FilePath), "<PATH>") + If Len(QueryString) > 190 Then + QueryString = DeleteStr(QueryString, ".<BR>") + End If + QueryString = ReplaceString(QueryString, chr(13), "<BR>") + lblYes = GetResText("RID_COMMON_8") + lblYesToAll = GetResText("RID_COMMON_9") + lblNo = GetResText("RID_COMMON_10") + lblCancel = GetResText("RID_COMMON_11") + DlgOverwrite = LoadDialog("Tools", "DlgOverwriteAll") + DlgOverwrite.Title = sTitle + OverwriteModel = DlgOverwrite.Model + OverwriteModel.cmdYes.Label = lblYes + OverwriteModel.cmdYesToAll.Label = lblYesToAll + OverwriteModel.cmdNo.Label = lblNo + OverwriteModel.cmdCancel.Label = lblCancel + OverwriteModel.lblQueryforSave.Label = QueryString + OverwriteModel.cmdNo.DefaultButton = True + DlgOverwrite.GetControl("cmdNo").SetFocus() + iGeneralOverwrite = 999 + LocRetValue = DlgOverwrite.execute() + If iGeneralOverwrite = 999 Then + iGeneralOverwrite = SBOVERWRITECANCEL + End If + DlgOverwrite.dispose() + Else + iGeneralOverwrite = SBOVERWRITECANCEL + End If +End Sub + + +Sub SetOVERWRITEToQuery() + iGeneralOverwrite = SBOVERWRITEQUERY + DlgOverwrite.EndExecute() +End Sub + + +Sub SetOVERWRITEToAlways() + iGeneralOverwrite = SBOVERWRITEALWAYS + DlgOverwrite.EndExecute() +End Sub + + +Sub SetOVERWRITEToNever() + iGeneralOverwrite = SBOVERWRITENEVER + DlgOverwrite.EndExecute() +End Sub +</script:module> diff --git a/wizards/source/tools/Strings.xba b/wizards/source/tools/Strings.xba new file mode 100644 index 000000000..4c2802f1a --- /dev/null +++ b/wizards/source/tools/Strings.xba @@ -0,0 +1,469 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Strings" script:language="StarBasic">Option Explicit +Public sProductname as String + + +' Deletes out of a String 'BigString' all possible PartStrings, that are summed up +' in the Array 'ElimArray' +Function ElimChar(ByVal BigString as String, ElimArray() as String) +Dim i% ,n% + For i = 0 to Ubound(ElimArray) + BigString = DeleteStr(BigString,ElimArray(i)) + Next + ElimChar = BigString +End Function + + +' Deletes out of a String 'BigString' a possible Partstring 'CompString' +Function DeleteStr(ByVal BigString,CompString as String) as String +Dim i%, CompLen%, BigLen% + CompLen = Len(CompString) + i = 1 + While i <> 0 + i = Instr(i, BigString,CompString) + If i <> 0 then + BigLen = Len(BigString) + BigString = Mid(BigString,1,i-1) + Mid(BigString,i+CompLen,BigLen-i+1-CompLen) + End If + Wend + DeleteStr = BigString +End Function + + +' Finds a PartString, that is framed by the Strings 'Prestring' and 'PostString' +Function FindPartString(BigString, PreString, PostString as String, SearchPos as Integer) as String +Dim StartPos%, EndPos% +Dim BigLen%, PreLen%, PostLen% + StartPos = Instr(SearchPos,BigString,PreString) + If StartPos <> 0 Then + PreLen = Len(PreString) + EndPos = Instr(StartPos + PreLen,BigString,PostString) + If EndPos <> 0 Then + BigLen = Len(BigString) + PostLen = Len(PostString) + FindPartString = Mid(BigString,StartPos + PreLen, EndPos - (StartPos + PreLen)) + SearchPos = EndPos + PostLen + Else + Msgbox("No final tag for '" & PreString & "' existing", 16, GetProductName()) + FindPartString = "" + End If + Else + FindPartString = "" + End If +End Function + + +' Note iCompare = 0 (Binary comparison) +' iCompare = 1 (Text comparison) +Function PartStringInArray(BigArray(), SearchString as String, iCompare as Integer) as Integer +Dim MaxIndex as Integer +Dim i as Integer + MaxIndex = Ubound(BigArray()) + For i = 0 To MaxIndex + If Instr(1, BigArray(i), SearchString, iCompare) <> 0 Then + PartStringInArray() = i + Exit Function + End If + Next i + PartStringInArray() = -1 +End Function + + +' Deletes the String 'SmallString' out of the String 'BigString' +' in case SmallString's Position in BigString is right at the end +Function RTrimStr(ByVal BigString, SmallString as String) as String +Dim SmallLen as Integer +Dim BigLen as Integer + SmallLen = Len(SmallString) + BigLen = Len(BigString) + If Instr(1,BigString, SmallString) <> 0 Then + If Mid(BigString,BigLen + 1 - SmallLen, SmallLen) = SmallString Then + RTrimStr = Mid(BigString,1,BigLen - SmallLen) + Else + RTrimStr = BigString + End If + Else + RTrimStr = BigString + End If +End Function + + +' Deletes the Char 'CompChar' out of the String 'BigString' +' in case CompChar's Position in BigString is right at the beginning +Function LTRimChar(ByVal BigString as String,CompChar as String) as String +Dim BigLen as integer + BigLen = Len(BigString) + If BigLen > 1 Then + If Left(BigString,1) = CompChar then + BigString = Mid(BigString,2,BigLen-1) + End If + ElseIf BigLen = 1 Then + BigString = "" + End If + LTrimChar = BigString +End Function + + +' Retrieves an Array out of a String. +' The fields of the Array are separated by the parameter 'Separator', that is contained +' in the Array +' The Array MaxIndex delivers the highest Index of this Array +Function ArrayOutOfString(BigString, Separator as String, Optional MaxIndex as Integer) +Dim LocList() as String + LocList=Split(BigString,Separator) + + If not isMissing(MaxIndex) then maxIndex=ubound(LocList()) + + ArrayOutOfString=LocList +End Function + + +' Deletes all fieldvalues in one-dimensional Array +Sub ClearArray(BigArray) +Dim i as integer + For i = Lbound(BigArray()) to Ubound(BigArray()) + BigArray(i) = "" + Next +End Sub + + +' Deletes all fieldvalues in a multidimensional Array +Sub ClearMultiDimArray(BigArray,DimCount as integer) +Dim n%, m% + For n = Lbound(BigArray(),1) to Ubound(BigArray(),1) + For m = 0 to Dimcount - 1 + BigArray(n,m) = "" + Next m + Next n +End Sub + + +' Checks if a Field (LocField) is already defined in an Array +' Returns 'True' or 'False' +Function FieldInArray(LocArray(), MaxIndex as integer, LocField as String) As Boolean +Dim i as integer + For i = Lbound(LocArray()) to MaxIndex + If Ucase(LocArray(i)) = Ucase(LocField) Then + FieldInArray = True + Exit Function + End if + Next + FieldInArray = False +End Function + + +' Checks if a Field (LocField) is already defined in an Array +' Returns 'True' or 'False' +Function FieldInList(LocField, BigList()) As Boolean +Dim i as integer + For i = Lbound(BigList()) to Ubound(BigList()) + If LocField = BigList(i) Then + FieldInList = True + Exit Function + End if + Next + FieldInList = False +End Function + + +' Retrieves the Index of the delivered String 'SearchString' in +' the Array LocList()' +Function IndexInArray(SearchString as String, LocList()) as Integer +Dim i as integer + For i = Lbound(LocList(),1) to Ubound(LocList(),1) + If Ucase(LocList(i,0)) = Ucase(SearchString) Then + IndexInArray = i + Exit Function + End if + Next + IndexInArray = -1 +End Function + + +Sub MultiArrayInListbox(oDialog as Object, ListboxName as String, ValList(), iDim as Integer) +Dim oListbox as Object +Dim i as integer +Dim a as Integer + a = 0 + oListbox = oDialog.GetControl(ListboxName) + oListbox.RemoveItems(0, oListbox.GetItemCount) + For i = 0 to Ubound(ValList(), 1) + If ValList(i) <> "" Then + oListbox.AddItem(ValList(i, iDim-1), a) + a = a + 1 + End If + Next +End Sub + + +' Searches for a String in a two-dimensional Array by querying all Searchindexes of the second dimension +' and delivers the specific String of the ReturnIndex in the second dimension of the Searchlist() +Function StringInMultiArray(SearchList(), SearchString as String, SearchIndex as Integer, ReturnIndex as Integer, Optional MaxIndex as Integer) as String +Dim i as integer +Dim CurFieldString as String + If IsMissing(MaxIndex) Then + MaxIndex = Ubound(SearchList(),1) + End If + For i = Lbound(SearchList()) to MaxIndex + CurFieldString = SearchList(i,SearchIndex) + If Ucase(CurFieldString) = Ucase(SearchString) Then + StringInMultiArray() = SearchList(i,ReturnIndex) + Exit Function + End if + Next + StringInMultiArray() = "" +End Function + + +' Searches for a Value in multidimensial Array by querying all Searchindices of the passed dimension +' and delivers the Index where it is found. +Function GetIndexInMultiArray(SearchList(), SearchValue, SearchIndex as Integer) as Integer +Dim i as integer +Dim MaxIndex as Integer +Dim CurFieldValue + MaxIndex = Ubound(SearchList(),1) + For i = Lbound(SearchList()) to MaxIndex + CurFieldValue = SearchList(i,SearchIndex) + If CurFieldValue = SearchValue Then + GetIndexInMultiArray() = i + Exit Function + End if + Next + GetIndexInMultiArray() = -1 +End Function + + +' Searches for a Value in multidimensial Array by querying all Searchindices of the passed dimension +' and delivers the Index where the Searchvalue is found as a part string +Function GetIndexForPartStringinMultiArray(SearchList(), SearchValue, SearchIndex as Integer) as Integer +Dim i as integer +Dim MaxIndex as Integer +Dim CurFieldValue + MaxIndex = Ubound(SearchList(),1) + For i = Lbound(SearchList()) to MaxIndex + CurFieldValue = SearchList(i,SearchIndex) + If Instr(CurFieldValue, SearchValue) > 0 Then + GetIndexForPartStringinMultiArray() = i + Exit Function + End if + Next + GetIndexForPartStringinMultiArray = -1 +End Function + + +Function ArrayfromMultiArray(MultiArray as String, iDim as Integer) +Dim MaxIndex as Integer +Dim i as Integer + MaxIndex = Ubound(MultiArray()) + Dim ResultArray(MaxIndex) as String + For i = 0 To MaxIndex + ResultArray(i) = MultiArray(i,iDim) + Next i + ArrayfromMultiArray() = ResultArray() +End Function + + +' Replaces the string "OldReplace" through the String "NewReplace" in the String +' 'BigString' +Function ReplaceString(ByVal Bigstring, NewReplace, OldReplace as String) as String + ReplaceString=join(split(BigString,OldReplace),NewReplace) +End Function + + +' Retrieves the second value for a next to 'SearchString' in +' a two-dimensional string-Array +Function FindSecondValue(SearchString as String, TwoDimList() as String ) as String +Dim i as Integer + For i = 0 To Ubound(TwoDimList,1) + If Ucase(SearchString) = Ucase(TwoDimList(i,0)) Then + FindSecondValue = TwoDimList(i,1) + Exit For + End If + Next +End Function + + +' raises a base to a certain power +Function Power(Basis as Double, Exponent as Double) as Double + Power = Exp(Exponent*Log(Basis)) +End Function + + +' rounds a Real to a given Number of Decimals +Function Round(BaseValue as Double, Decimals as Integer) as Double +Dim Multiplicator as Long +Dim DblValue#, RoundValue# + Multiplicator = Power(10,Decimals) + RoundValue = Int(BaseValue * Multiplicator) + Round = RoundValue/Multiplicator +End Function + + +'Retrieves the mere filename out of a whole path +Function FileNameoutofPath(ByVal Path as String, Optional Separator as String) as String +Dim i as Integer +Dim SepList() as String + If IsMissing(Separator) Then + Path = ConvertFromUrl(Path) + Separator = GetPathSeparator() + End If + SepList() = ArrayoutofString(Path, Separator,i) + FileNameoutofPath = SepList(i) +End Function + + +Function GetFileNameExtension(ByVal FileName as String) +Dim MaxIndex as Integer +Dim SepList() as String + SepList() = ArrayoutofString(FileName,".", MaxIndex) + GetFileNameExtension = SepList(MaxIndex) +End Function + + +Function GetFileNameWithoutExtension(ByVal FileName as String, Optional Separator as String) +Dim MaxIndex as Integer +Dim SepList() as String + If not IsMissing(Separator) Then + FileName = FileNameoutofPath(FileName, Separator) + End If + SepList() = ArrayoutofString(FileName,".", MaxIndex) + GetFileNameWithoutExtension = RTrimStr(FileName, "." & SepList(MaxIndex)) +End Function + + +Function DirectoryNameoutofPath(sPath as String, Separator as String) as String +Dim LocFileName as String + LocFileName = FileNameoutofPath(sPath, Separator) + DirectoryNameoutofPath = RTrimStr(sPath, Separator & LocFileName) +End Function + + +Function CountCharsInString(BigString, LocChar as String, ByVal StartPos as Integer) as Integer +Dim LocCount%, LocPos% + LocCount = 0 + Do + LocPos = Instr(StartPos,BigString,LocChar) + If LocPos <> 0 Then + LocCount = LocCount + 1 + StartPos = LocPos+1 + End If + Loop until LocPos = 0 + CountCharsInString = LocCount +End Function + + +Function BubbleSortList(ByVal SortList(),optional sort2ndValue as Boolean) +'This function bubble sorts an array of maximum 2 dimensions. +'The default sorting order is the first dimension +'Only if sort2ndValue is True the second dimension is the relevant for the sorting order + Dim s as Integer + Dim t as Integer + Dim i as Integer + Dim k as Integer + Dim dimensions as Integer + Dim sortvalue as Integer + Dim DisplayDummy + dimensions = 2 + +On Local Error Goto No2ndDim + k = Ubound(SortList(),2) + No2ndDim: + If Err <> 0 Then dimensions = 1 + + i = Ubound(SortList(),1) + If ismissing(sort2ndValue) then + sortvalue = 0 + else + sortvalue = 1 + end if + + For s = 1 to i - 1 + For t = 0 to i-s + Select Case dimensions + Case 1 + If SortList(t) > SortList(t+1) Then + DisplayDummy = SortList(t) + SortList(t) = SortList(t+1) + SortList(t+1) = DisplayDummy + End If + Case 2 + If SortList(t,sortvalue) > SortList(t+1,sortvalue) Then + For k = 0 to UBound(SortList(),2) + DisplayDummy = SortList(t,k) + SortList(t,k) = SortList(t+1,k) + SortList(t+1,k) = DisplayDummy + Next k + End If + End Select + Next t + Next s + BubbleSortList = SortList() +End Function + + +Function GetValueoutofList(SearchValue, BigList(), iDim as Integer, Optional ValueIndex) +Dim i as Integer +Dim MaxIndex as Integer + MaxIndex = Ubound(BigList(),1) + For i = 0 To MaxIndex + If BigList(i,0) = SearchValue Then + If Not IsMissing(ValueIndex) Then + ValueIndex = i + End If + GetValueOutOfList() = BigList(i,iDim) + End If + Next i +End Function + + +Function AddListtoList(ByVal FirstArray(), ByVal SecondArray(), Optional StartIndex) +Dim n as Integer +Dim m as Integer +Dim MaxIndex as Integer + MaxIndex = Ubound(FirstArray()) + Ubound(SecondArray()) + 1 + If MaxIndex > -1 Then + Dim ResultArray(MaxIndex) + For m = 0 To Ubound(FirstArray()) + ResultArray(m) = FirstArray(m) + Next m + For n = 0 To Ubound(SecondArray()) + ResultArray(m) = SecondArray(n) + m = m + 1 + Next n + AddListToList() = ResultArray() + Else + Dim NullArray() + AddListToList() = NullArray() + End If +End Function + + +Function CheckDouble(DoubleString as String) +On Local Error Goto WRONGDATATYPE + CheckDouble() = CDbl(DoubleString) +WRONGDATATYPE: + If Err <> 0 Then + CheckDouble() = 0 + Resume NoErr: + End If +NOERR: +End Function +</script:module> diff --git a/wizards/source/tools/UCB.xba b/wizards/source/tools/UCB.xba new file mode 100644 index 000000000..d849a2ea3 --- /dev/null +++ b/wizards/source/tools/UCB.xba @@ -0,0 +1,311 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="UCB" script:language="StarBasic">'Option explicit +Public oDocument +Public oDocInfo as object +Const SBMAXDIRCOUNT = 10 +Dim CurDirMaxCount as Integer +Dim sDirArray(SBMAXDIRCOUNT-1) as String +Dim DirIndex As Integer +Dim iDirCount as Integer +Public bInterruptSearch as Boolean +Public NoArgs()as New com.sun.star.beans.PropertyValue + +Sub Main() +Dim LocsfileContent(0) as String + LocsfileContent(0) = "*" + ReadDirectories("file:///space", LocsfileContent(), True, False, false) +End Sub + +' ReadDirectories( sSourceDir, bRecursive, bCheckRealType, False, sFileContent(), sLocExtension) + +Function ReadDirectories(ByVal AnchorDir As String, bRecursive as Boolean, bcheckFileType as Boolean, bGetByTitle as Boolean, Optional sFileContent(), Optional sExtension as String) +Dim i as integer +Dim Status as Object +Dim FileCountinDir as Integer +Dim RealFileContent as String +Dim FileName as string +Dim oUcbObject as Object +Dim DirContent() +Dim CurIndex as Integer +Dim MaxIndex as Integer +Dim StartUbound as Integer +Dim FileExtension as String + StartUbound = 5 + MaxIndex = StartUBound + CurDirMaxCount = SBMAXDIRCOUNT +Dim sFileArray(StartUbound,1) as String + On Local Error Goto FILESYSTEMPROBLEM: + CurIndex = -1 + ' Todo: Is the last separator valid? + DirIndex = 0 + sDirArray(iDirIndex) = AnchorDir + iDirCount = 1 + oDocInfo = CreateUnoService("com.sun.star.document.DocumentProperties") + oUcbObject = createUnoService("com.sun.star.ucb.SimpleFileAccess") + If oUcbObject.Exists(AnchorDir) Then + Do + AnchorDir = sDirArray(DirIndex) + On Local Error Resume Next + DirContent() = oUcbObject.GetFolderContents(AnchorDir,True) + DirIndex = DirIndex + 1 + On Local Error Goto 0 + On Local Error Goto FILESYSTEMPROBLEM: + If Ubound(DirContent()) <> -1 Then + FileCountinDir = Ubound(DirContent())+ 1 + For i = 0 to FilecountinDir -1 + If bInterruptSearch = True Then + Exit Do + End If + + Filename = DirContent(i) + If oUcbObject.IsFolder(FileName) Then + If brecursive Then + AddFoldertoList(FileName, DirIndex) + End If + Else + If bcheckFileType Then + RealFileContent = GetRealFileContent(FileName) + Else + RealFileContent = GetFileNameExtension(FileName) + End If + If RealFileContent <> "" Then + ' Retrieve the Index in the Array, where a Filename is positioned + If Not IsMissing(sFileContent()) Then + If (FieldInArray(sFileContent(), Ubound(sFileContent), RealFileContent)) Then + ' The extension of the current file passes the filter and is therefore admitted to the + ' fileList + If Not IsMissing(sExtension) Then + If sExtension <> "" Then + ' Consider that some Formats like old StarOffice Templates with the extension ".vor" can only be + ' precisely identified by their mimetype and their extension + FileExtension = GetFileNameExtension(FileName) + If FileExtension = sExtension Then + AddFileNameToList(sFileArray(), FileName, RealFileContent, bGetByTitle, CurIndex) + End If + Else + AddFileNameToList(sFileArray(), FileName, RealFileContent, bGetByTitle, CurIndex) + End If + Else + AddFileNameToList(sFileArray(), FileName, RealFileContent, bGetByTitle, CurIndex) + End If + End If + Else + AddFileNameToList(sFileArray(), FileName, RealFileContent, bGetByTitle, CurIndex) + End If + If CurIndex = MaxIndex Then + MaxIndex = MaxIndex + StartUbound + ReDim Preserve sFileArray(MaxIndex,1) as String + End If + End If + End If + Next i + End If + Loop Until DirIndex >= iDirCount + If CurIndex > -1 Then + ReDim Preserve sFileArray(CurIndex,1) as String + Else + ReDim sFileArray() as String + End If + Else + Msgbox("Directory '" & ConvertFromUrl(AnchorDir) & "' does not exist!", 16, GetProductName()) + End If + ReadDirectories() = sFileArray() + Exit Function + + FILESYSTEMPROBLEM: + Msgbox("Sorry, Filesystem Problem") + ReadDirectories() = sFileArray() + Resume LEAVEPROC + LEAVEPROC: +End Function + + +Sub AddFoldertoList(sDirURL as String, iDirIndex) + iDirCount = iDirCount + 1 + If iDirCount = CurDirMaxCount Then + CurDirMaxCount = CurDirMaxCount + SBMAXDIRCOUNT + ReDim Preserve sDirArray(CurDirMaxCount) as String + End If + sDirArray(iDirCount-1) = sDirURL +End Sub + + +Sub AddFileNameToList(sFileArray(), FileName as String, FileContent as String, bGetByTitle as Boolean, CurIndex) +Dim FileCount As Integer + CurIndex = CurIndex + 1 + sFileArray(CurIndex,0) = FileName + If bGetByTitle Then + sFileArray(CurIndex,1) = RetrieveDocTitle(oDocInfo, FileName) + ' Add the documenttitles to the Filearray + Else + sFileArray(CurIndex,1) = FileContent + End If +End Sub + + +Function RetrieveDocTitle(oDocProps as Object, sFileName as String) As String +Dim sDocTitle as String + On Local Error Goto NOFILE + oDocProps.loadFromMedium(sFileName, NoArgs()) + sDocTitle = oDocProps.Title + NOFILE: + If Err <> 0 Then + RetrieveDocTitle = "" + RESUME CLR_ERROR + End If + CLR_ERROR: + If sDocTitle = "" Then + sDocTitle = GetFileNameWithoutExtension(sFilename, "/") + End If + RetrieveDocTitle = sDocTitle +End Function + + +' Retrieves The Filecontent of a Document by extracting the content +' from the Header of the document +Function GetRealFileContent(FileName as String) As String + On Local Error Goto NOFILE + oTypeDetect = createUnoService("com.sun.star.document.TypeDetection") + GetRealFileContent = oTypeDetect.queryTypeByURL(FileName) + NOFILE: + If Err <> 0 Then + GetRealFileContent = "" + resume CLR_ERROR + End If + CLR_ERROR: +End Function + + +Function CopyRecursively(SourceFilePath as String, SourceStemDir as String, TargetStemDir as String) +Dim TargetDir as String +Dim TargetFile as String + + TargetFile= ReplaceString(SourceFilePath, TargetStemDir, SourceStemDir) + TargetFileName = FileNameoutofPath(TargetFile,"/") + TargetDir = DeleteStr(TargetFile, TargetFileName) + CreateFolder(TargetDir) + CopyRecursively() = TargetFile +End Function + + +' Opens a help url referenced by a Help ID that is retrieved from the calling button tag +Sub ShowHelperDialog(aEvent) +Dim oSystemNode as Object +Dim sSystem as String +Dim oLanguageNode as Object +Dim sLocale as String +Dim sLocaleList() as String +Dim sLanguage as String +Dim sHelpUrl as String +Dim sDocType as String + HelpID = aEvent.Source.Model.Tag + oLocDocument = StarDesktop.ActiveFrame.Controller.Model + sDocType = GetDocumentType(oLocDocument) + oSystemNode = GetRegistryKeyContent("org.openoffice.Office.Common/Help") + sSystem = oSystemNode.GetByName("System") + oLanguageNode = GetRegistryKeyContent("org.openoffice.Setup/L10N/") + sLocale = oLanguageNode.getByName("ooLocale") + sLocaleList() = ArrayoutofString(sLocale, "-") + sLanguage = sLocaleList(0) + sHelpUrl = "vnd.sun.star.help://" & sDocType & "/" & HelpID & "?Language=" & sLanguage & "&System=" & sSystem + StarDesktop.LoadComponentfromUrl(sHelpUrl, "OFFICE_HELP", 63, NoArgs()) +End Sub + + +Sub SaveDataToFile(FilePath as String, DataList()) +Dim FileChannel as Integer +Dim i as Integer +Dim oFile as Object +Dim oOutputStream as Object +Dim oStreamString as Object +Dim oUcb as Object +Dim sCRLF as String + + sCRLF = CHR(13) & CHR(10) + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + oOutputStream = createUnoService("com.sun.star.io.TextOutputStream") + If oUcb.Exists(FilePath) Then + oUcb.Kill(FilePath) + End If + oFile = oUcb.OpenFileReadWrite(FilePath) + oOutputStream.SetOutputStream(oFile.GetOutputStream) + For i = 0 To Ubound(DataList()) + oOutputStream.WriteString(DataList(i) & sCRLF) + Next i + oOutputStream.CloseOutput() +End Sub + + +Function LoadDataFromFile(FilePath as String, DataList()) as Boolean +Dim oInputStream as Object +Dim i as Integer +Dim oUcb as Object +Dim oFile as Object +Dim MaxIndex as Integer + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + If oUcb.Exists(FilePath) Then + MaxIndex = 10 + oInputStream = createUnoService("com.sun.star.io.TextInputStream") + oFile = oUcb.OpenFileReadWrite(FilePath) + oInputStream.SetInputStream(oFile.GetInputStream) + i = -1 + Redim Preserve DataList(MaxIndex) + While Not oInputStream.IsEOF + i = i + 1 + If i > MaxIndex Then + MaxIndex = MaxIndex + 10 + Redim Preserve DataList(MaxIndex) + End If + DataList(i) = oInputStream.ReadLine + Wend + If i > -1 And i <> MaxIndex Then + Redim Preserve DataList(i) + End If + LoadDataFromFile() = True + oInputStream.CloseInput() + Else + LoadDataFromFile() = False + End If +End Function + + +Function CreateFolder(sNewFolder) as Boolean +Dim oUcb as Object + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + On Local Error Goto NOSPACEONDRIVE + If Not oUcb.Exists(sNewFolder) Then + oUcb.CreateFolder(sNewFolder) + End If + CreateFolder = True +NOSPACEONDRIVE: + If Err <> 0 Then + If InitResources("") Then + ErrMsg = GetResText("RID_COMMON_0") + ErrMsg = ReplaceString(ErrMsg, chr(13), "<BR>") + ErrMsg = ReplaceString(ErrMsg, sNewFolder, "%1") + Msgbox(ErrMsg, 48, GetProductName()) + End If + CreateFolder = False + Resume GOON + End If +GOON: +End Function +</script:module> diff --git a/wizards/source/tools/dialog.xlb b/wizards/source/tools/dialog.xlb new file mode 100644 index 000000000..dc8dfbda2 --- /dev/null +++ b/wizards/source/tools/dialog.xlb @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Tools" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="DlgOverwriteAll"/> +</library:library> diff --git a/wizards/source/tools/script.xlb b/wizards/source/tools/script.xlb new file mode 100644 index 000000000..fe4d74d60 --- /dev/null +++ b/wizards/source/tools/script.xlb @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Tools" library:readonly="true" library:passwordprotected="false"> + <library:element library:name="ModuleControls"/> + <library:element library:name="Strings"/> + <library:element library:name="Misc"/> + <library:element library:name="UCB"/> + <library:element library:name="Listbox"/> + <library:element library:name="Debug"/> +</library:library>
\ No newline at end of file diff --git a/wizards/source/tutorials/Functions.xba b/wizards/source/tutorials/Functions.xba new file mode 100644 index 000000000..4b422c80b --- /dev/null +++ b/wizards/source/tutorials/Functions.xba @@ -0,0 +1,385 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Functions" script:language="StarBasic">REM ***** BASIC ***** +Dim DialogVisible As Boolean +Dim TutorStep As Integer +Dim TutorLastStep As Integer +Dim myDialog As Object +Dim myTutorial As Object +Public TutorText() As String +Dim documentTitle As String +Dim exampleUse As Object +Dim properties() As Object +Dim docTYP As String +'public myWidth As Long +Dim myHeight As Long +Dim oTextField As Object +Dim stepTitle As String +Dim oOpenDialogFlag +Dim imageStatus As String + +Sub LoadTutorialDialog(exampleToUse, documentTYP) + Init() + exampleUse = exampleToUse + TutorText() = exampleUse.LoadText() + properties() = exampleUse.GetProperties() + If properties(3).Value = "True" Then + Dim localisation(0) As new com.sun.star.beans.NamedValue + localisation(0).Name = "Localisation" + localisation(0).Value = properties() + myTutorial.execute(localisation()) + Else + TutorStep = 0 + TutorLastStep = 0 + docTYP = documentTYP + InitAction() + ShowInfoMain() + DialogVisible = True + myDialog = LoadDialog("Tutorials","TutorialsDialog") + + SetTutorialDocumentPosSize() + + documentProps = ThisComponent.getDocumentProperties() + myDialog.Title = "Tutorials - " & documentProps.Title + oTextField = myDialog.GetControl("myTextField") + oTextField.setVisible(False) + + imageStatus = "MIN" + setMaxMinImage(imageStatus) + + 'myWidth = myDialog.Size.Width + myHeight = myDialog.Size.Height + + CheckForStepShowButtonStatus() + CheckForStepNextButtonStatus() + InitRoadMap() + SetVisibleTrue() + myDialog.model.myTextField.Label = stepTitle + myDialog.model.myText.Label = GetStepText()'TutorText(TutorStep) + + + Do + wait 1000 + Loop Until DialogVisible = False + If( oOpenDialogFlag = True) Then + Destroy() + TutorialOpen.TutorialOpenMain() + Else + Destroy() + End If + End If +End Sub + +Sub setMaxMinImage(param As String) + On Local Error Goto NOIMAGE + oCommandButton = myDialog.GetControl("CommandButton") + templatePath = GetPathSettings("Template",false, 0) + Dim bitmapPath As String + iPos = InStr(templatePath,"/") + If(iPos > 0) Then + If(param = "MAX") Then + bitmapPath = templatePath & "../wizard/bitmap/maximize.png" + ElseIf(param = "MIN") Then + bitmapPath = templatePath & "../wizard/bitmap/minimize.png" + End If + Else + If(param = "MAX") Then + bitmapPath = templatePath & "..\wizard\bitmap\maximize.png" + ElseIf(param = "MIN") Then + bitmapPath = templatePath & "..\wizard\bitmap\minimize.png" + End If + End If + 'printdbgInfo oCommandButton.Model + oCommandButton.Model.ImageUrl = bitmapPath + Exit Sub + NOIMAGE: +End Sub + +Sub SetTutorialDocumentPosSize() + activDesktopWindow = StarDesktop.activeFrame.ContainerWindow + If(activDesktopWindow.posSize.Height < 550) Then + activDesktopWindow.setPosSize(0,0,0,550,8) + End If + If (activDesktopWindow.posSize.Width < 750 ) Then + activDesktopWindow.setPosSize(0,0,750,0,4) + EndIf +End Sub + +Sub InitRoadMap() + RoadMapMain(Functions, myDialog) + SetControlModelPosSize(0, 0, 85, 176) + SetControlModelText("Steps") + + StepSize = Ubound(TutorText()) + Dim ItemsArray(StepSize) as String + For i = 0 To StepSize + stepcontent = TutorText(i) + iPos = InStr(stepcontent,CHR(13)) + ItemName = Left(stepcontent, iPos) + ItemsArray(i) = ItemName + Next i + InsertItemsLabels( ItemsArray()) + + For i = 1 To StepSize + SetItemEnabled( i, False) + Next i + SetItemEnabled( 0, True) +End Sub + +Sub Destroy() + 'myDialog.dispose + wait 1000 + ShowInfoDialog.DisposeIDialog() + + ' THE DOCUMENT GETS CLOSED HERE!!!!!!!! GPF + thisComponent.CurrentController.Frame.close(True) + +End Sub + +Sub Init + GlobalScope.BasicLibraries.LoadLibrary("Tools") + myTutorial = createUNOService("com.sun.star.wizards.tutorial.executer.CallTutorialFramework") + documentTitle = ThisComponent.getCurrentController.getFrame.Title +End Sub + +Sub InitStep + udProps = ThisComponent.DocumentProperties.UserDefinedProperties + If udProps.PropertySetInfo.hasPropertyByName("CurrentStep") Then + TutorStep = udProps.CurrentStep + Else + udProps.addProperty("CurrentStep", 0, TutorStep) + End If +End Sub + +Sub setStep + ThisComponent.DocumentProperties.UserDefinedProperties.CurrentStep = TutorStep +End Sub + +Sub InitAction() + SetStepTitle() + + Dim property(6) As new com.sun.star.beans.PropertyValue + property(0).Name = "DocumentTYP" + property(0).Value = docTYP + property(1).Name = "MethodName" + property(1).Value = "setDelay" + property(2).Name = "Param" + property(2).Value = 0 'key insert speed (Millis) + property(3).Name = "Param" + property(3).Value = 4 'mouse animate speed (Millis) + property(4).Name = "Param" + property(4).Value = 2000 'after mouse animate sleep (Millis) + property(5).Name = "Param" + property(5).Value = 10 'mouse scroll speed (Millis) + property(6).Name = "Param" + property(6).Value = -1 'mouse speed (step) + myTutorial.setPropertyValues(property()) +End Sub + +Sub EndDialog + oOpenDialogFlag = False + If (myDialog.model.done.Label = "Close") Then + TutorialCloseMain() + Else + DialogVisible = False + End If +End Sub + +Sub NextStep + GotoStep(TutorStep + 1) +End Sub + +Sub GotoStep(StepIndex) + If(StepIndex <= Ubound(TutorText())) Then + TutorStep = StepIndex + If TutorStep > TutorLastStep Then + TutorLastStep = TutorStep + End If + If(TutorStep = Ubound(TutorText())) Then + myDialog.model.next.enabled = False + myDialog.model.done.Label = "Done" + myDialog.model.show.Label = "Tutorials" + Else + myDialog.model.next.enabled = True + End If + SetStepTitle() + myDialog.model.myText.Label = GetStepText() + CheckForStepShowButtonStatus() + SetItemEnabled( TutorStep, True) + 'setStep() + End If +End Sub + +Function GetStepText() + Dim tempText As String + tempText = TutorText(TutorStep) + iPos = InStr(tempText,CHR(13)) + ResultString = Right(tempText, Len(tempText) - iPos - 1) + GetStepText() = ResultString +End Function + +Sub ItemChange(CurrentItemID, SelectitemID) + GotoStep(SelectitemID) +End Sub + +Sub SetDisableShowMeButton() + myDialog.model.show.enabled = False + TutorLastStep = TutorLastStep + 1 +End Sub + +Sub Minimize(aEvent) + ActionItemsTextField = myDialog.GetControl("ActionItemsLabel") + FixedLineVertikal = myDialog.GetControl("FixedLineVertikal") + + If myDialog.Size.Height = 35 Then + myDialog.setPosSize(0,0,0,myHeight,8) + oTextField.setVisible(False) + ActionItemsTextField.setVisible(True) + FixedLineVertikal.setVisible(True) + RoadMap.SetVisibleRoadMap(True) + Else + myDialog.setPosSize(0,0,0,35,8) + rmSelectedIndex = RoadMap.GetSelectedIndex() + 1 + gsTitle = GetStepTitle() + oTextField.setText(rmSelectedIndex & ". " & gsTitle) + oTextField.setVisible(True) + ActionItemsTextField.setVisible(False) + FixedLineVertikal.setVisible(False) + RoadMap.SetVisibleRoadMap(False) + End If + If(imageStatus = "MAX") Then + imageStatus = "MIN" + ElseIf(imageStatus = "MIN") Then + imageStatus = "MAX" + End If + setMaxMinImage(imageStatus) + +End Sub + +Sub SetStepTitle() + stepcontent = TutorText(TutorStep) + iPos = InStr(stepcontent,CHR(13)) + stepTitle = Left(stepcontent, iPos) + SetStepTitle() = stepTitle +End Sub + +Function GetStepTitle() + GetStepTitle() = stepTitle +End Function + +Sub CheckForStepShowButtonStatus() + If ((exampleUse.ContainsStepAction() = True And TutorStep = TutorLastStep) Or myDialog.model.show.Label = "Tutorials") Then + myDialog.model.show.enabled = True + Else + myDialog.model.show.enabled = False + End If +End Sub + +Sub CheckForStepNextButtonStatus() + If(TutorStep = Ubound(TutorText())) Then + myDialog.model.next.enabled = False + myDialog.model.done.Label = "Done" + End If +End Sub + +Sub Show(aEvent) + 'ShowInfoMain() + If( myDialog.model.show.Label = "Tutorials") Then + oOpenDialogFlag = True + DialogVisible = False + Else + SetMousePosition(aEvent) + exampleUse.Action() + End If +End Sub + +Sub SetMousePosition(aEvent) + MyPoints() = MousePoints(aEvent) + + Dim mousePosition(3) as new com.sun.star.beans.PropertyValue + mousePosition(0).Name = "DocumentTYP" + mousePosition(0).Value = docTYP + mousePosition(1).Name = "MethodName" + mousePosition(1).Value = "setMousePosition" + mousePosition(2).Name = "Param" + mousePosition(2).Value = MyPoints(0) + mousePosition(3).Name = "Param" + mousePosition(3).Value = MyPoints(1) + + myTutorial.setPropertyValues(mousePosition()) +End Sub + +Function MousePoints(aEvent) + Dim position(1) As Integer + position(0) = myDialog.getControl("show").AccessibleContext.LocationOnScreen.X + aEvent.Source.Model.PositionX + position(1) = myDialog.getControl("show").AccessibleContext.LocationOnScreen.Y + aEvent.Source.Model.PositionY + MousePoints = position() +End Function + +Function CheckPath(path() As String) + 'documentTitle = ThisComponent.getCurrentController.getFrame.Title + sTitle = path(0) + ResultString = Right(sTitle, 3) + iPos = InStr(ResultString,"#") + ResultString = Right(ResultString, Len(ResultString) - iPos) + ResultFrameString = InStr (sTitle, "{D}FRAME#") + If ResultFrameString <> 0 Then + If Not (sTitle = ("{D}FRAME#" & documentTitle & "#" & ResultString)) Then + 'path(0) = "{D}FRAME#" & documentTitle & "#" & ResultString + path(0) = "FRAME#" & documentTitle & "#" & ResultString + sTitle = path(1) + ResultString = Right(sTitle, 3) + iPos = InStr(ResultString,"#") + ResultString = Right(ResultString, Len(ResultString) - iPos) + path(1) = "ROOT_PANE#" & documentTitle & "#" & ResultString + Else + 'path(0) = "{D}FRAME#" & documentTitle & "#" & ResultString + path(0) = "FRAME#" & documentTitle & "#" & ResultString + End If + End If +End Function + +Sub SetVisibleTutorialsDialog(param) + myDialog.setVisible(param) +End Sub + +Sub SetVisibleTrue() + myDialog.setVisible(True) +End Sub + +Sub SetVisibleFalse() + myDialog.setVisible(False) +End Sub + +Sub ExitTutorial() + Dim aUrl As new com.sun.star.util.URL + oDoc = ThisComponent + urlTransformer = createUNOService("com.sun.star.util.URLTransformer") + aUrl.Complete = "slot:5621" + urlTransformer.parseStrict(aUrl) + xController = oDoc.getCurrentController() + xDispatcher = xController.queryDispatch(aUrl, "", 0) + if NOT isNull(xDispatcher) then + xDispatcher.dispatch(aUrl, DimArray()) + else + msgBox "Error! Cannot close document." + End If +End Sub +</script:module> diff --git a/wizards/source/tutorials/RoadMap.xba b/wizards/source/tutorials/RoadMap.xba new file mode 100644 index 000000000..efcfc03a4 --- /dev/null +++ b/wizards/source/tutorials/RoadMap.xba @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="RoadMap" script:language="StarBasic">REM ***** BASIC ***** +Dim oControlModel +Dim oDialogModel +Dim CurrentItem +Dim bLongString +Dim oControl +Dim oEvent +Dim oUseDialog As Object +Dim oModulName As Object + +Sub RoadMapMain(ModulNameforItemChange, dialogtoUse) + GlobalScope.BasicLibraries.LoadLibrary("Tools") + oUseDialog = dialogtoUse + oModulName = ModulNameforItemChange + oDialogModel = oUseDialog.Model + oControlModel = oUseDialog.Model.CreateInstance("com.sun.star.awt.UnoControlRoadmapModel") + + oDialogModel.insertByName("RoadMap", oControlModel) + oControl = oUseDialog.getControl("RoadMap") + oEvent = createUnoListener( "CallBack_", "com.sun.star.awt.XItemListener" ) + oControl.addItemListener(oEvent) + oControlModel.CurrentItemID = 0 + oControlModel.Complete = True + oControlModel.Activated = True +End Sub + +Sub SetVisibleRoadMap(param) + oControl.SetVisible(param) +End Sub + +Sub SetDialogModelSize(Width, Height) + oDialogModel.Width = Width + oDialogModel.Height = Height +End Sub + +Sub SetControlModelPosSize(X, Y, Width, Height) + oControlModel.PositionX = X + oControlModel.PositionY = Y + oControlModel.Width = Width + oControlModel.Height = Height +End Sub + +Sub SetControlModelText( ModelText As String) + oControlModel.Text = ModelText +End Sub + +Sub InsertItemsLabels( ItemLabelsArray() As String) + For i = 0 To Ubound(ItemLabelsArray()) + oRoadmapItem = oControlModel.createInstance() + oRoadmapItem.Label = ItemLabelsArray(i) + oRoadmapItem.ID = i + oControlModel.insertbyIndex(i, oRoadmapItem) + Next i +End Sub + +Sub SetItemEnabled( ItemIndex, param) + oControlModel.getByIndex(ItemIndex).Enabled = param + oControlModel.CurrentItemID = ItemIndex +End Sub + +Sub AddImagetoControlModel( Url As String) + oControlModel.ImageUrl = ConvertToUrl(Url) +End Sub + +Function GetSelectedIndex() + GetSelectedIndex() = oControlModel.CurrentItemID +End Function + +Function GetControlModel() + GetControlModel = oControlModel +End Function + +Function GetDialogModel() + GetDialogModel = oDialogModel +End Function + +Sub Callback_itemStateChanged(aEvent) + oModulName.ItemChange(oControlModel.CurrentItemID, aEvent.itemID) +End Sub + +Sub SetComplete(param) + oControlModel.Complete = param +End Sub + +Sub SetActivated(param) + oControlModel.Activated = param +End Sub + +Sub RemoveItem(ItemIndex) + If ItemIndex > -1 Then + oControlModel.removeByIndex(ItemIndex) + End If +End Sub + +Sub InsertItem(ItemLabel As String) + oRoadmapItem = oControlModel.createInstance() + oRoadmapItem.Label = ItemLabel + oControlModel.insertbyIndex(oControlModel.CurrentItemID, oRoadmapItem) +End Sub + +Sub ReplaceItem(ItemLabel As String) + oRoadmapItem = oControlModel.createInstance() + oRoadmapItem.Label = ItemLabel + oControlModel.replacebyIndex(oControlModel.CurrentItemID, oRoadmapItem) +End Sub + +Sub Callback_disposing(aEvent) +End Sub + +Sub Property_propertyChange(aEvent) +End Sub + +Sub Property_disposing(aEvent) +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/tutorials/ShowInfoDialog.xba b/wizards/source/tutorials/ShowInfoDialog.xba new file mode 100644 index 000000000..e1da4b596 --- /dev/null +++ b/wizards/source/tutorials/ShowInfoDialog.xba @@ -0,0 +1,322 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="ShowInfoDialog" script:language="StarBasic">REM ***** BASIC ***** +Dim oWnd As Object +Dim oWnd2 As Object +Dim oWnd3 As Object +Dim oDoc as Object + +Sub ShowInfoMain + prop() = GetShowInfoProperties() + Init(prop(0).Value, prop(1).Value, prop(2).Value, prop(3).Value, prop(4).Value, prop(5).Value, prop(6).Value, prop(7).Value, prop(8).Value) +End Sub + +Sub Init(tFieldText As String, windowX, windowY, windowWidth, windowHeight, tFieldX, tFieldY, tFieldWidth, tFieldHeight) + toolkit = createUnoService("com.sun.star.awt.Toolkit") + Dim oWndDescr As new com.sun.star.awt.WindowDescriptor + Dim oBounds As new com.sun.star.awt.Rectangle + oWndDescr.Type = com.sun.star.awt.WindowClass.TOP + oWndDescr.WindowServiceName = "" + oWndDescr.ParentIndex = 0 + + 'officeX = StarDesktop.ActiveFrame.getContainerWindow().AccessibleContext.LocationOnScreen.X + 'officeY = StarDesktop.ActiveFrame.getContainerWindow().AccessibleContext.LocationOnScreen.Y + 'officeWidth = StarDesktop.ActiveFrame.getContainerWindow().getPosSize().Width + 'officeHeight = StarDesktop.ActiveFrame.getContainerWindow().getPosSize().Height + officeWidth = thisComponent.CurrentController.Frame.getContainerWindow().getPosSize().Width + officeHeight = thisComponent.CurrentController.Frame.getContainerWindow().getPosSize().Height + + 'dialogWidth = myTutoShowDialog.getPosSize().Width + 'dialogHeight = myTutoShowDialog.getPosSize().Height + X = officeWidth - windowWidth - windowX + Y = officeHeight - windowHeight - windowY + + oBounds.X = X : oBounds.Y = Y + oBounds.Width = windowWidth : oBounds.Height = windowHeight + oWndDescr.Bounds = oBounds + oWndDescr.Parent = thisComponent.CurrentController.Frame.ContainerWindow + with com.sun.star.awt.WindowAttribute + oWndDescr.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW + end with + + oWnd = toolkit.createWindow(oWndDescr) + + Dim oWndDescr3 As new com.sun.star.awt.WindowDescriptor + Dim oBounds3 As new com.sun.star.awt.Rectangle + oWndDescr3.Type = com.sun.star.awt.WindowClass.TOP + oWndDescr3.WindowServiceName = "fixedimage" '"fixedtext" + oWndDescr3.ParentIndex = 0 + oBounds3.X = 0 : oBounds3.Y = 0 + oBounds3.Width = tFieldWidth : oBounds3.Height = tFieldHeight + oWndDescr3.Bounds = oBounds3 + oWndDescr3.Parent = oWnd + with com.sun.star.awt.WindowAttribute + oWndDescr3.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW + end with + + oWnd3= toolkit.createWindow(oWndDescr3) + 'oWnd2.Text = tFieldText + 'printdbgInfo(oWnd3) + setImage(oWnd3) + 'oWnd3.Background = 16777215 +' oWnd2.SetBackGround(16776960) + oWnd.SetBackGround(16776960) +' oWnd.FontDescriptors(0).Name = "Albany" +' oWnd.FontDescriptors(0).StyleName = "BOLD" + + Dim oWndDescr2 As new com.sun.star.awt.WindowDescriptor + Dim oBounds2 As new com.sun.star.awt.Rectangle + oWndDescr2.Type = com.sun.star.awt.WindowClass.TOP + oWndDescr2.WindowServiceName = "fixedtext" + oWndDescr2.ParentIndex = 0 + oBounds2.X = tFieldX : oBounds2.Y = tFieldY + oBounds2.Width = tFieldWidth : oBounds2.Height = tFieldHeight + oWndDescr2.Bounds = oBounds2 + oWndDescr2.Parent = oWnd3 + with com.sun.star.awt.WindowAttribute + oWndDescr2.WindowAttributes = .CLOSEABLE AND .MOVEABLE AND .SIZEABLE AND .BORDER AND .SHOW + end with + + oWnd2= toolkit.createWindow(oWndDescr2) + oWnd2.Text = tFieldText + oWnd2.Background = 268435455 + 'printdbgInfo(oWnd2) + + 'printdbgInfo oWnd.getPosSize() + +End Sub + +Function GetShowInfoProperties() + stepText = GetStepTitle() + Dim Properties(8) As new com.sun.star.beans.NamedValue + Properties(0).Name = "ShowInfoDialogText" + Properties(0).Value = stepText & "Press [Esc] to abort." + Properties(1).Name = "WindowX" + Properties(1).Value = 20 + Properties(2).Name = "WindowY" + Properties(2).Value = 40 + Properties(3).Name = "WindowWidth" + Properties(3).Value = 190 + Properties(4).Name = "WindowHeight" + Properties(4).Value = 50 + Properties(5).Name = "TFieldX" + Properties(5).Value = 7 + Properties(6).Name = "TFieldY" + Properties(6).Value = 8 + Properties(7).Name = "TFieldWidth" + Properties(7).Value = 190 + Properties(8).Name = "TFieldHeight" + Properties(8).Value = 50 + GetShowInfoProperties = Properties() +End Function + +Sub setShowInfoText() + stepText = GetStepTitle() + oWnd2.Text = stepText & "Press [Esc] to abort." +End Sub + +Sub ShowON() + setShowInfoText() + oWnd.setVisible(True) + oWnd3.setVisible(True) + oWnd2.setVisible(True) +End Sub + +Sub ShowOFF() + 'On Local Error Goto NOPROPERTYSETINFO: + oWnd.setVisible(False) + oWnd2.setVisible(False) + oWnd3.setVisible(False) + 'oDoc.dispose() + Exit Sub + 'NOPROPERTYSETINFO: +End Sub + +Sub DisposeIDialog() + 'On Local Error Goto NOPROPERTYSETINFO: + oWnd3.dispose + oWnd2.dispose + oWnd.dispose + oDoc.dispose() + Exit Sub + 'NOPROPERTYSETINFO: +End Sub + +sub setImage(whatever as Object) + + templatePath = GetPathSettings("Template",false, 0) + Dim bitmapPath As String + iPos = InStr(templatePath,"/") + if(iPos > 0) Then + bitmapPath = templatePath & "../wizard/bitmap/tutorial_background.gif" + Else + bitmapPath = templatePath & "..\wizard\bitmap\tutorial_background.gif" + End If + + dim props(0) as new com.sun.star.beans.PropertyValue + props(0).Name = "Hidden" + props(0).Value = true + oDoc = StarDesktop.loadComponentFromUrl("private:factory/swriter","_blank",0,props()) + oShape = addControlToDefaultForm("ImageButton", 1000, 1000, 2000, 1000) + imgControl = oShape.getControl() + 'imgControl.ImageUrl="file:///D:/Program%20Files/src680_m11_qwizards1_49_TEST/share/gallery/tutoItem.gif" + imgControl.ImageUrl = bitmapPath + imgControl.addConsumer(whatever) + imgControl.startProduction() +end sub + +Function createControlShape(cKind As String) As Object + + Dim oControlShape As Object + Dim oControl As Object + + + oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape") + oControl = oDoc.createInstance("com.sun.star.form.component." & cKind) + oControl.setPropertyValue("DefaultControl", "com.sun.star.form.control." & cKind) + oControlShape.setControl(oControl) + + + createControlShape() = oControlShape + +End Function + +Function createControlShapeWithDefaultControl(cKind As String) As Object + + Dim oControlShape As Object + Dim oControl As Object + + + oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape") + oControl = oDoc.createInstance("com.sun.star.form.component." & cKind) + oControlShape.setControl(oControl) + + + createControlShapeWithDefaultControl() = oControlShape + +End Function + +Function createUNOControlShape(cKind As String, defControl As String) As Object + + Dim oControlShape As Object + Dim oControl As Object + + + oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape") + oControl = oDoc.createInstance("com.sun.star.form.component." & cKind) + oControl.setPropertyValue("DefaultControl", "com.sun.star.awt." & defControl) + oControlShape.setControl(oControl) + + + createUNOControlShape() = oControlShape + +End Function + +Function addShape(oShape As Object) As Boolean + + Dim vSize As New com.sun.star.awt.Size + Dim oDrawPage As Object + Dim oForms As Object + Dim oForm As Object + + oDrawPage = oDoc.getDrawPage() + oForms = oDrawPage.getForms() + + if oForms.Count = 0 then + oForm = oDoc.createInstance("com.sun.star.form.component.Form") + oForms.insertByIndex(0, oForm) + end if + + vSize.Height = 2000 : vSize.Width = 2000 + oShape.Size = vSize + oDrawPage.add(oShape) + + addShape() = true + +End Function + +sub addControl(cKind as String) + + Dim oDrawPage As Object + Dim oForm As Object, oForms As Object + Dim oControl As Object, oControlShape As Object + Dim aSz As Variant + Dim oText As Object + + oDrawPage = oDoc.DrawPage + oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape") + oControl = oDoc.createInstance("com.sun.star.form.component." + cKind) + oForm = oDoc.createInstance("com.sun.star.form.component.Form") + oforms = oDrawPage.Forms + if oforms.count = 0 then + oforms.insertbyindex(0,oForm) + end if + oControlShape.Control = oControl + oDrawPage.add(oControlShape) + +End sub + +Function addControlToDefaultForm(cKind as String, x As Integer, y As Integer, width As Integer, height As Integer) As Object + + Dim oDrawPage As Object + Dim oControl As Object, oControlShape As Object + Dim pos As New com.sun.star.awt.Point + Dim size As New com.sun.star.awt.Size + + pos.X = x + pos.Y = y + size.Width = width + size.Height = height + + oDrawPage = oDoc.DrawPage + oControlShape = oDoc.createInstance("com.sun.star.drawing.ControlShape") + oControl = oDoc.createInstance("com.sun.star.form.component." + cKind) + oControlShape.Control = oControl + oControlShape.Position = pos + oControlShape.Size = size + oDrawPage.add(oControlShape) + + addControlToDefaultForm() = oControlShape + +End Function + +Function addShapeToDrawDoc(oPage as Object, nPosX, nPosY as Integer, oType As String) As Object + Dim aPoint As New com.sun.star.awt.Point + Dim aSize As New com.sun.star.awt.Size + Dim oShape As Object + Dim servNames As Variant + + aPoint.x = nPosX + aPoint.y = nPosY + aSize.Width = 2000 + aSize.Height = 1000 + oShape = oDoc.createInstance("com.sun.star.drawing."+oType+"Shape") + oShape.Size = aSize + oShape.Position = aPoint + + if oShape.getPropertySetInfo().hasPropertyByName("FillColor") then + oShape.FillColor = RGB(128, 255, 0) + End If + + oPage.add(oShape) + + addShapeToDrawDoc() = oShape +End Function +</script:module> diff --git a/wizards/source/tutorials/TutorialClose.xba b/wizards/source/tutorials/TutorialClose.xba new file mode 100644 index 000000000..b4a066b89 --- /dev/null +++ b/wizards/source/tutorials/TutorialClose.xba @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TutorialClose" script:language="StarBasic">REM ***** BASIC ***** +Dim myCloseDialog As Object + +Sub TutorialCloseMain + myCloseDialog = LoadDialog("Tutorials","TutorialCloseDialog") + myCloseDialog.Execute() +End Sub + +Sub CloseYes(aEvent) + myCloseDialog.EndExecute() + DialogVisible = False +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/tutorials/TutorialCloseDialog.xdl b/wizards/source/tutorials/TutorialCloseDialog.xdl new file mode 100644 index 000000000..a362b2a44 --- /dev/null +++ b/wizards/source/tutorials/TutorialCloseDialog.xdl @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="TutorialCloseDialog" dlg:left="173" dlg:top="82" dlg:width="132" dlg:height="38" dlg:closeable="true" dlg:moveable="true"> + <dlg:styles> + <dlg:style dlg:style-id="0" dlg:font-weight="150"/> + </dlg:styles> + <dlg:bulletinboard> + <dlg:button dlg:id="yesButton" dlg:tab-index="1" dlg:left="24" dlg:top="20" dlg:width="50" dlg:height="14" dlg:value="Yes"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.TutorialClose.CloseYes?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="noButton" dlg:tab-index="0" dlg:left="76" dlg:top="20" dlg:width="50" dlg:height="14" dlg:value="No" dlg:button-type="cancel"/> + <dlg:text dlg:style-id="0" dlg:id="Label1" dlg:tab-index="2" dlg:left="6" dlg:top="6" dlg:width="120" dlg:height="8" dlg:value="Do you want to close this Tutorial?." dlg:align="center"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/tutorials/TutorialCreator.xba b/wizards/source/tutorials/TutorialCreator.xba new file mode 100644 index 000000000..34e1276f4 --- /dev/null +++ b/wizards/source/tutorials/TutorialCreator.xba @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TutorialCreator" script:language="StarBasic">REM ***** BASIC ***** +Sub TutorialCreatorMain + GlobalScope.BasicLibraries.LoadLibrary("Tools") + myTutorial = createUNOService("com.sun.star.wizards.tutorial.executer.CallTutorialFramework") + myTutorial.trigger("StartTutorialCreator") +End Sub + +</script:module>
\ No newline at end of file diff --git a/wizards/source/tutorials/TutorialOpen.xba b/wizards/source/tutorials/TutorialOpen.xba new file mode 100644 index 000000000..5b6001c6c --- /dev/null +++ b/wizards/source/tutorials/TutorialOpen.xba @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<script:module xmlns:script="http://openoffice.org/2000/script" script:name="TutorialOpen" script:language="StarBasic">REM ***** BASIC ***** +Dim myOpenDialog As Object +Dim oListBox As Object +Dim files As Object +Dim oUcb As Object +Dim oListener As Object + +Sub TutorialOpenMain + GlobalScope.BasicLibraries.LoadLibrary("Tools") + myOpenDialog = LoadDialog("Tutorials","TutorialOpenDialog") + init() + myOpenDialog.Execute() +End Sub + +Sub Init + On Local Error Goto NOFILE + myOpenDialog.Title = "Tutorials" + oListBox = myOpenDialog.GetControl("ListBox") + templatePath = GetPathSettings("Template",false, 0) + Dim tutorialPath As String + iPos = InStr(templatePath,"/") + if(iPos > 0) Then + tutorialPath = templatePath & "/tutorials" + Else + tutorialPath = templatePath & "\tutorials" + End If + oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess") + files = oUcb.getFolderContents(tutorialPath,true) + size = Ubound( files() ) + Dim tempFiles(size) As String + tempCount = 0 + For iCount = 0 To size + completPath = files(iCount) + oDocInfo = CreateUnoService("com.sun.star.document.DocumentProperties") + oDocInfo.Read(completPath) + sDocTitle = oDocInfo.Title + if(not isNull(sDocTitle) And len(sDocTitle) > 0) Then + oListbox.addItem(sDocTitle,0) + tempFiles(tempCount) = completPath + tempCount = tempCount + 1 + End If + Next iCount + 'printdbgInfo oListbox + size = oListbox.ItemCount - 1 + Dim tempFiles2(size) As String + For iCount = 0 To size + tempFiles2(iCount) = tempFiles(iCount) + Next iCount + files() = tempFiles2() + Exit Sub + NOFILE: + If Err <> 0 Then + Msgbox "No file found error!" & CHR(13) & "Path: ...\share\template\...\tutorials\" + myOpenDialog.model.Open.enabled = False + End If +End Sub + +Sub ItemSelected(oEvent) + On Local Error Goto NOFILE + completPath = files(Ubound(files()) - oEvent.Selected) + oTextField = myOpenDialog.GetControl("Label") 'TextField + oTextField.setText("") + Dim NoArgs() as new com.sun.star.beans.PropertyValue + oDocInfo = CreateUnoService("com.sun.star.document.DocumentProperties") + oDocInfo.Read(completPath) + sDocDescription = oDocInfo.Description + if(not isNull(sDocTitle) And len(sDocDescription) > 0) Then + oTextField.setText(sDocDescription) + Else + oTextField.setText("Not Description!!!.") + End If + Exit Sub + NOFILE: + If Err <> 0 Then + Msgbox "Open file error!" + End If +End Sub + +Sub OpenTutorial(aEvent) + completPath = files(Ubound(files()) - oListBox.getSelectedItemPos()) + Dim Args(2) as new com.sun.star.beans.PropertyValue + Args(1).Name = "MacroExecutionMode" + Args(1).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE + Args(2).Name = "AsTemplate" + Args(2).Value = true + + StarDesktop.LoadComponentFromURL(completPath,"_default",0, Args()) + myOpenDialog.endExecute() +End Sub + +Sub Cancel(aEvent) + myOpenDialog.endExecute() +End Sub +</script:module>
\ No newline at end of file diff --git a/wizards/source/tutorials/TutorialOpenDialog.xdl b/wizards/source/tutorials/TutorialOpenDialog.xdl new file mode 100644 index 000000000..d9a6009a3 --- /dev/null +++ b/wizards/source/tutorials/TutorialOpenDialog.xdl @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="TutorialOpenDialog" dlg:left="158" dlg:top="58" dlg:width="250" dlg:height="200" dlg:closeable="true" dlg:moveable="true"> + <dlg:bulletinboard> + <dlg:button dlg:id="Open" dlg:tab-index="1" dlg:left="141" dlg:top="180" dlg:width="50" dlg:height="14" dlg:value="Open"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.TutorialOpen.OpenTutorial?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="Cancel" dlg:tab-index="2" dlg:left="194" dlg:top="180" dlg:width="50" dlg:height="14" dlg:value="Cancel"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.TutorialOpen.Cancel?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:menulist dlg:id="ListBox" dlg:tab-index="0" dlg:left="8" dlg:top="17" dlg:width="98" dlg:height="155"> + <script:event script:event-name="on-performaction" script:location="application" script:macro-name="Tutorials.TutorialOpen.OpenTutorial" script:language="StarBasic"/> + <script:event script:event-name="on-itemstatechange" script:location="application" script:macro-name="Tutorials.TutorialOpen.ItemSelected" script:language="StarBasic"/> + </dlg:menulist> + <dlg:fixedline dlg:id="FixedLine" dlg:tab-index="3" dlg:left="6" dlg:top="6" dlg:width="100" dlg:height="8" dlg:value="Tutorials"/> + <dlg:fixedline dlg:id="FixedLine1" dlg:tab-index="4" dlg:left="6" dlg:top="176" dlg:width="238" dlg:height="1"/> + <dlg:fixedline dlg:id="FixedLine2" dlg:tab-index="5" dlg:left="110" dlg:top="6" dlg:width="134" dlg:height="8" dlg:value="Description"/> + <dlg:fixedline dlg:id="FixedLine3" dlg:tab-index="6" dlg:left="267" dlg:top="44" dlg:width="0" dlg:height="2"/> + <dlg:text dlg:id="Label" dlg:tab-index="7" dlg:left="112" dlg:top="17" dlg:width="132" dlg:height="155" dlg:multiline="true"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/tutorials/TutorialsDialog.xdl b/wizards/source/tutorials/TutorialsDialog.xdl new file mode 100644 index 000000000..f8a2ee211 --- /dev/null +++ b/wizards/source/tutorials/TutorialsDialog.xdl @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE dlg:window PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "dialog.dtd"> +<!-- + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . +--> +<dlg:window xmlns:dlg="http://openoffice.org/2000/dialog" xmlns:script="http://openoffice.org/2000/script" dlg:id="TutorialsDialog" dlg:left="149" dlg:top="54" dlg:width="250" dlg:height="200" dlg:closeable="true" dlg:moveable="true"> + <dlg:styles> + <dlg:style dlg:style-id="0" dlg:font-weight="150"/> + </dlg:styles> + <dlg:bulletinboard> + <dlg:button dlg:id="CommandButton" dlg:tab-index="3" dlg:left="232" dlg:top="4" dlg:width="13" dlg:height="13" dlg:value="C"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.Functions.Minimize?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:id="myText" dlg:tab-index="4" dlg:left="91" dlg:top="26" dlg:width="153" dlg:height="145" dlg:value="This text explains all the action items that the user can do to follow the current step highlighted in the road map at the left side of the tutorial window.

1. Open the Format menu
2. Choose the Paragraph command
3. Click the Numbering tab

The first step will always explain what the current tutorial is about.

The last step - it is highlighted currently in the road map - will summarize what the user now has seen or learned." dlg:multiline="true"/> + <dlg:button dlg:id="show" dlg:tab-index="1" dlg:left="142" dlg:top="180" dlg:width="50" dlg:height="14" dlg:value="Show me"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.Functions.Show?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:button dlg:id="next" dlg:tab-index="0" dlg:left="89" dlg:top="180" dlg:width="50" dlg:height="14" dlg:value="Next >>"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.Functions.NextStep?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:style-id="0" dlg:id="myTextField" dlg:tab-index="5" dlg:left="6" dlg:top="6" dlg:width="192" dlg:height="8" dlg:value="Current Step (in Road Map)"/> + <dlg:button dlg:id="done" dlg:tab-index="2" dlg:left="195" dlg:top="180" dlg:width="50" dlg:height="14" dlg:value="Close"> + <script:event script:event-name="on-performaction" script:macro-name="vnd.sun.star.script:Tutorials.Functions.EndDialog?language=Basic&location=application" script:language="Script"/> + </dlg:button> + <dlg:text dlg:style-id="0" dlg:id="ActionItemsLabel" dlg:tab-index="8" dlg:left="91" dlg:top="8" dlg:width="45" dlg:height="8" dlg:value="Action Items"/> + <dlg:fixedline dlg:id="FixedLineHorizontal" dlg:tab-index="7" dlg:left="0" dlg:top="176" dlg:width="250" dlg:height="1"/> + <dlg:fixedline dlg:id="FixedLineVertikal" dlg:tab-index="6" dlg:left="85" dlg:top="0" dlg:width="1" dlg:height="176" dlg:align="vertical"/> + </dlg:bulletinboard> +</dlg:window>
\ No newline at end of file diff --git a/wizards/source/tutorials/dialog.xlb b/wizards/source/tutorials/dialog.xlb new file mode 100644 index 000000000..e02b20688 --- /dev/null +++ b/wizards/source/tutorials/dialog.xlb @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Tutorials" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="TutorialsDialog"/> + <library:element library:name="TutorialOpenDialog"/> + <library:element library:name="TutorialCloseDialog"/> +</library:library>
\ No newline at end of file diff --git a/wizards/source/tutorials/script.xlb b/wizards/source/tutorials/script.xlb new file mode 100644 index 000000000..30280c6b1 --- /dev/null +++ b/wizards/source/tutorials/script.xlb @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE library:library PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "library.dtd"> +<library:library xmlns:library="http://openoffice.org/2000/library" library:name="Tutorials" library:readonly="false" library:passwordprotected="false"> + <library:element library:name="Functions"/> + <library:element library:name="TutorialCreator"/> + <library:element library:name="TutorialOpen"/> + <library:element library:name="RoadMap"/> + <library:element library:name="ShowInfoDialog"/> + <library:element library:name="TutorialClose"/> +</library:library>
\ No newline at end of file |