Files
libreoffice/dbaccess/source/core/dataaccess/documentdefinition.cxx
Ivo Hinkelmann 7599f68cee CWS-TOOLING: integrate CWS dba32a
2009-04-16 13:08:19 +0200 oj  r270882 : #i14538# set property at control
2009-04-16 13:04:28 +0200 oj  r270881 : #i98557# remove binary string for SRB
2009-04-15 13:19:10 +0200 oj  r270838 : #i96782# use type set at view
2009-04-14 14:53:20 +0200 oj  r270778 : #i96782# set initialize size for custom shape
2009-04-06 14:19:14 +0200 oj  r270546 : #i88432# correct pos when < 0 while resizing
2009-04-06 13:36:13 +0200 oj  r270541 : #i96782# handle toolbar and menubar differently
2009-04-06 13:33:54 +0200 oj  r270540 : #i96782# handle toolbar and menubar differently
2009-04-06 12:28:23 +0200 oj  r270534 : #i96782# handle toolbar and menubar differently
2009-04-06 12:27:44 +0200 oj  r270533 : #i96782# handle toolbar and menubar differently
2009-04-06 12:24:32 +0200 oj  r270532 : #i96782# handle toolbar and menubar differently
2009-04-06 12:15:15 +0200 oj  r270531 : do not initialze when field is empty
2009-04-06 10:06:08 +0200 oj  r270528 : #i96782# clean up of menubar and remove duplicates
2009-04-06 09:47:49 +0200 oj  r270527 : #i96519# adjust help text dynamic
2009-04-03 13:43:20 +0200 oj  r270482 : do not need to remove section from observer they are already disposed
2009-04-03 13:27:28 +0200 fs  r270479 : #i97356#
2009-04-02 11:30:39 +0200 fs  r270386 : UNX line ends
2009-04-02 10:54:51 +0200 fs  r270379 : UNX line ends
2009-04-02 10:39:57 +0200 fs  r270378 : UNX line ends
2009-04-02 10:37:24 +0200 fs  r270377 : why did this survive the rebase? was removed on trunk ...
2009-03-31 13:31:12 +0200 fs  r270277 : component_foo should be public
2009-03-28 00:21:01 +0100 fs  r270176 : manuallly merged the changes which happened in CWS before resync to m45, where the directory had been moved from reportdesign/registry to reportbuilder/registry
2009-03-27 23:01:20 +0100 fs  r270174 : CWS-TOOLING: rebase CWS dba32a to trunk@270033 (milestone: DEV300:m45)
2009-03-11 12:23:35 +0100 fs  r269310 : #i99958# ensure the ControlModelLock doesn't release twice
2009-03-06 09:07:32 +0100 fs  r268970 : ignore output paths in SVN's status
2009-03-06 09:07:08 +0100 fs  r268969 : ignore output paths in SVN's status
2009-03-04 11:28:02 +0100 oj  r268800 : copy and paste error, check correct end now
2009-03-03 15:49:11 +0100 fs  r268736 : #i10000# those merges were lost during the rebase (m38->m42)
2009-03-03 13:25:27 +0100 lla  r268720 : #i99652# fix wrong refactoring
2009-02-27 11:12:56 +0100 fs  r268566 : beautified
2009-02-27 10:53:47 +0100 fs  r268561 : doFormListening(false) only when actually isFormListening() (found during complex test case XMLFormSettings with assertions)
2009-02-26 20:55:31 +0100 fs  r268546 : #i96530# set the Label property of the bound control, if we didn't create a dedicated label control
2009-02-26 11:53:09 +0100 fs  r268494 : #i10000#
2009-02-26 11:27:50 +0100 fs  r268493 : #i10000#
2009-02-26 11:17:08 +0100 fs  r268490 : reportdesign depends on REPORTBUILDER, not REPORTDESIGN
2009-02-25 11:39:48 +0100 fs  r268422 : #i10000# post-resync: INFO_ESCAPE_DATETIME got lost during rebase
2009-02-24 23:24:10 +0100 fs  r268411 : CWS-TOOLING: rebase CWS dba32a to trunk@268395 (milestone: DEV300:m42)
2009-02-20 15:09:48 +0100 fs  r268324 : respect ImplicitCatalog/SchemaRestriction in all necessary places
2009-02-20 13:48:10 +0100 oj  r268318 : order of initialize corrected
2009-02-14 15:07:52 +0100 fs  r267759 : #i98975# when an image does not have a bitmap, but a text, draw this (as placeholder)
2009-02-14 15:02:40 +0100 fs  r267758 : consolidated and removed some duplicate code
2009-02-14 13:52:23 +0100 fs  r267756 : #i10000#
2009-02-13 22:08:34 +0100 fs  r267750 : #i100000#
2009-02-13 22:07:25 +0100 fs  r267749 : #i10000#
2009-02-13 21:55:36 +0100 fs  r267747 : #i10000#
2009-02-13 21:54:27 +0100 fs  r267746 : use const_cast
2009-02-13 21:29:10 +0100 fs  r267745 : #i10000#
2009-02-13 21:27:39 +0100 fs  r267744 : #i10000#
2009-02-13 20:59:13 +0100 fs  r267742 : #i10000#
2009-02-13 13:21:30 +0100 fs  r267717 : better diagnostics
2009-02-13 13:17:24 +0100 fs  r267715 : #i58313# support Catalog/SchemaRestriction settings, which are applied in getTables when 'all catalogs/schemas' are to be retrieved
2009-02-13 13:16:14 +0100 fs  r267714 : filter out some more known global settings
2009-02-13 12:39:43 +0100 fs  r267713 : #i58313# ImplicitCatalog/SchemaRestriction
2009-02-13 12:36:50 +0100 fs  r267712 : when exporting data source settings, allow for properties which have a VOID default value, but are currently not VOID
2009-02-13 12:35:57 +0100 fs  r267711 : implement XSet, to allow inserting properties which have a default value of VOID
2009-02-13 12:35:03 +0100 fs  r267710 : +addVoidProperty
2009-02-13 10:20:08 +0100 fs  r267697 : removed unused variable
2009-02-13 09:46:46 +0100 fs  r267695 : refactored the table filtering code, to have a better base for introducing additional low level filters
2009-02-10 09:23:07 +0100 lla  r267537 : #i10000# wrong line feed, double named variable
2009-02-09 12:13:08 +0100 oj  r267508 : #i98605# notify hanlder
2009-02-09 11:50:34 +0100 oj  r267507 : #i98926# solve refcount problem
2009-02-09 11:50:05 +0100 oj  r267506 : #i98971# fix for simple html
2009-02-09 11:49:24 +0100 oj  r267505 : #i98971# fix for simple html
2009-02-09 11:47:27 +0100 oj  r267504 : invoke on copy
2009-02-09 09:51:00 +0100 fs  r267500 : #i98316#
2009-02-09 09:46:10 +0100 fs  r267499 : setCurrentSelection: don't reset the current form when we de-select everything
2009-02-09 09:43:45 +0100 fs  r267498 : #i98316#
2009-02-08 21:25:18 +0100 fs  r267496 : #i98272# introduce late ctor for cloning
2009-02-07 21:08:39 +0100 fs  r267485 : #i98272# when copy-constructing a FmFormPageImpl, use the XCloneable of the forms collection, instead of XPersistObject (which is incompletely implemented)
2009-02-07 21:07:26 +0100 fs  r267484 : removed obsolete include guards
2009-02-07 21:05:22 +0100 fs  r267483 : #i98272# implement XCloneable
2009-02-06 15:02:48 +0100 lla  r267467 : #i96523# add XImageControl
2009-02-06 14:41:38 +0100 oj  r267463 : #i98926# late init when connection disposed but only when asked for
2009-02-06 13:49:57 +0100 lla  r267457 : #i92860# bigint in forms doesn't allow input of values > 1, fixed
2009-02-06 13:03:55 +0100 oj  r267455 : ImageScaleMode
2009-02-05 14:48:19 +0100 lla  r267424 : #i89335# dropdown listboxes are 14 instead of 7 lines high
2009-02-05 13:40:00 +0100 oj  r267423 : #i96945# insert new prop Opaque
2009-02-05 13:39:19 +0100 oj  r267422 : #i96945# insert layer handling for hell and heaven
2009-02-05 13:29:32 +0100 lla  r267420 : #i89335# add is null, is not null, is not like filter condition
2009-02-04 12:23:02 +0100 oj  r267364 : #i98821# load table font settings
2009-02-04 10:05:27 +0100 oj  r267351 : #i98821# load table font settings
2009-02-04 09:23:22 +0100 fs  r267350 : checking persistency of UI settings in database documents - for the moment, capture table formattings (which is issue 98821)
2009-02-04 09:22:15 +0100 fs  r267349 : moved some methods which are of wider interest from DatabaseDocument to FileHelper resp. TestCase
2009-02-04 08:56:27 +0100 oj  r267347 : #i97586# UcbStreamHelper::CreateStream doesn't check all streamModes use different method
2009-02-04 08:23:26 +0100 oj  r267346 : #i98701# check key size is >= 3 and some redesign
2009-02-03 23:29:24 +0100 fs  r267345 : return the component (controller), not the frame
2009-02-03 23:28:53 +0100 fs  r267344 : openExisting returns a controller now, not the frame (this was a bug)
2009-02-03 23:28:25 +0100 fs  r267343 : openElement: properly return the component in the table/query case
2009-02-02 12:48:17 +0100 oj  r267261 : #i96013# fix for relative path
2009-02-02 10:33:28 +0100 lla  r267253 : #i98557# cleanups and consolidation
2009-02-02 09:37:23 +0100 lla  r267250 : #i88432# resize will no longer move components to other sections
2009-02-02 09:08:24 +0100 oj  r267245 : #i97475# write 0x1A at the end of the file
2009-01-30 19:39:20 +0100 lla  r267230 : #i10000# unused parameters
2009-01-30 09:51:09 +0100 fs  r267181 : onsolete
2009-01-30 09:49:27 +0100 fs  r267180 : onsolete
2009-01-29 14:28:22 +0100 oj  r267139 : #i96825# import cell style
2009-01-29 14:23:12 +0100 oj  r267137 : #i98601# export imagescalehandler
2009-01-29 14:19:57 +0100 lla  r267135 : #i98601# add ImageScaleMode
2009-01-29 13:21:08 +0100 oj  r267124 : #i98601# impl ScaleMode
2009-01-29 13:20:56 +0100 oj  r267123 : #i98601# impl ScaleMode
2009-01-29 08:46:40 +0100 oj  r267095 : new property: ScaleMode
2009-01-29 08:45:23 +0100 oj  r267094 : new ScaleMode from UnControlImageModel
2009-01-29 08:28:12 +0100 oj  r267093 : #i87930# close all sub forms/reports when the desktop is going to be terminated and no db frame exists
2009-01-28 19:54:34 +0100 lla  r267082 : #i98557# pictures in report wizard
2009-01-28 15:06:25 +0100 oj  r267060 : #i87930# close all sub forms/reports when the desktop is going to be terminated and no db frame exists
2009-01-28 11:38:41 +0100 lla  r267046 : #i76783# handle binary fields in forms
2009-01-28 09:24:43 +0100 lla  r267025 : #i10000#
2009-01-28 08:40:04 +0100 fs  r267024 : #i10000#
2009-01-28 08:04:43 +0100 oj  r267023 : #i93456# use resource strings for function names
2009-01-27 13:26:05 +0100 oj  r266988 : check data field is type field or expression
2009-01-27 13:07:17 +0100 oj  r266985 : check data field length
2009-01-27 11:48:19 +0100 oj  r266974 : #i96823# return dll string as column name when no alias exists
2009-01-27 09:53:11 +0100 fs  r266958 : display the message of a caught exception
2009-01-27 09:44:13 +0100 fs  r266957 : #i58313# when retrieving all tables, just set an empty table type filter - the connection will care for translating this, by respecting the TableTypeFilterMode setting
2009-01-27 09:36:09 +0100 fs  r266956 : #i58313# getTables: per JDBC spec,  is not a valid table type filter. Translate it to 'null'.
2009-01-26 11:24:49 +0100 lla  r266912 : #i97865# cleanups (AddField viewable in remote mode)
2009-01-26 07:49:27 +0100 lla  r266897 : #i97865# AddField opens in remote case
2009-01-26 07:48:58 +0100 lla  r266896 : #i97865# AddField opens in remote case
2009-01-26 07:48:42 +0100 lla  r266895 : #i97865# AddField opens in remote case
2009-01-23 15:04:40 +0100 fs  r266825 : consolidate the usage of OSQLMessageBox with MessageType==Warning into OSQLWarningBox
2009-01-23 10:47:33 +0100 fs  r266787 : +supportsUserAdministration
2009-01-23 10:47:11 +0100 fs  r266784 : use DatabaseMetaData.supportsUserAdministration
2009-01-23 07:55:59 +0100 lla  r266767 : #i10000# fix gcc compiler failures
2009-01-21 15:08:55 +0100 lla  r266673 : #i97265# Labels in HC (IsDark) with other color (viewable)
2009-01-19 14:58:54 +0100 lla  r266504 : #i96523# last problems with FormatKey and '0' values fixed
2009-01-19 14:58:00 +0100 lla  r266503 : #i96519# AddField help text
2009-01-19 11:59:02 +0100 fs  r266485 : #i96523# for formatted field models, init them with TreatAsNumber = false
2009-01-16 10:31:49 +0100 lla  r266405 : #i96793# add shrink to popup menu
2009-01-16 09:21:44 +0100 lla  r266401 : #i96519# AddField contains a help text
2009-01-15 11:21:49 +0100 lla  r266357 : #i96523# problem with XVclWindowPeer not fixed now
2009-01-15 09:19:20 +0100 lla  r266335 : #i96523# more crashes fixed.
2009-01-14 13:08:34 +0100 lla  r266291 : #i96523# problems with crashes fixed
2009-01-13 10:54:24 +0100 lla  r266199 : #i96523# show datasource in formattedfields new files
2009-01-13 10:52:39 +0100 lla  r266198 : #i96523# show datasource in formattedfields
2009-01-13 09:41:50 +0100 lla  r266197 : #i96526# handling none existance default.otr
2009-01-12 12:55:49 +0100 fs  r266151 : don't expect the control model to be a BoundComponent before adding as modify listener
2009-01-12 12:51:33 +0100 fs  r266149 : #i88458# let the ImageControl be an XModifyBroadcaster, so the forms runtime can notice when the user changes the control content while it does not have the focus
2009-01-09 13:41:22 +0100 fs  r266080 : doc
2009-01-09 13:14:14 +0100 fs  r266077 : #i97377# SetModified when order is changed via DnD
2009-01-07 09:55:40 +0100 oj  r265951 : merge from master
2009-01-07 09:55:24 +0100 oj  r265950 : removed observer
2009-01-07 09:55:06 +0100 oj  r265949 : merge from master
2009-01-07 07:29:11 +0100 oj  r265945 : shadow var changed
2009-01-06 07:25:57 +0100 oj  r265893 : CWS-TOOLING: rebase CWS dba32a to trunk@265758 (milestone: DEV300:m38)
2009-01-05 13:18:22 +0100 oj  r265865 : convert to unix le
2009-01-05 09:13:52 +0100 lla  r265857 : #i79423# lc_ sc_ permutation fix
2009-01-02 19:40:59 +0100 lla  r265847 : #i79423# section shrink icons
2008-12-22 11:37:57 +0100 lla  r265749 : #i97484# move component to negative Y-position
2008-12-22 11:37:05 +0100 lla  r265748 : #i97484# move component to negative Y-position
2008-12-22 11:35:33 +0100 lla  r265747 : #i97484# move component to negative Y-position
2008-12-22 11:25:07 +0100 lla  r265745 : #i96757# changes via property browser was not undoable
2008-12-18 15:10:38 +0100 fs  r265694 : corrected an condition in doFormListening, which otherwise leads to uncommitable grid columns in documents which are loaded from disc (not in documents which are newly created)
2008-12-18 14:54:39 +0100 fs  r265692 : Hide Columns text slightly changed
2008-12-18 13:44:15 +0100 fs  r265683 : #i94068# properly display erros happening during a form operation - at least once, and at most once
2008-12-18 11:28:29 +0100 fs  r265677 : document the new InputRequired property
2008-12-18 11:04:15 +0100 fs  r265676 : #i96530# createControlLabelPair: don't actually create a label for a checkbox
2008-12-18 10:35:53 +0100 fs  r265674 : #i95226# when a column is replaced, and it's the selected column, update the selection
2008-12-18 10:34:42 +0100 fs  r265673 : #i95226# refactoring of the implReplaced method
2008-12-18 10:34:28 +0100 fs  r265672 : #i95226# when replacing a grid column, update the property browser
2008-12-18 10:33:17 +0100 fs  r265671 : when an element is removed, remove it from m_aCurrentSelection, too (if necessary)
2008-12-18 10:31:57 +0100 fs  r265670 : Hide Columns text slightly changed
2008-12-18 10:15:56 +0100 lla  r265669 : #i14538# do not allow to press finish button twice
2008-12-18 08:56:33 +0100 lla  r265665 : #i10000# build depend=t problem hacked.
2008-12-17 20:59:10 +0100 fs  r265656 : #i89821# don't let a MultiLineEdit select all text when it receives the focus
2008-12-17 12:10:54 +0100 fs  r265594 : #i97356#
2008-12-17 12:06:29 +0100 fs  r265593 : #i97355# Print -> Printable
2008-12-17 11:59:31 +0100 fs  r265591 : #i97350# combo boxes comment on list selection (as list boxes already do)
2008-12-16 09:53:57 +0100 lla  r265527 : #i96526# handling none existance default.otr
2008-12-15 14:48:39 +0100 lla  r265500 : #i79423# reparing, was wrong implemented
2008-12-12 15:08:33 +0100 lla  r265424 : #i10000# remove wrong carridge returns
2008-12-12 15:07:55 +0100 lla  r265423 : #i10000# remove wrong carridge returns
2008-12-12 15:06:41 +0100 lla  r265422 : #i10000# remove wrong carridge returns
2008-12-12 10:23:13 +0100 lla  r265395 : #i95234# reset DragDelta
2008-12-12 10:11:02 +0100 lla  r265393 : #i79423# pre versions of shrink buttons
2008-12-11 15:32:13 +0100 fs  r265318 : prevent a deadlock during complex.dbaccess.DatabaseDocument test
2008-12-11 15:30:06 +0100 fs  r265316 : prevent a deadlock during complex.dbaccess.DatabaseDocument test
2008-12-11 15:07:05 +0100 fs  r265307 : removed superfluous text
2008-12-11 12:29:54 +0100 lla  r265282 : #i96757# cleanup second try
2008-12-11 12:09:15 +0100 lla  r265278 : #i96757# cleanup
2008-12-11 12:07:56 +0100 lla  r265277 : #i95234#
2008-12-10 14:04:39 +0100 lla  r265183 : #i93472# D&D fixes
2008-12-10 12:29:33 +0100 lla  r265168 : #i94067# add (APP|SYS)FONT to XUnitConversion
2008-12-10 12:15:02 +0100 lla  r265166 : #i94067# add APPFONT, SYSFONT to MeasureUnit
2008-12-10 11:52:10 +0100 lla  r265163 : #i94067# add comments
2008-12-06 20:33:05 +0100 fs  r264935 : #i10000# precompiled header
2008-12-05 09:29:26 +0100 fs  r264889 : #i10000#
2008-12-05 09:07:31 +0100 fs  r264888 : #i10000#
2008-12-04 13:25:46 +0100 fs  r264838 : CWS-TOOLING: rebase CWS dba32a to trunk@264807 (milestone: DEV300:m37)
2008-12-03 23:49:13 +0100 fs  r264808 : merge changes from trunk, to be able to do a rebase
2008-12-03 17:13:09 +0100 lla  r264801 : #i91041# update documentation
2008-12-03 16:57:04 +0100 lla  r264799 : #i94067# allow convert(Point|Size)ToLogic as pixel also
2008-12-02 12:36:32 +0100 lla  r264687 : #i96782# bring toolbar objects to menu structure
2008-12-02 10:32:44 +0100 lla  r264667 : #i86255# make property work
2008-12-02 09:22:47 +0100 lla  r264659 : #i79423# add section shrink toolbar
2008-12-02 07:41:22 +0100 lla  r264657 : #i86255# add check box for Escape DateTime property
2008-12-02 07:37:17 +0100 lla  r264656 : #i79423# new shrink buttons
2008-11-26 11:55:28 +0100 fs  r264362 : #i96541#
FillPropertySet: do not only catch UnknownPropertyException when setting the Char/ParaAutoStyleName,
but also care for the other exceptions which can be thrown by XPropertySet::setPropertyValue.
This is actually not the real fix for #i96541#, but only a follow-up. The root cause of the issue
was fixed in CWS dba301b, but this here was another (potential) bug which popped up during investigations.
2008-11-25 09:04:40 +0100 lla  r264273 : #i82083# new toolbox in GroupsSorting dialog
2008-11-25 08:56:08 +0100 lla  r264272 : #i94729# change token strings into string list, move class out of function
2008-11-24 15:52:22 +0100 fs  r264251 : #i96532# do not set AppendTableAlias, NameLengthLimit, etc., if the OXMLDataSourceInstance is used for elements at which those attributes never appear
2008-11-24 15:51:45 +0100 fs  r264249 : #i96532# do not set AppendTableAlias, NameLengthLimit, etc., if the OXMLDataSourceInstance is used for elements at which those attributes never appear
2008-11-24 15:45:21 +0100 fs  r264244 : #i96532# the API default for ParamNameSubst is false
2008-11-24 15:45:04 +0100 fs  r264243 : #i96532# do not set AppendTableAlias, NameLengthLimit, etc., if the OXMLDataSourceInstance is used for elements at which those attributes never appear
2008-11-24 15:44:14 +0100 fs  r264241 : #i96532# slight refactoring of exporting properties which have a XML default different from the API default
2008-11-24 10:50:01 +0100 lla  r264216 : #i82083# icons for new toolbox
2008-11-24 09:38:45 +0100 lla  r264205 : #i82083# new toolbox in GroupsSorting dialog
2008-11-24 09:32:20 +0100 lla  r264201 : #i96501# cleanup assertions
2008-11-24 09:12:55 +0100 lla  r264198 : #i83082# enhancement for toolboxes, better HC comfort
2008-11-24 08:46:43 +0100 lla  r264197 : #i96501# fix problem with negative positions
2008-11-21 11:44:47 +0100 fs  r264118 : #i57042# introduce a counter for suspending change notifications of a given property, so recursive calls are possible
2008-11-21 11:02:17 +0100 fs  r264116 : #i96388# don't call ExecuteContextMenuAction when no action was chosen by the user
2008-11-21 10:36:53 +0100 fs  r264114 : #i47384# assertion was wrong
2008-11-14 12:33:15 +0100 fs  r263673 : #i47318# XRowSetChangeBroadcaster/Listener, to be able to listen for changes in an XRowSetSupplier's RowSet
2008-11-14 12:30:29 +0100 fs  r263672 : #i47318# more refactoring
- BoundControlModels now listen at the XRowSetSupplier for changes in the supplied
  RowSet, to properly revoke/register old/new listeners at the RowSet
