Files
libreoffice/dbaccess/source/ui/tabledesign/TableController.cxx
Kurt Zenker bda7e683ae CWS-TOOLING: integrate CWS dba32b
2009-06-03 14:58:08 +0200 fs  r272581 : #i102439#
2009-05-29 13:56:18 +0200 fs  r272456 : remove the sub form when the 'add subform' setting changes from <true/> to <false/>, not only its controls
2009-05-29 13:19:27 +0200 fs  r272454 : display '(Default)' instead of an empty string when a control has the default font
2009-05-28 20:49:18 +0200 fs  r272428 : #i98162# getFirstSelectedValue: do not return reference to a temporary
2009-05-27 15:30:22 +0200 msc  r272353 : #102303#
2009-05-26 13:03:06 +0200 fs  r272295 : spelling
2009-05-26 12:59:54 +0200 fs  r272294 : merge m48 version to get latest cygwin related fixes
2009-05-25 14:02:06 +0200 fs  r272239 : remove references to local files, needed for debugging sessions only
2009-05-25 14:01:16 +0200 fs  r272238 : #i102021# ensure members such as bNumberFormat are initialized before actually returning them
2009-05-25 13:10:20 +0200 fs  r272236 : #i10000# reset ENABLE_EVOAB2
2009-05-22 06:44:45 +0200 oj  r272167 : #i99104# add import handler for calc-sett
2009-05-22 06:42:27 +0200 oj  r272166 : #i99104# impl NullDate as member
2009-05-22 06:36:22 +0200 oj  r272165 : #i99104# handle nulldate from parent model
2009-05-22 06:33:13 +0200 oj  r272164 : #i99104# export and import calculation-settings and nulldate
2009-05-22 06:27:50 +0200 oj  r272163 : #i99104# export and import calculation-settings and nulldate
2009-05-20 13:29:58 +0200 oj  r272118 : #i99911# handle invalid name
2009-05-20 13:28:49 +0200 oj  r272117 : #i101261# handle different rowsets
2009-05-20 11:29:55 +0200 msc  r272111 : #i100000#
2009-05-20 11:28:27 +0200 msc  r272110 : merge in change from dba32a
2009-05-20 11:27:38 +0200 msc  r272109 : #102082# CTRL + C does not work
2009-05-20 09:43:36 +0200 oj  r272106 : clean up includes
2009-05-20 09:32:15 +0200 oj  r272105 : #i99060# merge error resovled now VERTICAL_ALIGN is in both stmt
2009-05-20 08:37:21 +0200 msc  r272104 : add workaround for issue #102010#
2009-05-20 08:10:12 +0200 oj  r272103 : #i99104# use numberformatkey
2009-05-20 08:07:02 +0200 oj  r272102 : #i99104# use column info from rowset
2009-05-20 08:04:43 +0200 oj  r272101 : #i102032# use a special column type where prec and scale are the values currently set at the column
2009-05-20 08:03:04 +0200 oj  r272100 : #i102032# correct type info, we have to use SQL defined type names
2009-05-19 10:27:02 +0200 oj  r272061 : #i99104# export null-date
2009-05-19 08:26:53 +0200 oj  r272056 : #i99104# export null-date
2009-05-18 13:15:10 +0200 msc  r272014 : add issue #102019#
2009-05-18 11:33:07 +0200 msc  r272005 : add issue #102019#
2009-05-18 08:59:45 +0200 msc  r271996 : add workaroud for issue #102010#
2009-05-15 10:21:24 +0200 msc  r271929 : #101944#
2009-05-11 21:18:30 +0200 fs  r271792 : #i99914#
2009-05-08 13:52:06 +0200 oj  r271715 : #i96423# remember column span
2009-05-08 11:26:19 +0200 oj  r271708 : #i98605# impl new scale mode
2009-05-08 10:33:35 +0200 fs  r271706 : SendUserCall: only call into the shape notification routine for UserCall types where this is necessary (performance issue)
2009-05-07 20:52:44 +0200 fs  r271698 : outsource ShapeProperty from shapepropertynotifier.hxx
2009-05-07 20:43:33 +0200 fs  r271697 : #i99056# use notifyShapePropertyChange, instead of getShapePropertyChangeNotifier - the latter throws if no shape exists, yet
2009-05-07 20:33:58 +0200 fs  r271696 : #i99056# +notifyShapePropertyChange: allow notifying chages without checking whether there actually already exists an SvxShape
2009-05-07 16:22:15 +0200 fs  r271679 : #i10000# cygwin needs quotes around the classpath
2009-05-07 16:21:37 +0200 fs  r271678 : #i10000# cygwin needs quotes around the classpath
2009-05-07 16:01:11 +0200 oj  r271677 : #i99914# notify parent handler
2009-05-07 15:54:54 +0200 fs  r271676 : #i10000# cygwin needs some quoting
2009-05-07 14:49:48 +0200 oj  r271672 : #i99277# quote alias name
2009-05-07 14:48:12 +0200 oj  r271671 : #i92538# add ~ in front of type
2009-05-07 14:37:13 +0200 oj  r271667 : #i99118# change type from char to varchar
2009-05-07 14:36:23 +0200 oj  r271666 : #i99118# clear dest columns when changing to create new table
2009-05-07 13:35:32 +0200 oj  r271657 : #i94467# handle type 0 as double as well
2009-05-07 13:20:49 +0200 oj  r271655 : i99743# setNull when varchar is no text
2009-05-07 12:58:06 +0200 fs  r271651 : initialize the SdrObject's property change notifier after the ctor, if necessary
2009-05-07 11:47:18 +0200 fs  r271647 : #i10000#
2009-05-07 10:57:16 +0200 fs  r271639 : OPropertyBrowserController::propertyChange: care for the current property state, too, and properly forward it to the UI
2009-05-07 10:18:14 +0200 fs  r271636 : onNewComponent: do not ask the map for grid columns, it will throw
2009-05-07 10:09:55 +0200 fs  r271634 : #i101623#
2009-05-07 09:53:44 +0200 fs  r271631 : #i101622#
2009-05-06 21:55:53 +0200 fs  r271615 : #i10000#
2009-05-06 21:10:42 +0200 fs  r271611 : #i10000#
2009-05-06 13:11:48 +0200 fs  r271583 : #i10000#
2009-05-05 22:29:31 +0200 fs  r271559 : proper assertion message
2009-05-05 22:29:03 +0200 fs  r271558 : diagnostics
2009-05-05 22:16:16 +0200 fs  r271557 : #i10000#
2009-05-05 13:50:32 +0200 fs  r271513 : #i10000#
2009-05-05 10:21:50 +0200 fs  r271503 : #i10000#
2009-05-05 09:30:26 +0200 fs  r271501 : why did those survive the rebase -C step?
2009-05-05 09:18:12 +0200 fs  r271500 : #i10000#
2009-05-04 17:08:17 +0200 fs  r271475 : CWS-TOOLING: rebase CWS dba32b to trunk@271427 (milestone: DEV300:m47)
2009-05-04 14:51:26 +0200 fs  r271456 : line ends
2009-04-30 15:55:27 +0200 fs  r271418 : NewURL -> PublicConnectionURL
2009-04-22 21:18:34 +0200 fs  r271141 : #i100944#
2009-04-22 09:12:26 +0200 oj  r271071 : #i101261# little code change
2009-04-22 09:11:43 +0200 oj  r271070 : #i101261# only ask for parameters which aren't set before
2009-04-22 09:11:25 +0200 oj  r271069 : #i101261# new grabage container for nodes
2009-04-22 09:11:02 +0200 oj  r271068 : #i101261# new grabage container for nodes
2009-04-22 09:10:44 +0200 oj  r271067 : #i101261# new grabage container for nodes
2009-04-22 09:10:21 +0200 oj  r271066 : #i101261# only ask for parameters which aren't set before
2009-04-22 09:08:24 +0200 oj  r271065 : #i101261# only ask for parameters which aren't set before
2009-04-22 09:07:25 +0200 oj  r271064 : #i101261# only ask for parameters which aren't set before
2009-04-22 08:49:07 +0200 oj  r271062 : #i77501# preview only when needed
2009-04-22 08:45:44 +0200 oj  r271061 : #i101261# new prop max rows
2009-04-22 08:44:18 +0200 oj  r271060 : #i101261# create dataprovider earlier to avoid the wrong legend in chart
2009-04-22 08:42:48 +0200 oj  r271059 : #i101261# handle parameter
2009-04-17 21:00:23 +0200 fs  r270954 : #i98350#
2009-04-17 13:54:19 +0200 fs  r270942 : #i99565#
2009-04-17 13:51:34 +0200 fs  r270940 : #i101153# only localize the (potentially) localizable properties when there really is support at the control model
2009-04-17 11:43:14 +0200 fs  r270932 : removed superfluous include
2009-04-17 10:10:15 +0200 fs  r270926 : #i10000#
2009-04-17 10:02:36 +0200 fs  r270925 : #i10000#
2009-04-17 09:15:13 +0200 fs  r270918 : #i99056# some more refactoring of the recently introduced property change notification mechanism for UNO shapes
2009-04-17 09:14:56 +0200 fs  r270917 : #i99056# some more refactoring of the recently introduced property change notification mechanism for UNO shapes
2009-04-17 09:13:25 +0200 fs  r270915 : #i99056# some more refactoring of the recently introduced property change notification mechanism for UNO shapes
2009-04-17 08:30:34 +0200 fs  r270914 : removed unotools/servicehelper.hxx in favour of the (duplicated) comphelper/servicehelper.hxx
2009-04-16 21:05:25 +0200 fs  r270903 : #i10000#
2009-04-16 20:43:43 +0200 fs  r270902 : #i99056# shape notification outsourced to the SdrObject, this is what all other shape implementations (which only aggregate an SvxShape) have access to, too
2009-04-16 15:57:36 +0200 fs  r270891 : #i99056# make SetUnoControlModel virtual
2009-04-16 15:44:02 +0200 fs  r270890 : #i99056# let the ScShapeObj notify changes in its Anchor property
2009-04-16 15:36:47 +0200 fs  r270889 : #i99056# enable the sheet anchor type property, too
2009-04-16 15:33:45 +0200 fs  r270887 : #i99056# shape notification outsourced to the SdrObject, this is what all other shape implementations (which only aggregate an SvxShape) have access to, too
2009-04-15 14:53:13 +0200 fs  r270844 : #i10000#
2009-04-15 13:08:29 +0200 fs  r270836 : #i10000#
2009-04-15 12:28:14 +0200 fs  r270832 : #i10000#
2009-04-15 10:59:14 +0200 fs  r270827 : #i10000#
2009-04-15 09:41:08 +0200 oj  r270823 : fix issues found with findbugs and pmd
2009-04-14 21:08:04 +0200 fs  r270808 : #i99056# implement SheetAnchorType - now the only thing missing to enable it is the proper notification when it is modified
2009-04-14 17:09:00 +0200 fs  r270799 : #i99056# implement XServiceInfo for the ScShapeObj
2009-04-14 17:07:55 +0200 fs  r270798 : #i99056# implement TextAnchorType, partially implement SheetAnchorType
2009-04-14 15:54:05 +0200 fs  r270786 : #i99056# SwXShape: notify changes of the AnchorType property
2009-04-14 15:47:32 +0200 fs  r270785 : #i99056# deliver shapepropertynotifier.hxx
2009-04-14 15:46:54 +0200 fs  r270784 : diagnostics
2009-04-14 15:08:28 +0200 fs  r270781 : #i99056# outsourced the SvxShape's property change notification code into a dedicated class
2009-04-14 14:41:09 +0200 fs  r270773 : #i99056# outsourced the SvxShape's property change notification code into a dedicated class
2009-04-14 14:37:23 +0200 fs  r270772 : in dtor, remove the properties from the temporary component context
2009-04-14 14:36:34 +0200 fs  r270771 : getWeakUnoShape made const
2009-04-14 12:23:08 +0200 oj  r270757 : #i101064# add missing braces
2009-04-14 12:21:25 +0200 oj  r270756 : #i101065# add braces for gcc 4.3.2
2009-04-14 12:17:45 +0200 oj  r270755 : #i101059# add dep for manifest
2009-04-09 12:06:58 +0200 oj  r270686 : #i93100# use OptimalSize from control to get height
2009-04-08 09:56:55 +0200 oj  r270619 : #i92537# handle calculations in the select columns as well
2009-04-08 09:30:39 +0200 oj  r270615 : #i96657# throw error message when the key doesn't have any columns
2009-04-07 12:08:26 +0200 oj  r270592 : #i77501# impl preview of the executed report
2009-04-07 12:01:56 +0200 oj  r270591 : #i77501# impl preview of the executed report
2009-04-07 11:41:03 +0200 oj  r270590 : #i77501# impl preview of the executed report
2009-04-07 11:39:32 +0200 oj  r270589 : #i77501# impl preview of the executed report
2009-04-07 11:29:25 +0200 oj  r270588 : #i77501# convert dos to unix lineends
2009-04-07 11:28:23 +0200 oj  r270587 : #i77501# impl preview of the executed report
2009-04-07 11:16:50 +0200 oj  r270586 : #i77501# impl preview of the executed report
2009-04-07 11:16:00 +0200 oj  r270585 : #i77501# impl preview of the executed report
2009-04-07 11:15:44 +0200 oj  r270584 : #i77501# impl preview of the executed report
2009-04-07 11:15:28 +0200 oj  r270583 : #i77501# impl preview of the executed report
2009-04-07 11:15:04 +0200 oj  r270582 : #i77501# impl preview of the executed report
2009-04-06 15:38:54 +0200 fs  r270559 : merge changes from CWS dba32a herein
2009-04-03 15:56:16 +0200 fs  r270494 : ImpSvMEdit::Resize: do multiple iterations, if necessary
2009-04-03 14:35:49 +0200 fs  r270487 : #i10000#
2009-04-03 13:17:16 +0200 fs  r270476 : #i99056# display geometry information for controls, too
2009-04-03 13:16:37 +0200 fs  r270475 : #i99056# better ordering of the geometry properties
2009-04-03 13:16:07 +0200 fs  r270473 : #i99056# now that SvxShape supports property change listeners, forward add/remove requests to it
2009-04-03 13:13:18 +0200 fs  r270472 : #i99056# at SvxShape, allow for PropertyChangeListeners for Size/Position
2009-04-03 09:29:27 +0200 oj  r270456 : #i94571# use correct prop name
2009-04-03 09:14:54 +0200 fs  r270451 : merge changes from CWS dba32a herein
2009-04-02 17:00:51 +0200 fs  r270424 : better diagnostics
2009-04-02 16:35:19 +0200 fs  r270421 : diagnostics
2009-04-02 16:34:50 +0200 fs  r270420 : #i99056# mxUnoShape not accessible anymore, use impl_setUnoShape instead
2009-04-02 16:32:48 +0200 fs  r270419 : #i99056# make getUnoShape cheaper: keep the pointer to the SvxShape all the time, so there's no need to ask for it in getUnoShape. As a consequence, we will later be able to use the pointer in scenarious where performance (potentially) matters
2009-04-02 16:31:13 +0200 fs  r270417 : merge changes from CWS dba32a herein
2009-04-02 16:23:16 +0200 fs  r270414 : merge changes from CWS dba32a herein
2009-04-02 14:10:35 +0200 fs  r270405 : #i10000#
2009-04-02 14:06:26 +0200 fs  r270404 : merge changes from CWS dba32a herein
2009-04-02 14:03:03 +0200 fs  r270401 : #i10000#
2009-04-02 13:58:13 +0200 fs  r270400 : #i10000#
2009-04-02 12:59:44 +0200 fs  r270397 : merge changes from CWS dba32a herein
2009-04-02 12:46:30 +0200 fs  r270396 : #i99056# let the form page maintain a mapping between control models and control shapes
2009-04-02 12:44:07 +0200 fs  r270395 : merge changes from CWS dba32a herein
2009-04-02 12:42:06 +0200 fs  r270394 : merge changes from CWS dba32a herein
2009-04-02 12:35:20 +0200 fs  r270393 : #i10000# precompiled header
2009-04-02 12:05:31 +0200 fs  r270392 : merge changes from CWS dba32a herein
2009-04-02 12:00:42 +0200 fs  r270391 : merge changes from CWS dba32a herein
2009-04-02 11:47:26 +0200 fs  r270390 : merge changes from CWS dba32a herein
2009-04-02 11:39:15 +0200 oj  r270389 : #i94467# foxpro impl several new types
2009-04-02 11:35:58 +0200 fs  r270387 : merge changes from CWS dba32a herein
2009-04-01 14:10:51 +0200 fs  r270329 : merge changes from CWS dba32a herein
2009-03-31 17:29:50 +0200 fs  r270290 : merge changes from CWS dba32a herein
2009-03-30 14:53:56 +0200 fs  r270233 : #i100417# don't set grid column widths to 0, but to <void/>
2009-03-30 12:31:03 +0200 oj  r270213 : #i100552# wrong orb used
2009-03-30 12:19:20 +0200 oj  r270212 : #i98303# convertlike corrected to sal_Unicode
2009-03-30 11:58:25 +0200 fs  r270210 : merge changes from CWS dba32a herein
2009-03-30 11:38:16 +0200 oj  r270205 : remove duplicate code from merge
2009-03-30 11:02:27 +0200 fs  r270202 : merge changes from CWS dba32a herein
2009-03-30 11:02:19 +0200 fs  r270201 : merge changes from CWS dba32a herein
2009-03-30 10:31:26 +0200 oj  r270200 : #i100665# only throw exception and do not drop table
2009-03-30 09:36:24 +0200 fs  r270195 : assertion text
2009-03-28 20:21:58 +0100 fs  r270187 : #ii10000#
2009-03-28 20:19:54 +0100 fs  r270186 : removed unused help ids
2009-03-28 20:19:40 +0100 fs  r270185 : removed unused help ids
2009-03-28 20:19:10 +0100 fs  r270184 : #i100237# +DefaultState/XReset
2009-03-28 00:29:29 +0100 fs  r270177 : CWS-TOOLING: rebase CWS dba32b to trunk@270033 (milestone: DEV300:m45)
2009-03-27 22:56:46 +0100 fs  r270173 : #i100237# DEFAULT_CHECKED -> DEFAULT_STATE
2009-03-27 22:55:52 +0100 fs  r270172 : #i100237# DefaultState property for buttons, enabled only when Toggle=Yes
2009-03-27 22:54:15 +0100 fs  r270171 : #i100237# DEFAULT_CHECKED -> DEFAULT_STATE
2009-03-27 22:53:54 +0100 fs  r270170 : #i100237# introduce a DefaultState property for buttons, which implies buttongs supporting XReset, which needed some refactoring
2009-03-27 13:31:41 +0100 fs  r270152 : ignore output paths
2009-03-27 11:23:44 +0100 fs  r270139 : tuned behavior with respect to invalid keys/values
2009-03-27 09:57:14 +0100 fs  r270136 : don't allow Double.NaN
2009-03-27 09:56:16 +0100 fs  r270135 : talk about Double.NaN
2009-03-26 12:14:30 +0100 fs  r270067 : removed unused parameter
2009-03-26 12:14:02 +0100 fs  r270066 : removed widening conversion when checking keys
2009-03-26 09:17:34 +0100 fs  r270053 : separated the enumerator functionality into a dedicated interface, this way not burdening XMap with it
2009-03-26 09:17:11 +0100 fs  r270052 : separated the enumerator functionality into a dedicated interface, this way not burdening XMap with it
2009-03-26 09:16:49 +0100 fs  r270051 : separated the enumerator functionality into a dedicated interface, this way not burdening XMap with it
2009-03-25 21:55:20 +0100 fs  r270044 : #i100541# properly calculat bNeedScrollBox
2009-03-25 12:56:17 +0100 fs  r270019 : renamed the previously introduced error condition
2009-03-25 12:11:48 +0100 fs  r270015 : #i100095# when the error messages contain non-trivial details (SQLState/ErrorCode), then always display the 'Details' button
2009-03-25 12:10:05 +0100 fs  r270012 : renamed the previously introduced error condition
2009-03-25 12:01:04 +0100 fs  r270011 : #i100095# when no address book (or respective profile) can be found, then use a dedicated ErrorCondition
2009-03-25 10:29:07 +0100 fs  r270003 : add missing localization
2009-03-25 10:23:12 +0100 fs  r270001 : in preparation of #i1000095#:
rework the error handling, allow using css.sdb.ErrorCondition values, plus
allow propagating the nsresult
2009-03-25 10:21:55 +0100 fs  r270000 : in preparation of #i1000095#:
rework the error handling, allow using css.sdb.ErrorCondition values, plus
allow propagating the nsresult
2009-03-20 23:05:38 +0100 fs  r269829 : XMap::getSize removed
2009-03-20 23:05:19 +0100 fs  r269828 : changes as suggested by sb
2009-03-20 23:04:56 +0100 fs  r269827 : enhanced documentation
2009-03-20 15:31:40 +0100 fs  r269815 : changes as suggested by sb
2009-03-20 13:23:52 +0100 oj  r269804 : #i92538# correct the zorder that fixedtext is infront of control
2009-03-20 12:59:38 +0100 oj  r269801 : #i94571# paraadjust now supports BLOCK
2009-03-20 12:58:11 +0100 oj  r269800 : #i94571# export style with data style
2009-03-20 12:57:05 +0100 oj  r269799 : #i94571# text align is now paraadjust
2009-03-20 12:37:02 +0100 fs  r269797 : enum keys only accepted if they have the exact type, not if they have *any* enum type
2009-03-20 12:28:31 +0100 fs  r269794 : some changes requested by sb
2009-03-20 08:52:47 +0100 fs  r269780 : doc
2009-03-20 07:37:31 +0100 oj  r269779 : #i99913# only notifiy when values are different
2009-03-20 07:36:58 +0100 oj  r269778 : #i99913# add undoenv as listener at the dataprovider
2009-03-19 22:52:52 +0100 fs  r269771 : added comment
2009-03-19 22:40:06 +0100 fs  r269770 : +testEnumeration
2009-03-19 22:39:41 +0100 fs  r269769 : implemented enumeration, getKeySet, and getValues. Should be finished now.
2009-03-19 14:01:01 +0100 oj  r269743 : #i99913# reset the modified state when selecting an object
2009-03-19 12:19:54 +0100 lla  r269739 : #i72390# cleanups
2009-03-19 09:25:27 +0100 fs  r269727 : #i10000#
2009-03-18 23:37:02 +0100 fs  r269708 : extended checks for value type acceptance
2009-03-18 23:36:41 +0100 fs  r269707 : fixed value type checks
2009-03-18 14:59:56 +0100 fs  r269678 : initial complex test case for the new css.container.Map implementation
2009-03-18 14:59:24 +0100 fs  r269677 : verifyExpectedException moved to base class (in complexlib), and renamed to assureException for consistency
2009-03-18 14:58:35 +0100 fs  r269676 : removed unused imports
2009-03-18 14:58:03 +0100 fs  r269675 : first implementation of the new css.container.Map service (not completed, yet)
2009-03-18 14:57:17 +0100 fs  r269674 : base class for UNO components, freeing you from some repeating work
2009-03-18 14:55:53 +0100 fs  r269672 : +assureException: call a given method with given parameters on a given object, ensure that a given exception is thrown by the method implementation
2009-03-18 14:54:58 +0100 fs  r269671 : +getComponentContext
2009-03-18 14:54:00 +0100 fs  r269670 : isEmpty returns a boolean, not a long
2009-03-18 14:14:43 +0100 oj  r269663 : #i99743# now text also supports null
2009-03-18 13:54:14 +0100 oj  r269660 : #i99223# remove check for 2 params
2009-03-18 13:33:35 +0100 oj  r269659 : #i99060# replace text::ParagraphVertAlign with style::VerticalAlignment
2009-03-18 13:32:18 +0100 oj  r269658 : #i99060# don't set void property when void isn't allowed
2009-03-18 13:31:11 +0100 oj  r269657 : #i99060# handle vertical alignment
2009-03-18 13:28:28 +0100 oj  r269656 : #i99060# remove unused elements from sytle
2009-03-18 09:35:42 +0100 lla  r269639 : #i72390# cleanups
2009-03-18 09:31:20 +0100 lla  r269638 : #i72390# add ButtonList
2009-03-18 09:30:46 +0100 lla  r269637 : #i72390# renamed interface
2009-03-18 09:30:15 +0100 lla  r269636 : #i72390# use ButtonList instead of ImageList
2009-03-18 09:29:05 +0100 lla  r269635 : #i72390# new ButtonList, cleanups
2009-03-18 09:26:34 +0100 lla  r269634 : #i72390# cleanups
2009-03-17 12:21:20 +0100 oj  r269590 : #i99222# remove assertion
2009-03-17 12:17:22 +0100 oj  r269589 : #i98605# impl scale mode
2009-03-17 12:10:42 +0100 oj  r269588 : #i98605# impl scale mode
2009-03-17 11:40:15 +0100 oj  r269584 : #i96944# doesn't create equation for shapes
2009-03-17 11:33:16 +0100 oj  r269583 : #i96423# switch calc from float to long
2009-03-16 15:19:18 +0100 fs  r269550 : #i41930# enable zoom for embedded/outplace documents
2009-03-16 14:25:54 +0100 oj  r269542 : #i93734# remove ContextSensitive
2009-03-16 14:21:58 +0100 oj  r269541 : #i99274# page header before group header
2009-03-16 14:18:23 +0100 oj  r269539 : #i99110# fix value type
2009-03-16 14:14:16 +0100 fs  r269537 : line ends
2009-03-16 14:11:06 +0100 fs  r269535 : line ends
2009-03-16 14:08:34 +0100 fs  r269534 : #i100087# (provided my np): allow for polymorphic types with more than one parameter
2009-03-16 12:30:31 +0100 oj  r269521 : compile error
2009-03-16 12:19:12 +0100 oj  r269519 : compile error
2009-03-16 10:39:28 +0100 oj  r269511 : compile error under linux with swap
2009-03-13 10:33:04 +0100 oj  r269462 : CWS-TOOLING: rebase CWS dba32b to trunk@269297 (milestone: DEV300:m43)
2009-03-12 14:37:25 +0100 fs  r269416 : interface SequenceOutputStreamTest is unneeded, and pollutes the namespace here :)
2009-03-12 14:35:07 +0100 fs  r269414 : not needed
2009-03-12 14:34:15 +0100 fs  r269413 : preparation for multiple tests in this module
2009-03-12 14:33:02 +0100 fs  r269412 : ShowTargets was moved from module integration.forms to module complexlib
2009-03-12 14:32:48 +0100 fs  r269411 : helper class for projects containing multiple complex test cases (and following a certain structure)
2009-03-12 14:00:14 +0100 fs  r269407 : proper module after the move
2009-03-12 13:59:10 +0100 fs  r269406 : superseded by ../makefile.mk
2009-03-12 13:47:38 +0100 fs  r269403 : not needed anymore
2009-03-12 13:45:46 +0100 fs  r269402 : moved, in preparation of adding more test cases here, with a common infrastructure
2009-03-12 13:45:07 +0100 fs  r269401 : moved from ../
2009-03-12 13:43:59 +0100 fs  r269400 : moved to ./comphelper, in preparation of adding more test cases here, with a common infrastructure
2009-03-12 13:29:47 +0100 oj  r269396 : #i99914# set parent on dataprovider
2009-03-12 13:10:35 +0100 oj  r269393 : #i99832# check thrown exception and show error
2009-03-12 13:08:10 +0100 fs  r269392 : reorganizing tests
2009-03-12 12:52:55 +0100 oj  r269390 : #i99118# convert formatkey in numberformat
2009-03-12 12:34:53 +0100 fs  r269388 : new API tests
2009-03-12 12:29:05 +0100 fs  r269386 : Map not yet committed
2009-03-12 12:28:36 +0100 fs  r269385 : oops, forgot the SequenceInputStream during the previous refactoring
2009-03-12 12:12:39 +0100 oj  r269384 : #i99104# set HasCategories prop
2009-03-12 12:12:08 +0100 oj  r269383 : #i99104# check HasCategories even for internal dataprovider
2009-03-12 12:10:40 +0100 oj  r269382 : #i99104# set HasCategories prop
2009-03-12 10:51:49 +0100 fs  r269373 : #i10000# exception specifications
2009-03-12 10:49:18 +0100 fs  r269372 : #i10000# exception specifications
2009-03-12 10:44:02 +0100 fs  r269371 : #i10000# exception specifications
2009-03-12 10:30:55 +0100 fs  r269368 : refactored the UNO service registration in this module, using the helper classes provided by comphelper itself, so you have less effort when extending the list of to-be-registered components
2009-03-12 10:30:37 +0100 fs  r269367 : module-local includes
2009-03-12 07:05:54 +0100 oj  r269357 : #i99104# database dataprovider doesn't need dataranges and diagramdata
2009-03-11 10:58:28 +0100 oj  r269306 : #i99911# check if name of the report is a valid file name
2009-03-11 10:03:23 +0100 oj  r269299 : #i99666# the report is new when the HierarchicalDocumentName is empty
2009-03-10 11:32:45 +0100 oj  r269258 : #i99221# use fallback for language
2009-03-10 10:48:40 +0100 oj  r269255 : #i99433# now use OStringBuffer
2009-03-10 10:36:21 +0100 fs  r269252 : initial version of (X)Map
2009-03-10 09:52:23 +0100 oj  r269246 : #i99433# now use OStringBuffer
2009-03-10 08:56:13 +0100 oj  r269240 : #i99655# patch applied
2009-03-09 07:35:33 +0100 lla  r269058 : #i10000# wrong variable assignment fixed
2009-03-06 17:20:40 +0100 fs  r269030 : some explicit defaults
2009-03-06 17:20:30 +0100 fs  r269029 : #i98600#
2009-03-06 14:40:34 +0100 fs  r269009 : #i87692# during reload, prevent the document being modified just because of some control content changes ...
2009-03-06 12:52:20 +0100 lla  r268997 : #i10000# ambigous problem with FontWeight fixed
2009-03-06 11:39:32 +0100 fs  r268989 : #i10000# (approved by pl): use --without-t1-library configure option
2009-03-06 10:55:43 +0100 fs  r268986 : #i99953# depends on xmlscript module now
2009-03-06 10:54:04 +0100 fs  r268985 : #i99953# also adjust the event names found in dialogs embedded in the forms
2009-03-06 09:53:41 +0100 fs  r268977 : #i10000#
2009-03-06 09:30:41 +0100 lla  r268973 : #i10000# merge problems
2009-03-05 17:52:34 +0100 fs  r268932 : #i98593# for sub components which are actually controlled by a DocumentDefinition (aka XComponentSupplier aka XCommandProcessor), close them by executing the 'close' command, not by suspending/closing the controller (which cannot be intercepted)
2009-03-05 11:41:56 +0100 fs  r268889 : default the drop down line count for list/combo boxes to 20
2009-03-05 11:39:10 +0100 fs  r268887 : do not display empty error messages
2009-03-02 10:13:57 +0100 lla  r268639 : #i91541# CWS rebase m41 to m42
2009-03-02 09:06:27 +0100 lla  r268635 : #i10000# add ';' to strings
2009-02-26 11:18:00 +0100 fs  r268492 : reportdesign depends on REPORTBUILDER, not REPORTDESIGN
2009-02-26 10:11:38 +0100 lla  r268489 : CWS-TOOLING: rebase CWS dba32b to trunk@268395 (milestone: DEV300:m42)
2009-02-26 09:04:11 +0100 lla  r268488 : CWS-TOOLING: rebase CWS dba32b to trunk@268395 (milestone: DEV300:m42)
2009-02-24 12:09:13 +0100 lla  r268392 : #i91541# #i91542# cleanups
2009-02-24 08:08:06 +0100 lla  r268382 : merge all dba32a changes into dba32b
2009-02-24 07:14:55 +0100 lla  r268381 : merge all dba32a changes into dba32b
2009-02-23 21:44:28 +0100 fs  r268377 : oops ... don't tamper with m_aListSourceValues at the end of loadData
2009-02-23 20:57:05 +0100 fs  r268376 : #i98162# don't hold the values as strings, but as ORowSetValue, this way preserving their type, and being agnostic to different result/rowset implementations doing different to-string-conversations
2009-02-23 20:55:44 +0100 fs  r268375 : getObject: throwFunctionNotSupportedException, instead of silently returning NULL
2009-02-23 20:55:20 +0100 fs  r268374 : #i98162# some more supported types
2009-02-23 20:54:43 +0100 fs  r268373 : #i98162# +operator !=
2009-02-20 09:35:39 +0100 fs  r268306 : #i99422# for a font, display the font name, the style, and the size
2009-02-20 09:33:45 +0100 fs  r268305 : #i99422# in the property browser, FONT supersedes CHARFONTNAME: the aggregated FormComponentHandler displays them more nicely now
2009-02-19 16:12:06 +0100 fs  r268293 : #i99372# recognize DataType::FLOAT as numeric
2009-02-19 15:43:12 +0100 fs  r268291 : #i99415#
2009-02-19 15:40:15 +0100 fs  r268290 : #i99242# lcl_firstFocussableControl: take disabled controls into account
2009-02-19 15:34:36 +0100 fs  r268289 : #i99396# properly decode the base name of the URL when using it as title
2009-02-19 15:19:05 +0100 fs  r268287 : #i98247#
2009-06-05 09:47:55 +00:00

1710 lines
65 KiB
C++

/*************************************************************************
*
* 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: TableController.cxx,v $
* $Revision: 1.122.24.3 $
*
* 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 DBUI_TABLECONTROLLER_HXX
#include "TableController.hxx"
#endif
#ifndef _DBAU_REGHELPER_HXX_
#include "dbu_reghelper.hxx"
#endif
#ifndef _STRING_HXX
#include <tools/string.hxx>
#endif
#include <tools/diagnose_ex.h>
#ifndef _SFXSIDS_HRC
#include <sfx2/sfxsids.hrc>
#endif
#ifndef _DBU_TBL_HRC_
#include "dbu_tbl.hrc"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef DBACCESS_SOURCE_UI_INC_DEFAULTOBJECTNAMECHECK_HXX
#include "defaultobjectnamecheck.hxx"
#endif
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
#include <connectivity/dbtools.hxx>
#endif
#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#endif
#ifndef _COMPHELPER_EXTRACT_HXX_
#include <comphelper/extract.hxx>
#endif
#ifndef DBAUI_DLGSAVE_HXX
#include "dlgsave.hxx"
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
#include <com/sun/star/container/XChild.hpp>
#endif
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XDATADESCRIPTORFACTORY_HPP_
#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_KEYTYPE_HPP_
#include <com/sun/star/sdbcx/KeyType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XDROP_HPP_
#include <com/sun/star/sdbcx/XDrop.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XALTERTABLE_HPP_
#include <com/sun/star/sdbcx/XAlterTable.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XAPPEND_HPP_
#include <com/sun/star/sdbcx/XAppend.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
#include <com/sun/star/sdb/SQLContext.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_SQLWARNING_HPP_
#include <com/sun/star/sdbc/SQLWarning.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
#include <com/sun/star/sdbc/ColumnValue.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
#include <com/sun/star/sdbc/XRow.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XINDEXESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XIndexesSupplier.hpp>
#endif
#include <com/sun/star/frame/XTitleChangeListener.hpp>
#ifndef _DBHELPER_DBEXCEPTION_HXX_
#include <connectivity/dbexception.hxx>
#endif
#ifndef _COM_SUN_STAR_UI_XEXECUTABLEDIALOG_HPP_
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
#endif
#include <com/sun/star/frame/XUntitledNumbers.hpp>
#ifndef _COMPHELPER_STREAMSECTION_HXX_
#include <comphelper/streamsection.hxx>
#endif
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HPP_
#include <com/sun/star/io/XActiveDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HPP_
#include <com/sun/star/io/XActiveDataSink.hpp>
#endif
#ifndef DBAUI_TABLEDESIGNVIEW_HXX
#include "TableDesignView.hxx"
#endif
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
#include <com/sun/star/sdb/CommandType.hpp>
#endif
#ifndef DBAUI_FIELDDESCRIPTIONS_HXX
#include "FieldDescriptions.hxx"
#endif
#ifndef DBAUI_TABLEROW_HXX
#include "TableRow.hxx"
#endif
#ifndef DBAUI_TYPEINFO_HXX
#include "TypeInfo.hxx"
#endif
#ifndef DBAUI_TABLEEDITORCONTROL_HXX
#include "TEditControl.hxx"
#endif
#ifndef _DBAUI_SQLMESSAGE_HXX_
#include "sqlmessage.hxx"
#endif
#ifndef _SV_MSGBOX_HXX
#include <vcl/msgbox.hxx>
#endif
#ifndef _DBAUI_INDEXDIALOG_HXX_
#include "indexdialog.hxx"
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#ifndef DBAUI_TOOLS_HXX
#include "UITools.hxx"
#endif
#include <boost/mem_fn.hpp>
#ifndef _CPPUHELPER_EXC_HLP_HXX_
#include <cppuhelper/exc_hlp.hxx>
#endif
#include "dsmeta.hxx"
extern "C" void SAL_CALL createRegistryInfo_OTableControl()
{
static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::OTableController > aAutoRegistration;
}
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::io;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::frame;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::ui;
using namespace ::com::sun::star::util;
using namespace ::dbtools;
using namespace ::dbaui;
using namespace ::comphelper;
namespace
{
void dropTable(const Reference<XNameAccess>& _rxTable,const ::rtl::OUString& _sTableName)
{
if ( _rxTable->hasByName(_sTableName) )
{
Reference<XDrop> xNameCont(_rxTable,UNO_QUERY);
OSL_ENSURE(xNameCont.is(),"No drop interface for tables!");
if ( xNameCont.is() )
xNameCont->dropByName(_sTableName);
}
}
//------------------------------------------------------------------------------
struct OTableRowCompare : public ::std::binary_function< ::boost::shared_ptr<OTableRow> , ::rtl::OUString, bool>
{
bool operator() (const ::boost::shared_ptr<OTableRow> lhs, const ::rtl::OUString& rhs) const
{
OFieldDescription* pField = lhs->GetActFieldDescr();
return pField && pField->GetName() == rhs;
}
};
}
//------------------------------------------------------------------------------
::rtl::OUString SAL_CALL OTableController::getImplementationName() throw( RuntimeException )
{
return getImplementationName_Static();
}
//------------------------------------------------------------------------------
::rtl::OUString OTableController::getImplementationName_Static() throw( RuntimeException )
{
return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.OTableDesign");
}
//------------------------------------------------------------------------------
Sequence< ::rtl::OUString> OTableController::getSupportedServiceNames_Static(void) throw( RuntimeException )
{
Sequence< ::rtl::OUString> aSupported(1);
aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.TableDesign");
return aSupported;
}
//-------------------------------------------------------------------------
Sequence< ::rtl::OUString> SAL_CALL OTableController::getSupportedServiceNames() throw(RuntimeException)
{
return getSupportedServiceNames_Static();
}
// -------------------------------------------------------------------------
Reference< XInterface > SAL_CALL OTableController::Create(const Reference<XMultiServiceFactory >& _rxFactory)
{
return *(new OTableController(_rxFactory));
}
DBG_NAME(OTableController)
// -----------------------------------------------------------------------------
OTableController::OTableController(const Reference< XMultiServiceFactory >& _rM) : OTableController_BASE(_rM)
,m_sTypeNames(ModuleRes(STR_TABLEDESIGN_DBFIELDTYPES))
,m_pTypeInfo()
,m_bAllowAutoIncrementValue(sal_False)
,m_bNew(sal_True)
{
DBG_CTOR(OTableController,NULL);
InvalidateAll();
m_pTypeInfo = TOTypeInfoSP(new OTypeInfo());
m_pTypeInfo->aUIName = m_sTypeNames.GetToken(TYPE_OTHER);
m_aTypeCollection.initUserDriverTypes(_rM);
}
// -----------------------------------------------------------------------------
OTableController::~OTableController()
{
m_aTypeInfoIndex.clear();
m_aTypeInfo.clear();
DBG_DTOR(OTableController,NULL);
}
// -----------------------------------------------------------------------------
void OTableController::startTableListening()
{
Reference< XComponent > xComponent(m_xTable, UNO_QUERY);
if (xComponent.is())
xComponent->addEventListener(static_cast<XModifyListener*>(this));
}
// -----------------------------------------------------------------------------
void OTableController::stopTableListening()
{
Reference< XComponent > xComponent(m_xTable, UNO_QUERY);
if (xComponent.is())
xComponent->removeEventListener(static_cast<XModifyListener*>(this));
}
// -----------------------------------------------------------------------------
void OTableController::disposing()
{
OTableController_BASE::disposing();
m_pView = NULL;
m_vRowList.clear();
}
// -----------------------------------------------------------------------------
FeatureState OTableController::GetState(sal_uInt16 _nId) const
{
FeatureState aReturn;
// (disabled automatically)
switch (_nId)
{
case ID_BROWSER_CLOSE:
aReturn.bEnabled = sal_True;
break;
case ID_BROWSER_EDITDOC:
aReturn.bChecked = isEditable();
aReturn.bEnabled = m_bNew || isEditable();// the editable flag is set through this one -> || isAddAllowed() || isDropAllowed() || isAlterAllowed();
break;
case ID_BROWSER_SAVEDOC:
aReturn.bEnabled = isModified();
if ( aReturn.bEnabled )
{
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = ::std::find_if(m_vRowList.begin(),m_vRowList.end(),
::boost::mem_fn(&OTableRow::isValid));
aReturn.bEnabled = aIter != m_vRowList.end();
}
break;
case ID_BROWSER_SAVEASDOC:
aReturn.bEnabled = isConnected() && isEditable();
if ( aReturn.bEnabled )
{
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = ::std::find_if(m_vRowList.begin(),m_vRowList.end(),
::boost::mem_fn(&OTableRow::isValid));
aReturn.bEnabled = aIter != m_vRowList.end();
}
break;
case ID_BROWSER_CUT:
aReturn.bEnabled = isEditable() && m_aCurrentFrame.isActive() && getView() && static_cast<OTableDesignView*>(getView())->isCutAllowed();
break;
case ID_BROWSER_COPY:
aReturn.bEnabled = m_aCurrentFrame.isActive() && getView() && static_cast<OTableDesignView*>(getView())->isCopyAllowed();
break;
case ID_BROWSER_PASTE:
aReturn.bEnabled = isEditable() && m_aCurrentFrame.isActive() && getView() && static_cast<OTableDesignView*>(getView())->isPasteAllowed();
break;
case SID_INDEXDESIGN:
aReturn.bEnabled =
( ( ((!m_bNew && isModified()) || isModified())
|| Reference< XIndexesSupplier >(m_xTable, UNO_QUERY).is()
)
&& isConnected()
);
if ( aReturn.bEnabled )
{
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = ::std::find_if(m_vRowList.begin(),m_vRowList.end(),
::boost::mem_fn(&OTableRow::isValid));
aReturn.bEnabled = aIter != m_vRowList.end();
}
break;
default:
aReturn = OTableController_BASE::GetState(_nId);
}
return aReturn;
}
// -----------------------------------------------------------------------------
void OTableController::Execute(sal_uInt16 _nId, const Sequence< PropertyValue >& aArgs)
{
switch(_nId)
{
case ID_BROWSER_EDITDOC:
setEditable(!isEditable());
static_cast<OTableDesignView*>(getView())->setReadOnly(!isEditable());
InvalidateFeature(ID_BROWSER_PASTE);
InvalidateFeature(SID_BROWSER_CLEAR_QUERY);
break;
case ID_BROWSER_SAVEASDOC:
doSaveDoc(sal_True);
break;
case ID_BROWSER_SAVEDOC:
static_cast<OTableDesignView*>(getView())->GetEditorCtrl()->SaveCurRow();
doSaveDoc(sal_False);
break;
case ID_BROWSER_CUT:
static_cast<OTableDesignView*>(getView())->cut();
break;
case ID_BROWSER_COPY:
static_cast<OTableDesignView*>(getView())->copy();
break;
case ID_BROWSER_PASTE:
static_cast<OTableDesignView*>(getView())->paste();
break;
case SID_INDEXDESIGN:
doEditIndexes();
break;
default:
OTableController_BASE::Execute(_nId,aArgs);
}
InvalidateFeature(_nId);
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::doSaveDoc(sal_Bool _bSaveAs)
{
if (!isConnected())
reconnect(sal_True); // ask the user for a new connection
Reference<XTablesSupplier> xTablesSup(getConnection(),UNO_QUERY);
if (!xTablesSup.is())
{
String aMessage(ModuleRes(STR_TABLEDESIGN_CONNECTION_MISSING));
OSQLWarningBox( getView(), aMessage ).Execute();
return sal_False;
}
// check if a column exists
// TODO
Reference<XNameAccess> xTables;
::rtl::OUString sCatalog, sSchema;
sal_Bool bNew = (0 == m_sName.getLength());
bNew = bNew || m_bNew || _bSaveAs;
try
{
xTables = xTablesSup->getTables();
OSL_ENSURE(xTables.is(),"The tables can't be null!");
bNew = bNew || (xTables.is() && !xTables->hasByName(m_sName));
// first we need a name for our query so ask the user
if(bNew)
{
String aDefaultName;
if (_bSaveAs && !bNew)
aDefaultName = String(m_sName);
else
{
String aName = String(ModuleRes(STR_TBL_TITLE));
aDefaultName = aName.GetToken(0,' ');
//aDefaultName = getPrivateTitle();
aDefaultName = ::dbtools::createUniqueName(xTables,aDefaultName);
}
DynamicTableOrQueryNameCheck aNameChecker( getConnection(), CommandType::TABLE );
OSaveAsDlg aDlg( getView(), CommandType::TABLE, getORB(), getConnection(), aDefaultName, aNameChecker );
if ( aDlg.Execute() != RET_OK )
return sal_False;
m_sName = aDlg.getName();
sCatalog = aDlg.getCatalog();
sSchema = aDlg.getSchema();
}
// did we get a name
if(!m_sName.getLength())
return sal_False;
}
catch(Exception&)
{
OSL_ENSURE(sal_False, "OTableController::doSaveDoc: nothing is expected to happen here!");
}
sal_Bool bAlter = sal_False;
sal_Bool bError = sal_False;
SQLExceptionInfo aInfo;
try
{
// check the columns for double names
if(!checkColumns(bNew || !xTables->hasByName(m_sName)))
{
// #105323# OJ
return sal_False;
}
Reference<XPropertySet> xTable;
if(bNew || !xTables->hasByName(m_sName)) // just to make sure the table already exists
{
dropTable(xTables,m_sName);
Reference<XDataDescriptorFactory> xFact(xTables,UNO_QUERY);
OSL_ENSURE(xFact.is(),"OTableController::doSaveDoc: No XDataDescriptorFactory available!");
xTable = xFact->createDataDescriptor();
OSL_ENSURE(xTable.is(),"OTableController::doSaveDoc: Create query failed!");
// to set the name is only allowed when the wuery is new
xTable->setPropertyValue(PROPERTY_CATALOGNAME,makeAny(sCatalog));
xTable->setPropertyValue(PROPERTY_SCHEMANAME,makeAny(sSchema));
xTable->setPropertyValue(PROPERTY_NAME,makeAny(m_sName));
// now append the columns
Reference<XColumnsSupplier> xColSup(xTable,UNO_QUERY);
appendColumns(xColSup,bNew);
// now append the primary key
Reference<XKeysSupplier> xKeySup(xTable,UNO_QUERY);
appendPrimaryKey(xKeySup,bNew);
}
// now set the properties
if(bNew)
{
Reference<XAppend> xAppend(xTables,UNO_QUERY);
OSL_ENSURE(xAppend.is(),"OTableController::doSaveDoc: No XAppend Interface!");
xAppend->appendByDescriptor(xTable);
assignTable();
if(!m_xTable.is()) // correct name and try again
{
// it can be that someone inserted new data for us
m_sName = ::dbtools::composeTableName( getConnection()->getMetaData(), xTable, ::dbtools::eInDataManipulation, false, false, false );
assignTable();
}
// now check if our datasource has set a tablefilter and if append the new table name to it
::dbaui::appendToFilter(getConnection(),m_sName,getORB(),getView()); // we are not interessted in the return value
Reference< frame::XTitleChangeListener> xEventListener(impl_getTitleHelper_throw(),UNO_QUERY);
if ( xEventListener.is() )
{
frame::TitleChangedEvent aEvent;
xEventListener->titleChanged(aEvent);
}
releaseNumberForComponent();
}
else if(m_xTable.is())
{
bAlter = sal_True;
alterColumns();
}
reSyncRows();
}
catch(const SQLContext& e)
{
aInfo = SQLExceptionInfo(e);
}
catch(const SQLWarning& e)
{
aInfo = SQLExceptionInfo(e);
}
catch(const SQLException& e)
{
aInfo = SQLExceptionInfo(e);
}
catch(const ElementExistException& )
{
String sText( ModuleRes( STR_NAME_ALREADY_EXISTS ) );
sText.SearchAndReplaceAscii( "#" , m_sName);
OSQLMessageBox aDlg( getView(), String( ModuleRes( STR_ERROR_DURING_CREATION ) ), sText, WB_OK, OSQLMessageBox::Error );
aDlg.Execute();
bError = sal_True;
}
catch( const Exception& )
{
bError = sal_True;
DBG_UNHANDLED_EXCEPTION();
}
if ( aInfo.isValid() )
aInfo.prepend( String( ModuleRes( STR_TABLEDESIGN_SAVE_ERROR ) ) );
showError(aInfo);
if (aInfo.isValid() || bError)
{
if(!bAlter || bNew)
{
m_sName = ::rtl::OUString();
stopTableListening();
m_xTable = NULL;
}
// reload(); // a error occured so we have to reload
}
return ! (aInfo.isValid() || bError);
}
// -----------------------------------------------------------------------------
void OTableController::doEditIndexes()
{
// table needs to be saved before editing indexes
if (m_bNew || isModified())
{
QueryBox aAsk(getView(), ModuleRes(QUERY_SAVE_TABLE_EDIT_INDEXES));
if (RET_YES != aAsk.Execute())
return;
if (!doSaveDoc(sal_False))
return;
OSL_ENSURE(!m_bNew && !isModified(), "OTableController::doEditIndexes: what the hell did doSaveDoc do?");
}
Reference< XNameAccess > xIndexes; // will be the keys of the table
Sequence< ::rtl::OUString > aFieldNames; // will be the column names of the table
try
{
// get the keys
Reference< XIndexesSupplier > xIndexesSupp(m_xTable, UNO_QUERY);
if (xIndexesSupp.is())
{
xIndexes = xIndexesSupp->getIndexes();
OSL_ENSURE(xIndexes.is(), "OTableController::doEditIndexes: no keys got from the indexes supplier!");
}
else
OSL_ENSURE(sal_False, "OTableController::doEditIndexes: should never have reached this (no indexes supplier)!");
// get the field names
Reference< XColumnsSupplier > xColSupp(m_xTable, UNO_QUERY);
OSL_ENSURE(xColSupp.is(), "OTableController::doEditIndexes: no columns supplier!");
if (xColSupp.is())
{
Reference< XNameAccess > xCols = xColSupp->getColumns();
OSL_ENSURE(xCols.is(), "OTableController::doEditIndexes: no columns!");
if (xCols.is())
aFieldNames = xCols->getElementNames();
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
if (!xIndexes.is())
return;
DbaIndexDialog aDialog(getView(), aFieldNames, xIndexes, getConnection(),getORB(),isConnected() ? getConnection()->getMetaData().is() && getConnection()->getMetaData()->getMaxColumnsInIndex() : sal_Int32(0));
if (RET_OK != aDialog.Execute())
return;
}
// -----------------------------------------------------------------------------
void OTableController::impl_initialize()
{
try
{
OTableController_BASE::impl_initialize();
const NamedValueCollection& rArguments( getInitParams() );
rArguments.get_ensureType( (::rtl::OUString)PROPERTY_CURRENTTABLE, m_sName );
// read autoincrement value set in the datasource
::dbaui::fillAutoIncrementValue(getDataSource(),m_bAllowAutoIncrementValue,m_sAutoIncrementValue);
assignTable();
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
try
{
::dbaui::fillTypeInfo(getConnection(),m_sTypeNames,m_aTypeInfo,m_aTypeInfoIndex); // fill the needed type information
}
catch(const SQLException&)
{
OSQLWarningBox( getView(), ModuleRes( STR_NO_TYPE_INFO_AVAILABLE ) ).Execute();
throw;
}
try
{
loadData(); // fill the column information form the table
getView()->initialize(); // show the windows and fill with our informations
getUndoMgr()->Clear(); // clear all undo redo things
setModified(sal_False); // and we are not modified yet
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::Construct(Window* pParent)
{
m_pView = new OTableDesignView( pParent, getORB(), *this );
OTableController_BASE::Construct(pParent);
// m_pView->Construct();
// m_pView->Show();
return sal_True;
}
// -----------------------------------------------------------------------------
sal_Bool SAL_CALL OTableController::suspend(sal_Bool /*_bSuspend*/) throw( RuntimeException )
{
if ( getBroadcastHelper().bInDispose || getBroadcastHelper().bDisposed )
return sal_True;
vos::OGuard aSolarGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( getMutex() );
if ( getView() && getView()->IsInModalMode() )
return sal_False;
if ( getView() )
static_cast<OTableDesignView*>(getView())->GrabFocus();
sal_Bool bCheck = sal_True;
if ( isModified() )
{
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = ::std::find_if(m_vRowList.begin(),m_vRowList.end(),
::boost::mem_fn(&OTableRow::isValid));
if ( aIter != m_vRowList.end() )
{
QueryBox aQry(getView(), ModuleRes(TABLE_DESIGN_SAVEMODIFIED));
switch (aQry.Execute())
{
case RET_YES:
Execute(ID_BROWSER_SAVEDOC,Sequence<PropertyValue>());
if ( isModified() )
bCheck = sal_False; // when we save the table this must be false else some press cancel
break;
case RET_CANCEL:
bCheck = sal_False;
default:
break;
}
}
else if ( !m_bNew )
{
QueryBox aQry(getView(), ModuleRes(TABLE_DESIGN_ALL_ROWS_DELETED));
switch (aQry.Execute())
{
case RET_YES:
{
try
{
Reference<XTablesSupplier> xTablesSup(getConnection(),UNO_QUERY);
Reference<XNameAccess> xTables = xTablesSup->getTables();
dropTable(xTables,m_sName);
}
catch(const Exception&)
{
OSL_ENSURE(sal_False, "OTableController::suspend: nothing is expected to happen here!");
}
}
break;
case RET_CANCEL:
bCheck = sal_False;
default:
break;
}
}
}
/*
if ( bCheck )
OSingleDocumentController::suspend(_bSuspend);
*/
return bCheck;
}
// -----------------------------------------------------------------------------
void OTableController::describeSupportedFeatures()
{
OSingleDocumentController::describeSupportedFeatures();
implDescribeSupportedFeature( ".uno:Redo", ID_BROWSER_REDO, CommandGroup::EDIT );
implDescribeSupportedFeature( ".uno:Save", ID_BROWSER_SAVEDOC, CommandGroup::EDIT );
implDescribeSupportedFeature( ".uno:Undo", ID_BROWSER_UNDO, CommandGroup::EDIT );
implDescribeSupportedFeature( ".uno:HelpMenu", SID_HELPMENU, CommandGroup::APPLICATION );
implDescribeSupportedFeature( ".uno:NewDoc", SID_NEWDOC, CommandGroup::DOCUMENT );
implDescribeSupportedFeature( ".uno:SaveAs", ID_BROWSER_SAVEASDOC, CommandGroup::DOCUMENT );
implDescribeSupportedFeature( ".uno:DBIndexDesign", SID_INDEXDESIGN, CommandGroup::APPLICATION );
implDescribeSupportedFeature( ".uno:EditDoc", ID_BROWSER_EDITDOC, CommandGroup::EDIT );
}
// -----------------------------------------------------------------------------
SfxUndoManager* OTableController::getUndoMgr()
{
return &m_aUndoManager;
}
// -----------------------------------------------------------------------------
void OTableController::setModified(sal_Bool _bModified)
{
OSingleDocumentController::setModified(_bModified);
InvalidateFeature(SID_INDEXDESIGN);
}
// -----------------------------------------------------------------------------
void SAL_CALL OTableController::disposing( const EventObject& _rSource ) throw(RuntimeException)
{
if ( _rSource.Source == m_xTable )
{ // some deleted our table so we have a new one
stopTableListening();
m_xTable = NULL;
m_bNew = sal_True;
setModified(sal_True);
}
else
OTableController_BASE::disposing( _rSource );
}
// -----------------------------------------------------------------------------
void OTableController::Save(const Reference< XObjectOutputStream>& _rxOut)
{
OStreamSection aSection(_rxOut.get());
}
// -----------------------------------------------------------------------------
void OTableController::Load(const Reference< XObjectInputStream>& _rxIn)
{
OStreamSection aSection(_rxIn.get());
}
// -----------------------------------------------------------------------------
void OTableController::losingConnection( )
{
// let the base class do it's reconnect
OTableController_BASE::losingConnection( );
// remove from the table
Reference< XComponent > xComponent(m_xTable, UNO_QUERY);
if (xComponent.is())
{
Reference<XEventListener> xEvtL( static_cast< ::cppu::OWeakObject*>(this), UNO_QUERY);
xComponent->removeEventListener(xEvtL);
}
stopTableListening();
m_xTable = NULL;
assignTable();
if(!m_xTable.is())
{
m_bNew = sal_True;
setModified(sal_True);
}
InvalidateAll();
}
// -----------------------------------------------------------------------------
TOTypeInfoSP OTableController::getTypeInfoByType(sal_Int32 _nDataType) const
{
return queryTypeInfoByType(_nDataType,m_aTypeInfo);
}
// -----------------------------------------------------------------------------
void OTableController::appendColumns(Reference<XColumnsSupplier>& _rxColSup,sal_Bool _bNew,sal_Bool _bKeyColumns)
{
try
{
// now append the columns
OSL_ENSURE(_rxColSup.is(),"No columns supplier");
if(!_rxColSup.is())
return;
Reference<XNameAccess> xColumns = _rxColSup->getColumns();
OSL_ENSURE(xColumns.is(),"No columns");
Reference<XDataDescriptorFactory> xColumnFactory(xColumns,UNO_QUERY);
Reference<XAppend> xAppend(xColumns,UNO_QUERY);
OSL_ENSURE(xAppend.is(),"No XAppend Interface!");
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vRowList.begin();
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_vRowList.end();
for(;aIter != aEnd;++aIter)
{
OSL_ENSURE(*aIter,"OTableRow is null!");
OFieldDescription* pField = (*aIter)->GetActFieldDescr();
if ( !pField || (!_bNew && (*aIter)->IsReadOnly() && !_bKeyColumns) )
continue;
Reference<XPropertySet> xColumn;
if(pField->IsPrimaryKey() || !_bKeyColumns)
xColumn = xColumnFactory->createDataDescriptor();
if(xColumn.is())
{
if(!_bKeyColumns)
::dbaui::setColumnProperties(xColumn,pField);
else
xColumn->setPropertyValue(PROPERTY_NAME,makeAny(pField->GetName()));
xAppend->appendByDescriptor(xColumn);
xColumn = NULL;
// now only the settings are missing
if(xColumns->hasByName(pField->GetName()))
{
xColumns->getByName(pField->GetName()) >>= xColumn;
if(xColumn.is())
pField->copyColumnSettingsTo(xColumn);
}
else
{
OSL_ENSURE(sal_False, "OTableController::appendColumns: invalid field name!");
}
}
}
}
catch(const SQLException& )
{
showError( SQLExceptionInfo( ::cppu::getCaughtException() ) );
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
}
// -----------------------------------------------------------------------------
void OTableController::appendPrimaryKey(Reference<XKeysSupplier>& _rxSup,sal_Bool _bNew)
{
if(!_rxSup.is())
return; // the database doesn't support keys
OSL_ENSURE(_rxSup.is(),"No XKeysSupplier!");
Reference<XIndexAccess> xKeys(_rxSup->getKeys(),UNO_QUERY);
Reference<XPropertySet> xProp;
const sal_Int32 nCount = xKeys->getCount();
for(sal_Int32 i=0;i< nCount ;++i)
{
xKeys->getByIndex(i) >>= xProp;
sal_Int32 nKeyType = 0;
xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
if(KeyType::PRIMARY == nKeyType)
{
return; // primary key already exists after appending a column
}
}
Reference<XDataDescriptorFactory> xKeyFactory(xKeys,UNO_QUERY);
OSL_ENSURE(xKeyFactory.is(),"No XDataDescriptorFactory Interface!");
if ( !xKeyFactory.is() )
return;
Reference<XAppend> xAppend(xKeyFactory,UNO_QUERY);
OSL_ENSURE(xAppend.is(),"No XAppend Interface!");
Reference<XPropertySet> xKey = xKeyFactory->createDataDescriptor();
OSL_ENSURE(xKey.is(),"Key is null!");
xKey->setPropertyValue(PROPERTY_TYPE,makeAny(KeyType::PRIMARY));
Reference<XColumnsSupplier> xColSup(xKey,UNO_QUERY);
if(xColSup.is())
{
appendColumns(xColSup,_bNew,sal_True);
Reference<XNameAccess> xColumns = xColSup->getColumns();
if(xColumns->hasElements())
xAppend->appendByDescriptor(xKey);
}
}
// -----------------------------------------------------------------------------
void OTableController::loadData()
{
//////////////////////////////////////////////////////////////////////
// Wenn Datenstruktur bereits vorhanden, Struktur leeren
m_vRowList.clear();
::boost::shared_ptr<OTableRow> pTabEdRow;
Reference< XDatabaseMetaData> xMetaData = getMetaData( );
//////////////////////////////////////////////////////////////////////
// Datenstruktur mit Daten aus DatenDefinitionsObjekt fuellen
if(m_xTable.is() && xMetaData.is())
{
Reference<XColumnsSupplier> xColSup(m_xTable,UNO_QUERY);
OSL_ENSURE(xColSup.is(),"No XColumnsSupplier!");
Reference<XNameAccess> xColumns = xColSup->getColumns();
OFieldDescription* pActFieldDescr = NULL;
String aType;
//////////////////////////////////////////////////////////////////////
// ReadOnly-Flag
// Bei Drop darf keine Zeile editierbar sein.
// Bei Add duerfen nur die leeren Zeilen editierbar sein.
// Bei Add und Drop koennen alle Zeilen editiert werden.
// sal_Bool bReadOldRow = xMetaData->supportsAlterTableWithAddColumn() && xMetaData->supportsAlterTableWithDropColumn();
sal_Bool bIsAlterAllowed = isAlterAllowed();
Sequence< ::rtl::OUString> aColumns = xColumns->getElementNames();
const ::rtl::OUString* pIter = aColumns.getConstArray();
const ::rtl::OUString* pEnd = pIter + aColumns.getLength();
for(;pIter != pEnd;++pIter)
{
Reference<XPropertySet> xColumn;
xColumns->getByName(*pIter) >>= xColumn;
sal_Int32 nType = 0;
sal_Int32 nScale = 0;
sal_Int32 nPrecision = 0;
sal_Int32 nNullable = 0;
sal_Int32 nFormatKey = 0;
sal_Int32 nAlign = 0;
sal_Bool bIsAutoIncrement = false, bIsCurrency = false;
::rtl::OUString sName,sDescription,sTypeName;
Any aControlDefault;
// get the properties from the column
xColumn->getPropertyValue(PROPERTY_NAME) >>= sName;
xColumn->getPropertyValue(PROPERTY_TYPENAME) >>= sTypeName;
xColumn->getPropertyValue(PROPERTY_ISNULLABLE) >>= nNullable;
xColumn->getPropertyValue(PROPERTY_ISAUTOINCREMENT) >>= bIsAutoIncrement;
xColumn->getPropertyValue(PROPERTY_ISCURRENCY) >>= bIsCurrency;
xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
xColumn->getPropertyValue(PROPERTY_SCALE) >>= nScale;
xColumn->getPropertyValue(PROPERTY_PRECISION) >>= nPrecision;
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_HELPTEXT))
xColumn->getPropertyValue(PROPERTY_HELPTEXT) >>= sDescription;
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
aControlDefault = xColumn->getPropertyValue(PROPERTY_CONTROLDEFAULT);
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_FORMATKEY))
xColumn->getPropertyValue(PROPERTY_FORMATKEY) >>= nFormatKey;
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_ALIGN))
xColumn->getPropertyValue(PROPERTY_ALIGN) >>= nAlign;
pTabEdRow.reset(new OTableRow());
pTabEdRow->SetReadOnly(!bIsAlterAllowed);
// search for type
sal_Bool bForce;
::rtl::OUString sCreate(RTL_CONSTASCII_USTRINGPARAM("x"));
TOTypeInfoSP pTypeInfo = ::dbaui::getTypeInfoFromType(m_aTypeInfo,nType,sTypeName,sCreate,nPrecision,nScale,bIsAutoIncrement,bForce);
if ( !pTypeInfo.get() )
pTypeInfo = m_pTypeInfo;
pTabEdRow->SetFieldType( pTypeInfo, bForce );
pActFieldDescr = pTabEdRow->GetActFieldDescr();
OSL_ENSURE(pActFieldDescr, "OTableController::loadData: invalid field description generated by the table row!");
if ( pActFieldDescr )
{
pActFieldDescr->SetName(sName);
pActFieldDescr->SetFormatKey(nFormatKey);
// pActFieldDescr->SetPrimaryKey(pPrimary->GetValue());
pActFieldDescr->SetDescription(sDescription);
pActFieldDescr->SetAutoIncrement(bIsAutoIncrement);
pActFieldDescr->SetHorJustify(dbaui::mapTextJustify(nAlign));
pActFieldDescr->SetCurrency(bIsCurrency);
//////////////////////////////////////////////////////////////////////
// Spezielle Daten
pActFieldDescr->SetIsNullable(nNullable);
pActFieldDescr->SetControlDefault(aControlDefault);
pActFieldDescr->SetPrecision(nPrecision);
pActFieldDescr->SetScale(nScale);
}
m_vRowList.push_back( pTabEdRow);
}
// fill the primary key information
Reference<XNameAccess> xKeyColumns = getKeyColumns();
if(xKeyColumns.is())
{
Sequence< ::rtl::OUString> aKeyColumns = xKeyColumns->getElementNames();
const ::rtl::OUString* pKeyBegin = aKeyColumns.getConstArray();
const ::rtl::OUString* pKeyEnd = pKeyBegin + aKeyColumns.getLength();
for(;pKeyBegin != pKeyEnd;++pKeyBegin)
{
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator rowIter = m_vRowList.begin();
for(;rowIter != m_vRowList.end();++rowIter)
{
if((*rowIter)->GetActFieldDescr()->GetName() == *pKeyBegin)
{
(*rowIter)->SetPrimaryKey(sal_True);
break;
}
}
}
}
}
//////////////////////////////////////////////////////////////////////
// Leere Zeilen fuellen
OTypeInfoMap::iterator aTypeIter = m_aTypeInfo.find(DataType::VARCHAR);
if(aTypeIter == m_aTypeInfo.end())
aTypeIter = m_aTypeInfo.begin();
OSL_ENSURE(aTypeIter != m_aTypeInfo.end(),"We have no type infomation!");
bool bReadRow = !isAddAllowed();
for(sal_Int32 i=m_vRowList.size(); i<128; i++ )
{
pTabEdRow.reset(new OTableRow());
pTabEdRow->SetReadOnly(bReadRow);
m_vRowList.push_back( pTabEdRow);
}
}
// -----------------------------------------------------------------------------
Reference<XNameAccess> OTableController::getKeyColumns() const
{
// use keys and indexes for excat postioning
// first the keys
Reference<XKeysSupplier> xKeySup(m_xTable,UNO_QUERY);
Reference<XIndexAccess> xKeys;
if(xKeySup.is())
xKeys = xKeySup->getKeys();
Reference<XColumnsSupplier> xKeyColsSup;
Reference<XNameAccess> xKeyColumns;
if(xKeys.is())
{
Reference<XPropertySet> xProp;
sal_Int32 nCount = xKeys->getCount();
for(sal_Int32 i=0;i< nCount;++i)
{
xKeys->getByIndex(i) >>= xProp;
OSL_ENSURE(xProp.is(),"Key is invalid: NULL!");
if ( xProp.is() )
{
sal_Int32 nKeyType = 0;
xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
if(KeyType::PRIMARY == nKeyType)
{
xKeyColsSup.set(xProp,UNO_QUERY);
OSL_ENSURE(xKeyColsSup.is(),"Columnsupplier is null!");
xKeyColumns = xKeyColsSup->getColumns();
break;
}
}
}
}
return xKeyColumns;
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::checkColumns(sal_Bool _bNew) throw(::com::sun::star::sdbc::SQLException)
{
sal_Bool bOk = sal_True;
sal_Bool bFoundPKey = sal_False;
Reference< XDatabaseMetaData> xMetaData = getMetaData( );
::comphelper::UStringMixEqual bCase(xMetaData.is() ? xMetaData->supportsMixedCaseQuotedIdentifiers() : sal_True);
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_vRowList.begin();
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_vRowList.end();
for(;aIter != aEnd;++aIter)
{
OFieldDescription* pFieldDesc = (*aIter)->GetActFieldDescr();
if (pFieldDesc && pFieldDesc->GetName().getLength())
{
bFoundPKey |= (*aIter)->IsPrimaryKey();
// first check for duplicate names
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter2 = aIter+1;
for(;aIter2 != aEnd;++aIter2)
{
OFieldDescription* pCompareDesc = (*aIter2)->GetActFieldDescr();
if (pCompareDesc && bCase(pCompareDesc->GetName(),pFieldDesc->GetName()))
{
String strMessage = String(ModuleRes(STR_TABLEDESIGN_DUPLICATE_NAME));
strMessage.SearchAndReplaceAscii("$column$", pFieldDesc->GetName());
OSQLWarningBox( getView(), strMessage ).Execute();
return sal_False;
}
}
}
}
if(!bFoundPKey)
{
if(_bNew && xMetaData.is() && xMetaData->supportsCoreSQLGrammar())
{
String sTitle(ModuleRes(STR_TABLEDESIGN_NO_PRIM_KEY_HEAD));
String sMsg(ModuleRes(STR_TABLEDESIGN_NO_PRIM_KEY));
OSQLMessageBox aBox(getView(), sTitle,sMsg, WB_YES_NO_CANCEL | WB_DEF_YES);
INT16 nReturn = aBox.Execute();
if (nReturn == RET_YES)
{
::boost::shared_ptr<OTableRow> pNewRow(new OTableRow());
TOTypeInfoSP pTypeInfo = ::dbaui::queryPrimaryKeyType(m_aTypeInfo);
if ( pTypeInfo.get() )
{
pNewRow->SetFieldType( pTypeInfo );
OFieldDescription* pActFieldDescr = pNewRow->GetActFieldDescr();
pActFieldDescr->SetAutoIncrement(sal_False); // #95927# pTypeInfo->bAutoIncrement
pActFieldDescr->SetIsNullable(ColumnValue::NO_NULLS);
pActFieldDescr->SetName( createUniqueName(::rtl::OUString::createFromAscii("ID") ));
pActFieldDescr->SetPrimaryKey( sal_True );
m_vRowList.insert(m_vRowList.begin(),pNewRow);
static_cast<OTableDesignView*>(getView())->GetEditorCtrl()->Invalidate();
static_cast<OTableDesignView*>(getView())->GetEditorCtrl()->RowInserted(0);
} // if ( pTypeInfo.get() )
}
else if (nReturn == RET_CANCEL)
bOk = sal_False;
}
}
return bOk;
}
// -----------------------------------------------------------------------------
void OTableController::alterColumns()
{
Reference<XColumnsSupplier> xColSup(m_xTable,UNO_QUERY_THROW);
OSL_ENSURE(xColSup.is(),"What happen here?!");
Reference<XNameAccess> xColumns = xColSup->getColumns();
Reference<XIndexAccess> xIdxColumns(xColumns,UNO_QUERY_THROW);
OSL_ENSURE(xColumns.is(),"No columns");
if ( !xColumns.is() )
return;
Reference<XAlterTable> xAlter(m_xTable,UNO_QUERY); // can be null
sal_Int32 nColumnCount = xIdxColumns->getCount();
Reference<XDrop> xDrop(xColumns,UNO_QUERY); // can be null
Reference<XAppend> xAppend(xColumns,UNO_QUERY); // can be null
Reference<XDataDescriptorFactory> xColumnFactory(xColumns,UNO_QUERY); // can be null
sal_Bool bReload = sal_False; // refresh the data
// contains all columns names which are already handled those which are not in the list will be deleted
Reference< XDatabaseMetaData> xMetaData = getMetaData( );
::std::map< ::rtl::OUString,sal_Bool,::comphelper::UStringMixLess> aColumns(xMetaData.is() ? (xMetaData->supportsMixedCaseQuotedIdentifiers() ? true : false): sal_True);
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vRowList.begin();
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_vRowList.end();
// first look for columns where something other than the name changed
for(sal_Int32 nPos = 0;aIter != aEnd;++aIter,++nPos)
{
OSL_ENSURE(*aIter,"OTableRow is null!");
OFieldDescription* pField = (*aIter)->GetActFieldDescr();
if ( !pField )
continue;
if ( (*aIter)->IsReadOnly() )
{
aColumns[pField->GetName()] = sal_True;
continue;
}
Reference<XPropertySet> xColumn;
if ( xColumns->hasByName(pField->GetName()) )
{
aColumns[pField->GetName()] = sal_True;
xColumns->getByName(pField->GetName()) >>= xColumn;
OSL_ENSURE(xColumn.is(),"Column is null!");
sal_Int32 nType=0,nPrecision=0,nScale=0,nNullable=0,nFormatKey=0,nAlignment=0;
sal_Bool bAutoIncrement = false;
::rtl::OUString sDescription, sTypeName;
Any aControlDefault;
xColumn->getPropertyValue(PROPERTY_TYPE) >>= nType;
xColumn->getPropertyValue(PROPERTY_PRECISION) >>= nPrecision;
xColumn->getPropertyValue(PROPERTY_SCALE) >>= nScale;
xColumn->getPropertyValue(PROPERTY_ISNULLABLE) >>= nNullable;
xColumn->getPropertyValue(PROPERTY_ISAUTOINCREMENT) >>= bAutoIncrement;
try { xColumn->getPropertyValue(PROPERTY_TYPENAME) >>= sTypeName; }
catch( const Exception& )
{
OSL_ENSURE( sal_False, "no TypeName property?!" );
// since this is a last minute fix for #i41785#, I want to be on the safe side,
// and catch errors here as early as possible (instead of the whole process of altering
// the columns failing)
// Normally, sdbcx::Column objects are expected to have a TypeName property
}
// xColumn->getPropertyValue(PROPERTY_ISCURRENCY,::cppu::bool2any(pField->IsCurrency()));
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_HELPTEXT))
xColumn->getPropertyValue(PROPERTY_HELPTEXT) >>= sDescription;
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
aControlDefault = xColumn->getPropertyValue(PROPERTY_CONTROLDEFAULT);
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_FORMATKEY))
xColumn->getPropertyValue(PROPERTY_FORMATKEY) >>= nFormatKey;
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_ALIGN))
xColumn->getPropertyValue(PROPERTY_ALIGN) >>= nAlignment;
// check if something changed
if((nType != pField->GetType() ||
sTypeName != pField->GetTypeName() ||
nPrecision != pField->GetPrecision() ||
nScale != pField->GetScale() ||
nNullable != pField->GetIsNullable() ||
bAutoIncrement != pField->IsAutoIncrement())&&
xColumnFactory.is())
{
Reference<XPropertySet> xNewColumn;
xNewColumn = xColumnFactory->createDataDescriptor();
::dbaui::setColumnProperties(xNewColumn,pField);
// first try to alter the column
sal_Bool bNotOk = sal_False;
try
{
// first try if we can alter the column
if(xAlter.is())
xAlter->alterColumnByName(pField->GetName(),xNewColumn);
}
catch(const SQLException&)
{
if(xDrop.is() && xAppend.is())
{
String aMessage( ModuleRes( STR_TABLEDESIGN_ALTER_ERROR ) );
aMessage.SearchAndReplaceAscii( "$column$", pField->GetName() );
SQLExceptionInfo aError( ::cppu::getCaughtException() );
OSQLWarningBox aMsg( getView(), aMessage, WB_YES_NO | WB_DEF_YES , &aError );
bNotOk = aMsg.Execute() == RET_YES;
}
else
throw;
}
// if something went wrong or we can't alter columns
// drop and append a new one
if((!xAlter.is() || bNotOk) && xDrop.is() && xAppend.is())
{
xDrop->dropByName(pField->GetName());
try
{
xAppend->appendByDescriptor(xNewColumn);
}
catch(const SQLException&)
{ // an error occured so we try to reactivate the old one
xAppend->appendByDescriptor(xColumn);
throw;
}
}
// exceptions are caught outside
xNewColumn = NULL;
if(xColumns->hasByName(pField->GetName()))
xColumns->getByName(pField->GetName()) >>= xColumn;
bReload = sal_True;
}
if(nFormatKey != pField->GetFormatKey())
{
if(xColumn.is() && xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_FORMATKEY))
xColumn->setPropertyValue(PROPERTY_FORMATKEY,makeAny(pField->GetFormatKey()));
}
if(nAlignment != dbaui::mapTextAllign(pField->GetHorJustify()))
{
if(xColumn.is() && xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_ALIGN))
xColumn->setPropertyValue(PROPERTY_ALIGN,makeAny(dbaui::mapTextAllign(pField->GetHorJustify())));
}
if(sDescription != pField->GetDescription())
{
if(xColumn.is() && xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_HELPTEXT))
xColumn->setPropertyValue(PROPERTY_HELPTEXT,makeAny(pField->GetDescription()));
}
if ( aControlDefault != pField->GetControlDefault())
{
if(xColumn.is() && xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
xColumn->setPropertyValue(PROPERTY_CONTROLDEFAULT,pField->GetControlDefault());
}
}
else if(xColumnFactory.is() && xAlter.is() && nPos < nColumnCount)
{ // we can't find the column so we could try it with the index before we drop and append a new column
try
{
Reference<XPropertySet> xNewColumn;
xNewColumn = xColumnFactory->createDataDescriptor();
::dbaui::setColumnProperties(xNewColumn,pField);
xAlter->alterColumnByIndex(nPos,xNewColumn);
if(xColumns->hasByName(pField->GetName()))
{ // ask for the append by name
aColumns[pField->GetName()] = sal_True;
xColumns->getByName(pField->GetName()) >>= xColumn;
if(xColumn.is())
pField->copyColumnSettingsTo(xColumn);
}
else
{
OSL_ENSURE(sal_False, "OTableController::alterColumns: invalid column (2)!");
}
}
catch(const SQLException&)
{ // we couldn't alter the column so we have to add new columns
bReload = sal_True;
if(xDrop.is() && xAppend.is())
{
String aMessage(ModuleRes(STR_TABLEDESIGN_ALTER_ERROR));
aMessage.SearchAndReplaceAscii("$column$",pField->GetName());
OSQLWarningBox aMsg( getView(), aMessage, WB_YES_NO | WB_DEF_YES );
if ( aMsg.Execute() != RET_YES )
{
Reference<XPropertySet> xNewColumn(xIdxColumns->getByIndex(nPos),UNO_QUERY_THROW);
::rtl::OUString sName;
xNewColumn->getPropertyValue(PROPERTY_NAME) >>= sName;
aColumns[sName] = sal_True;
aColumns[pField->GetName()] = sal_True;
continue;
}
}
else
throw;
}
}
else
bReload = sal_True;
}
// second drop all columns which could be found by name
Reference<XNameAccess> xKeyColumns = getKeyColumns();
// now we have to look for the columns who could be deleted
if ( xDrop.is() )
{
Sequence< ::rtl::OUString> aColumnNames = xColumns->getElementNames();
const ::rtl::OUString* pIter = aColumnNames.getConstArray();
const ::rtl::OUString* pEnd = pIter + aColumnNames.getLength();
for(;pIter != pEnd;++pIter)
{
if(aColumns.find(*pIter) == aColumns.end()) // found a column to delete
{
if(xKeyColumns.is() && xKeyColumns->hasByName(*pIter)) // check if this column is a member of the primary key
{
String aMsgT(ModuleRes(STR_TBL_COLUMN_IS_KEYCOLUMN));
aMsgT.SearchAndReplaceAscii("$column$",*pIter);
String aTitle(ModuleRes(STR_TBL_COLUMN_IS_KEYCOLUMN_TITLE));
OSQLMessageBox aMsg(getView(),aTitle,aMsgT,WB_YES_NO| WB_DEF_YES);
if(aMsg.Execute() == RET_YES)
{
xKeyColumns = NULL;
dropPrimaryKey();
}
else
{
bReload = sal_True;
continue;
}
}
try
{
xDrop->dropByName(*pIter);
}
catch (const SQLException&)
{
String sError( ModuleRes( STR_TABLEDESIGN_COULD_NOT_DROP_COL ) );
sError.SearchAndReplaceAscii( "$column$", *pIter );
SQLException aNewException;
aNewException.Message = sError;
aNewException.SQLState = ::rtl::OUString::createFromAscii( "S1000" );
aNewException.NextException = ::cppu::getCaughtException();
throw aNewException;
}
}
}
}
// third append the new columns
aIter = m_vRowList.begin();
for(;aIter != m_vRowList.end();++aIter)
{
OSL_ENSURE(*aIter,"OTableRow is null!");
OFieldDescription* pField = (*aIter)->GetActFieldDescr();
if ( !pField || (*aIter)->IsReadOnly() || aColumns.find(pField->GetName()) != aColumns.end() )
continue;
Reference<XPropertySet> xColumn;
if(!xColumns->hasByName(pField->GetName()))
{
if(xColumnFactory.is() && xAppend.is())
{// column not found by its name so we assume it is new
// Column is new
xColumn = xColumnFactory->createDataDescriptor();
::dbaui::setColumnProperties(xColumn,pField);
xAppend->appendByDescriptor(xColumn);
if(xColumns->hasByName(pField->GetName()))
{ // ask for the append by name
aColumns[pField->GetName()] = sal_True;
xColumns->getByName(pField->GetName()) >>= xColumn;
if(xColumn.is())
pField->copyColumnSettingsTo(xColumn);
}
else
{
OSL_ENSURE(sal_False, "OTableController::alterColumns: invalid column!");
}
}
}
}
// check if we have to do something with the primary key
sal_Bool bNeedDropKey = sal_False;
sal_Bool bNeedAppendKey = sal_False;
if ( xKeyColumns.is() )
{
aIter = m_vRowList.begin();
for(;aIter != m_vRowList.end();++aIter)
{
OSL_ENSURE(*aIter,"OTableRow is null!");
OFieldDescription* pField = (*aIter)->GetActFieldDescr();
if ( !pField )
continue;
if ( pField->IsPrimaryKey()
&& !xKeyColumns->hasByName( pField->GetName() )
)
{ // new primary key column inserted which isn't already in the columns selection
bNeedDropKey = bNeedAppendKey = sal_True;
break;
}
else if ( !pField->IsPrimaryKey()
&& xKeyColumns->hasByName( pField->GetName() )
)
{ // found a column which currently is in the primary key, but is marked not to be anymore
bNeedDropKey = bNeedAppendKey = sal_True;
break;
}
}
}
else
{ // no primary key available so we check if we should create one
bNeedAppendKey = sal_True;
}
if ( bNeedDropKey )
dropPrimaryKey();
if ( bNeedAppendKey )
{
Reference< XKeysSupplier > xKeySup( m_xTable, UNO_QUERY );
appendPrimaryKey( xKeySup ,sal_False);
}
reSyncRows();
if ( bReload )
reload();
}
// -----------------------------------------------------------------------------
void OTableController::dropPrimaryKey()
{
SQLExceptionInfo aInfo;
try
{
Reference<XKeysSupplier> xKeySup(m_xTable,UNO_QUERY);
Reference<XIndexAccess> xKeys;
if(xKeySup.is())
xKeys = xKeySup->getKeys();
if(xKeys.is())
{
Reference<XPropertySet> xProp;
for(sal_Int32 i=0;i< xKeys->getCount();++i)
{
xProp.set(xKeys->getByIndex(i),UNO_QUERY);
sal_Int32 nKeyType = 0;
xProp->getPropertyValue(PROPERTY_TYPE) >>= nKeyType;
if(KeyType::PRIMARY == nKeyType)
{
Reference<XDrop> xDrop(xKeys,UNO_QUERY);
xDrop->dropByIndex(i); // delete the key
break;
}
}
}
}
catch(const SQLContext& e)
{
aInfo = SQLExceptionInfo(e);
}
catch(const SQLWarning& e)
{
aInfo = SQLExceptionInfo(e);
}
catch(const SQLException& e)
{
aInfo = SQLExceptionInfo(e);
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
showError(aInfo);
}
// -----------------------------------------------------------------------------
void OTableController::assignTable()
{
::rtl::OUString sComposedName;
// get the table
if(m_sName.getLength())
{
Reference<XNameAccess> xNameAccess;
Reference<XTablesSupplier> xSup(getConnection(),UNO_QUERY);
if(xSup.is())
{
xNameAccess = xSup->getTables();
OSL_ENSURE(xNameAccess.is(),"no nameaccess for the queries!");
Reference<XPropertySet> xProp;
if(xNameAccess->hasByName(m_sName) && ::cppu::extractInterface(xProp,xNameAccess->getByName(m_sName)) && xProp.is())
{
m_xTable = xProp;
startTableListening();
// check if we set the table editable
Reference<XDatabaseMetaData> xMeta = getConnection()->getMetaData();
setEditable( xMeta.is() && !xMeta->isReadOnly() && (isAlterAllowed() || isDropAllowed() || isAddAllowed()) );
if(!isEditable())
{
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vRowList.begin();
for(; aIter != m_vRowList.end(); ++aIter)
(*aIter)->SetReadOnly(sal_True);
}
m_bNew = sal_False;
// be notified when the table is in disposing
InvalidateAll();
}
}
}
//updateTitle();
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::isAddAllowed() const
{
Reference<XColumnsSupplier> xColsSup(m_xTable,UNO_QUERY);
sal_Bool bAddAllowed = !m_xTable.is();
if(xColsSup.is())
bAddAllowed = Reference<XAppend>(xColsSup->getColumns(),UNO_QUERY).is();
try
{
Reference< XDatabaseMetaData > xMetaData = getMetaData( );
bAddAllowed = bAddAllowed || ( xMetaData.is() && xMetaData->supportsAlterTableWithAddColumn());
}
catch(Exception&)
{
DBG_UNHANDLED_EXCEPTION();
bAddAllowed = sal_False;
}
return bAddAllowed;
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::isDropAllowed() const
{
Reference<XColumnsSupplier> xColsSup(m_xTable,UNO_QUERY);
sal_Bool bDropAllowed = !m_xTable.is();
if(xColsSup.is())
{
Reference<XNameAccess> xNameAccess = xColsSup->getColumns();
bDropAllowed = Reference<XDrop>(xNameAccess,UNO_QUERY).is() && xNameAccess->hasElements();
}
Reference< XDatabaseMetaData> xMetaData = getMetaData( );
bDropAllowed = bDropAllowed || ( xMetaData.is() && xMetaData->supportsAlterTableWithDropColumn());
return bDropAllowed;
}
// -----------------------------------------------------------------------------
sal_Bool OTableController::isAlterAllowed() const
{
sal_Bool bAllowed(!m_xTable.is() || Reference<XAlterTable>(m_xTable,UNO_QUERY).is());
return bAllowed;
}
// -----------------------------------------------------------------------------
void OTableController::reSyncRows()
{
sal_Bool bAlterAllowed = isAlterAllowed();
sal_Bool bAddAllowed = isAddAllowed();
::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_vRowList.begin();
for(;aIter != m_vRowList.end();++aIter)
{
OSL_ENSURE(*aIter,"OTableRow is null!");
OFieldDescription* pField = (*aIter)->GetActFieldDescr();
if ( pField )
(*aIter)->SetReadOnly(!bAlterAllowed);
else
(*aIter)->SetReadOnly(!bAddAllowed);
}
static_cast<OTableDesignView*>(getView())->reSync(); // show the windows and fill with our informations
getUndoMgr()->Clear(); // clear all undo redo things
setModified(sal_False); // and we are not modified yet
}
// -----------------------------------------------------------------------------
::rtl::OUString OTableController::createUniqueName(const ::rtl::OUString& _rName)
{
::rtl::OUString sName = _rName;
Reference< XDatabaseMetaData> xMetaData = getMetaData( );
::comphelper::UStringMixEqual bCase(xMetaData.is() ? xMetaData->supportsMixedCaseQuotedIdentifiers() : sal_True);
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_vRowList.begin();
for(sal_Int32 i=0;aIter != m_vRowList.end();++aIter)
{
OFieldDescription* pFieldDesc = (*aIter)->GetActFieldDescr();
if (pFieldDesc && pFieldDesc->GetName().getLength() && bCase(sName,pFieldDesc->GetName()))
{ // found a second name of _rName so we need another
sName = _rName + ::rtl::OUString::valueOf(++i);
aIter = m_vRowList.begin(); // and retry
}
}
return sName;
}
// -----------------------------------------------------------------------------
::rtl::OUString OTableController::getPrivateTitle() const
{
::rtl::OUString sTitle;
try
{
// get the table
if ( m_sName.getLength() && getConnection().is() )
{
if ( m_xTable.is() )
sTitle = ::dbtools::composeTableName( getConnection()->getMetaData(), m_xTable, ::dbtools::eInDataManipulation, false, false, false );
else
sTitle = m_sName;
}
if ( !sTitle.getLength() )
{
String aName = String(ModuleRes(STR_TBL_TITLE));
sTitle = aName.GetToken(0,' ');
sTitle += ::rtl::OUString::valueOf(getCurrentStartNumber());
}
}
catch( const Exception& )
{
DBG_UNHANDLED_EXCEPTION();
}
return sTitle;
}
// -----------------------------------------------------------------------------
void OTableController::reload()
{
loadData(); // fill the column information form the table
static_cast<OTableDesignView*>(getView())->reSync(); // show the windows and fill with our informations
getUndoMgr()->Clear(); // clear all undo redo things
setModified(sal_False); // and we are not modified yet
static_cast<OTableDesignView*>(getView())->Invalidate();
}
// -----------------------------------------------------------------------------
sal_Int32 OTableController::getFirstEmptyRowPosition() const
{
sal_Int32 nRet = -1;
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_vRowList.begin();
::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_vRowList.end();
for(;aIter != aEnd;++aIter)
{
if ( !*aIter || !(*aIter)->GetActFieldDescr() || !(*aIter)->GetActFieldDescr()->GetName().getLength() )
{
nRet = aIter - m_vRowList.begin();
break;
}
}
return nRet;
}
// -----------------------------------------------------------------------------
bool OTableController::isAutoIncrementPrimaryKey() const
{
::dbaccess::DATASOURCE_TYPE eType = m_aTypeCollection.getType(::comphelper::getString(getDataSource()->getPropertyValue(PROPERTY_URL)));
DataSourceMetaData aMeta(eType);
return aMeta.getAdvancedSettingsSupport().bAutoIncrementIsPrimaryKey;
}
// -----------------------------------------------------------------------------