- replaced ::osl::Mutex in various places with a ControlModelLock
2008-11-14 12:20:55 +0100 fs  r263671 : when BUILD_TYPE includes QADEVOOO, the BUILD_QADEVOOO needs to bet set, too
2008-11-14 12:19:21 +0100 fs  r263670 : oops, this was not intended to be committed
2008-11-12 11:08:10 +0100 fs  r263579 : #i96096# new ctors taking UNO_QUERY_THROW
2008-11-12 09:15:54 +0100 fs  r263576 : no need to load the complete dialog just to get a string which the dialog itself loads from resource
2008-11-10 17:55:45 +0100 fs  r263535 : spelling in comment
2008-11-10 15:51:14 +0100 fs  r263523 : #i47318# various refactorings
1. don't forward syntetic XLoadListener events from the grid control to
   the grid columns. Instead, forward GridColumn::XChild::setParent to
   the base class, which then can add itself as load listener 
2. removed various occurances of XMultiServiceFactory, instead use the
   ::comphelper::ComponentContext
3. in O(Bound)ControlModel, have a mechanism to lock the instance (using
   ControlModelLock) and fire property changes when the last lock dies.
2008-11-10 12:49:24 +0100 oj  r263513 : #i94729# change token strings into string list
2008-11-10 12:13:15 +0100 oj  r263512 : #i95222# export chart:title style as well
2008-11-10 08:55:25 +0100 oj  r263507 : #i93471# show the correct tabpage when selecting a different object
2008-11-07 23:38:29 +0100 fs  r263490 : #i95977# for the event input controls, add a component extending their functionality so they're reset when the users presses DEL
2008-11-07 23:35:39 +0100 fs  r263489 : during #i95977#: When a VCL Window is deleted from within VCL code, the respective WindowPeer was never disposed. Corrected this.
2008-11-07 14:57:07 +0100 fs  r263420 : #i95963# human-readable display names for event bindings
2008-11-06 10:34:52 +0100 fs  r263366 : #i95865# don't use library names containing InvalidZipEntryFileNames - workaround until i95409 is fixed
2008-11-06 10:33:28 +0100 fs  r263365 : #i95865#
copied the following change from CWS odfmetadata2 (not yet integrated) into CWS dba31d
  - comphelper/inc/comphelper/storagehelper.hxx,
    comphelper/source/misc/storagehelper.cxx:
    + add function IsValidZipEntryFileName (moved from module package)
2009-04-22 11:01:27 +00:00

2197 lines
88 KiB
C++
Raw Blame History

/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: documentdefinition.cxx,v $
* $Revision: 1.64.20.2 $
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org 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. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_dbaccess.hxx"
#ifndef _DBA_COREDATAACCESS_DOCUMENTDEFINITION_HXX_
#include "documentdefinition.hxx"
#endif
#ifndef DBACCESS_SHARED_DBASTRINGS_HRC
#include "dbastrings.hrc"
#endif
#ifndef DBACORE_SDBCORETOOLS_HXX
#include "sdbcoretools.hxx"
#endif
#ifndef _TOOLS_DEBUG_HXX
#include <tools/debug.hxx>
#endif
#ifndef TOOLS_DIAGNOSE_EX_H
#include <tools/diagnose_ex.h>
#endif
#ifndef _COMPHELPER_PROPERTY_HXX_
#include <comphelper/property.hxx>
#endif
#ifndef _COMPHELPER_SEQUENCE_HXX_
#include <comphelper/sequence.hxx>
#endif
#ifndef _COMPHELPER_MEDIADESCRIPTOR_HXX_
#include <comphelper/mediadescriptor.hxx>
#endif
#ifndef COMPHELPER_NAMEDVALUECOLLECTION_HXX
#include <comphelper/namedvaluecollection.hxx>
#endif
#ifndef _COMPHELPER_CLASSIDS_HXX
#include <comphelper/classids.hxx>
#endif
#include <com/sun/star/frame/XUntitledNumbers.hpp>
#ifndef _COM_SUN_STAR_AWT_XTOPWINDOW_HPP_
#include <com/sun/star/awt/XTopWindow.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_SIZE_HPP_
#include <com/sun/star/awt/Size.hpp>
#endif
#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
#include <com/sun/star/lang/DisposedException.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
#include <com/sun/star/beans/PropertyAttribute.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODEL_HPP_
#include <com/sun/star/frame/XModel.hpp>
#endif
#include <com/sun/star/frame/XTitle.hpp>
#ifndef _COM_SUN_STAR_FRAME_XCONTROLLER_HPP_
#include <com/sun/star/frame/XController.hpp>
#endif
#ifndef _COM_SUN_STAR_TASK_XJOBEXECUTOR_HPP_
#include <com/sun/star/task/XJobExecutor.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDERINTERCEPTION_HPP_
#include <com/sun/star/frame/XDispatchProviderInterception.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XFRAMESSUPPLIER_HPP_
#include <com/sun/star/frame/XFramesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_INSERTCOMMANDARGUMENT_HPP_
#include <com/sun/star/ucb/InsertCommandArgument.hpp>
#endif
#include <com/sun/star/report/XReportDefinition.hpp>
#include <com/sun/star/report/XReportEngine.hpp>
#ifndef _COM_SUN_STAR_UCB_OPENMODE_HPP_
#include <com/sun/star/ucb/OpenMode.hpp>
#endif
#ifndef _COM_SUN_STAR_XEMBEDOBJECTFACTORY_HPP_
#include <com/sun/star/embed/XEmbedObjectFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_XEMBEDOBJECTCREATOR_HPP_
#include <com/sun/star/embed/XEmbedObjectCreator.hpp>
#endif
#ifndef _COM_SUN_STAR_EMBED_ASPECTS_HPP_
#include <com/sun/star/embed/Aspects.hpp>
#endif
#ifndef _UCBHELPER_CANCELCOMMANDEXECUTION_HXX_
#include <ucbhelper/cancelcommandexecution.hxx>
#endif
#ifndef _COM_SUN_STAR_UCB_UNSUPPORTEDDATASINKEXCEPTION_HPP_
#include <com/sun/star/ucb/UnsupportedDataSinkException.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_UNSUPPORTEDOPENMODEEXCEPTION_HPP_
#include <com/sun/star/ucb/UnsupportedOpenModeException.hpp>
#endif
#ifndef _COM_SUN_STAR_ELEMENTMODES_HPP_
#include <com/sun/star/embed/ElementModes.hpp>
#endif
#ifndef _COM_SUN_STAR_XEMBEDPERSIST_HPP_
#include <com/sun/star/embed/XEmbedPersist.hpp>
#endif
#ifndef _COM_SUN_STAR_EMBEDSTATES_HPP_
#include <com/sun/star/embed/EmbedStates.hpp>
#endif
#ifndef _COM_SUN_STAR_XCOMPONENTSUPPLIER_HPP_
#include <com/sun/star/embed/XComponentSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_ENTRYINITMODES_HPP_
#include <com/sun/star/embed/EntryInitModes.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_MISSINGPROPERTIESEXCEPTION_HPP_
#include <com/sun/star/ucb/MissingPropertiesException.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_MISSINGINPUTSTREAMEXCEPTION_HPP_
#include <com/sun/star/ucb/MissingInputStreamException.hpp>
#endif
#ifndef _COM_SUN_STAR_UCB_OPENCOMMANDARGUMENT2_HPP_
#include <com/sun/star/ucb/OpenCommandArgument2.hpp>
#endif
#ifndef _COM_SUN_STAR_UTIL_XCLOSEBROADCASTER_HPP_
#include <com/sun/star/util/XCloseBroadcaster.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XMODULE_HPP_
#include <com/sun/star/frame/XModule.hpp>
#endif
#ifndef _COM_SUN_STAR_DATATRANSFER_DATAFLAVOR_HPP_
#include <com/sun/star/datatransfer/DataFlavor.hpp>
#endif
#ifndef _COM_SUN_STAR_DATATRANSFER_XTRANSFERABLE_HPP_
#include <com/sun/star/datatransfer/XTransferable.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_XTRANSACTEDOBJECT_HPP_
#include <com/sun/star/embed/XTransactedObject.hpp>
#endif
#ifndef _COM_SUN_STAR_EMBED_XCOMMONEMBEDPERSIST_HPP_
#include <com/sun/star/embed/XCommonEmbedPersist.hpp>
#endif
#ifndef DBA_INTERCEPT_HXX
#include "intercept.hxx"
#endif
#ifndef _COM_SUN_STAR_SDB_ERRORCONDITION_HPP_
#include <com/sun/star/sdb/ErrorCondition.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XINTERACTIONDOCUMENTSAVE_HPP_
#include <com/sun/star/sdb/XInteractionDocumentSave.hpp>
#endif
#ifndef _COM_SUN_STAR_TASK_XINTERACTIONHANDLER_HPP_
#include <com/sun/star/task/XInteractionHandler.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_DOCUMENTSAVEREQUEST_HPP_
#include <com/sun/star/sdb/DocumentSaveRequest.hpp>
#endif
#ifndef _COM_SUN_STAR_DOCUMENT_XDOCUMENTPROPERTIESSUPPLIER_HPP_
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_DOCUMENT_MACROEXECMODE_HPP_
#include <com/sun/star/document/MacroExecMode.hpp>
#endif
#ifndef _COM_SUN_STAR_DRAWING_XDRAWPAGESUPPLIER_HPP_
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XINDEXCONTAINER_HPP_
#include <com/sun/star/container/XIndexContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORMSSUPPLIER_HPP_
#include <com/sun/star/form/XFormsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COMPHELPER_INTERACTION_HXX_
#include <comphelper/interaction.hxx>
#endif
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
#include <connectivity/dbtools.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
#ifndef _VOS_MUTEX_HXX_
#include <vos/mutex.hxx>
#endif
#ifndef _COM_SUN_STAR_VIEW_XVIEWSETTINGSSUPPLIER_HPP_
#include <com/sun/star/view/XViewSettingsSupplier.hpp>
#endif
#ifndef _DBA_CORE_RESOURCE_HXX_
#include "core_resource.hxx"
#endif
#ifndef _DBA_CORE_RESOURCE_HRC_
#include "core_resource.hrc"
#endif
#ifndef _DBA_COREDATAACCESS_DATASOURCE_HXX_
#include "datasource.hxx"
#endif
#ifndef _COM_SUN_STAR_EMBED_XSTATECHANGEBROADCASTER_HPP_
#include <com/sun/star/embed/XStateChangeBroadcaster.hpp>
#endif
#ifndef _COM_SUN_STAR_TASK_XINTERACTIONAPPROVE_HPP_
#include <com/sun/star/task/XInteractionApprove.hpp>
#endif
#ifndef _COM_SUN_STAR_TASK_XINTERACTIONDISAPPROVE_HPP_
#include <com/sun/star/task/XInteractionDisapprove.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_XLAYOUTMANAGER_HPP_
#include <com/sun/star/frame/XLayoutManager.hpp>
#endif
#ifndef _CPPUHELPER_COMPBASE1_HXX_
#include <cppuhelper/compbase1.hxx>
#endif
#include <cppuhelper/exc_hlp.hxx>
#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#endif
#ifndef _COMPHELPER_SEQUENCEASHASHMAP_HXX_
#include <comphelper/sequenceashashmap.hxx>
#endif
#ifndef _COMPHELPER_MIMECONFIGHELPER_HXX_
#include <comphelper/mimeconfighelper.hxx>
#endif
#ifndef _COMPHELPER_STORAGEHELPER_HXX
#include <comphelper/storagehelper.hxx>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCONTENTENUMERATIONACCESS_HPP_
#include <com/sun/star/container/XContentEnumerationAccess.hpp>
#endif
#include <com/sun/star/io/WrongFormatException.hpp>
#include <com/sun/star/sdb/application/XDatabaseDocumentUI.hpp>
#include <com/sun/star/sdb/application/DatabaseObject.hpp>
using namespace ::com::sun::star;
using namespace view;
using namespace uno;
using namespace util;
using namespace ucb;
using namespace beans;
using namespace lang;
using namespace awt;
using namespace embed;
using namespace frame;
using namespace document;
using namespace sdbc;
using namespace sdb;
using namespace io;
using namespace container;
using namespace datatransfer;
using namespace task;
using namespace form;
using namespace drawing;
using namespace ::osl;
using namespace ::comphelper;
using namespace ::cppu;
namespace css = ::com::sun::star;
using sdb::application::XDatabaseDocumentUI;
namespace DatabaseObject = sdb::application::DatabaseObject;
#define DEFAULT_WIDTH 10000
#define DEFAULT_HEIGHT 7500
//.............................................................................
namespace dbaccess
{
//.............................................................................
typedef ::boost::optional< bool > optional_bool;
//=========================================================================
//= helper
//=========================================================================
namespace
{
// --------------------------------------------------------------------
::rtl::OUString lcl_determineContentType_nothrow( const Reference< XStorage >& _rxContainerStorage,
const ::rtl::OUString& _rEntityName )
{
::rtl::OUString sContentType;
try
{
Reference< XStorage > xContainerStorage( _rxContainerStorage, UNO_QUERY_THROW );
::utl::SharedUNOComponent< XPropertySet > xStorageProps(
xContainerStorage->openStorageElement( _rEntityName, ElementModes::READ ), UNO_QUERY_THROW );
OSL_VERIFY( xStorageProps->getPropertyValue( INFO_MEDIATYPE ) >>= sContentType );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return sContentType;
}
}
//==================================================================
// OEmbedObjectHolder
//==================================================================
typedef ::cppu::WeakComponentImplHelper1< embed::XStateChangeListener > TEmbedObjectHolder;
class OEmbedObjectHolder : public ::comphelper::OBaseMutex
,public TEmbedObjectHolder
{
Reference< XEmbeddedObject > m_xBroadCaster;
ODocumentDefinition* m_pDefinition;
bool m_bInStateChange;
bool m_bInChangingState;
protected:
virtual void SAL_CALL disposing();
public:
OEmbedObjectHolder(const Reference< XEmbeddedObject >& _xBroadCaster,ODocumentDefinition* _pDefinition)
: TEmbedObjectHolder(m_aMutex)
,m_xBroadCaster(_xBroadCaster)
,m_pDefinition(_pDefinition)
,m_bInStateChange(false)
,m_bInChangingState(false)
{
osl_incrementInterlockedCount( &m_refCount );
{
if ( m_xBroadCaster.is() )
m_xBroadCaster->addStateChangeListener(this);
}
osl_decrementInterlockedCount( &m_refCount );
}
virtual void SAL_CALL changingState( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (embed::WrongStateException, uno::RuntimeException);
virtual void SAL_CALL stateChanged( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (uno::RuntimeException);
virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw (uno::RuntimeException);
};
//------------------------------------------------------------------
void SAL_CALL OEmbedObjectHolder::disposing()
{
if ( m_xBroadCaster.is() )
m_xBroadCaster->removeStateChangeListener(this);
m_xBroadCaster = NULL;
m_pDefinition = NULL;
}
//------------------------------------------------------------------
void SAL_CALL OEmbedObjectHolder::changingState( const lang::EventObject& /*aEvent*/, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (embed::WrongStateException, uno::RuntimeException)
{
if ( !m_bInChangingState && nNewState == EmbedStates::RUNNING && nOldState == EmbedStates::ACTIVE && m_pDefinition )
{
m_bInChangingState = true;
//m_pDefinition->save(sal_False);
m_bInChangingState = false;
}
}
//------------------------------------------------------------------
void SAL_CALL OEmbedObjectHolder::stateChanged( const lang::EventObject& aEvent, ::sal_Int32 nOldState, ::sal_Int32 nNewState ) throw (uno::RuntimeException)
{
if ( !m_bInStateChange && nNewState == EmbedStates::RUNNING && nOldState == EmbedStates::ACTIVE && m_pDefinition )
{
m_bInStateChange = true;
Reference<XInterface> xInt(static_cast< ::cppu::OWeakObject* >(m_pDefinition),UNO_QUERY);
{
Reference<XEmbeddedObject> xEmbeddedObject(aEvent.Source,UNO_QUERY);
if ( xEmbeddedObject.is() )
xEmbeddedObject->changeState(EmbedStates::LOADED);
}
m_bInStateChange = false;
}
}
//------------------------------------------------------------------
void SAL_CALL OEmbedObjectHolder::disposing( const lang::EventObject& /*Source*/ ) throw (uno::RuntimeException)
{
m_xBroadCaster = NULL;
}
//==================================================================
// OEmbeddedClientHelper
//==================================================================
typedef ::cppu::WeakImplHelper1 < XEmbeddedClient
> EmbeddedClientHelper_BASE;
class OEmbeddedClientHelper : public EmbeddedClientHelper_BASE
{
ODocumentDefinition* m_pClient;
public:
OEmbeddedClientHelper(ODocumentDefinition* _pClient) :m_pClient(_pClient) {}
virtual void SAL_CALL saveObject( ) throw (ObjectSaveVetoException, Exception, RuntimeException)
{
}
virtual void SAL_CALL onShowWindow( sal_Bool /*bVisible*/ ) throw (RuntimeException)
{
}
// XComponentSupplier
virtual Reference< util::XCloseable > SAL_CALL getComponent( ) throw (RuntimeException)
{
return Reference< css::util::XCloseable >();
}
// XEmbeddedClient
virtual void SAL_CALL visibilityChanged( ::sal_Bool /*bVisible*/ ) throw (WrongStateException, RuntimeException)
{
}
inline void resetClient(ODocumentDefinition* _pClient) { m_pClient = _pClient; }
};
//==================================================================
// LifetimeCoupler
//==================================================================
typedef ::cppu::WeakImplHelper1 < css::lang::XEventListener
> LifetimeCoupler_Base;
/** helper class which couples the lifetime of a component to the lifetim
of another component
Instances of this class are constructed with two components. The first is
simply held by reference, and thus kept alive. The second one is observed
for <code>disposing</code> calls - if they occur, i.e. if the component dies,
the reference to the first component is cleared.
This way, you can ensure that a certain component is kept alive as long
as a second component is not disposed.
*/
class LifetimeCoupler : public LifetimeCoupler_Base
{
private:
Reference< XInterface > m_xClient;
public:
inline static void couple( const Reference< XInterface >& _rxClient, const Reference< XComponent >& _rxActor )
{
Reference< css::lang::XEventListener > xEnsureDelete( new LifetimeCoupler( _rxClient, _rxActor ) );
}
private:
inline LifetimeCoupler( const Reference< XInterface >& _rxClient, const Reference< XComponent >& _rxActor )
:m_xClient( _rxClient )
{
DBG_ASSERT( _rxActor.is(), "LifetimeCoupler::LifetimeCoupler: this will crash!" );
osl_incrementInterlockedCount( &m_refCount );
{
_rxActor->addEventListener( this );
}
osl_decrementInterlockedCount( &m_refCount );
DBG_ASSERT( m_refCount, "LifetimeCoupler::LifetimeCoupler: the actor is not holding us by hard ref - this won't work!" );
}
virtual void SAL_CALL disposing( const css::lang::EventObject& Source ) throw (RuntimeException);
protected:
};
//------------------------------------------------------------------
void SAL_CALL LifetimeCoupler::disposing( const css::lang::EventObject& /*Source*/ ) throw (RuntimeException)
{
m_xClient.clear();
}
//==================================================================
// ODocumentSaveContinuation
//==================================================================
class ODocumentSaveContinuation : public OInteraction< XInteractionDocumentSave >
{
::rtl::OUString m_sName;
Reference<XContent> m_xParentContainer;
public:
ODocumentSaveContinuation() { }
inline Reference<XContent> getContent() const { return m_xParentContainer; }
inline ::rtl::OUString getName() const { return m_sName; }
// XInteractionDocumentSave
virtual void SAL_CALL setName( const ::rtl::OUString& _sName,const Reference<XContent>& _xParent) throw(RuntimeException);
};
//------------------------------------------------------------------
void SAL_CALL ODocumentSaveContinuation::setName( const ::rtl::OUString& _sName,const Reference<XContent>& _xParent) throw(RuntimeException)
{
m_sName = _sName;
m_xParentContainer = _xParent;
}
// -----------------------------------------------------------------------------
::rtl::OUString ODocumentDefinition::GetDocumentServiceFromMediaType( const Reference< XStorage >& _rxContainerStorage,
const ::rtl::OUString& _rEntityName, const ::comphelper::ComponentContext& _rContext,
Sequence< sal_Int8 >& _rClassId )
{
return GetDocumentServiceFromMediaType(
lcl_determineContentType_nothrow( _rxContainerStorage, _rEntityName ),
_rContext, _rClassId );
}
// -----------------------------------------------------------------------------
::rtl::OUString ODocumentDefinition::GetDocumentServiceFromMediaType( const ::rtl::OUString& _rMediaType,
const ::comphelper::ComponentContext& _rContext, Sequence< sal_Int8 >& _rClassId )
{
::rtl::OUString sResult;
try
{
::comphelper::MimeConfigurationHelper aConfigHelper( _rContext.getLegacyServiceFactory() );
sResult = aConfigHelper.GetDocServiceNameFromMediaType( _rMediaType );
_rClassId = aConfigHelper.GetSequenceClassIDRepresentation(aConfigHelper.GetExplicitlyRegisteredObjClassID( _rMediaType ));
if ( !_rClassId.getLength() && sResult.getLength() )
{
Reference< XNameAccess > xObjConfig = aConfigHelper.GetObjConfiguration();
if ( xObjConfig.is() )
{
Sequence< ::rtl::OUString > aClassIDs = xObjConfig->getElementNames();
for ( sal_Int32 nInd = 0; nInd < aClassIDs.getLength(); nInd++ )
{
Reference< XNameAccess > xObjectProps;
::rtl::OUString aEntryDocName;
if ( ( xObjConfig->getByName( aClassIDs[nInd] ) >>= xObjectProps ) && xObjectProps.is()
&& ( xObjectProps->getByName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ObjectDocumentServiceName"))
) >>= aEntryDocName )
&& aEntryDocName.equals( sResult ) )
{
_rClassId = aConfigHelper.GetSequenceClassIDRepresentation(aClassIDs[nInd]);
break;
}
}
}
}
}
catch ( Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return sResult;
}
// -----------------------------------------------------------------------------
//==========================================================================
//= ODocumentDefinition
//==========================================================================
DBG_NAME(ODocumentDefinition)
//--------------------------------------------------------------------------
ODocumentDefinition::ODocumentDefinition(const Reference< XInterface >& _rxContainer
, const Reference< XMultiServiceFactory >& _xORB
,const TContentPtr& _pImpl
, sal_Bool _bForm
, const Sequence< sal_Int8 >& _aClassID
,const Reference<XConnection>& _xConnection
)
:OContentHelper(_xORB,_rxContainer,_pImpl)
,OPropertyStateContainer(OContentHelper::rBHelper)
,m_pInterceptor(NULL)
,m_bForm(_bForm)
,m_bOpenInDesign(sal_False)
,m_bInExecute(sal_False)
,m_bRemoveListener(sal_False)
,m_pClientHelper(NULL)
{
DBG_CTOR(ODocumentDefinition, NULL);
registerProperties();
if ( _aClassID.getLength() )
loadEmbeddedObject( _xConnection, _aClassID, Sequence< PropertyValue >(), false, false );
}
//--------------------------------------------------------------------------
ODocumentDefinition::~ODocumentDefinition()
{
DBG_DTOR(ODocumentDefinition, NULL);
if ( !OContentHelper::rBHelper.bInDispose && !OContentHelper::rBHelper.bDisposed )
{
acquire();
dispose();
}
if ( m_pInterceptor )
{
m_pInterceptor->dispose();
m_pInterceptor->release();
m_pInterceptor = NULL;
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::closeObject()
{
::osl::MutexGuard aGuard(m_aMutex);
if ( m_xEmbeddedObject.is() )
{
try
{
Reference< com::sun::star::util::XCloseable> xCloseable(m_xEmbeddedObject,UNO_QUERY);
if ( xCloseable.is() )
xCloseable->close(sal_True);
}
catch(Exception)
{
}
m_xEmbeddedObject = NULL;
if ( m_pClientHelper )
{
m_pClientHelper->resetClient(NULL);
m_pClientHelper->release();
m_pClientHelper = NULL;
}
}
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::disposing()
{
OContentHelper::disposing();
::osl::MutexGuard aGuard(m_aMutex);
closeObject();
::comphelper::disposeComponent(m_xListener);
if ( m_bRemoveListener && m_xDesktop.is() )
{
Reference<util::XCloseable> xCloseable(m_pImpl->m_pDataSource->getModel_noCreate(),UNO_QUERY);
if ( xCloseable.is() )
xCloseable->removeCloseListener(this);
}
m_xDesktop = NULL;
}
// -----------------------------------------------------------------------------
IMPLEMENT_TYPEPROVIDER3(ODocumentDefinition,OContentHelper,OPropertyStateContainer,ODocumentDefinition_Base);
IMPLEMENT_FORWARD_XINTERFACE3( ODocumentDefinition,OContentHelper,OPropertyStateContainer,ODocumentDefinition_Base)
IMPLEMENT_SERVICE_INFO1(ODocumentDefinition,"com.sun.star.comp.dba.ODocumentDefinition",SERVICE_SDB_DOCUMENTDEFINITION)
//--------------------------------------------------------------------------
void ODocumentDefinition::registerProperties()
{
registerProperty(PROPERTY_NAME, PROPERTY_ID_NAME, PropertyAttribute::BOUND | PropertyAttribute::READONLY | PropertyAttribute::CONSTRAINED,
&m_pImpl->m_aProps.aTitle, ::getCppuType(&m_pImpl->m_aProps.aTitle));
registerProperty(PROPERTY_AS_TEMPLATE, PROPERTY_ID_AS_TEMPLATE, PropertyAttribute::BOUND | PropertyAttribute::READONLY | PropertyAttribute::CONSTRAINED,
&m_pImpl->m_aProps.bAsTemplate, ::getCppuType(&m_pImpl->m_aProps.bAsTemplate));
registerProperty(PROPERTY_PERSISTENT_NAME, PROPERTY_ID_PERSISTENT_NAME, PropertyAttribute::BOUND | PropertyAttribute::READONLY | PropertyAttribute::CONSTRAINED,
&m_pImpl->m_aProps.sPersistentName, ::getCppuType(&m_pImpl->m_aProps.sPersistentName));
registerProperty(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsForm")), PROPERTY_ID_IS_FORM, PropertyAttribute::BOUND | PropertyAttribute::READONLY | PropertyAttribute::CONSTRAINED,
&m_bForm, ::getCppuType(&m_bForm));
}
// -----------------------------------------------------------------------------
Reference< XPropertySetInfo > SAL_CALL ODocumentDefinition::getPropertySetInfo( ) throw(RuntimeException)
{
Reference<XPropertySetInfo> xInfo( createPropertySetInfo( getInfoHelper() ) );
return xInfo;
}
//--------------------------------------------------------------------------
IPropertyArrayHelper& ODocumentDefinition::getInfoHelper()
{
return *getArrayHelper();
}
//--------------------------------------------------------------------------
IPropertyArrayHelper* ODocumentDefinition::createArrayHelper( ) const
{
Sequence< Property > aProps;
describeProperties(aProps);
return new OPropertyArrayHelper(aProps);
}
class OExecuteImpl
{
sal_Bool& m_rbSet;
public:
OExecuteImpl(sal_Bool& _rbSet) : m_rbSet(_rbSet){ m_rbSet=sal_True; }
~OExecuteImpl(){ m_rbSet = sal_False; }
};
// -----------------------------------------------------------------------------
namespace
{
bool lcl_extractOpenMode( const Any& _rValue, sal_Int32& _out_rMode )
{
OpenCommandArgument aOpenCommand;
if ( _rValue >>= aOpenCommand )
_out_rMode = aOpenCommand.Mode;
else
{
OpenCommandArgument2 aOpenCommand2;
if ( _rValue >>= aOpenCommand2 )
_out_rMode = aOpenCommand2.Mode;
else
return false;
}
return true;
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::impl_removeFrameFromDesktop_throw( const Reference< XFrame >& _rxFrame )
{
if ( !m_xDesktop.is() )
m_xDesktop.set( m_aContext.createComponent( (::rtl::OUString)SERVICE_FRAME_DESKTOP ), UNO_QUERY_THROW );
Reference< XFrames > xFrames( m_xDesktop->getFrames(), UNO_QUERY_THROW );
xFrames->remove( _rxFrame );
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::impl_onActivateEmbeddedObject()
{
try
{
Reference< XModel > xModel( getComponent(), UNO_QUERY );
Reference< XController > xController( xModel.is() ? xModel->getCurrentController() : Reference< XController >() );
if ( !xController.is() )
return;
if ( !m_xListener.is() )
// it's the first time the embedded object has been activated
// create an OEmbedObjectHolder
m_xListener = new OEmbedObjectHolder(m_xEmbeddedObject,this);
Reference< XFrame > xFrame( xController->getFrame() );
if ( xFrame.is() )
{
// raise the window to top (especially necessary if this is not the first activation)
Reference< XTopWindow > xTopWindow( xFrame->getContainerWindow(), UNO_QUERY_THROW );
xTopWindow->toFront();
// remove the frame from the desktop's frame collection because we need full control of it.
impl_removeFrameFromDesktop_throw( xFrame );
}
// ensure that we ourself are kept alive as long as the embedded object's frame is
// opened
LifetimeCoupler::couple( *this, Reference< XComponent >( xFrame, UNO_QUERY_THROW ) );
// init the edit view
if ( m_bOpenInDesign )
impl_initObjectEditView( xController );
}
catch( const RuntimeException& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
namespace
{
// =========================================================================
// = PreserveVisualAreaSize
// =========================================================================
/** stack-guard for preserving the size of the VisArea of an XModel
*/
class PreserveVisualAreaSize
{
private:
Reference< XVisualObject > m_xVisObject;
awt::Size m_aOriginalSize;
public:
inline PreserveVisualAreaSize( const Reference< XModel >& _rxModel )
:m_xVisObject( _rxModel, UNO_QUERY )
{
if ( m_xVisObject.is() )
{
try
{
m_aOriginalSize = m_xVisObject->getVisualAreaSize( Aspects::MSOLE_CONTENT );
}
catch ( Exception& )
{
DBG_ERROR( "PreserveVisualAreaSize::PreserveVisualAreaSize: caught an exception!" );
}
}
}
inline ~PreserveVisualAreaSize()
{
if ( m_xVisObject.is() && m_aOriginalSize.Width && m_aOriginalSize.Height )
{
try
{
m_xVisObject->setVisualAreaSize( Aspects::MSOLE_CONTENT, m_aOriginalSize );
}
catch ( Exception& )
{
DBG_ERROR( "PreserveVisualAreaSize::~PreserveVisualAreaSize: caught an exception!" );
}
}
}
};
// =========================================================================
// = LayoutManagerLock
// =========================================================================
/** helper class for stack-usage which during its lifetime locks a layout manager
*/
class LayoutManagerLock
{
private:
Reference< XLayoutManager > m_xLayoutManager;
public:
inline LayoutManagerLock( const Reference< XController >& _rxController )
{
DBG_ASSERT( _rxController.is(), "LayoutManagerLock::LayoutManagerLock: this will crash!" );
Reference< XFrame > xFrame( _rxController->getFrame() );
try
{
Reference< XPropertySet > xPropSet( xFrame, UNO_QUERY_THROW );
m_xLayoutManager.set(
xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ) ) ),
UNO_QUERY_THROW );
m_xLayoutManager->lock();
}
catch( Exception& )
{
DBG_ERROR( "LayoutManagerLock::LayoutManagerLock: caught an exception!" );
}
}
inline ~LayoutManagerLock()
{
try
{
// unlock the layout manager
if ( m_xLayoutManager.is() )
m_xLayoutManager->unlock();
}
catch( Exception& )
{
DBG_ERROR( "LayoutManagerLock::~LayoutManagerLock: caught an exception!" );
}
}
};
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::impl_initObjectEditView( const Reference< XController >& _rxController )
{
if ( !m_bForm )
// currently, only forms need to be initialized
return;
try
{
Reference< XViewSettingsSupplier > xSettingsSupplier( _rxController, UNO_QUERY_THROW );
Reference< XPropertySet > xViewSettings( xSettingsSupplier->getViewSettings(), UNO_QUERY_THROW );
// The visual area size can be changed by the setting of the following properties
// so it should be restored later
PreserveVisualAreaSize aPreserveVisAreaSize( _rxController->getModel() );
// Layout manager should not layout while the size is still not restored
// so it will stay locked for this time
LayoutManagerLock aLockLayout( _rxController );
// setting of the visual properties
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowRulers")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowVertRuler")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowHoriRuler")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsRasterVisible")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IsSnapToRaster")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowOnlineLayout")),makeAny(sal_True));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RasterSubdivisionX")),makeAny(sal_Int32(5)));
xViewSettings->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RasterSubdivisionY")),makeAny(sal_Int32(5)));
Reference< XModifiable > xModifiable( _rxController->getModel(), UNO_QUERY_THROW );
xModifiable->setModified( sal_False );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::onCommandOpenSomething( const Any& _rOpenArgument, const bool _bActivate,
const Reference< XCommandEnvironment >& _rxEnvironment, Any& _out_rComponent, ::osl::ClearableMutexGuard & _aGuard )
{
OExecuteImpl aExecuteGuard(m_bInExecute);
Reference< XConnection > xConnection;
sal_Int32 nOpenMode = OpenMode::DOCUMENT;
::comphelper::NamedValueCollection aDocumentArgs;
// for the document, default to the interaction handler as used for loading the DB doc
// This might be overwritten below, when examining _rOpenArgument.
::comphelper::NamedValueCollection aDBDocArgs( m_pImpl->m_pDataSource->getResource() );
aDocumentArgs.put( "InteractionHandler", aDBDocArgs.getOrDefault( "InteractionHandler", Reference< XInteractionHandler >() ) );
::boost::optional< sal_Int16 > aDocumentMacroMode;
if ( !lcl_extractOpenMode( _rOpenArgument, nOpenMode ) )
{
Sequence< PropertyValue > aArguments;
if ( _rOpenArgument >>= aArguments )
{
const PropertyValue* pIter = aArguments.getConstArray();
const PropertyValue* pEnd = pIter + aArguments.getLength();
for ( ;pIter != pEnd; ++pIter )
{
if ( pIter->Name == PROPERTY_ACTIVE_CONNECTION )
{
xConnection.set( pIter->Value, UNO_QUERY );
continue;
}
if ( lcl_extractOpenMode( pIter->Value, nOpenMode ) )
continue;
if ( pIter->Name.equalsAscii( "MacroExecutionMode" ) )
{
sal_Int16 nMacroExecMode( !aDocumentMacroMode ? MacroExecMode::USE_CONFIG : *aDocumentMacroMode );
OSL_VERIFY( pIter->Value >>= nMacroExecMode );
aDocumentMacroMode.reset( nMacroExecMode );
continue;
}
// unknown argument -> pass to the loaded document
aDocumentArgs.put( pIter->Name, pIter->Value );
}
}
}
bool bExecuteDBDocMacros = m_pImpl->m_pDataSource->checkMacrosOnLoading();
// Note that this call implies the user might be asked for the macro execution mode.
// Normally, this would happen when the database document is loaded, and subsequent calls
// will simply use the user's decision from this point in time.
// However, it is possible to programmatically load forms/reports, without actually
// loading the database document into a frame. In this case, the user will be asked
// here and now.
// #i87741# / 2008-05-05 / frank.schoenheit@sun.com
// allow the command arguments to downgrade the macro execution mode, but not to upgrade
// it
if ( ( m_pImpl->m_pDataSource->getImposedMacroExecMode() == MacroExecMode::USE_CONFIG )
&& bExecuteDBDocMacros
)
{
// while loading the whole database document, USE_CONFIG, was passed.
// Additionally, *by now* executing macros from the DB doc is allowed (this is what bExecuteDBDocMacros
// indicates). This means either one of:
// 1. The DB doc or one of the sub docs contained macros and
// 1a. the user explicitly allowed executing them
// 1b. the configuration allows executing them without asking the user
// 2. Neither the DB doc nor the sub docs contained macros, thus macro
// execution was silently enabled, assuming that any macro will be a
// user-created macro
//
// The problem with this: If the to-be-opened sub document has macros embedded in
// the content.xml (which is valid ODF, but normally not produced by OOo itself),
// then this has not been detected while loading the database document - it would
// be too expensive, as it effectively would require loading all forms/reports.
//
// So, in such a case, and with 2. above, we would silently execute those macros,
// regardless of the global security settings - which would be a security issue, of
// course.
if ( !m_pImpl->m_pDataSource->hasAnyObjectWithMacros() )
{
// this is case 2. from above (not *exactly*, but sufficiently)
// So, pass a USE_CONFIG to the to-be-loaded document. This means that
// the user will be prompted with a security message upon opening this
// sub document, in case the settings require this, *and* the document
// contains scripts in the content.xml. But this is better than the security
// issue we had before ...
aDocumentMacroMode.reset( MacroExecMode::USE_CONFIG );
}
}
if ( !aDocumentMacroMode )
{
// nobody so far felt responsible for setting it
// => use the DBDoc-wide macro exec mode for the document, too
aDocumentMacroMode.reset( bExecuteDBDocMacros ? MacroExecMode::ALWAYS_EXECUTE_NO_WARN : MacroExecMode::NEVER_EXECUTE );
}
aDocumentArgs.put( "MacroExecutionMode", *aDocumentMacroMode );
if ( xConnection.is() )
m_xLastKnownConnection = xConnection;
if ( ( nOpenMode == OpenMode::ALL )
|| ( nOpenMode == OpenMode::FOLDERS )
|| ( nOpenMode == OpenMode::DOCUMENTS )
|| ( nOpenMode == OpenMode::DOCUMENT_SHARE_DENY_NONE )
|| ( nOpenMode == OpenMode::DOCUMENT_SHARE_DENY_WRITE )
)
{
// not supported
ucbhelper::cancelCommandExecution(
makeAny( UnsupportedOpenModeException(
rtl::OUString(),
static_cast< cppu::OWeakObject * >( this ),
sal_Int16( nOpenMode ) ) ),
_rxEnvironment );
// Unreachable
DBG_ERROR( "unreachable" );
}
OSL_ENSURE( m_pImpl->m_aProps.sPersistentName.getLength(),
"ODocumentDefinition::onCommandOpenSomething: no persistent name - cannot load!" );
if ( !m_pImpl->m_aProps.sPersistentName.getLength() )
return;
// embedded objects themself do not support the hidden flag. We implement support for
// it by changing the STATE to RUNNING only, instead of ACTIVE.
bool bOpenHidden = aDocumentArgs.getOrDefault( "Hidden", false );
aDocumentArgs.remove( "Hidden" );
loadEmbeddedObject( xConnection, Sequence< sal_Int8 >(), aDocumentArgs.getPropertyValues(), false, !m_bOpenInDesign );
OSL_ENSURE( m_xEmbeddedObject.is(), "ODocumentDefinition::onCommandOpenSomething: what's this?" );
if ( !m_xEmbeddedObject.is() )
return;
Reference< XModel > xModel( getComponent(), UNO_QUERY );
Reference< report::XReportDefinition > xReportDefinition(xModel,UNO_QUERY);
Reference< XModule > xModule( xModel, UNO_QUERY );
if ( xModule.is() )
{
if ( m_bForm )
xModule->setIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.FormDesign" ) ) );
else if ( !xReportDefinition.is() )
xModule->setIdentifier( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.TextReportDesign" ) ) );
updateDocumentTitle();
}
bool bIsAliveNewStyleReport = ( !m_bOpenInDesign && xReportDefinition.is() );
if ( bIsAliveNewStyleReport )
{
// we are in ReadOnly mode
// we would like to open the Writer or Calc with the report direct, without design it.
Reference< report::XReportEngine > xReportEngine( m_aContext.createComponent( "com.sun.star.comp.report.OReportEngineJFree" ), UNO_QUERY_THROW );
xReportEngine->setReportDefinition(xReportDefinition);
xReportEngine->setActiveConnection(m_xLastKnownConnection);
if ( bOpenHidden )
_out_rComponent <<= xReportEngine->createDocumentModel( );
else
_out_rComponent <<= xReportEngine->createDocumentAlive(NULL);
return;
}
if ( _bActivate && !bOpenHidden )
{
m_xEmbeddedObject->changeState( EmbedStates::ACTIVE );
impl_onActivateEmbeddedObject();
}
// LLA: Alle fillReportData() calls pr<70>fen, sollte es welche geben, die danach noch viel machen
// LLA: sollten wir einen _aGuard Pointer <20>bergeben, sonst erstmal als Referenz
fillReportData(_aGuard);
_out_rComponent <<= xModel;
}
// -----------------------------------------------------------------------------
Any SAL_CALL ODocumentDefinition::execute( const Command& aCommand, sal_Int32 CommandId, const Reference< XCommandEnvironment >& Environment ) throw (Exception, CommandAbortedException, RuntimeException)
{
Any aRet;
::osl::ClearableMutexGuard aGuard(m_aMutex);
if ( !m_bInExecute )
{
sal_Bool bOpen = aCommand.Name.equalsAscii( "open" );
sal_Bool bOpenInDesign = aCommand.Name.equalsAscii( "openDesign" );
sal_Bool bOpenForMail = aCommand.Name.equalsAscii( "openForMail" );
if ( bOpen || bOpenInDesign || bOpenForMail )
{
bool bActivateObject = true;
if ( bOpenForMail )
{
OSL_ENSURE( false, "ODocumentDefinition::execute: 'openForMail' should not be used anymore - use the 'Hidden' parameter instead!" );
bActivateObject = false;
}
// if the object is already opened, do nothing
// #i89509# / 2008-05-22 / frank.schoenheit@sun.com
if ( m_xEmbeddedObject.is() )
{
sal_Int32 nCurrentState = m_xEmbeddedObject->getCurrentState();
bool bIsActive = ( nCurrentState == EmbedStates::ACTIVE );
// exception: new-style reports always create a new document when "open" is executed
Reference< report::XReportDefinition > xReportDefinition( getComponent(), UNO_QUERY );
bool bIsAliveNewStyleReport = ( xReportDefinition.is() && ( bOpen || bOpenForMail ) );
if ( bIsActive && !bIsAliveNewStyleReport )
{
impl_onActivateEmbeddedObject();
return makeAny( getComponent() );
}
}
// m_bOpenInDesign = bOpenInDesign;
// onCommandOpenSomething( aCommand.Argument, !bOpenForMail, Environment, aRet, aGuard );
m_bOpenInDesign = bOpenInDesign || bOpenForMail;
onCommandOpenSomething( aCommand.Argument, bActivateObject, Environment, aRet, aGuard );
}
else if ( aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "copyTo" ) ) )
{
Sequence<Any> aIni;
aCommand.Argument >>= aIni;
if ( aIni.getLength() != 2 )
{
OSL_ENSURE( sal_False, "Wrong argument type!" );
ucbhelper::cancelCommandExecution(
makeAny( IllegalArgumentException(
rtl::OUString(),
static_cast< cppu::OWeakObject * >( this ),
-1 ) ),
Environment );
// Unreachable
}
Reference< XStorage> xDest(aIni[0],UNO_QUERY);
::rtl::OUString sPersistentName;
aIni[1] >>= sPersistentName;
Reference< XStorage> xStorage = getContainerStorage();
// -----------------------------------------------------------------------------
xStorage->copyElementTo(m_pImpl->m_aProps.sPersistentName,xDest,sPersistentName);
/*loadEmbeddedObject( true );
Reference<XEmbedPersist> xPersist(m_xEmbeddedObject,UNO_QUERY);
if ( xPersist.is() )
{
xPersist->storeToEntry(xStorage,sPersistentName,Sequence<PropertyValue>(),Sequence<PropertyValue>());
xPersist->storeOwn();
m_xEmbeddedObject->changeState(EmbedStates::LOADED);
}
else
throw CommandAbortedException();*/
}
else if ( aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "preview" ) ) )
{
onCommandPreview(aRet);
}
else if ( aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "insert" ) ) )
{
Sequence<Any> aIni;
aCommand.Argument >>= aIni;
if ( aIni.getLength() > 0 && aIni.getLength() < 2 )
{
OSL_ENSURE( sal_False, "Wrong argument type!" );
ucbhelper::cancelCommandExecution(
makeAny( IllegalArgumentException(
rtl::OUString(),
static_cast< cppu::OWeakObject * >( this ),
-1 ) ),
Environment );
// Unreachable
}
::rtl::OUString sURL;
aIni[0] >>= sURL;
onCommandInsert( sURL, Environment );
}
else if ( aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "getdocumentinfo" ) ) // compatibility
|| aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "getDocumentInfo" ) )
)
{
onCommandGetDocumentProperties( aRet );
}
else if ( aCommand.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "delete" ) ) )
{
//////////////////////////////////////////////////////////////////
// delete
//////////////////////////////////////////////////////////////////
closeObject();
Reference< XStorage> xStorage = getContainerStorage();
if ( xStorage.is() )
xStorage->removeElement(m_pImpl->m_aProps.sPersistentName);
dispose();
}
else if ( ( aCommand.Name.compareToAscii( "storeOwn" ) == 0 ) // compatibility
|| ( aCommand.Name.compareToAscii( "store" ) == 0 )
)
{
impl_store_throw();
}
else if ( ( aCommand.Name.compareToAscii( "shutdown" ) == 0 ) // compatibility
|| ( aCommand.Name.compareToAscii( "close" ) == 0 )
)
{
aRet <<= impl_close_throw();
}
else
{
aRet = OContentHelper::execute(aCommand,CommandId,Environment);
}
}
return aRet;
}
// -----------------------------------------------------------------------------
namespace
{
void lcl_resetChildFormsToEmptyDataSource( const Reference< XIndexAccess>& _rxFormsContainer )
{
OSL_PRECOND( _rxFormsContainer.is(), "lcl_resetChildFormsToEmptyDataSource: illegal call!" );
sal_Int32 count = _rxFormsContainer->getCount();
for ( sal_Int32 i = 0; i < count; ++i )
{
Reference< XForm > xForm( _rxFormsContainer->getByIndex( i ), UNO_QUERY );
if ( !xForm.is() )
continue;
// if the element is a form, reset its DataSourceName property to an empty string
try
{
Reference< XPropertySet > xFormProps( xForm, UNO_QUERY_THROW );
xFormProps->setPropertyValue( PROPERTY_DATASOURCENAME, makeAny( ::rtl::OUString() ) );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
// if the element is a container itself, step down the component hierarchy
Reference< XIndexAccess > xContainer( xForm, UNO_QUERY );
if ( xContainer.is() )
lcl_resetChildFormsToEmptyDataSource( xContainer );
}
}
void lcl_resetFormsToEmptyDataSource( const Reference< XEmbeddedObject>& _rxEmbeddedObject )
{
try
{
Reference< XComponentSupplier > xCompProv( _rxEmbeddedObject, UNO_QUERY_THROW );
Reference< XDrawPageSupplier > xSuppPage( xCompProv->getComponent(), UNO_QUERY_THROW );
// if this interface does not exist, then either getComponent returned NULL,
// or the document is a multi-page document. The latter is allowed, but currently
// simply not handled by this code, as it would not normally happen.
Reference< XFormsSupplier > xSuppForms( xSuppPage->getDrawPage(), UNO_QUERY_THROW );
Reference< XIndexAccess > xForms( xSuppForms->getForms(), UNO_QUERY_THROW );
lcl_resetChildFormsToEmptyDataSource( xForms );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::onCommandInsert( const ::rtl::OUString& _sURL, const Reference< XCommandEnvironment >& Environment )
throw( Exception )
{
osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
// Check, if all required properties were set.
if ( !_sURL.getLength() || m_xEmbeddedObject.is() )
{
OSL_ENSURE( sal_False, "Content::onCommandInsert - property value missing!" );
Sequence< rtl::OUString > aProps( 1 );
aProps[ 0 ] = PROPERTY_URL;
ucbhelper::cancelCommandExecution(
makeAny( MissingPropertiesException(
rtl::OUString(),
static_cast< cppu::OWeakObject * >( this ),
aProps ) ),
Environment );
// Unreachable
}
if ( !m_xEmbeddedObject.is() )
{
Reference< XStorage> xStorage = getContainerStorage();
if ( xStorage.is() )
{
Reference< XEmbedObjectCreator> xEmbedFactory( m_aContext.createComponent( "com.sun.star.embed.EmbeddedObjectCreator" ), UNO_QUERY );
if ( xEmbedFactory.is() )
{
Sequence<PropertyValue> aEmpty,aMediaDesc(1);
aMediaDesc[0].Name = PROPERTY_URL;
aMediaDesc[0].Value <<= _sURL;
m_xEmbeddedObject.set(xEmbedFactory->createInstanceInitFromMediaDescriptor( xStorage
,m_pImpl->m_aProps.sPersistentName
,aMediaDesc
,aEmpty),UNO_QUERY);
lcl_resetFormsToEmptyDataSource( m_xEmbeddedObject );
// #i57669# / 2005-12-01 / frank.schoenheit@sun.com
Reference<XEmbedPersist> xPersist(m_xEmbeddedObject,UNO_QUERY);
if ( xPersist.is() )
{
xPersist->storeOwn();
}
try
{
Reference< com::sun::star::util::XCloseable> xCloseable(m_xEmbeddedObject,UNO_QUERY);
if ( xCloseable.is() )
xCloseable->close(sal_True);
}
catch(Exception)
{
}
m_xEmbeddedObject = NULL;
}
}
}
// @@@
// storeData();
aGuard.clear();
// inserted();
}
// -----------------------------------------------------------------------------
sal_Bool ODocumentDefinition::save(sal_Bool _bApprove)
{
// default handling: instantiate an interaction handler and let it handle the parameter request
if ( !m_bOpenInDesign )
return sal_False;
try
{
{
::vos::OGuard aSolarGuard(Application::GetSolarMutex());
// the request
Reference<XNameAccess> xName(m_xParentContainer,UNO_QUERY);
DocumentSaveRequest aRequest;
aRequest.Name = m_pImpl->m_aProps.aTitle;
if ( !aRequest.Name.getLength() )
{
if ( m_bForm )
aRequest.Name = DBACORE_RESSTRING( RID_STR_FORM );
else
aRequest.Name = DBACORE_RESSTRING( RID_STR_REPORT );
aRequest.Name = ::dbtools::createUniqueName(xName,aRequest.Name);
}
else if ( xName->hasByName(aRequest.Name) )
aRequest.Name = ::dbtools::createUniqueName(xName,aRequest.Name);
aRequest.Content.set(m_xParentContainer,UNO_QUERY);
OInteractionRequest* pRequest = new OInteractionRequest(makeAny(aRequest));
Reference< XInteractionRequest > xRequest(pRequest);
// some knittings
// two continuations allowed: OK and Cancel
ODocumentSaveContinuation* pDocuSave = NULL;
if ( !m_pImpl->m_aProps.aTitle.getLength() )
{
pDocuSave = new ODocumentSaveContinuation;
pRequest->addContinuation(pDocuSave);
}
OInteraction< XInteractionApprove >* pApprove = NULL;
if ( _bApprove )
{
pApprove = new OInteraction< XInteractionApprove >;
pRequest->addContinuation(pApprove);
}
OInteraction< XInteractionDisapprove >* pDisApprove = new OInteraction< XInteractionDisapprove >;
pRequest->addContinuation(pDisApprove);
OInteractionAbort* pAbort = new OInteractionAbort;
pRequest->addContinuation(pAbort);
// create the handler, let it handle the request
Reference< XInteractionHandler > xHandler( m_aContext.createComponent( (::rtl::OUString)SERVICE_SDB_INTERACTION_HANDLER ), UNO_QUERY );
if ( xHandler.is() )
xHandler->handle(xRequest);
if ( pAbort->wasSelected() )
return sal_False;
if ( pDisApprove->wasSelected() )
return sal_True;
if ( pDocuSave && pDocuSave->wasSelected() )
{
::osl::MutexGuard aGuard(m_aMutex);
Reference<XNameContainer> xNC(pDocuSave->getContent(),UNO_QUERY);
if ( xNC.is() )
{
m_pImpl->m_aProps.aTitle = pDocuSave->getName();
Reference< XContent> xContent = this;
xNC->insertByName(pDocuSave->getName(),makeAny(xContent));
updateDocumentTitle();
}
}
}
::osl::MutexGuard aGuard(m_aMutex);
Reference<XEmbedPersist> xPersist(m_xEmbeddedObject,UNO_QUERY);
if ( xPersist.is() )
{
xPersist->storeOwn();
notifyDataSourceModified();
}
}
catch(Exception&)
{
OSL_ENSURE(0,"ODocumentDefinition::save: caught an Exception (tried to let the InteractionHandler handle it)!");
}
return sal_True;
}
// -----------------------------------------------------------------------------
sal_Bool ODocumentDefinition::saveAs()
{
// default handling: instantiate an interaction handler and let it handle the parameter request
if ( !m_bOpenInDesign )
return sal_False;
{
osl::ClearableGuard< osl::Mutex > aGuard( m_aMutex );
if ( !m_pImpl->m_aProps.aTitle.getLength() )
{
aGuard.clear();
return save(sal_False); // (sal_False) : we don't want an approve dialog
}
}
try
{
{
::vos::OGuard aSolarGuard(Application::GetSolarMutex());
// the request
Reference<XNameAccess> xName(m_xParentContainer,UNO_QUERY);
DocumentSaveRequest aRequest;
aRequest.Name = m_pImpl->m_aProps.aTitle;
aRequest.Content.set(m_xParentContainer,UNO_QUERY);
OInteractionRequest* pRequest = new OInteractionRequest(makeAny(aRequest));
Reference< XInteractionRequest > xRequest(pRequest);
// some knittings
// two continuations allowed: OK and Cancel
ODocumentSaveContinuation* pDocuSave = new ODocumentSaveContinuation;
pRequest->addContinuation(pDocuSave);
OInteraction< XInteractionDisapprove >* pDisApprove = new OInteraction< XInteractionDisapprove >;
pRequest->addContinuation(pDisApprove);
OInteractionAbort* pAbort = new OInteractionAbort;
pRequest->addContinuation(pAbort);
// create the handler, let it handle the request
Reference< XInteractionHandler > xHandler(m_aContext.createComponent(::rtl::OUString(SERVICE_SDB_INTERACTION_HANDLER)), UNO_QUERY);
if ( xHandler.is() )
xHandler->handle(xRequest);
if ( pAbort->wasSelected() )
return sal_False;
if ( pDisApprove->wasSelected() )
return sal_True;
if ( pDocuSave->wasSelected() )
{
::osl::MutexGuard aGuard(m_aMutex);
Reference<XNameContainer> xNC(pDocuSave->getContent(),UNO_QUERY);
if ( xNC.is() )
{
if ( m_pImpl->m_aProps.aTitle == pDocuSave->getName() )
{
Reference<XEmbedPersist> xPersist(m_xEmbeddedObject,UNO_QUERY);
if ( xPersist.is() )
{
xPersist->storeOwn();
notifyDataSourceModified();
}
}
else
{
try
{
Reference< XStorage> xStorage = getContainerStorage();
const static ::rtl::OUString sBaseName(RTL_CONSTASCII_USTRINGPARAM("Obj"));
// -----------------------------------------------------------------------------
Reference<XNameAccess> xElements(xStorage,UNO_QUERY_THROW);
::rtl::OUString sPersistentName = ::dbtools::createUniqueName(xElements,sBaseName);
xStorage->copyElementTo(m_pImpl->m_aProps.sPersistentName,xStorage,sPersistentName);
::rtl::OUString sOldName = m_pImpl->m_aProps.aTitle;
rename(pDocuSave->getName());
updateDocumentTitle();
Sequence< Any > aArguments(3);
PropertyValue aValue;
// set as folder
aValue.Name = PROPERTY_NAME;
aValue.Value <<= sOldName;
aArguments[0] <<= aValue;
aValue.Name = PROPERTY_PERSISTENT_NAME;
aValue.Value <<= sPersistentName;
aArguments[1] <<= aValue;
aValue.Name = PROPERTY_AS_TEMPLATE;
aValue.Value <<= m_pImpl->m_aProps.bAsTemplate;
aArguments[2] <<= aValue;
Reference< XMultiServiceFactory > xORB( m_xParentContainer, UNO_QUERY_THROW );
Reference< XInterface > xComponent( xORB->createInstanceWithArguments( SERVICE_SDB_DOCUMENTDEFINITION, aArguments ) );
Reference< XNameContainer > xNameContainer( m_xParentContainer, UNO_QUERY_THROW );
xNameContainer->insertByName( sOldName, makeAny( xComponent ) );
}
catch(Exception&)
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
}
}
}
catch(Exception&)
{
OSL_ENSURE(0,"ODocumentDefinition::save: caught an Exception (tried to let the InteractionHandler handle it)!");
}
return sal_True;
}
namespace
{
// .........................................................................
void lcl_putLoadArgs( ::comphelper::NamedValueCollection& _io_rArgs, const optional_bool _bSuppressMacros, const optional_bool _bReadOnly )
{
if ( !!_bSuppressMacros )
{
if ( *_bSuppressMacros )
{
// if we're to suppress macros, do exactly this
_io_rArgs.put( "MacroExecutionMode", MacroExecMode::NEVER_EXECUTE );
}
else
{
// otherwise, put the setting only if not already present
if ( !_io_rArgs.has( "MacroExecutionMode" ) )
{
_io_rArgs.put( "MacroExecutionMode", MacroExecMode::USE_CONFIG );
}
}
}
if ( !!_bReadOnly )
_io_rArgs.put( "ReadOnly", *_bReadOnly );
}
}
// -----------------------------------------------------------------------------
namespace
{
Reference< XFrame > lcl_getDatabaseDocumentFrame( ODatabaseModelImpl& _rImpl )
{
Reference< XModel > xDatabaseDocumentModel( _rImpl.getModel_noCreate() );
Reference< XController > xDatabaseDocumentController;
if ( xDatabaseDocumentModel.is() )
xDatabaseDocumentController = xDatabaseDocumentModel->getCurrentController();
Reference< XFrame > xFrame;
if ( xDatabaseDocumentController.is() )
xFrame = xDatabaseDocumentController->getFrame();
return xFrame;
}
}
// -----------------------------------------------------------------------------
sal_Bool ODocumentDefinition::objectSupportsEmbeddedScripts() const
{
bool bAllowDocumentMacros = !m_pImpl->m_pDataSource || m_pImpl->m_pDataSource->hasAnyObjectWithMacros();
// if *any* of the objects of the database document already has macros, we continue to allow it
// to have them, until the user did a migration.
// If there are no macros, yet, we don't allow to create them
return bAllowDocumentMacros;
}
// -----------------------------------------------------------------------------
::rtl::OUString ODocumentDefinition::determineContentType() const
{
return lcl_determineContentType_nothrow( getContainerStorage(), m_pImpl->m_aProps.sPersistentName );
}
// -----------------------------------------------------------------------------
Sequence< PropertyValue > ODocumentDefinition::fillLoadArgs( const Reference< XConnection>& _xConnection, const bool _bSuppressMacros, const bool _bReadOnly,
const Sequence< PropertyValue >& _rAdditionalArgs, Sequence< PropertyValue >& _out_rEmbeddedObjectDescriptor )
{
// .........................................................................
// (re-)create interceptor, and put it into the descriptor of the embedded object
if ( m_pInterceptor )
{
m_pInterceptor->dispose();
m_pInterceptor->release();
m_pInterceptor = NULL;
}
m_pInterceptor = new OInterceptor( this ,_bReadOnly);
m_pInterceptor->acquire();
Reference<XDispatchProviderInterceptor> xInterceptor = m_pInterceptor;
::comphelper::NamedValueCollection aEmbeddedDescriptor;
aEmbeddedDescriptor.put( "OutplaceDispatchInterceptor", xInterceptor );
// .........................................................................
// create the OutplaceFrameProperties, and put them into the descriptor of the embedded object
::comphelper::NamedValueCollection OutplaceFrameProperties;
OutplaceFrameProperties.put( "TopWindow", (sal_Bool)sal_True );
Reference< XFrame > xParentFrame;
if ( m_pImpl->m_pDataSource )
xParentFrame = lcl_getDatabaseDocumentFrame( *m_pImpl->m_pDataSource );
if ( !xParentFrame.is() )
{ // i87957 we need a parent frame
if ( !m_xDesktop.is() )
m_xDesktop.set( m_aContext.createComponent( (::rtl::OUString)SERVICE_FRAME_DESKTOP ), UNO_QUERY_THROW );
xParentFrame.set(m_xDesktop,uno::UNO_QUERY);
if ( xParentFrame.is() )
{
Reference<util::XCloseable> xCloseable(m_pImpl->m_pDataSource->getModel_noCreate(),UNO_QUERY);
if ( xCloseable.is() )
{
xCloseable->addCloseListener(this);
m_bRemoveListener = sal_True;
}
}
}
OSL_ENSURE( xParentFrame.is(), "ODocumentDefinition::fillLoadArgs: no parent frame!" );
if ( xParentFrame.is() )
OutplaceFrameProperties.put( "ParentFrame", xParentFrame );
aEmbeddedDescriptor.put( "OutplaceFrameProperties", OutplaceFrameProperties.getNamedValues() );
// .........................................................................
// tell the embedded object to have (or not have) script support
aEmbeddedDescriptor.put( "EmbeddedScriptSupport", (sal_Bool)objectSupportsEmbeddedScripts() );
// .........................................................................
// pass the descriptor of the embedded object to the caller
aEmbeddedDescriptor >>= _out_rEmbeddedObjectDescriptor;
// .........................................................................
::comphelper::NamedValueCollection aMediaDesc( _rAdditionalArgs );
// .........................................................................
// create the ComponentData, and put it into the document's media descriptor
{
::comphelper::NamedValueCollection aComponentData;
aComponentData.put( "ActiveConnection", _xConnection );
aComponentData.put( "ApplyFormDesignMode", !_bReadOnly );
aMediaDesc.put( "ComponentData", aComponentData.getPropertyValues() );
}
if ( m_pImpl->m_aProps.aTitle.getLength() )
aMediaDesc.put( "DocumentTitle", m_pImpl->m_aProps.aTitle );
aMediaDesc.put( "DocumentBaseURL", m_pImpl->m_pDataSource->getURL() );
// .........................................................................
// put the common load arguments into the document's media descriptor
lcl_putLoadArgs( aMediaDesc, optional_bool( _bSuppressMacros ), optional_bool( _bReadOnly ) );
return aMediaDesc.getPropertyValues();
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::loadEmbeddedObject( const Reference< XConnection >& _xConnection, const Sequence< sal_Int8 >& _aClassID,
const Sequence< PropertyValue >& _rAdditionalArgs, const bool _bSuppressMacros, const bool _bReadOnly )
{
if ( !m_xEmbeddedObject.is() )
{
Reference< XStorage> xStorage = getContainerStorage();
if ( xStorage.is() )
{
Reference< XEmbedObjectFactory> xEmbedFactory( m_aContext.createComponent( "com.sun.star.embed.OOoEmbeddedObjectFactory" ), UNO_QUERY );
if ( xEmbedFactory.is() )
{
::rtl::OUString sDocumentService;
sal_Bool bSetSize = sal_False;
sal_Int32 nEntryConnectionMode = EntryInitModes::DEFAULT_INIT;
Sequence< sal_Int8 > aClassID = _aClassID;
if ( aClassID.getLength() )
{
nEntryConnectionMode = EntryInitModes::TRUNCATE_INIT;
bSetSize = sal_True;
}
else
{
sDocumentService = GetDocumentServiceFromMediaType( getContentType(), m_aContext, aClassID );
// check if we are not a form and
// the com.sun.star.report.pentaho.SOReportJobFactory is not present.
if ( !m_bForm && !sDocumentService.equalsAscii("com.sun.star.text.TextDocument"))
{
// we seems to be a new report, check if report extension is present.
Reference< XContentEnumerationAccess > xEnumAccess( m_aContext.getLegacyServiceFactory(), UNO_QUERY );
const ::rtl::OUString sReportEngineServiceName = ::dbtools::getDefaultReportEngineServiceName(m_aContext.getLegacyServiceFactory());
Reference< XEnumeration > xEnumDrivers = xEnumAccess->createContentEnumeration(sReportEngineServiceName);
if ( !xEnumDrivers.is() || !xEnumDrivers->hasMoreElements() )
{
com::sun::star::io::WrongFormatException aWFE;
aWFE.Message = ::rtl::OUString::createFromAscii("Extension not present.");
// TODO: resource
throw aWFE;
}
}
if ( !aClassID.getLength() )
{
if ( m_bForm )
aClassID = MimeConfigurationHelper::GetSequenceClassID(SO3_SW_CLASSID);
else
{
aClassID = MimeConfigurationHelper::GetSequenceClassID(SO3_RPT_CLASSID_90);
}
}
}
OSL_ENSURE( aClassID.getLength(),"No Class ID" );
Sequence< PropertyValue > aEmbeddedObjectDescriptor;
Sequence< PropertyValue > aLoadArgs( fillLoadArgs(
_xConnection, _bSuppressMacros, _bReadOnly, _rAdditionalArgs, aEmbeddedObjectDescriptor ) );
m_xEmbeddedObject.set(xEmbedFactory->createInstanceUserInit(aClassID
,sDocumentService
,xStorage
,m_pImpl->m_aProps.sPersistentName
,nEntryConnectionMode
,aLoadArgs
,aEmbeddedObjectDescriptor
),UNO_QUERY);
if ( m_xEmbeddedObject.is() )
{
if ( !m_pClientHelper )
{
m_pClientHelper = new OEmbeddedClientHelper(this);
m_pClientHelper->acquire();
}
Reference<XEmbeddedClient> xClient = m_pClientHelper;
m_xEmbeddedObject->setClientSite(xClient);
m_xEmbeddedObject->changeState(EmbedStates::RUNNING);
if ( bSetSize )
{
awt::Size aSize( DEFAULT_WIDTH, DEFAULT_HEIGHT );
m_xEmbeddedObject->setVisualAreaSize(Aspects::MSOLE_CONTENT,aSize);
}
}
}
}
}
else
{
sal_Int32 nCurrentState = m_xEmbeddedObject->getCurrentState();
if ( nCurrentState == EmbedStates::LOADED )
{
if ( !m_pClientHelper )
{
m_pClientHelper = new OEmbeddedClientHelper(this);
m_pClientHelper->acquire();
}
Reference<XEmbeddedClient> xClient = m_pClientHelper;
m_xEmbeddedObject->setClientSite(xClient);
Sequence< PropertyValue > aEmbeddedObjectDescriptor;
Sequence< PropertyValue > aLoadArgs( fillLoadArgs(
_xConnection, _bSuppressMacros, _bReadOnly, _rAdditionalArgs, aEmbeddedObjectDescriptor ) );
Reference<XCommonEmbedPersist> xCommon(m_xEmbeddedObject,UNO_QUERY);
OSL_ENSURE(xCommon.is(),"unsupported interface!");
if ( xCommon.is() )
xCommon->reload( aLoadArgs, aEmbeddedObjectDescriptor );
m_xEmbeddedObject->changeState(EmbedStates::RUNNING);
}
else
{
OSL_ENSURE( ( nCurrentState == EmbedStates::RUNNING ) || ( nCurrentState == EmbedStates::ACTIVE ),
"ODocumentDefinition::loadEmbeddedObject: unexpected state!" );
// if the document was already loaded (which means the embedded object is in state RUNNING or ACTIVE),
// then just re-set some model parameters
try
{
Reference< XModel > xModel( getComponent(), UNO_QUERY_THROW );
Sequence< PropertyValue > aArgs = xModel->getArgs();
::comphelper::NamedValueCollection aMediaDesc( aArgs );
::comphelper::NamedValueCollection aArguments( _rAdditionalArgs );
aMediaDesc.merge( aArguments, sal_False );
lcl_putLoadArgs( aMediaDesc, optional_bool(), optional_bool() );
// don't put _bSuppressMacros and _bReadOnly here - if the document was already
// loaded, we should not tamper with its settings.
// #i88977# / 2008-05-05 / frank.schoenheit@sun.com
// #i86872# / 2008-03-13 / frank.schoenheit@sun.com
aMediaDesc >>= aArgs;
xModel->attachResource( xModel->getURL(), aArgs );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
// set the OfficeDatabaseDocument instance as parent of the embedded document
// #i40358# / 2005-01-19 / frank.schoenheit@sun.com
Reference< XChild > xDepdendDocAsChild( getComponent(), UNO_QUERY );
if ( xDepdendDocAsChild.is() )
{
try
{
if ( !xDepdendDocAsChild->getParent().is() )
{ // first encounter
xDepdendDocAsChild->setParent( getDataSource( m_xParentContainer ) );
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::onCommandPreview(Any& _rImage)
{
loadEmbeddedObjectForPreview();
if ( m_xEmbeddedObject.is() )
{
try
{
Reference<XTransferable> xTransfer(getComponent(),UNO_QUERY);
if ( xTransfer.is() )
{
DataFlavor aFlavor;
aFlavor.MimeType = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("image/png"));
aFlavor.HumanPresentableName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Portable Network Graphics"));
aFlavor.DataType = ::getCppuType(static_cast< const Sequence < sal_Int8 >* >(NULL));
_rImage = xTransfer->getTransferData( aFlavor );
}
}
catch( Exception )
{
}
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::getPropertyDefaultByHandle( sal_Int32 /*_nHandle*/, Any& _rDefault ) const
{
_rDefault.clear();
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::onCommandGetDocumentProperties( Any& _rProps )
{
loadEmbeddedObjectForPreview();
if ( m_xEmbeddedObject.is() )
{
try
{
Reference<XDocumentPropertiesSupplier> xDocSup(
getComponent(), UNO_QUERY );
if ( xDocSup.is() )
_rProps <<= xDocSup->getDocumentProperties();
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
}
// -----------------------------------------------------------------------------
Reference< util::XCloseable> ODocumentDefinition::getComponent() throw (RuntimeException)
{
OSL_ENSURE(m_xEmbeddedObject.is(),"Illegal call for embeddedObject");
Reference< util::XCloseable> xComp;
if ( m_xEmbeddedObject.is() )
{
int nOldState = m_xEmbeddedObject->getCurrentState();
int nState = nOldState;
if ( nOldState == EmbedStates::LOADED )
{
m_xEmbeddedObject->changeState( EmbedStates::RUNNING );
nState = EmbedStates::RUNNING;
}
if ( nState == EmbedStates::ACTIVE || nState == EmbedStates::RUNNING )
{
Reference<XComponentSupplier> xCompProv(m_xEmbeddedObject,UNO_QUERY);
if ( xCompProv.is() )
{
xComp = xCompProv->getComponent();
OSL_ENSURE(xComp.is(),"No valid component");
}
}
}
return xComp;
}
// -----------------------------------------------------------------------------
namespace
{
Reference< XDatabaseDocumentUI > lcl_getDatabaseDocumentUI( ODatabaseModelImpl& _rModelImpl )
{
Reference< XDatabaseDocumentUI > xUI;
Reference< XModel > xModel( _rModelImpl.getModel_noCreate() );
if ( xModel.is() )
xUI.set( xModel->getCurrentController(), UNO_QUERY );
return xUI;
}
}
// -----------------------------------------------------------------------------
Reference< XComponent > ODocumentDefinition::impl_openUI_nolck_throw( bool _bForEditing )
{
::osl::ClearableMutexGuard aGuard( m_aMutex );
if ( !m_pImpl || !m_pImpl->m_pDataSource )
throw DisposedException();
Reference< XDatabaseDocumentUI > xUI( lcl_getDatabaseDocumentUI( *m_pImpl->m_pDataSource ) );
if ( !xUI.is() )
{
// no XDatabaseDocumentUI -> just execute the respective command
m_bOpenInDesign = _bForEditing;
Any aComponent;
onCommandOpenSomething( Any(), true, NULL, aComponent, aGuard );
Reference< XComponent > xComponent;
OSL_VERIFY( aComponent >>= xComponent );
return xComponent;
}
Reference< XComponent > xComponent;
try
{
::rtl::OUString sName( m_pImpl->m_aProps.aTitle );
sal_Int32 nObjectType = m_bForm ? DatabaseObject::FORM : DatabaseObject::REPORT;
aGuard.clear();
xComponent = xUI->loadComponent(
nObjectType, sName, _bForEditing
);
}
catch( RuntimeException& ) { throw; }
catch( const Exception& )
{
throw WrappedTargetException(
::rtl::OUString(), *this, ::cppu::getCaughtException() );
}
return xComponent;
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::impl_store_throw()
{
Reference<XEmbedPersist> xPersist( m_xEmbeddedObject, UNO_QUERY );
if ( xPersist.is() )
{
xPersist->storeOwn();
notifyDataSourceModified();
}
}
// -----------------------------------------------------------------------------
bool ODocumentDefinition::impl_close_throw()
{
bool bSuccess = prepareClose();
if ( bSuccess && m_xEmbeddedObject.is() )
{
m_xEmbeddedObject->changeState( EmbedStates::LOADED );
bSuccess = m_xEmbeddedObject->getCurrentState() == EmbedStates::LOADED;
}
return bSuccess;
}
// -----------------------------------------------------------------------------
Reference< XComponent > SAL_CALL ODocumentDefinition::open( ) throw (WrappedTargetException, RuntimeException)
{
return impl_openUI_nolck_throw( false );
}
// -----------------------------------------------------------------------------
Reference< XComponent > SAL_CALL ODocumentDefinition::openDesign( ) throw (WrappedTargetException, RuntimeException)
{
return impl_openUI_nolck_throw( true );
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::store( ) throw (WrappedTargetException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
try
{
impl_store_throw();
}
catch( RuntimeException& ) { throw; }
catch( const Exception& )
{
throw WrappedTargetException(
::rtl::OUString(), *this, ::cppu::getCaughtException() );
}
}
// -----------------------------------------------------------------------------
::sal_Bool SAL_CALL ODocumentDefinition::close( ) throw (WrappedTargetException, RuntimeException)
{
::osl::MutexGuard aGuard( m_aMutex );
sal_Bool bSuccess = sal_False;
try
{
bSuccess = impl_close_throw();
}
catch( RuntimeException& ) { throw; }
catch( const Exception& )
{
throw WrappedTargetException(
::rtl::OUString(), *this, ::cppu::getCaughtException() );
}
return bSuccess;
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::rename( const ::rtl::OUString& _rNewName ) throw (SQLException, ElementExistException, RuntimeException)
{
try
{
osl::ClearableGuard< osl::Mutex > aGuard(m_aMutex);
if ( _rNewName.equals( m_pImpl->m_aProps.aTitle ) )
return;
// document definitions are organized in a hierarchical way, so reject names
// which contain a /, as this is reserved for hierarchy level separation
if ( _rNewName.indexOf( '/' ) != -1 )
m_aErrorHelper.raiseException( ErrorCondition::DB_OBJECT_NAME_WITH_SLASHES, *this );
sal_Int32 nHandle = PROPERTY_ID_NAME;
Any aOld = makeAny( m_pImpl->m_aProps.aTitle );
Any aNew = makeAny( _rNewName );
aGuard.clear();
fire(&nHandle, &aNew, &aOld, 1, sal_True );
m_pImpl->m_aProps.aTitle = _rNewName;
fire(&nHandle, &aNew, &aOld, 1, sal_False );
::osl::ClearableGuard< ::osl::Mutex > aGuard2( m_aMutex );
if ( m_xEmbeddedObject.is() && m_xEmbeddedObject->getCurrentState() == EmbedStates::ACTIVE )
updateDocumentTitle();
}
catch(const PropertyVetoException&)
{
throw ElementExistException(_rNewName,*this);
}
}
// -----------------------------------------------------------------------------
Reference< XStorage> ODocumentDefinition::getContainerStorage() const
{
return m_pImpl->m_pDataSource
? m_pImpl->m_pDataSource->getStorage( ODatabaseModelImpl::getObjectContainerStorageName( m_bForm ? ODatabaseModelImpl::E_FORM : ODatabaseModelImpl::E_REPORT ) )
: Reference< XStorage>();
}
// -----------------------------------------------------------------------------
sal_Bool ODocumentDefinition::isModified()
{
osl::ClearableGuard< osl::Mutex > aGuard(m_aMutex);
sal_Bool bRet = sal_False;
if ( m_xEmbeddedObject.is() )
{
Reference<XModifiable> xModel(getComponent(),UNO_QUERY);
bRet = xModel.is() && xModel->isModified();
}
return bRet;
}
// -----------------------------------------------------------------------------
bool ODocumentDefinition::prepareClose()
{
if ( !m_xEmbeddedObject.is() )
return true;
try
{
// suspend the controller. Embedded objects are not allowed to raise
// own UI at their own discretion, instead, this has always to be triggered
// by the embedding component. Thus, we do the suspend call here.
// #i49370# / 2005-06-09 / frank.schoenheit@sun.com
Reference< XModel > xModel( getComponent(), UNO_QUERY );
Reference< XController > xController;
if ( xModel.is() )
xController = xModel->getCurrentController();
OSL_ENSURE( xController.is() || ( m_xEmbeddedObject->getCurrentState() < EmbedStates::ACTIVE ),
"ODocumentDefinition::prepareClose: no controller!" );
if ( !xController.is() )
// document has not yet been activated, i.e. has no UI, yet
return true;
sal_Bool bCouldSuspend = xController->suspend( sal_True );
if ( !bCouldSuspend )
// controller vetoed the closing
return false;
if ( isModified() )
{
Reference< XFrame > xFrame( xController->getFrame() );
if ( xFrame.is() )
{
Reference< XTopWindow > xTopWindow( xFrame->getContainerWindow(), UNO_QUERY_THROW );
xTopWindow->toFront();
}
if ( !save( sal_True ) )
{
if ( bCouldSuspend )
// revert suspension
xController->suspend( sal_False );
// saving failed or was cancelled
return false;
}
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return true;
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::fillReportData(::osl::ClearableMutexGuard & _aGuard)
{
if ( !m_bForm && m_pImpl->m_aProps.bAsTemplate && !m_bOpenInDesign ) // open a report in alive mode, so we need to fill it
{
Sequence<Any> aArgs(2);
PropertyValue aValue;
aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TextDocument"));
aValue.Value <<= getComponent();
aArgs[0] <<= aValue;
aValue.Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ActiveConnection"));
aValue.Value <<= m_xLastKnownConnection;
aArgs[1] <<= aValue;
Reference< XJobExecutor > xExecuteable( m_aContext.createComponentWithArguments( "com.sun.star.wizards.report.CallReportWizard", aArgs ), UNO_QUERY );
if ( xExecuteable.is() )
{
_aGuard.clear();
xExecuteable->trigger(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("fill")));
}
}
}
// -----------------------------------------------------------------------------
void ODocumentDefinition::updateDocumentTitle()
{
::rtl::OUString sName = m_pImpl->m_aProps.aTitle;
if ( m_pImpl->m_pDataSource )
{
if ( !sName.getLength() )
{
if ( m_bForm )
sName = DBACORE_RESSTRING( RID_STR_FORM );
else
sName = DBACORE_RESSTRING( RID_STR_REPORT );
Reference< XUntitledNumbers > xUntitledProvider(m_pImpl->m_pDataSource->getModel_noCreate(), UNO_QUERY );
if ( xUntitledProvider.is() )
sName += ::rtl::OUString::valueOf( xUntitledProvider->leaseNumber(getComponent()) );
}
Reference< XTitle > xDatabaseDocumentModel(m_pImpl->m_pDataSource->getModel_noCreate(),uno::UNO_QUERY);
if ( xDatabaseDocumentModel.is() )
sName = xDatabaseDocumentModel->getTitle() + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" : ")) + sName;
}
Reference< XTitle> xTitle(getComponent(),UNO_QUERY);
if ( xTitle.is() )
xTitle->setTitle(sName);
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::queryClosing( const lang::EventObject& Source, ::sal_Bool GetsOwnership ) throw (util::CloseVetoException, uno::RuntimeException)
{
(void) Source;
(void) GetsOwnership;
try
{
if ( !close() )
throw util::CloseVetoException();
}
catch(const lang::WrappedTargetException&)
{
throw util::CloseVetoException();
}
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::notifyClosing( const lang::EventObject& /*Source*/ ) throw (uno::RuntimeException)
{
}
// -----------------------------------------------------------------------------
void SAL_CALL ODocumentDefinition::disposing( const lang::EventObject& /*Source*/ ) throw (uno::RuntimeException)
{
}
//........................................................................
} // namespace dbaccess
//........................................................................