1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_dbaccess.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "AppController.hxx"
28*b1cdbd2cSJim Jagielski #include "dbustrings.hrc"
29*b1cdbd2cSJim Jagielski #include "advancedsettingsdlg.hxx"
30*b1cdbd2cSJim Jagielski #include "subcomponentmanager.hxx"
31*b1cdbd2cSJim Jagielski #include "closeveto.hxx"
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/
34*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/NamedValue.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XChild.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContainer.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContentEnumerationAccess.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalNameContainer.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
41*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FrameSearchFlag.hpp>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XStorable.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/CommandType.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/SQLContext.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XBookmarksSupplier.hpp>
46*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
47*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
48*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XDataSource.hpp>
49*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XAlterView.hpp>
50*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XAppend.hpp>
51*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XRename.hpp>
52*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
53*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XViewsSupplier.hpp>
54*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
55*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XNamingService.hpp>
56*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XFlushable.hpp>
57*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifiable.hpp>
58*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifyBroadcaster.hpp>
59*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormatter.hpp>
60*b1cdbd2cSJim Jagielski #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
61*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XEmbeddedScripts.hpp>
62*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel2.hpp>
63*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalNameContainer.hpp>
64*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifyBroadcaster.hpp>
65*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModifiable.hpp>
66*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/FrameSearchFlag.hpp>
67*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XFlushable.hpp>
68*b1cdbd2cSJim Jagielski #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
69*b1cdbd2cSJim Jagielski #include "com/sun/star/beans/NamedValue.hpp"
70*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XTopWindow.hpp>
71*b1cdbd2cSJim Jagielski #include <com/sun/star/task/XInteractionHandler.hpp>
72*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/application/DatabaseObject.hpp>
73*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/application/DatabaseObjectContainer.hpp>
74*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XDocumentEventBroadcaster.hpp>
75*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XHierarchicalName.hpp>
76*b1cdbd2cSJim Jagielski /** === end UNO includes === **/
77*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
78*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
79*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski #include <svl/urihelper.hxx>
82*b1cdbd2cSJim Jagielski #include <svl/filenotation.hxx>
83*b1cdbd2cSJim Jagielski #include <svtools/svtreebx.hxx>
84*b1cdbd2cSJim Jagielski #include <svtools/transfer.hxx>
85*b1cdbd2cSJim Jagielski #include <svtools/cliplistener.hxx>
86*b1cdbd2cSJim Jagielski #include <svtools/svlbitm.hxx>
87*b1cdbd2cSJim Jagielski #include <svtools/insdlg.hxx>
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
90*b1cdbd2cSJim Jagielski #include <comphelper/uno3.hxx>
91*b1cdbd2cSJim Jagielski #include <comphelper/string.hxx>
92*b1cdbd2cSJim Jagielski #include <comphelper/types.hxx>
93*b1cdbd2cSJim Jagielski #include <comphelper/interaction.hxx>
94*b1cdbd2cSJim Jagielski #include <comphelper/componentcontext.hxx>
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
97*b1cdbd2cSJim Jagielski #include <vcl/stdtext.hxx>
98*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
99*b1cdbd2cSJim Jagielski #include <vcl/menu.hxx>
100*b1cdbd2cSJim Jagielski #include <vcl/lstbox.hxx>
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski #include <unotools/pathoptions.hxx>
103*b1cdbd2cSJim Jagielski #include <unotools/tempfile.hxx>
104*b1cdbd2cSJim Jagielski #include <unotools/internaloptions.hxx>
105*b1cdbd2cSJim Jagielski #include <unotools/moduleoptions.hxx>
106*b1cdbd2cSJim Jagielski #include <unotools/historyoptions.hxx>
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski #include <sfx2/mailmodelapi.hxx>
109*b1cdbd2cSJim Jagielski #include <sfx2/filedlghelper.hxx>
110*b1cdbd2cSJim Jagielski #include <sfx2/docfilt.hxx>
111*b1cdbd2cSJim Jagielski #include <sfx2/QuerySaveDocument.hxx>
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski #include <cppuhelper/typeprovider.hxx>
114*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx>
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
117*b1cdbd2cSJim Jagielski #include <connectivity/dbexception.hxx>
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski #include <svx/dbaexchange.hxx>
120*b1cdbd2cSJim Jagielski #include <svx/dbaobjectex.hxx>
121*b1cdbd2cSJim Jagielski #include <svx/svxdlg.hxx>
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
124*b1cdbd2cSJim Jagielski #include "AppView.hxx"
125*b1cdbd2cSJim Jagielski #include "browserids.hxx"
126*b1cdbd2cSJim Jagielski #include "dbu_reghelper.hxx"
127*b1cdbd2cSJim Jagielski #include "dbu_app.hrc"
128*b1cdbd2cSJim Jagielski #include "defaultobjectnamecheck.hxx"
129*b1cdbd2cSJim Jagielski #include "databaseobjectview.hxx"
130*b1cdbd2cSJim Jagielski #include "listviewitems.hxx"
131*b1cdbd2cSJim Jagielski #include "AppDetailView.hxx"
132*b1cdbd2cSJim Jagielski #include "linkeddocuments.hxx"
133*b1cdbd2cSJim Jagielski #include "sqlmessage.hxx"
134*b1cdbd2cSJim Jagielski #include "UITools.hxx"
135*b1cdbd2cSJim Jagielski #include "dsntypes.hxx"
136*b1cdbd2cSJim Jagielski #include "dbaccess_helpid.hrc"
137*b1cdbd2cSJim Jagielski #include "dlgsave.hxx"
138*b1cdbd2cSJim Jagielski #include "dbaccess_slotid.hrc"
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski #include <algorithm>
141*b1cdbd2cSJim Jagielski #include <functional>
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski #include <boost/noncopyable.hpp>
144*b1cdbd2cSJim Jagielski 
createRegistryInfo_ODBApplication()145*b1cdbd2cSJim Jagielski extern "C" void SAL_CALL createRegistryInfo_ODBApplication()
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski 	static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::OApplicationController > aAutoRegistration;
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski //........................................................................
150*b1cdbd2cSJim Jagielski namespace dbaui
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski //........................................................................
153*b1cdbd2cSJim Jagielski using namespace ::dbtools;
154*b1cdbd2cSJim Jagielski using namespace ::svx;
155*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
156*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
157*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb;
158*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::view;
159*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
160*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
161*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
162*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
163*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
164*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb;
165*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
166*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx;
167*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::datatransfer;
168*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ui::dialogs;
169*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::task;
170*b1cdbd2cSJim Jagielski using ::com::sun::star::document::XEmbeddedScripts;
171*b1cdbd2cSJim Jagielski using ::com::sun::star::document::XDocumentEventBroadcaster;
172*b1cdbd2cSJim Jagielski using ::com::sun::star::document::DocumentEvent;
173*b1cdbd2cSJim Jagielski using ::com::sun::star::sdb::application::NamedDatabaseObject;
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski namespace DatabaseObject = ::com::sun::star::sdb::application::DatabaseObject;
176*b1cdbd2cSJim Jagielski namespace DatabaseObjectContainer = ::com::sun::star::sdb::application::DatabaseObjectContainer;
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getImplementationName()179*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL OApplicationController::getImplementationName() throw( RuntimeException )
180*b1cdbd2cSJim Jagielski {
181*b1cdbd2cSJim Jagielski 	return getImplementationName_Static();
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getImplementationName_Static()185*b1cdbd2cSJim Jagielski ::rtl::OUString OApplicationController::getImplementationName_Static() throw( RuntimeException )
186*b1cdbd2cSJim Jagielski {
187*b1cdbd2cSJim Jagielski 	return ::rtl::OUString(SERVICE_SDB_APPLICATIONCONTROLLER);
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getSupportedServiceNames_Static(void)190*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString> OApplicationController::getSupportedServiceNames_Static(void) throw( RuntimeException )
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski 	Sequence< ::rtl::OUString> aSupported(1);
193*b1cdbd2cSJim Jagielski 	aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.application.DefaultViewController");
194*b1cdbd2cSJim Jagielski 	return aSupported;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------------
getSupportedServiceNames()197*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString> SAL_CALL OApplicationController::getSupportedServiceNames() throw(RuntimeException)
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski 	return getSupportedServiceNames_Static();
200*b1cdbd2cSJim Jagielski }
201*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
Create(const Reference<XMultiServiceFactory> & _rxFactory)202*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL OApplicationController::Create(const Reference<XMultiServiceFactory >& _rxFactory)
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski 	return *(new OApplicationController(_rxFactory));
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski struct XContainerFunctor : public ::std::unary_function< OApplicationController::TContainerVector::value_type , bool>
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski 	Reference<XContainerListener> m_xContainerListener;
XContainerFunctordbaui::XContainerFunctor211*b1cdbd2cSJim Jagielski 	XContainerFunctor( const Reference<XContainerListener>& _xContainerListener)
212*b1cdbd2cSJim Jagielski 		: m_xContainerListener(_xContainerListener){}
213*b1cdbd2cSJim Jagielski 
operator ()dbaui::XContainerFunctor214*b1cdbd2cSJim Jagielski 	bool operator() (const OApplicationController::TContainerVector::value_type& lhs) const
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		if ( lhs.is() )
217*b1cdbd2cSJim Jagielski 			lhs->removeContainerListener(m_xContainerListener);
218*b1cdbd2cSJim Jagielski 		return true;
219*b1cdbd2cSJim Jagielski 	}
220*b1cdbd2cSJim Jagielski };
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski //====================================================================
223*b1cdbd2cSJim Jagielski //= OApplicationController
224*b1cdbd2cSJim Jagielski //====================================================================
225*b1cdbd2cSJim Jagielski class SelectionNotifier : public ::boost::noncopyable
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski private:
228*b1cdbd2cSJim Jagielski     ::cppu::OInterfaceContainerHelper   m_aSelectionListeners;
229*b1cdbd2cSJim Jagielski     ::cppu::OWeakObject&                m_rContext;
230*b1cdbd2cSJim Jagielski     sal_Int32                           m_nSelectionNestingLevel;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski public:
SelectionNotifier(::osl::Mutex & _rMutex,::cppu::OWeakObject & _rContext)233*b1cdbd2cSJim Jagielski     SelectionNotifier( ::osl::Mutex& _rMutex, ::cppu::OWeakObject& _rContext )
234*b1cdbd2cSJim Jagielski         :m_aSelectionListeners( _rMutex )
235*b1cdbd2cSJim Jagielski         ,m_rContext( _rContext )
236*b1cdbd2cSJim Jagielski         ,m_nSelectionNestingLevel( 0 )
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski     }
239*b1cdbd2cSJim Jagielski 
addListener(const Reference<XSelectionChangeListener> & _Listener)240*b1cdbd2cSJim Jagielski     void addListener( const Reference< XSelectionChangeListener >& _Listener )
241*b1cdbd2cSJim Jagielski     {
242*b1cdbd2cSJim Jagielski         m_aSelectionListeners.addInterface( _Listener );
243*b1cdbd2cSJim Jagielski     }
244*b1cdbd2cSJim Jagielski 
removeListener(const Reference<XSelectionChangeListener> & _Listener)245*b1cdbd2cSJim Jagielski     void removeListener( const Reference< XSelectionChangeListener >& _Listener )
246*b1cdbd2cSJim Jagielski     {
247*b1cdbd2cSJim Jagielski         m_aSelectionListeners.removeInterface( _Listener );
248*b1cdbd2cSJim Jagielski     }
249*b1cdbd2cSJim Jagielski 
disposing()250*b1cdbd2cSJim Jagielski     void disposing()
251*b1cdbd2cSJim Jagielski     {
252*b1cdbd2cSJim Jagielski         EventObject aEvent( m_rContext );
253*b1cdbd2cSJim Jagielski         m_aSelectionListeners.disposeAndClear( aEvent );
254*b1cdbd2cSJim Jagielski     }
255*b1cdbd2cSJim Jagielski 
~SelectionNotifier()256*b1cdbd2cSJim Jagielski     ~SelectionNotifier()
257*b1cdbd2cSJim Jagielski     {
258*b1cdbd2cSJim Jagielski     }
259*b1cdbd2cSJim Jagielski 
SelectionGuardAccessdbaui::SelectionNotifier::SelectionGuardAccess260*b1cdbd2cSJim Jagielski     struct SelectionGuardAccess { friend class SelectionGuard; private: SelectionGuardAccess() { }  };
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski     /** enters a block which modifies the selection of our owner.
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski         Can be called multiple times, the only important thing is to call leaveSelection
265*b1cdbd2cSJim Jagielski         equally often.
266*b1cdbd2cSJim Jagielski     */
enterSelection(SelectionGuardAccess)267*b1cdbd2cSJim Jagielski     void    enterSelection( SelectionGuardAccess )
268*b1cdbd2cSJim Jagielski     {
269*b1cdbd2cSJim Jagielski         ++m_nSelectionNestingLevel;
270*b1cdbd2cSJim Jagielski     }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski     /** leaves a block which modifies the selection of our owner
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski         Must be paired with enterSelection calls.
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski         When the last block is left, i.e. the last leaveSelection call is made on the current stack,
277*b1cdbd2cSJim Jagielski         then our SelectionChangeListeners are notified
278*b1cdbd2cSJim Jagielski     */
leaveSelection(SelectionGuardAccess)279*b1cdbd2cSJim Jagielski     void    leaveSelection( SelectionGuardAccess )
280*b1cdbd2cSJim Jagielski     {
281*b1cdbd2cSJim Jagielski         if ( --m_nSelectionNestingLevel == 0 )
282*b1cdbd2cSJim Jagielski         {
283*b1cdbd2cSJim Jagielski             EventObject aEvent( m_rContext );
284*b1cdbd2cSJim Jagielski             m_aSelectionListeners.notifyEach( &XSelectionChangeListener::selectionChanged, aEvent );
285*b1cdbd2cSJim Jagielski         }
286*b1cdbd2cSJim Jagielski     }
287*b1cdbd2cSJim Jagielski };
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski class SelectionGuard : public ::boost::noncopyable
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski public:
SelectionGuard(SelectionNotifier & _rNotifier)292*b1cdbd2cSJim Jagielski     SelectionGuard( SelectionNotifier& _rNotifier )
293*b1cdbd2cSJim Jagielski         :m_rNotifier( _rNotifier )
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski         m_rNotifier.enterSelection( SelectionNotifier::SelectionGuardAccess() );
296*b1cdbd2cSJim Jagielski     }
297*b1cdbd2cSJim Jagielski 
~SelectionGuard()298*b1cdbd2cSJim Jagielski     ~SelectionGuard()
299*b1cdbd2cSJim Jagielski     {
300*b1cdbd2cSJim Jagielski         m_rNotifier.leaveSelection( SelectionNotifier::SelectionGuardAccess() );
301*b1cdbd2cSJim Jagielski     }
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski private:
304*b1cdbd2cSJim Jagielski     SelectionNotifier&  m_rNotifier;
305*b1cdbd2cSJim Jagielski };
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski //====================================================================
308*b1cdbd2cSJim Jagielski //= OApplicationController
309*b1cdbd2cSJim Jagielski //====================================================================
DBG_NAME(OApplicationController)310*b1cdbd2cSJim Jagielski DBG_NAME(OApplicationController)
311*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
312*b1cdbd2cSJim Jagielski OApplicationController::OApplicationController(const Reference< XMultiServiceFactory >& _rxORB)
313*b1cdbd2cSJim Jagielski 	:OApplicationController_CBASE( _rxORB )
314*b1cdbd2cSJim Jagielski     ,m_aContextMenuInterceptors( getMutex() )
315*b1cdbd2cSJim Jagielski     ,m_pSubComponentManager( new SubComponentManager( *this, getSharedMutex() ) )
316*b1cdbd2cSJim Jagielski     ,m_aTypeCollection(_rxORB)
317*b1cdbd2cSJim Jagielski     ,m_aTableCopyHelper(this)
318*b1cdbd2cSJim Jagielski 	,m_pClipbordNotifier(NULL)
319*b1cdbd2cSJim Jagielski 	,m_nAsyncDrop(0)
320*b1cdbd2cSJim Jagielski     ,m_aControllerConnectedEvent( LINK( this, OApplicationController, OnFirstControllerConnected ) )
321*b1cdbd2cSJim Jagielski     ,m_aSelectContainerEvent( LINK( this, OApplicationController, OnSelectContainer ) )
322*b1cdbd2cSJim Jagielski 	,m_ePreviewMode(E_PREVIEWNONE)
323*b1cdbd2cSJim Jagielski 	,m_eCurrentType(E_NONE)
324*b1cdbd2cSJim Jagielski 	,m_bNeedToReconnect(sal_False)
325*b1cdbd2cSJim Jagielski     ,m_bSuspended( sal_False )
326*b1cdbd2cSJim Jagielski     ,m_pSelectionNotifier( new SelectionNotifier( getMutex(), *this ) )
327*b1cdbd2cSJim Jagielski {
328*b1cdbd2cSJim Jagielski     DBG_CTOR(OApplicationController,NULL);
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OApplicationController()331*b1cdbd2cSJim Jagielski OApplicationController::~OApplicationController()
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski 	if ( !rBHelper.bDisposed && !rBHelper.bInDispose )
334*b1cdbd2cSJim Jagielski 	{
335*b1cdbd2cSJim Jagielski 		OSL_ENSURE(0,"Please check who doesn't dispose this component!");
336*b1cdbd2cSJim Jagielski         // increment ref count to prevent double call of Dtor
337*b1cdbd2cSJim Jagielski         osl_incrementInterlockedCount( &m_refCount );
338*b1cdbd2cSJim Jagielski         dispose();
339*b1cdbd2cSJim Jagielski 	}
340*b1cdbd2cSJim Jagielski 	::std::auto_ptr< Window> aTemp( getView() );
341*b1cdbd2cSJim Jagielski     clearView();
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     DBG_DTOR(OApplicationController,NULL);
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
IMPLEMENT_FORWARD_XTYPEPROVIDER2(OApplicationController,OApplicationController_CBASE,OApplicationController_Base)346*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XTYPEPROVIDER2(OApplicationController,OApplicationController_CBASE,OApplicationController_Base)
347*b1cdbd2cSJim Jagielski IMPLEMENT_FORWARD_XINTERFACE2(OApplicationController,OApplicationController_CBASE,OApplicationController_Base)
348*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
349*b1cdbd2cSJim Jagielski void OApplicationController::disconnect()
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski     if ( m_xDataSourceConnection.is() )
352*b1cdbd2cSJim Jagielski 	    stopConnectionListening( m_xDataSourceConnection );
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski     try
355*b1cdbd2cSJim Jagielski     {
356*b1cdbd2cSJim Jagielski         // temporary (hopefully!) hack for #i55274#
357*b1cdbd2cSJim Jagielski         Reference< XFlushable > xFlush( m_xDataSourceConnection, UNO_QUERY );
358*b1cdbd2cSJim Jagielski         if ( xFlush.is() && m_xMetaData.is() && !m_xMetaData->isReadOnly() )
359*b1cdbd2cSJim Jagielski             xFlush->flush();
360*b1cdbd2cSJim Jagielski     }
361*b1cdbd2cSJim Jagielski     catch( const Exception& )
362*b1cdbd2cSJim Jagielski     {
363*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
364*b1cdbd2cSJim Jagielski     }
365*b1cdbd2cSJim Jagielski 
366*b1cdbd2cSJim Jagielski     m_xDataSourceConnection.clear();
367*b1cdbd2cSJim Jagielski     m_xMetaData.clear();
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski 	InvalidateAll();
370*b1cdbd2cSJim Jagielski }
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
disposing()373*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::disposing()
374*b1cdbd2cSJim Jagielski {
375*b1cdbd2cSJim Jagielski     m_aControllerConnectedEvent.CancelCall();
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 	::std::for_each(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),XContainerFunctor(this));
378*b1cdbd2cSJim Jagielski 	m_aCurrentContainers.clear();
379*b1cdbd2cSJim Jagielski     m_pSubComponentManager->disposing();
380*b1cdbd2cSJim Jagielski     m_pSelectionNotifier->disposing();
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	if ( getView() )
383*b1cdbd2cSJim Jagielski 	{
384*b1cdbd2cSJim Jagielski 		getContainer()->showPreview(NULL);
385*b1cdbd2cSJim Jagielski 		m_pClipbordNotifier->ClearCallbackLink();
386*b1cdbd2cSJim Jagielski 		m_pClipbordNotifier->AddRemoveListener( getView(), sal_False );
387*b1cdbd2cSJim Jagielski 		m_pClipbordNotifier->release();
388*b1cdbd2cSJim Jagielski 		m_pClipbordNotifier = NULL;
389*b1cdbd2cSJim Jagielski 	}
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	disconnect();
392*b1cdbd2cSJim Jagielski 	try
393*b1cdbd2cSJim Jagielski 	{
394*b1cdbd2cSJim Jagielski 		Reference < XFrame > xFrame;
395*b1cdbd2cSJim Jagielski 		attachFrame( xFrame );
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski         if ( m_xDataSource.is() )
398*b1cdbd2cSJim Jagielski 		{
399*b1cdbd2cSJim Jagielski 		    m_xDataSource->removePropertyChangeListener(::rtl::OUString(), this);
400*b1cdbd2cSJim Jagielski             m_xDataSource->removePropertyChangeListener(PROPERTY_INFO, this);
401*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_URL, this);
402*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_ISPASSWORDREQUIRED, this);
403*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_LAYOUTINFORMATION, this);
404*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_SUPPRESSVERSIONCL, this);
405*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_TABLEFILTER, this);
406*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_TABLETYPEFILTER, this);
407*b1cdbd2cSJim Jagielski 			m_xDataSource->removePropertyChangeListener(PROPERTY_USER, this);
408*b1cdbd2cSJim Jagielski 			// otherwise we may delete our datasource twice
409*b1cdbd2cSJim Jagielski 			Reference<XPropertySet> xProp = m_xDataSource;
410*b1cdbd2cSJim Jagielski 			m_xDataSource = NULL;
411*b1cdbd2cSJim Jagielski 		}
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 		Reference< XModifyBroadcaster > xBroadcaster( m_xModel, UNO_QUERY );
414*b1cdbd2cSJim Jagielski 		if ( xBroadcaster.is() )
415*b1cdbd2cSJim Jagielski 			xBroadcaster->removeModifyListener(static_cast<XModifyListener*>(this));
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 		if ( m_xModel.is() )
418*b1cdbd2cSJim Jagielski 		{
419*b1cdbd2cSJim Jagielski 			::rtl::OUString sUrl = m_xModel->getURL();
420*b1cdbd2cSJim Jagielski 			if ( sUrl.getLength() )
421*b1cdbd2cSJim Jagielski 	    	{
422*b1cdbd2cSJim Jagielski                 ::comphelper::NamedValueCollection aArgs( m_xModel->getArgs() );
423*b1cdbd2cSJim Jagielski                 if ( true == aArgs.getOrDefault( "PickListEntry", true ) )
424*b1cdbd2cSJim Jagielski                 {
425*b1cdbd2cSJim Jagielski     				::rtl::OUString		aFilter;
426*b1cdbd2cSJim Jagielski     				INetURLObject		aURL( m_xModel->getURL() );
427*b1cdbd2cSJim Jagielski     				const SfxFilter* pFilter = getStandardDatabaseFilter();
428*b1cdbd2cSJim Jagielski     				if ( pFilter )
429*b1cdbd2cSJim Jagielski     					aFilter = pFilter->GetFilterName();
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski     				// add to svtool history options
432*b1cdbd2cSJim Jagielski     				SvtHistoryOptions().AppendItem( ePICKLIST,
433*b1cdbd2cSJim Jagielski     						aURL.GetURLNoPass( INetURLObject::NO_DECODE ),
434*b1cdbd2cSJim Jagielski     						aFilter,
435*b1cdbd2cSJim Jagielski     						getStrippedDatabaseName(),
436*b1cdbd2cSJim Jagielski     						::rtl::OUString() );
437*b1cdbd2cSJim Jagielski                 }
438*b1cdbd2cSJim Jagielski             }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski             m_xModel->disconnectController( this );
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski             m_xModel.clear();
443*b1cdbd2cSJim Jagielski 		}
444*b1cdbd2cSJim Jagielski 	}
445*b1cdbd2cSJim Jagielski 	catch(Exception)
446*b1cdbd2cSJim Jagielski 	{
447*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
448*b1cdbd2cSJim Jagielski 	}
449*b1cdbd2cSJim Jagielski 
450*b1cdbd2cSJim Jagielski     clearView();
451*b1cdbd2cSJim Jagielski 	OApplicationController_CBASE::disposing(); // here the m_refCount must be equal 5
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
Construct(Window * _pParent)455*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::Construct(Window* _pParent)
456*b1cdbd2cSJim Jagielski {
457*b1cdbd2cSJim Jagielski 	setView( * new OApplicationView( _pParent, getORB(), *this, m_ePreviewMode ) );
458*b1cdbd2cSJim Jagielski 	getView()->SetUniqueId(UID_APP_VIEW);
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	// late construction
461*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = sal_False;
462*b1cdbd2cSJim Jagielski 	try
463*b1cdbd2cSJim Jagielski 	{
464*b1cdbd2cSJim Jagielski 		getContainer()->Construct();
465*b1cdbd2cSJim Jagielski 		bSuccess = sal_True;
466*b1cdbd2cSJim Jagielski 	}
467*b1cdbd2cSJim Jagielski 	catch(SQLException&)
468*b1cdbd2cSJim Jagielski 	{
469*b1cdbd2cSJim Jagielski 	}
470*b1cdbd2cSJim Jagielski 	catch(Exception&)
471*b1cdbd2cSJim Jagielski 	{
472*b1cdbd2cSJim Jagielski 		DBG_ERROR("OApplicationController::Construct : the construction of UnoDataBrowserView failed !");
473*b1cdbd2cSJim Jagielski 	}
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 	if ( !bSuccess )
476*b1cdbd2cSJim Jagielski 	{
477*b1cdbd2cSJim Jagielski 		::std::auto_ptr< Window> aTemp( getView() );
478*b1cdbd2cSJim Jagielski         clearView();
479*b1cdbd2cSJim Jagielski 		return sal_False;
480*b1cdbd2cSJim Jagielski 	}
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski 	// now that we have a view we can create the clipboard listener
483*b1cdbd2cSJim Jagielski 	m_aSystemClipboard = TransferableDataHelper::CreateFromSystemClipboard( getView() );
484*b1cdbd2cSJim Jagielski 	m_aSystemClipboard.StartClipboardListening( );
485*b1cdbd2cSJim Jagielski 
486*b1cdbd2cSJim Jagielski 	m_pClipbordNotifier = new TransferableClipboardListener( LINK( this, OApplicationController, OnClipboardChanged ) );
487*b1cdbd2cSJim Jagielski 	m_pClipbordNotifier->acquire();
488*b1cdbd2cSJim Jagielski 	m_pClipbordNotifier->AddRemoveListener( getView(), sal_True );
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski 	OApplicationController_CBASE::Construct( _pParent );
491*b1cdbd2cSJim Jagielski 	getView()->Show();
492*b1cdbd2cSJim Jagielski 
493*b1cdbd2cSJim Jagielski 	return sal_True;
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
disposing(const EventObject & _rSource)497*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::disposing(const EventObject& _rSource) throw( RuntimeException )
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getMutex() );
500*b1cdbd2cSJim Jagielski 	Reference<XConnection> xCon(_rSource.Source, UNO_QUERY);
501*b1cdbd2cSJim Jagielski 	if ( xCon.is() )
502*b1cdbd2cSJim Jagielski 	{
503*b1cdbd2cSJim Jagielski         DBG_ASSERT( m_xDataSourceConnection == xCon,
504*b1cdbd2cSJim Jagielski             "OApplicationController::disposing: which connection does this come from?" );
505*b1cdbd2cSJim Jagielski 
506*b1cdbd2cSJim Jagielski         if ( getContainer() && getContainer()->getElementType() == E_TABLE )
507*b1cdbd2cSJim Jagielski             getContainer()->clearPages();
508*b1cdbd2cSJim Jagielski         if ( m_xDataSourceConnection == xCon )
509*b1cdbd2cSJim Jagielski         {
510*b1cdbd2cSJim Jagielski 			m_xMetaData.clear();
511*b1cdbd2cSJim Jagielski             m_xDataSourceConnection.clear();
512*b1cdbd2cSJim Jagielski 		}
513*b1cdbd2cSJim Jagielski 	}
514*b1cdbd2cSJim Jagielski 	else if ( _rSource.Source == m_xModel )
515*b1cdbd2cSJim Jagielski 	{
516*b1cdbd2cSJim Jagielski 		m_xModel.clear();
517*b1cdbd2cSJim Jagielski 	}
518*b1cdbd2cSJim Jagielski 	else if ( _rSource.Source == m_xDataSource )
519*b1cdbd2cSJim Jagielski 	{
520*b1cdbd2cSJim Jagielski 		m_xDataSource = NULL;
521*b1cdbd2cSJim Jagielski 	}
522*b1cdbd2cSJim Jagielski 	else
523*b1cdbd2cSJim Jagielski 	{
524*b1cdbd2cSJim Jagielski 		Reference<XContainer> xContainer( _rSource.Source, UNO_QUERY );
525*b1cdbd2cSJim Jagielski 		if ( xContainer.is() )
526*b1cdbd2cSJim Jagielski 		{
527*b1cdbd2cSJim Jagielski 			TContainerVector::iterator aFind = ::std::find(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),xContainer);
528*b1cdbd2cSJim Jagielski 			if ( aFind != m_aCurrentContainers.end() )
529*b1cdbd2cSJim Jagielski 				m_aCurrentContainers.erase(aFind);
530*b1cdbd2cSJim Jagielski 		}
531*b1cdbd2cSJim Jagielski 		OApplicationController_CBASE::disposing( _rSource );
532*b1cdbd2cSJim Jagielski 	}
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
suspend(sal_Bool bSuspend)535*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL OApplicationController::suspend(sal_Bool bSuspend) throw( RuntimeException )
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski     // notify the OnPrepareViewClosing event (before locking any mutex)
538*b1cdbd2cSJim Jagielski     Reference< XDocumentEventBroadcaster > xBroadcaster( m_xModel, UNO_QUERY );
539*b1cdbd2cSJim Jagielski     if ( xBroadcaster.is() )
540*b1cdbd2cSJim Jagielski     {
541*b1cdbd2cSJim Jagielski         xBroadcaster->notifyDocumentEvent(
542*b1cdbd2cSJim Jagielski             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnPrepareViewClosing" ) ),
543*b1cdbd2cSJim Jagielski             this,
544*b1cdbd2cSJim Jagielski             Any()
545*b1cdbd2cSJim Jagielski         );
546*b1cdbd2cSJim Jagielski     }
547*b1cdbd2cSJim Jagielski 
548*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
549*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getMutex() );
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski     if ( getView() && getView()->IsInModalMode() )
552*b1cdbd2cSJim Jagielski         return sal_False;
553*b1cdbd2cSJim Jagielski 
554*b1cdbd2cSJim Jagielski     sal_Bool bCanSuspend = sal_True;
555*b1cdbd2cSJim Jagielski 
556*b1cdbd2cSJim Jagielski     if ( m_bSuspended != bSuspend )
557*b1cdbd2cSJim Jagielski     {
558*b1cdbd2cSJim Jagielski 	    if ( bSuspend && !closeSubComponents() )
559*b1cdbd2cSJim Jagielski 		    return sal_False;
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	    Reference<XModifiable> xModi(m_xModel,UNO_QUERY);
562*b1cdbd2cSJim Jagielski         Reference<XStorable> xStor(getModel(),UNO_QUERY);
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski 	    if  (   bSuspend
565*b1cdbd2cSJim Jagielski             &&  xStor.is()
566*b1cdbd2cSJim Jagielski             &&  !xStor->isReadonly()
567*b1cdbd2cSJim Jagielski             &&  (   xModi.is()
568*b1cdbd2cSJim Jagielski                 &&  xModi->isModified()
569*b1cdbd2cSJim Jagielski                 )
570*b1cdbd2cSJim Jagielski             )
571*b1cdbd2cSJim Jagielski 	    {
572*b1cdbd2cSJim Jagielski 		    switch (ExecuteQuerySaveDocument(getView(),getStrippedDatabaseName()))
573*b1cdbd2cSJim Jagielski 		    {
574*b1cdbd2cSJim Jagielski 			    case RET_YES:
575*b1cdbd2cSJim Jagielski 				    Execute(ID_BROWSER_SAVEDOC,Sequence<PropertyValue>());
576*b1cdbd2cSJim Jagielski 				    bCanSuspend = !xModi->isModified();
577*b1cdbd2cSJim Jagielski                     // when we save the document this must be false else some press cancel
578*b1cdbd2cSJim Jagielski 				    break;
579*b1cdbd2cSJim Jagielski 			    case RET_CANCEL:
580*b1cdbd2cSJim Jagielski 				    bCanSuspend = sal_False;
581*b1cdbd2cSJim Jagielski 			    default:
582*b1cdbd2cSJim Jagielski 				    break;
583*b1cdbd2cSJim Jagielski 		    }
584*b1cdbd2cSJim Jagielski 	    }
585*b1cdbd2cSJim Jagielski     }
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski     if ( bCanSuspend )
588*b1cdbd2cSJim Jagielski 	    m_bSuspended = bSuspend;
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 	return bCanSuspend;
591*b1cdbd2cSJim Jagielski }
592*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetState(sal_uInt16 _nId) const593*b1cdbd2cSJim Jagielski FeatureState OApplicationController::GetState(sal_uInt16 _nId) const
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	FeatureState aReturn;
596*b1cdbd2cSJim Jagielski 	aReturn.bEnabled = sal_False;
597*b1cdbd2cSJim Jagielski 	// check this first
598*b1cdbd2cSJim Jagielski 	if ( !getContainer() || m_bReadOnly )
599*b1cdbd2cSJim Jagielski 		return aReturn;
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski 	try
602*b1cdbd2cSJim Jagielski 	{
603*b1cdbd2cSJim Jagielski 		switch (_nId)
604*b1cdbd2cSJim Jagielski 		{
605*b1cdbd2cSJim Jagielski             case SID_OPENURL:
606*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = sal_True;
607*b1cdbd2cSJim Jagielski                 if ( m_xModel.is() )
608*b1cdbd2cSJim Jagielski 				    aReturn.sTitle = m_xModel->getURL();
609*b1cdbd2cSJim Jagielski                 break;
610*b1cdbd2cSJim Jagielski 			case ID_BROWSER_COPY:
611*b1cdbd2cSJim Jagielski 				{
612*b1cdbd2cSJim Jagielski 					sal_Int32 nCount = getContainer()->getSelectionCount();
613*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = nCount >= 1;
614*b1cdbd2cSJim Jagielski 					if ( aReturn.bEnabled && nCount == 1 && getContainer()->getElementType() == E_TABLE )
615*b1cdbd2cSJim Jagielski 						aReturn.bEnabled = getContainer()->isALeafSelected();
616*b1cdbd2cSJim Jagielski 				}
617*b1cdbd2cSJim Jagielski 				break;
618*b1cdbd2cSJim Jagielski 			case ID_BROWSER_CUT:
619*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && getContainer()->getSelectionCount() >= 1;
620*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = aReturn.bEnabled && ( (ID_BROWSER_CUT == _nId && getContainer()->getElementType() == E_TABLE) ? getContainer()->isCutAllowed() : sal_True);
621*b1cdbd2cSJim Jagielski 				break;
622*b1cdbd2cSJim Jagielski 			case ID_BROWSER_PASTE:
623*b1cdbd2cSJim Jagielski 				switch( getContainer()->getElementType() )
624*b1cdbd2cSJim Jagielski 				{
625*b1cdbd2cSJim Jagielski 					case E_TABLE:
626*b1cdbd2cSJim Jagielski 						aReturn.bEnabled = !isDataSourceReadOnly() && !isConnectionReadOnly() && isTableFormat();
627*b1cdbd2cSJim Jagielski 						break;
628*b1cdbd2cSJim Jagielski 					case E_QUERY:
629*b1cdbd2cSJim Jagielski 						aReturn.bEnabled = !isDataSourceReadOnly() && getViewClipboard().HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY);
630*b1cdbd2cSJim Jagielski 						break;
631*b1cdbd2cSJim Jagielski 					default:
632*b1cdbd2cSJim Jagielski 						aReturn.bEnabled = !isDataSourceReadOnly() && OComponentTransferable::canExtractComponentDescriptor(getViewClipboard().GetDataFlavorExVector(),getContainer()->getElementType() == E_FORM);
633*b1cdbd2cSJim Jagielski 				}
634*b1cdbd2cSJim Jagielski 				break;
635*b1cdbd2cSJim Jagielski 			case SID_DB_APP_PASTE_SPECIAL:
636*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->getElementType() == E_TABLE && !isDataSourceReadOnly() && !isConnectionReadOnly() && isTableFormat();
637*b1cdbd2cSJim Jagielski 				break;
638*b1cdbd2cSJim Jagielski 			case SID_OPENDOC:
639*b1cdbd2cSJim Jagielski 			case SID_HELP_INDEX:
640*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
641*b1cdbd2cSJim Jagielski 				break;
642*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SAVEDOC:
643*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && m_xDocumentModify.is() && m_xDocumentModify->isModified();
644*b1cdbd2cSJim Jagielski 				break;
645*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SAVEASDOC:
646*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
647*b1cdbd2cSJim Jagielski 				break;
648*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SORTUP:
649*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->isFilled() && getContainer()->getElementCount();
650*b1cdbd2cSJim Jagielski 				aReturn.bChecked = aReturn.bEnabled && getContainer()->isSortUp();
651*b1cdbd2cSJim Jagielski 				break;
652*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SORTDOWN:
653*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->isFilled() && getContainer()->getElementCount();
654*b1cdbd2cSJim Jagielski 				aReturn.bChecked = aReturn.bEnabled && !getContainer()->isSortUp();
655*b1cdbd2cSJim Jagielski 				break;
656*b1cdbd2cSJim Jagielski 
657*b1cdbd2cSJim Jagielski 			case SID_NEWDOC:
658*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_FORM:
659*b1cdbd2cSJim Jagielski 			case ID_DOCUMENT_CREATE_REPWIZ:
660*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = !isDataSourceReadOnly() && SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SWRITER);
661*b1cdbd2cSJim Jagielski 				break;
662*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_REPORT:
663*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly()
664*b1cdbd2cSJim Jagielski                                     && SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SWRITER);
665*b1cdbd2cSJim Jagielski                 if ( aReturn.bEnabled )
666*b1cdbd2cSJim Jagielski                 {
667*b1cdbd2cSJim Jagielski                     Reference< XContentEnumerationAccess > xEnumAccess(m_xServiceFactory, UNO_QUERY);
668*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = xEnumAccess.is();
669*b1cdbd2cSJim Jagielski 	                if ( aReturn.bEnabled )
670*b1cdbd2cSJim Jagielski                     {
671*b1cdbd2cSJim Jagielski                         const ::rtl::OUString sReportEngineServiceName = ::dbtools::getDefaultReportEngineServiceName(m_xServiceFactory);
672*b1cdbd2cSJim Jagielski                         aReturn.bEnabled = sReportEngineServiceName.getLength() != 0;
673*b1cdbd2cSJim Jagielski                         if ( aReturn.bEnabled )
674*b1cdbd2cSJim Jagielski                         {
675*b1cdbd2cSJim Jagielski                     	    const Reference< XEnumeration > xEnumDrivers = xEnumAccess->createContentEnumeration(sReportEngineServiceName);
676*b1cdbd2cSJim Jagielski                             aReturn.bEnabled = xEnumDrivers.is() && xEnumDrivers->hasMoreElements();
677*b1cdbd2cSJim Jagielski                         }
678*b1cdbd2cSJim Jagielski                     }
679*b1cdbd2cSJim Jagielski                 }
680*b1cdbd2cSJim Jagielski 				break;
681*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_TABLES:
682*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
683*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getElementType() == E_TABLE;
684*b1cdbd2cSJim Jagielski 				break;
685*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_QUERIES:
686*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
687*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getElementType() == E_QUERY;
688*b1cdbd2cSJim Jagielski 				break;
689*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_FORMS:
690*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
691*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getElementType() == E_FORM;
692*b1cdbd2cSJim Jagielski 				break;
693*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_REPORTS:
694*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
695*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getElementType() == E_REPORT;
696*b1cdbd2cSJim Jagielski 				break;
697*b1cdbd2cSJim Jagielski 			case ID_NEW_QUERY_DESIGN:
698*b1cdbd2cSJim Jagielski 			case ID_NEW_QUERY_SQL:
699*b1cdbd2cSJim Jagielski 			case ID_APP_NEW_QUERY_AUTO_PILOT:
700*b1cdbd2cSJim Jagielski 			case SID_DB_FORM_NEW_PILOT:
701*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly();
702*b1cdbd2cSJim Jagielski 				break;
703*b1cdbd2cSJim Jagielski 			case ID_NEW_VIEW_DESIGN:
704*b1cdbd2cSJim Jagielski 			case SID_DB_NEW_VIEW_SQL:
705*b1cdbd2cSJim Jagielski 			case ID_NEW_VIEW_DESIGN_AUTO_PILOT:
706*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && !isConnectionReadOnly();
707*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
708*b1cdbd2cSJim Jagielski 				{
709*b1cdbd2cSJim Jagielski 					Reference<XViewsSupplier> xViewsSup( getConnection(), UNO_QUERY );
710*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = xViewsSup.is();
711*b1cdbd2cSJim Jagielski 				}
712*b1cdbd2cSJim Jagielski 				break;
713*b1cdbd2cSJim Jagielski 			case ID_NEW_TABLE_DESIGN:
714*b1cdbd2cSJim Jagielski 			case ID_NEW_TABLE_DESIGN_AUTO_PILOT:
715*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && !isConnectionReadOnly();
716*b1cdbd2cSJim Jagielski 				break;
717*b1cdbd2cSJim Jagielski 			case ID_DIRECT_SQL:
718*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
719*b1cdbd2cSJim Jagielski 				break;
720*b1cdbd2cSJim Jagielski             case ID_MIGRATE_SCRIPTS:
721*b1cdbd2cSJim Jagielski             {
722*b1cdbd2cSJim Jagielski                 // Our document supports embedding scripts into it, if and only if there are no
723*b1cdbd2cSJim Jagielski                 // forms/reports with macros/scripts into them. So, we need to enable migration
724*b1cdbd2cSJim Jagielski                 // if and only if the database document does *not* support embedding scripts.
725*b1cdbd2cSJim Jagielski                 bool bAvailable =
726*b1cdbd2cSJim Jagielski                         !Reference< XEmbeddedScripts >( m_xModel, UNO_QUERY ).is()
727*b1cdbd2cSJim Jagielski                     &&  !Reference< XStorable >( m_xModel, UNO_QUERY_THROW )->isReadonly();
728*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = bAvailable;
729*b1cdbd2cSJim Jagielski                 if ( !bAvailable )
730*b1cdbd2cSJim Jagielski                     aReturn.bInvisible = true;
731*b1cdbd2cSJim Jagielski             }
732*b1cdbd2cSJim Jagielski             break;
733*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_FOLDER:
734*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && getContainer()->getSelectionCount() <= 1;
735*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
736*b1cdbd2cSJim Jagielski 				{
737*b1cdbd2cSJim Jagielski 					const ElementType eType = getContainer()->getElementType();
738*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = eType == E_REPORT || eType == E_FORM;
739*b1cdbd2cSJim Jagielski 				}
740*b1cdbd2cSJim Jagielski 				break;
741*b1cdbd2cSJim Jagielski 			case SID_FORM_CREATE_REPWIZ_PRE_SEL:
742*b1cdbd2cSJim Jagielski 			case SID_REPORT_CREATE_REPWIZ_PRE_SEL:
743*b1cdbd2cSJim Jagielski             case SID_APP_NEW_REPORT_PRE_SEL:
744*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly()
745*b1cdbd2cSJim Jagielski 									&& SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SWRITER)
746*b1cdbd2cSJim Jagielski 									&& getContainer()->isALeafSelected();
747*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
748*b1cdbd2cSJim Jagielski 				{
749*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
750*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = eType == E_QUERY || eType == E_TABLE;
751*b1cdbd2cSJim Jagielski                     if ( aReturn.bEnabled && SID_APP_NEW_REPORT_PRE_SEL == _nId )
752*b1cdbd2cSJim Jagielski                     {
753*b1cdbd2cSJim Jagielski                         Reference< XContentEnumerationAccess > xEnumAccess(m_xServiceFactory, UNO_QUERY);
754*b1cdbd2cSJim Jagielski 					    aReturn.bEnabled = xEnumAccess.is();
755*b1cdbd2cSJim Jagielski 	                    if ( aReturn.bEnabled )
756*b1cdbd2cSJim Jagielski                         {
757*b1cdbd2cSJim Jagielski                             static ::rtl::OUString s_sReportDesign(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.pentaho.SOReportJobFactory"));
758*b1cdbd2cSJim Jagielski                     	    Reference< XEnumeration > xEnumDrivers = xEnumAccess->createContentEnumeration(s_sReportDesign);
759*b1cdbd2cSJim Jagielski                             aReturn.bEnabled = xEnumDrivers.is() && xEnumDrivers->hasMoreElements();
760*b1cdbd2cSJim Jagielski                         }
761*b1cdbd2cSJim Jagielski                     }
762*b1cdbd2cSJim Jagielski 				}
763*b1cdbd2cSJim Jagielski 				break;
764*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DELETE:
765*b1cdbd2cSJim Jagielski 			case SID_DB_APP_RENAME:
766*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = isRenameDeleteAllowed(getContainer()->getElementType(), _nId == SID_DB_APP_DELETE);
767*b1cdbd2cSJim Jagielski 				break;
768*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_DELETE:
769*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_RENAME:
770*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = isRenameDeleteAllowed(E_TABLE, _nId == SID_DB_APP_TABLE_DELETE);
771*b1cdbd2cSJim Jagielski 				break;
772*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_DELETE:
773*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_RENAME:
774*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = isRenameDeleteAllowed(E_QUERY, _nId == SID_DB_APP_QUERY_DELETE);
775*b1cdbd2cSJim Jagielski 				break;
776*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_DELETE:
777*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_RENAME:
778*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = isRenameDeleteAllowed(E_FORM, _nId == SID_DB_APP_FORM_DELETE);
779*b1cdbd2cSJim Jagielski 				break;
780*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_DELETE:
781*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_RENAME:
782*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = isRenameDeleteAllowed(E_REPORT, _nId == SID_DB_APP_REPORT_DELETE);
783*b1cdbd2cSJim Jagielski 				break;
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski 			case SID_SELECTALL:
786*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->getElementCount() > 0 && getContainer()->getSelectionCount() != getContainer()->getElementCount();
787*b1cdbd2cSJim Jagielski 				break;
788*b1cdbd2cSJim Jagielski 			case SID_DB_APP_EDIT:
789*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_EDIT:
790*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_EDIT:
791*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_EDIT:
792*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_EDIT:
793*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly() && getContainer()->getSelectionCount() > 0
794*b1cdbd2cSJim Jagielski 									&& getContainer()->isALeafSelected();
795*b1cdbd2cSJim Jagielski 				break;
796*b1cdbd2cSJim Jagielski 			case SID_DB_APP_EDIT_SQL_VIEW:
797*b1cdbd2cSJim Jagielski                 if ( isDataSourceReadOnly() )
798*b1cdbd2cSJim Jagielski 				    aReturn.bEnabled = sal_False;
799*b1cdbd2cSJim Jagielski                 else
800*b1cdbd2cSJim Jagielski                 {
801*b1cdbd2cSJim Jagielski                     switch ( getContainer()->getElementType() )
802*b1cdbd2cSJim Jagielski                     {
803*b1cdbd2cSJim Jagielski                     case E_QUERY:
804*b1cdbd2cSJim Jagielski                         aReturn.bEnabled =  ( getContainer()->getSelectionCount() > 0 )
805*b1cdbd2cSJim Jagielski                                         &&  ( getContainer()->isALeafSelected() );
806*b1cdbd2cSJim Jagielski                         break;
807*b1cdbd2cSJim Jagielski                     case E_TABLE:
808*b1cdbd2cSJim Jagielski                         aReturn.bEnabled = sal_False;
809*b1cdbd2cSJim Jagielski                         // there's one exception: views which support altering their underlying
810*b1cdbd2cSJim Jagielski                         // command can be edited in SQL view, too
811*b1cdbd2cSJim Jagielski                         if  (   ( getContainer()->getSelectionCount() > 0 )
812*b1cdbd2cSJim Jagielski                             &&  ( getContainer()->isALeafSelected() )
813*b1cdbd2cSJim Jagielski                             )
814*b1cdbd2cSJim Jagielski                         {
815*b1cdbd2cSJim Jagielski 						    ::std::vector< ::rtl::OUString > aSelected;
816*b1cdbd2cSJim Jagielski 						    getSelectionElementNames( aSelected );
817*b1cdbd2cSJim Jagielski                             bool bAlterableViews = true;
818*b1cdbd2cSJim Jagielski                             for (   ::std::vector< ::rtl::OUString >::const_iterator selectedName = aSelected.begin();
819*b1cdbd2cSJim Jagielski                                     bAlterableViews && ( selectedName != aSelected.end() ) ;
820*b1cdbd2cSJim Jagielski                                     ++selectedName
821*b1cdbd2cSJim Jagielski                                 )
822*b1cdbd2cSJim Jagielski                             {
823*b1cdbd2cSJim Jagielski                                 bAlterableViews &= impl_isAlterableView_nothrow( *selectedName );
824*b1cdbd2cSJim Jagielski                             }
825*b1cdbd2cSJim Jagielski                             aReturn.bEnabled = bAlterableViews;
826*b1cdbd2cSJim Jagielski                         }
827*b1cdbd2cSJim Jagielski                         break;
828*b1cdbd2cSJim Jagielski                     default:
829*b1cdbd2cSJim Jagielski                         break;
830*b1cdbd2cSJim Jagielski                     }
831*b1cdbd2cSJim Jagielski                 }
832*b1cdbd2cSJim Jagielski                 break;
833*b1cdbd2cSJim Jagielski 			case SID_DB_APP_OPEN:
834*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_OPEN:
835*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_OPEN:
836*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_OPEN:
837*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_OPEN:
838*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->getSelectionCount() > 0 && getContainer()->isALeafSelected();
839*b1cdbd2cSJim Jagielski 				break;
840*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSUSERADMIN:
841*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !m_aTypeCollection.isEmbeddedDatabase(::comphelper::getString(m_xDataSource->getPropertyValue(PROPERTY_URL)));
842*b1cdbd2cSJim Jagielski 			    break;
843*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSRELDESIGN:
844*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
845*b1cdbd2cSJim Jagielski 				break;
846*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLEFILTER:
847*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly();
848*b1cdbd2cSJim Jagielski 				break;
849*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REFRESH_TABLES:
850*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = getContainer()->getElementType() == E_TABLE && isConnected();
851*b1cdbd2cSJim Jagielski 				break;
852*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSPROPS:
853*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = m_xDataSource.is() && m_aTypeCollection.isShowPropertiesEnabled(::comphelper::getString(m_xDataSource->getPropertyValue(PROPERTY_URL)));
854*b1cdbd2cSJim Jagielski 				break;
855*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSCONNECTION_TYPE:
856*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = !isDataSourceReadOnly() && m_xDataSource.is() && !m_aTypeCollection.isEmbeddedDatabase(::comphelper::getString(m_xDataSource->getPropertyValue(PROPERTY_URL)));
857*b1cdbd2cSJim Jagielski 				break;
858*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSADVANCED_SETTINGS:
859*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = m_xDataSource.is() && AdvancedSettingsDialog::doesHaveAnyAdvancedSettings( m_aTypeCollection.getType(::comphelper::getString( m_xDataSource->getPropertyValue( PROPERTY_URL ) )) );
860*b1cdbd2cSJim Jagielski 				break;
861*b1cdbd2cSJim Jagielski 			case SID_DB_APP_CONVERTTOVIEW:
862*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = !isDataSourceReadOnly();
863*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
864*b1cdbd2cSJim Jagielski 				{
865*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
866*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = eType == E_QUERY && getContainer()->getSelectionCount() > 0;
867*b1cdbd2cSJim Jagielski 					if ( aReturn.bEnabled )
868*b1cdbd2cSJim Jagielski 					{
869*b1cdbd2cSJim Jagielski 						Reference<XViewsSupplier> xViewSup( getConnection(), UNO_QUERY );
870*b1cdbd2cSJim Jagielski 						aReturn.bEnabled = xViewSup.is() && Reference<XAppend>(xViewSup->getViews(),UNO_QUERY).is();
871*b1cdbd2cSJim Jagielski 					}
872*b1cdbd2cSJim Jagielski 				}
873*b1cdbd2cSJim Jagielski 				break;
874*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DISABLE_PREVIEW:
875*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
876*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getPreviewMode() == E_PREVIEWNONE;
877*b1cdbd2cSJim Jagielski 				break;
878*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_DOCINFO_PREVIEW:
879*b1cdbd2cSJim Jagielski 				{
880*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
881*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = (E_REPORT == eType || E_FORM == eType);
882*b1cdbd2cSJim Jagielski 					aReturn.bChecked = getContainer()->getPreviewMode() == E_DOCUMENTINFO;
883*b1cdbd2cSJim Jagielski 				}
884*b1cdbd2cSJim Jagielski 				break;
885*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_DOC_PREVIEW:
886*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
887*b1cdbd2cSJim Jagielski 				aReturn.bChecked = getContainer()->getPreviewMode() == E_DOCUMENT;
888*b1cdbd2cSJim Jagielski 				break;
889*b1cdbd2cSJim Jagielski             case ID_BROWSER_UNDO:
890*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = sal_False;
891*b1cdbd2cSJim Jagielski                 break;
892*b1cdbd2cSJim Jagielski 			case SID_MAIL_SENDDOC:
893*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_True;
894*b1cdbd2cSJim Jagielski 				break;
895*b1cdbd2cSJim Jagielski 			case SID_DB_APP_SENDREPORTASMAIL:
896*b1cdbd2cSJim Jagielski 				{
897*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
898*b1cdbd2cSJim Jagielski 					aReturn.bEnabled = E_REPORT == eType && getContainer()->getSelectionCount() > 0 && getContainer()->isALeafSelected();
899*b1cdbd2cSJim Jagielski 				}
900*b1cdbd2cSJim Jagielski 				break;
901*b1cdbd2cSJim Jagielski 			case SID_DB_APP_SENDREPORTTOWRITER:
902*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DBADMIN:
903*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = sal_False;
904*b1cdbd2cSJim Jagielski 				break;
905*b1cdbd2cSJim Jagielski 			case SID_DB_APP_STATUS_TYPE:
906*b1cdbd2cSJim Jagielski                 aReturn.bEnabled = m_xDataSource.is();
907*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
908*b1cdbd2cSJim Jagielski 				{
909*b1cdbd2cSJim Jagielski                     ::rtl::OUString sURL;
910*b1cdbd2cSJim Jagielski                     m_xDataSource->getPropertyValue(PROPERTY_URL) >>= sURL;
911*b1cdbd2cSJim Jagielski                     ::rtl::OUString sDSTypeName;
912*b1cdbd2cSJim Jagielski                     if ( m_aTypeCollection.isEmbeddedDatabase( sURL ) )
913*b1cdbd2cSJim Jagielski                     {
914*b1cdbd2cSJim Jagielski                         sDSTypeName = String( ModuleRes( RID_STR_EMBEDDED_DATABASE ) );
915*b1cdbd2cSJim Jagielski                     }
916*b1cdbd2cSJim Jagielski                     else
917*b1cdbd2cSJim Jagielski                     {
918*b1cdbd2cSJim Jagielski 					    sDSTypeName = m_aTypeCollection.getTypeDisplayName(sURL);
919*b1cdbd2cSJim Jagielski                     }
920*b1cdbd2cSJim Jagielski 				    aReturn.sTitle = sDSTypeName;
921*b1cdbd2cSJim Jagielski 				}
922*b1cdbd2cSJim Jagielski 				break;
923*b1cdbd2cSJim Jagielski 			case SID_DB_APP_STATUS_DBNAME:
924*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = m_xDataSource.is();
925*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
926*b1cdbd2cSJim Jagielski 				{
927*b1cdbd2cSJim Jagielski 					::rtl::OUString sURL;
928*b1cdbd2cSJim Jagielski 					m_xDataSource->getPropertyValue(PROPERTY_URL) >>= sURL;
929*b1cdbd2cSJim Jagielski                     String sDatabaseName;
930*b1cdbd2cSJim Jagielski 					String sHostName;
931*b1cdbd2cSJim Jagielski 					sal_Int32 nPortNumber( -1 );
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 					m_aTypeCollection.extractHostNamePort( sURL, sDatabaseName, sHostName, nPortNumber );
934*b1cdbd2cSJim Jagielski 
935*b1cdbd2cSJim Jagielski                     if ( !sDatabaseName.Len() )
936*b1cdbd2cSJim Jagielski 						sDatabaseName = m_aTypeCollection.cutPrefix( sURL );
937*b1cdbd2cSJim Jagielski 					if ( m_aTypeCollection.isFileSystemBased(sURL) )
938*b1cdbd2cSJim Jagielski 					{
939*b1cdbd2cSJim Jagielski 						sDatabaseName = SvtPathOptions().SubstituteVariable( sDatabaseName );
940*b1cdbd2cSJim Jagielski 						if ( sDatabaseName.Len() )
941*b1cdbd2cSJim Jagielski 						{
942*b1cdbd2cSJim Jagielski 							::svt::OFileNotation aFileNotation(sDatabaseName);
943*b1cdbd2cSJim Jagielski 							// set this decoded URL as text
944*b1cdbd2cSJim Jagielski 							sDatabaseName = aFileNotation.get(::svt::OFileNotation::N_SYSTEM);
945*b1cdbd2cSJim Jagielski 						}
946*b1cdbd2cSJim Jagielski 					}
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski                     if ( sDatabaseName.Len() == 0 )
949*b1cdbd2cSJim Jagielski                         sDatabaseName = m_aTypeCollection.getTypeDisplayName( sURL );
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski                     aReturn.sTitle = sDatabaseName;
952*b1cdbd2cSJim Jagielski 				}
953*b1cdbd2cSJim Jagielski 				break;
954*b1cdbd2cSJim Jagielski 			case SID_DB_APP_STATUS_USERNAME:
955*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = m_xDataSource.is();
956*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
957*b1cdbd2cSJim Jagielski                     m_xDataSource->getPropertyValue( PROPERTY_USER ) >>= aReturn.sTitle;
958*b1cdbd2cSJim Jagielski 				break;
959*b1cdbd2cSJim Jagielski 			case SID_DB_APP_STATUS_HOSTNAME:
960*b1cdbd2cSJim Jagielski 				aReturn.bEnabled = m_xDataSource.is();
961*b1cdbd2cSJim Jagielski 				if ( aReturn.bEnabled )
962*b1cdbd2cSJim Jagielski 				{
963*b1cdbd2cSJim Jagielski 					::rtl::OUString sURL;
964*b1cdbd2cSJim Jagielski 					m_xDataSource->getPropertyValue( PROPERTY_URL ) >>= sURL;
965*b1cdbd2cSJim Jagielski 
966*b1cdbd2cSJim Jagielski 					String sHostName, sDatabaseName;
967*b1cdbd2cSJim Jagielski 					sal_Int32 nPortNumber = -1;
968*b1cdbd2cSJim Jagielski 					m_aTypeCollection.extractHostNamePort( sURL, sDatabaseName, sHostName, nPortNumber );
969*b1cdbd2cSJim Jagielski 					aReturn.sTitle = sHostName;
970*b1cdbd2cSJim Jagielski 				}
971*b1cdbd2cSJim Jagielski 				break;
972*b1cdbd2cSJim Jagielski 			default:
973*b1cdbd2cSJim Jagielski 				aReturn = OApplicationController_CBASE::GetState(_nId);
974*b1cdbd2cSJim Jagielski 		}
975*b1cdbd2cSJim Jagielski 	}
976*b1cdbd2cSJim Jagielski 	catch(const Exception& )
977*b1cdbd2cSJim Jagielski 	{
978*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
979*b1cdbd2cSJim Jagielski 	}
980*b1cdbd2cSJim Jagielski 	return aReturn;
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
984*b1cdbd2cSJim Jagielski namespace
985*b1cdbd2cSJim Jagielski {
lcl_handleException_nothrow(const Reference<XModel> & _rxDocument,const Any & _rException)986*b1cdbd2cSJim Jagielski     bool lcl_handleException_nothrow( const Reference< XModel >& _rxDocument, const Any& _rException )
987*b1cdbd2cSJim Jagielski     {
988*b1cdbd2cSJim Jagielski         bool bHandled = false;
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski         // try handling the error with an interaction handler
991*b1cdbd2cSJim Jagielski         ::comphelper::NamedValueCollection aArgs( _rxDocument->getArgs() );
992*b1cdbd2cSJim Jagielski         Reference< XInteractionHandler > xHandler( aArgs.getOrDefault( "InteractionHandler", Reference< XInteractionHandler >() ) );
993*b1cdbd2cSJim Jagielski         if ( xHandler.is() )
994*b1cdbd2cSJim Jagielski         {
995*b1cdbd2cSJim Jagielski             ::rtl::Reference< ::comphelper::OInteractionRequest > pRequest( new ::comphelper::OInteractionRequest( _rException ) );
996*b1cdbd2cSJim Jagielski             ::rtl::Reference< ::comphelper::OInteractionApprove > pApprove( new ::comphelper::OInteractionApprove );
997*b1cdbd2cSJim Jagielski             pRequest->addContinuation( pApprove.get() );
998*b1cdbd2cSJim Jagielski 
999*b1cdbd2cSJim Jagielski             try
1000*b1cdbd2cSJim Jagielski             {
1001*b1cdbd2cSJim Jagielski                 xHandler->handle( pRequest.get() );
1002*b1cdbd2cSJim Jagielski             }
1003*b1cdbd2cSJim Jagielski             catch( const Exception& )
1004*b1cdbd2cSJim Jagielski             {
1005*b1cdbd2cSJim Jagielski                 DBG_UNHANDLED_EXCEPTION();
1006*b1cdbd2cSJim Jagielski             }
1007*b1cdbd2cSJim Jagielski 
1008*b1cdbd2cSJim Jagielski             bHandled = pApprove->wasSelected();
1009*b1cdbd2cSJim Jagielski         }
1010*b1cdbd2cSJim Jagielski         return bHandled;
1011*b1cdbd2cSJim Jagielski     }
1012*b1cdbd2cSJim Jagielski }
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
Execute(sal_uInt16 _nId,const Sequence<PropertyValue> & aArgs)1015*b1cdbd2cSJim Jagielski void OApplicationController::Execute(sal_uInt16 _nId, const Sequence< PropertyValue >& aArgs)
1016*b1cdbd2cSJim Jagielski {
1017*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
1018*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski     if ( isUserDefinedFeature( _nId ) )
1021*b1cdbd2cSJim Jagielski     {
1022*b1cdbd2cSJim Jagielski         OApplicationController_CBASE::Execute( _nId, aArgs );
1023*b1cdbd2cSJim Jagielski         return;
1024*b1cdbd2cSJim Jagielski     }
1025*b1cdbd2cSJim Jagielski 
1026*b1cdbd2cSJim Jagielski 	if ( !getContainer() || m_bReadOnly )
1027*b1cdbd2cSJim Jagielski 		return; // return without execution
1028*b1cdbd2cSJim Jagielski 
1029*b1cdbd2cSJim Jagielski 	try
1030*b1cdbd2cSJim Jagielski 	{
1031*b1cdbd2cSJim Jagielski 		switch(_nId)
1032*b1cdbd2cSJim Jagielski 		{
1033*b1cdbd2cSJim Jagielski 			case ID_BROWSER_CUT:
1034*b1cdbd2cSJim Jagielski 				getContainer()->cut();
1035*b1cdbd2cSJim Jagielski 				break;
1036*b1cdbd2cSJim Jagielski 			case ID_BROWSER_COPY:
1037*b1cdbd2cSJim Jagielski 				{
1038*b1cdbd2cSJim Jagielski 					TransferableHelper* pTransfer = copyObject( );
1039*b1cdbd2cSJim Jagielski 					Reference< XTransferable> aEnsureDelete = pTransfer;
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski 					if ( pTransfer )
1042*b1cdbd2cSJim Jagielski 						pTransfer->CopyToClipboard(getView());
1043*b1cdbd2cSJim Jagielski 				}
1044*b1cdbd2cSJim Jagielski 				break;
1045*b1cdbd2cSJim Jagielski 			case ID_BROWSER_PASTE:
1046*b1cdbd2cSJim Jagielski 				{
1047*b1cdbd2cSJim Jagielski 					const TransferableDataHelper& rTransferData( getViewClipboard() );
1048*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
1049*b1cdbd2cSJim Jagielski 
1050*b1cdbd2cSJim Jagielski 					switch( eType )
1051*b1cdbd2cSJim Jagielski 					{
1052*b1cdbd2cSJim Jagielski 						case E_TABLE:
1053*b1cdbd2cSJim Jagielski 							{
1054*b1cdbd2cSJim Jagielski 								// get the selected tablename
1055*b1cdbd2cSJim Jagielski 								::std::vector< ::rtl::OUString > aList;
1056*b1cdbd2cSJim Jagielski 								getSelectionElementNames( aList );
1057*b1cdbd2cSJim Jagielski 								if ( !aList.empty() )
1058*b1cdbd2cSJim Jagielski 									m_aTableCopyHelper.SetTableNameForAppend( *aList.begin() );
1059*b1cdbd2cSJim Jagielski                                 else
1060*b1cdbd2cSJim Jagielski                                     m_aTableCopyHelper.ResetTableNameForAppend();
1061*b1cdbd2cSJim Jagielski 
1062*b1cdbd2cSJim Jagielski 								m_aTableCopyHelper.pasteTable( rTransferData , getDatabaseName(), ensureConnection() );
1063*b1cdbd2cSJim Jagielski 							}
1064*b1cdbd2cSJim Jagielski 							break;
1065*b1cdbd2cSJim Jagielski 
1066*b1cdbd2cSJim Jagielski 						case E_QUERY:
1067*b1cdbd2cSJim Jagielski                             if ( rTransferData.HasFormat(SOT_FORMATSTR_ID_DBACCESS_QUERY) )
1068*b1cdbd2cSJim Jagielski 							    paste( E_QUERY, ODataAccessObjectTransferable::extractObjectDescriptor( rTransferData ) );
1069*b1cdbd2cSJim Jagielski 							break;
1070*b1cdbd2cSJim Jagielski 						default:
1071*b1cdbd2cSJim Jagielski 							{
1072*b1cdbd2cSJim Jagielski 								::std::vector< ::rtl::OUString> aList;
1073*b1cdbd2cSJim Jagielski 								getSelectionElementNames(aList);
1074*b1cdbd2cSJim Jagielski 								::rtl::OUString sFolderNameToInsertInto;
1075*b1cdbd2cSJim Jagielski 								if ( !aList.empty() )
1076*b1cdbd2cSJim Jagielski 								{
1077*b1cdbd2cSJim Jagielski 									Reference< XHierarchicalNameAccess > xContainer(getElements(eType),UNO_QUERY);
1078*b1cdbd2cSJim Jagielski 									if ( xContainer.is()
1079*b1cdbd2cSJim Jagielski 										&& xContainer->hasByHierarchicalName(*aList.begin())
1080*b1cdbd2cSJim Jagielski 										&& (xContainer->getByHierarchicalName(*aList.begin()) >>= xContainer)
1081*b1cdbd2cSJim Jagielski 										&& xContainer.is()
1082*b1cdbd2cSJim Jagielski 										)
1083*b1cdbd2cSJim Jagielski 										sFolderNameToInsertInto = *aList.begin();
1084*b1cdbd2cSJim Jagielski 								}
1085*b1cdbd2cSJim Jagielski 								paste( eType, OComponentTransferable::extractComponentDescriptor( rTransferData ),
1086*b1cdbd2cSJim Jagielski                                     sFolderNameToInsertInto );
1087*b1cdbd2cSJim Jagielski 							}
1088*b1cdbd2cSJim Jagielski 							break;
1089*b1cdbd2cSJim Jagielski 					}
1090*b1cdbd2cSJim Jagielski 				}
1091*b1cdbd2cSJim Jagielski 				break;
1092*b1cdbd2cSJim Jagielski 			case SID_DB_APP_PASTE_SPECIAL:
1093*b1cdbd2cSJim Jagielski 				{
1094*b1cdbd2cSJim Jagielski 					if ( !aArgs.getLength() )
1095*b1cdbd2cSJim Jagielski 					{
1096*b1cdbd2cSJim Jagielski                         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1097*b1cdbd2cSJim Jagielski                         ::std::auto_ptr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog( getView() ));
1098*b1cdbd2cSJim Jagielski 						::std::vector<SotFormatStringId> aFormatIds;
1099*b1cdbd2cSJim Jagielski 						getSupportedFormats(getContainer()->getElementType(),aFormatIds);
1100*b1cdbd2cSJim Jagielski 						const ::std::vector<SotFormatStringId>::iterator aEnd = aFormatIds.end();
1101*b1cdbd2cSJim Jagielski                         ::rtl::OUString sEmpty;
1102*b1cdbd2cSJim Jagielski 						for (::std::vector<SotFormatStringId>::iterator aIter = aFormatIds.begin();aIter != aEnd; ++aIter)
1103*b1cdbd2cSJim Jagielski 							pDlg->Insert(*aIter,sEmpty);
1104*b1cdbd2cSJim Jagielski 
1105*b1cdbd2cSJim Jagielski 						const TransferableDataHelper& rClipboard = getViewClipboard();
1106*b1cdbd2cSJim Jagielski 						pasteFormat(pDlg->GetFormat(rClipboard.GetTransferable()));
1107*b1cdbd2cSJim Jagielski 					}
1108*b1cdbd2cSJim Jagielski 					else
1109*b1cdbd2cSJim Jagielski 					{
1110*b1cdbd2cSJim Jagielski 						const PropertyValue* pIter = aArgs.getConstArray();
1111*b1cdbd2cSJim Jagielski 						const PropertyValue* pEnd  = pIter + aArgs.getLength();
1112*b1cdbd2cSJim Jagielski 						for( ; pIter != pEnd ; ++pIter)
1113*b1cdbd2cSJim Jagielski 						{
1114*b1cdbd2cSJim Jagielski 							if ( pIter->Name.equalsAscii("FormatStringId") )
1115*b1cdbd2cSJim Jagielski 							{
1116*b1cdbd2cSJim Jagielski 								SotFormatStringId nFormatId = 0;
1117*b1cdbd2cSJim Jagielski 								if ( pIter->Value >>= nFormatId )
1118*b1cdbd2cSJim Jagielski 									pasteFormat(nFormatId);
1119*b1cdbd2cSJim Jagielski 								break;
1120*b1cdbd2cSJim Jagielski 							}
1121*b1cdbd2cSJim Jagielski 						}
1122*b1cdbd2cSJim Jagielski 					}
1123*b1cdbd2cSJim Jagielski 				}
1124*b1cdbd2cSJim Jagielski 				break;
1125*b1cdbd2cSJim Jagielski 			case SID_OPENDOC:
1126*b1cdbd2cSJim Jagielski 			case SID_HELP_INDEX:
1127*b1cdbd2cSJim Jagielski 				{
1128*b1cdbd2cSJim Jagielski 					Reference < XDispatchProvider > xProv( getFrame(), UNO_QUERY );
1129*b1cdbd2cSJim Jagielski 					if ( xProv.is() )
1130*b1cdbd2cSJim Jagielski 					{
1131*b1cdbd2cSJim Jagielski 						URL aURL;
1132*b1cdbd2cSJim Jagielski 						switch(_nId)
1133*b1cdbd2cSJim Jagielski 						{
1134*b1cdbd2cSJim Jagielski 							case SID_HELP_INDEX:
1135*b1cdbd2cSJim Jagielski 								aURL.Complete = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:HelpIndex"));
1136*b1cdbd2cSJim Jagielski 								break;
1137*b1cdbd2cSJim Jagielski 							case SID_OPENDOC:
1138*b1cdbd2cSJim Jagielski 								aURL.Complete = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Open"));
1139*b1cdbd2cSJim Jagielski 								break;
1140*b1cdbd2cSJim Jagielski 						}
1141*b1cdbd2cSJim Jagielski 
1142*b1cdbd2cSJim Jagielski 						if ( m_xUrlTransformer.is() )
1143*b1cdbd2cSJim Jagielski 							m_xUrlTransformer->parseStrict( aURL );
1144*b1cdbd2cSJim Jagielski 						Reference < XDispatch > xDisp = xProv->queryDispatch( aURL, String(), 0 );
1145*b1cdbd2cSJim Jagielski             			if ( xDisp.is() )
1146*b1cdbd2cSJim Jagielski                 			xDisp->dispatch( aURL, Sequence < PropertyValue >() );
1147*b1cdbd2cSJim Jagielski 					}
1148*b1cdbd2cSJim Jagielski 				}
1149*b1cdbd2cSJim Jagielski 				break;
1150*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SAVEDOC:
1151*b1cdbd2cSJim Jagielski 				{
1152*b1cdbd2cSJim Jagielski 					Reference< XStorable > xStore( m_xModel, UNO_QUERY_THROW );
1153*b1cdbd2cSJim Jagielski                     try
1154*b1cdbd2cSJim Jagielski                     {
1155*b1cdbd2cSJim Jagielski                         xStore->store();
1156*b1cdbd2cSJim Jagielski                     }
1157*b1cdbd2cSJim Jagielski                     catch( const Exception& )
1158*b1cdbd2cSJim Jagielski                     {
1159*b1cdbd2cSJim Jagielski                         lcl_handleException_nothrow( m_xModel, ::cppu::getCaughtException() );
1160*b1cdbd2cSJim Jagielski                     }
1161*b1cdbd2cSJim Jagielski 				}
1162*b1cdbd2cSJim Jagielski 				break;
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski             case ID_BROWSER_SAVEASDOC:
1165*b1cdbd2cSJim Jagielski 				{
1166*b1cdbd2cSJim Jagielski 					WinBits nBits(WB_STDMODAL|WB_SAVEAS);
1167*b1cdbd2cSJim Jagielski                     ::rtl::OUString sUrl;
1168*b1cdbd2cSJim Jagielski 			        if ( m_xModel.is() )
1169*b1cdbd2cSJim Jagielski 				        sUrl = m_xModel->getURL();
1170*b1cdbd2cSJim Jagielski 			        if ( !sUrl.getLength() )
1171*b1cdbd2cSJim Jagielski                         sUrl = SvtPathOptions().GetWorkPath();
1172*b1cdbd2cSJim Jagielski 
1173*b1cdbd2cSJim Jagielski 					::sfx2::FileDialogHelper aFileDlg( com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_AUTOEXTENSION,static_cast<sal_uInt32>(nBits) ,getView());
1174*b1cdbd2cSJim Jagielski 					aFileDlg.SetDisplayDirectory( sUrl );
1175*b1cdbd2cSJim Jagielski 
1176*b1cdbd2cSJim Jagielski 					const SfxFilter* pFilter = getStandardDatabaseFilter();
1177*b1cdbd2cSJim Jagielski 					if ( pFilter )
1178*b1cdbd2cSJim Jagielski 					{
1179*b1cdbd2cSJim Jagielski 						aFileDlg.AddFilter(pFilter->GetUIName(),pFilter->GetDefaultExtension());
1180*b1cdbd2cSJim Jagielski 						aFileDlg.SetCurrentFilter(pFilter->GetUIName());
1181*b1cdbd2cSJim Jagielski 					}
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski 					if ( aFileDlg.Execute() != ERRCODE_NONE )
1184*b1cdbd2cSJim Jagielski                         break;
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski                     Reference<XStorable> xStore( m_xModel, UNO_QUERY_THROW );
1187*b1cdbd2cSJim Jagielski 					INetURLObject aURL( aFileDlg.GetPath() );
1188*b1cdbd2cSJim Jagielski                     try
1189*b1cdbd2cSJim Jagielski                     {
1190*b1cdbd2cSJim Jagielski                         xStore->storeAsURL( aURL.GetMainURL( INetURLObject::NO_DECODE ), Sequence< PropertyValue >() );
1191*b1cdbd2cSJim Jagielski                     }
1192*b1cdbd2cSJim Jagielski                     catch( const Exception& )
1193*b1cdbd2cSJim Jagielski                     {
1194*b1cdbd2cSJim Jagielski                         lcl_handleException_nothrow( m_xModel, ::cppu::getCaughtException() );
1195*b1cdbd2cSJim Jagielski                     }
1196*b1cdbd2cSJim Jagielski 
1197*b1cdbd2cSJim Jagielski 					/*updateTitle();*/
1198*b1cdbd2cSJim Jagielski 					m_bCurrentlyModified = sal_False;
1199*b1cdbd2cSJim Jagielski 					InvalidateFeature(ID_BROWSER_SAVEDOC);
1200*b1cdbd2cSJim Jagielski                     if ( getContainer()->getElementType() == E_NONE )
1201*b1cdbd2cSJim Jagielski                     {
1202*b1cdbd2cSJim Jagielski                         getContainer()->selectContainer(E_NONE);
1203*b1cdbd2cSJim Jagielski                         getContainer()->selectContainer(E_TABLE);
1204*b1cdbd2cSJim Jagielski                         // #i95524#
1205*b1cdbd2cSJim Jagielski                         getContainer()->Invalidate();
1206*b1cdbd2cSJim Jagielski                         refreshTables();
1207*b1cdbd2cSJim Jagielski                     }
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski 				}
1210*b1cdbd2cSJim Jagielski 				break;
1211*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SORTUP:
1212*b1cdbd2cSJim Jagielski 				getContainer()->sortUp();
1213*b1cdbd2cSJim Jagielski 				InvalidateFeature(ID_BROWSER_SORTDOWN);
1214*b1cdbd2cSJim Jagielski 				break;
1215*b1cdbd2cSJim Jagielski 			case ID_BROWSER_SORTDOWN:
1216*b1cdbd2cSJim Jagielski 				getContainer()->sortDown();
1217*b1cdbd2cSJim Jagielski 				InvalidateFeature(ID_BROWSER_SORTUP);
1218*b1cdbd2cSJim Jagielski 				break;
1219*b1cdbd2cSJim Jagielski 
1220*b1cdbd2cSJim Jagielski 			case ID_NEW_TABLE_DESIGN_AUTO_PILOT:
1221*b1cdbd2cSJim Jagielski 			case ID_NEW_VIEW_DESIGN_AUTO_PILOT:
1222*b1cdbd2cSJim Jagielski 			case ID_APP_NEW_QUERY_AUTO_PILOT:
1223*b1cdbd2cSJim Jagielski 			case SID_DB_FORM_NEW_PILOT:
1224*b1cdbd2cSJim Jagielski 			case SID_REPORT_CREATE_REPWIZ_PRE_SEL:
1225*b1cdbd2cSJim Jagielski             case SID_APP_NEW_REPORT_PRE_SEL:
1226*b1cdbd2cSJim Jagielski 			case SID_FORM_CREATE_REPWIZ_PRE_SEL:
1227*b1cdbd2cSJim Jagielski 			case ID_DOCUMENT_CREATE_REPWIZ:
1228*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_FORM:
1229*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_REPORT:
1230*b1cdbd2cSJim Jagielski 			case ID_NEW_QUERY_SQL:
1231*b1cdbd2cSJim Jagielski 			case ID_NEW_QUERY_DESIGN:
1232*b1cdbd2cSJim Jagielski 			case ID_NEW_TABLE_DESIGN:
1233*b1cdbd2cSJim Jagielski 				{
1234*b1cdbd2cSJim Jagielski 					ElementType eType = E_TABLE;
1235*b1cdbd2cSJim Jagielski 					sal_Bool bAutoPilot = sal_False;
1236*b1cdbd2cSJim Jagielski                     ::comphelper::NamedValueCollection aCreationArgs;
1237*b1cdbd2cSJim Jagielski 
1238*b1cdbd2cSJim Jagielski 					switch( _nId )
1239*b1cdbd2cSJim Jagielski 					{
1240*b1cdbd2cSJim Jagielski 						case SID_DB_FORM_NEW_PILOT:
1241*b1cdbd2cSJim Jagielski 						case SID_FORM_CREATE_REPWIZ_PRE_SEL:
1242*b1cdbd2cSJim Jagielski 							bAutoPilot = sal_True;
1243*b1cdbd2cSJim Jagielski 							// run through
1244*b1cdbd2cSJim Jagielski 						case SID_APP_NEW_FORM:
1245*b1cdbd2cSJim Jagielski 							eType = E_FORM;
1246*b1cdbd2cSJim Jagielski 							break;
1247*b1cdbd2cSJim Jagielski 						case ID_DOCUMENT_CREATE_REPWIZ:
1248*b1cdbd2cSJim Jagielski 						case SID_REPORT_CREATE_REPWIZ_PRE_SEL:
1249*b1cdbd2cSJim Jagielski 							bAutoPilot = sal_True;
1250*b1cdbd2cSJim Jagielski 							// run through
1251*b1cdbd2cSJim Jagielski 						case SID_APP_NEW_REPORT:
1252*b1cdbd2cSJim Jagielski                         case SID_APP_NEW_REPORT_PRE_SEL:
1253*b1cdbd2cSJim Jagielski 							eType = E_REPORT;
1254*b1cdbd2cSJim Jagielski 							break;
1255*b1cdbd2cSJim Jagielski 						case ID_APP_NEW_QUERY_AUTO_PILOT:
1256*b1cdbd2cSJim Jagielski 							bAutoPilot = sal_True;
1257*b1cdbd2cSJim Jagielski 							eType = E_QUERY;
1258*b1cdbd2cSJim Jagielski 							break;
1259*b1cdbd2cSJim Jagielski 						case ID_NEW_QUERY_DESIGN:
1260*b1cdbd2cSJim Jagielski                             aCreationArgs.put( (::rtl::OUString)PROPERTY_GRAPHICAL_DESIGN, sal_True );
1261*b1cdbd2cSJim Jagielski 							// run through
1262*b1cdbd2cSJim Jagielski 						case ID_NEW_QUERY_SQL:
1263*b1cdbd2cSJim Jagielski 							eType = E_QUERY;
1264*b1cdbd2cSJim Jagielski 							break;
1265*b1cdbd2cSJim Jagielski  						case ID_NEW_TABLE_DESIGN_AUTO_PILOT:
1266*b1cdbd2cSJim Jagielski  							bAutoPilot = sal_True;
1267*b1cdbd2cSJim Jagielski  							// run through
1268*b1cdbd2cSJim Jagielski 						case ID_NEW_TABLE_DESIGN:
1269*b1cdbd2cSJim Jagielski 							break;
1270*b1cdbd2cSJim Jagielski 						default:
1271*b1cdbd2cSJim Jagielski 							OSL_ENSURE(0,"illegal switch call!");
1272*b1cdbd2cSJim Jagielski 					}
1273*b1cdbd2cSJim Jagielski                     if ( bAutoPilot )
1274*b1cdbd2cSJim Jagielski                         getContainer()->PostUserEvent( LINK( this, OApplicationController, OnCreateWithPilot ), reinterpret_cast< void* >( eType ) );
1275*b1cdbd2cSJim Jagielski                     else
1276*b1cdbd2cSJim Jagielski                     {
1277*b1cdbd2cSJim Jagielski                         Reference< XComponent > xDocDefinition;
1278*b1cdbd2cSJim Jagielski 					    newElement( eType, aCreationArgs, xDocDefinition );
1279*b1cdbd2cSJim Jagielski                     }
1280*b1cdbd2cSJim Jagielski 				}
1281*b1cdbd2cSJim Jagielski 				break;
1282*b1cdbd2cSJim Jagielski 			case SID_APP_NEW_FOLDER:
1283*b1cdbd2cSJim Jagielski 				{
1284*b1cdbd2cSJim Jagielski 					ElementType eType = getContainer()->getElementType();
1285*b1cdbd2cSJim Jagielski 					::rtl::OUString sName = getContainer()->getQualifiedName( NULL );
1286*b1cdbd2cSJim Jagielski 					insertHierachyElement(eType,sName);
1287*b1cdbd2cSJim Jagielski 				}
1288*b1cdbd2cSJim Jagielski 				break;
1289*b1cdbd2cSJim Jagielski 			case ID_NEW_VIEW_DESIGN:
1290*b1cdbd2cSJim Jagielski 			case SID_DB_NEW_VIEW_SQL:
1291*b1cdbd2cSJim Jagielski 				{
1292*b1cdbd2cSJim Jagielski                     SharedConnection xConnection( ensureConnection() );
1293*b1cdbd2cSJim Jagielski 					if ( xConnection.is() )
1294*b1cdbd2cSJim Jagielski 					{
1295*b1cdbd2cSJim Jagielski 						QueryDesigner aDesigner( getORB(), this, getFrame(), true );
1296*b1cdbd2cSJim Jagielski 
1297*b1cdbd2cSJim Jagielski                         ::comphelper::NamedValueCollection aCreationArgs;
1298*b1cdbd2cSJim Jagielski                         aCreationArgs.put( (::rtl::OUString)PROPERTY_GRAPHICAL_DESIGN, ID_NEW_VIEW_DESIGN == _nId );
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski                         const Reference< XDataSource > xDataSource( m_xDataSource, UNO_QUERY );
1301*b1cdbd2cSJim Jagielski 						const Reference< XComponent > xComponent( aDesigner.createNew( xDataSource, aCreationArgs ), UNO_QUERY );
1302*b1cdbd2cSJim Jagielski                         onDocumentOpened( ::rtl::OUString(), E_QUERY, E_OPEN_DESIGN, xComponent, NULL );
1303*b1cdbd2cSJim Jagielski 					}
1304*b1cdbd2cSJim Jagielski 				}
1305*b1cdbd2cSJim Jagielski 				break;
1306*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DELETE:
1307*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_DELETE:
1308*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_DELETE:
1309*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_DELETE:
1310*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_DELETE:
1311*b1cdbd2cSJim Jagielski 				deleteEntries();
1312*b1cdbd2cSJim Jagielski 				break;
1313*b1cdbd2cSJim Jagielski 			case SID_DB_APP_RENAME:
1314*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_RENAME:
1315*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_RENAME:
1316*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_RENAME:
1317*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_RENAME:
1318*b1cdbd2cSJim Jagielski 				renameEntry();
1319*b1cdbd2cSJim Jagielski 				break;
1320*b1cdbd2cSJim Jagielski 			case SID_DB_APP_EDIT:
1321*b1cdbd2cSJim Jagielski 			case SID_DB_APP_EDIT_SQL_VIEW:
1322*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_EDIT:
1323*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_EDIT:
1324*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_EDIT:
1325*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_EDIT:
1326*b1cdbd2cSJim Jagielski 				doAction( _nId, E_OPEN_DESIGN );
1327*b1cdbd2cSJim Jagielski                 break;
1328*b1cdbd2cSJim Jagielski 			case SID_DB_APP_OPEN:
1329*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLE_OPEN:
1330*b1cdbd2cSJim Jagielski 			case SID_DB_APP_QUERY_OPEN:
1331*b1cdbd2cSJim Jagielski 			case SID_DB_APP_FORM_OPEN:
1332*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REPORT_OPEN:
1333*b1cdbd2cSJim Jagielski 				doAction( _nId, E_OPEN_NORMAL );
1334*b1cdbd2cSJim Jagielski 				break;
1335*b1cdbd2cSJim Jagielski 			case SID_DB_APP_CONVERTTOVIEW:
1336*b1cdbd2cSJim Jagielski 				doAction( _nId, E_OPEN_NORMAL );
1337*b1cdbd2cSJim Jagielski 				break;
1338*b1cdbd2cSJim Jagielski 			case SID_SELECTALL:
1339*b1cdbd2cSJim Jagielski 				getContainer()->selectAll();
1340*b1cdbd2cSJim Jagielski 				InvalidateAll();
1341*b1cdbd2cSJim Jagielski 				break;
1342*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSRELDESIGN:
1343*b1cdbd2cSJim Jagielski             {
1344*b1cdbd2cSJim Jagielski                 Reference< XComponent > xRelationDesigner;
1345*b1cdbd2cSJim Jagielski                 if ( !m_pSubComponentManager->activateSubFrame( ::rtl::OUString(), SID_DB_APP_DSRELDESIGN, E_OPEN_DESIGN, xRelationDesigner ) )
1346*b1cdbd2cSJim Jagielski                 {
1347*b1cdbd2cSJim Jagielski 				    SharedConnection xConnection( ensureConnection() );
1348*b1cdbd2cSJim Jagielski 				    if ( xConnection.is() )
1349*b1cdbd2cSJim Jagielski 				    {
1350*b1cdbd2cSJim Jagielski 					    RelationDesigner aDesigner( getORB(), this, m_aCurrentFrame.getFrame() );
1351*b1cdbd2cSJim Jagielski 
1352*b1cdbd2cSJim Jagielski                         const Reference< XDataSource > xDataSource( m_xDataSource, UNO_QUERY );
1353*b1cdbd2cSJim Jagielski 					    const Reference< XComponent > xComponent( aDesigner.createNew( xDataSource ), UNO_QUERY );
1354*b1cdbd2cSJim Jagielski                         onDocumentOpened( ::rtl::OUString(), SID_DB_APP_DSRELDESIGN, E_OPEN_DESIGN, xComponent, NULL );
1355*b1cdbd2cSJim Jagielski 				    }
1356*b1cdbd2cSJim Jagielski                 }
1357*b1cdbd2cSJim Jagielski             }
1358*b1cdbd2cSJim Jagielski 			break;
1359*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSUSERADMIN:
1360*b1cdbd2cSJim Jagielski 				{
1361*b1cdbd2cSJim Jagielski 					SharedConnection xConnection( ensureConnection() );
1362*b1cdbd2cSJim Jagielski 					if ( xConnection.is() )
1363*b1cdbd2cSJim Jagielski 						openDialog(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.UserAdministrationDialog")));
1364*b1cdbd2cSJim Jagielski 				}
1365*b1cdbd2cSJim Jagielski 				break;
1366*b1cdbd2cSJim Jagielski 			case SID_DB_APP_TABLEFILTER:
1367*b1cdbd2cSJim Jagielski 				openTableFilterDialog();
1368*b1cdbd2cSJim Jagielski 				askToReconnect();
1369*b1cdbd2cSJim Jagielski 				break;
1370*b1cdbd2cSJim Jagielski 			case SID_DB_APP_REFRESH_TABLES:
1371*b1cdbd2cSJim Jagielski 				refreshTables();
1372*b1cdbd2cSJim Jagielski 				break;
1373*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSPROPS:
1374*b1cdbd2cSJim Jagielski 				openDataSourceAdminDialog();
1375*b1cdbd2cSJim Jagielski 				askToReconnect();
1376*b1cdbd2cSJim Jagielski 				break;
1377*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSADVANCED_SETTINGS:
1378*b1cdbd2cSJim Jagielski 				openDialog(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.AdvancedDatabaseSettingsDialog")));
1379*b1cdbd2cSJim Jagielski 				askToReconnect();
1380*b1cdbd2cSJim Jagielski 				break;
1381*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DSCONNECTION_TYPE:
1382*b1cdbd2cSJim Jagielski 				openDialog(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.DataSourceTypeChangeDialog")));
1383*b1cdbd2cSJim Jagielski 				askToReconnect();
1384*b1cdbd2cSJim Jagielski 				break;
1385*b1cdbd2cSJim Jagielski 			case ID_DIRECT_SQL:
1386*b1cdbd2cSJim Jagielski 				{
1387*b1cdbd2cSJim Jagielski 					SharedConnection xConnection( ensureConnection() );
1388*b1cdbd2cSJim Jagielski 					if ( xConnection.is() )
1389*b1cdbd2cSJim Jagielski 						openDirectSQLDialog();
1390*b1cdbd2cSJim Jagielski 				}
1391*b1cdbd2cSJim Jagielski 				break;
1392*b1cdbd2cSJim Jagielski             case ID_MIGRATE_SCRIPTS:
1393*b1cdbd2cSJim Jagielski                 impl_migrateScripts_nothrow();
1394*b1cdbd2cSJim Jagielski                 break;
1395*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_TABLES:
1396*b1cdbd2cSJim Jagielski                 m_aSelectContainerEvent.Call( reinterpret_cast< void* >( E_TABLE ) );
1397*b1cdbd2cSJim Jagielski 				break;
1398*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_QUERIES:
1399*b1cdbd2cSJim Jagielski                 m_aSelectContainerEvent.Call( reinterpret_cast< void* >( E_QUERY ) );
1400*b1cdbd2cSJim Jagielski 				break;
1401*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_FORMS:
1402*b1cdbd2cSJim Jagielski                 m_aSelectContainerEvent.Call( reinterpret_cast< void* >( E_FORM ) );
1403*b1cdbd2cSJim Jagielski 				break;
1404*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_REPORTS:
1405*b1cdbd2cSJim Jagielski                 m_aSelectContainerEvent.Call( reinterpret_cast< void* >( E_REPORT ) );
1406*b1cdbd2cSJim Jagielski 				break;
1407*b1cdbd2cSJim Jagielski 			case SID_DB_APP_DISABLE_PREVIEW:
1408*b1cdbd2cSJim Jagielski 				m_ePreviewMode = E_PREVIEWNONE;
1409*b1cdbd2cSJim Jagielski 				getContainer()->switchPreview(m_ePreviewMode);
1410*b1cdbd2cSJim Jagielski 				break;
1411*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_DOCINFO_PREVIEW:
1412*b1cdbd2cSJim Jagielski 				m_ePreviewMode = E_DOCUMENTINFO;
1413*b1cdbd2cSJim Jagielski 				getContainer()->switchPreview(m_ePreviewMode);
1414*b1cdbd2cSJim Jagielski 				break;
1415*b1cdbd2cSJim Jagielski 			case SID_DB_APP_VIEW_DOC_PREVIEW:
1416*b1cdbd2cSJim Jagielski 				m_ePreviewMode = E_DOCUMENT;
1417*b1cdbd2cSJim Jagielski 				getContainer()->switchPreview(m_ePreviewMode);
1418*b1cdbd2cSJim Jagielski 				break;
1419*b1cdbd2cSJim Jagielski 			case SID_MAIL_SENDDOC:
1420*b1cdbd2cSJim Jagielski 				{
1421*b1cdbd2cSJim Jagielski 					SfxMailModel aSendMail;
1422*b1cdbd2cSJim Jagielski                     if ( aSendMail.AttachDocument(rtl::OUString(),getModel(), rtl::OUString()) == SfxMailModel::SEND_MAIL_OK )
1423*b1cdbd2cSJim Jagielski 						aSendMail.Send( getFrame() );
1424*b1cdbd2cSJim Jagielski 				}
1425*b1cdbd2cSJim Jagielski 				break;
1426*b1cdbd2cSJim Jagielski 			case SID_DB_APP_SENDREPORTASMAIL:
1427*b1cdbd2cSJim Jagielski 				doAction( _nId, E_OPEN_FOR_MAIL );
1428*b1cdbd2cSJim Jagielski 				break;
1429*b1cdbd2cSJim Jagielski 		}
1430*b1cdbd2cSJim Jagielski 	}
1431*b1cdbd2cSJim Jagielski 	catch( const Exception& )
1432*b1cdbd2cSJim Jagielski 	{
1433*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
1434*b1cdbd2cSJim Jagielski 	}
1435*b1cdbd2cSJim Jagielski 	InvalidateFeature(_nId);
1436*b1cdbd2cSJim Jagielski }
1437*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
describeSupportedFeatures()1438*b1cdbd2cSJim Jagielski void OApplicationController::describeSupportedFeatures()
1439*b1cdbd2cSJim Jagielski {
1440*b1cdbd2cSJim Jagielski 	OApplicationController_CBASE::describeSupportedFeatures();
1441*b1cdbd2cSJim Jagielski 
1442*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:Save",               ID_BROWSER_SAVEDOC,        CommandGroup::DOCUMENT );
1443*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:SaveAs",             ID_BROWSER_SAVEASDOC,      CommandGroup::DOCUMENT );
1444*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:SendMail",			 SID_MAIL_SENDDOC,			CommandGroup::DOCUMENT );
1445*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBSendReportAsMail",SID_DB_APP_SENDREPORTASMAIL,
1446*b1cdbd2cSJim Jagielski 																						CommandGroup::DOCUMENT );
1447*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBSendReportToWriter",SID_DB_APP_SENDREPORTTOWRITER,
1448*b1cdbd2cSJim Jagielski 																						CommandGroup::DOCUMENT );
1449*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewForm",          SID_APP_NEW_FORM,          CommandGroup::INSERT );
1450*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewFolder",        SID_APP_NEW_FOLDER,        CommandGroup::INSERT );
1451*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewFormAutoPilot", SID_DB_FORM_NEW_PILOT,     CommandGroup::INSERT );
1452*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewFormAutoPilotWithPreSelection",
1453*b1cdbd2cSJim Jagielski                                                              SID_FORM_CREATE_REPWIZ_PRE_SEL,
1454*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::APPLICATION );
1455*b1cdbd2cSJim Jagielski 
1456*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBNewReport",		 SID_APP_NEW_REPORT,		CommandGroup::INSERT );
1457*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewReportAutoPilot",
1458*b1cdbd2cSJim Jagielski                                                              ID_DOCUMENT_CREATE_REPWIZ, CommandGroup::INSERT );
1459*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewReportAutoPilotWithPreSelection",
1460*b1cdbd2cSJim Jagielski                                                              SID_REPORT_CREATE_REPWIZ_PRE_SEL,
1461*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::APPLICATION );
1462*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewQuery",         ID_NEW_QUERY_DESIGN,       CommandGroup::INSERT );
1463*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewQuerySql",      ID_NEW_QUERY_SQL,          CommandGroup::INSERT );
1464*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewQueryAutoPilot",ID_APP_NEW_QUERY_AUTO_PILOT,
1465*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::INSERT );
1466*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewTable",         ID_NEW_TABLE_DESIGN,       CommandGroup::INSERT );
1467*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewTableAutoPilot",ID_NEW_TABLE_DESIGN_AUTO_PILOT,
1468*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::INSERT );
1469*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewView",          ID_NEW_VIEW_DESIGN,        CommandGroup::INSERT );
1470*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewViewSQL",       SID_DB_NEW_VIEW_SQL,       CommandGroup::INSERT );
1471*b1cdbd2cSJim Jagielski 
1472*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDelete",           SID_DB_APP_DELETE,         CommandGroup::EDIT );
1473*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:Delete",			 SID_DB_APP_DELETE,         CommandGroup::EDIT );
1474*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBRename",           SID_DB_APP_RENAME,         CommandGroup::EDIT );
1475*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBEdit",             SID_DB_APP_EDIT,           CommandGroup::EDIT );
1476*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBEditSqlView",      SID_DB_APP_EDIT_SQL_VIEW,  CommandGroup::EDIT );
1477*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBOpen",             SID_DB_APP_OPEN,           CommandGroup::EDIT );
1478*b1cdbd2cSJim Jagielski 
1479*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBTableDelete",      SID_DB_APP_TABLE_DELETE,   CommandGroup::EDIT );
1480*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBTableRename",      SID_DB_APP_TABLE_RENAME,   CommandGroup::EDIT );
1481*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBTableEdit",        SID_DB_APP_TABLE_EDIT,     CommandGroup::EDIT );
1482*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBTableOpen",        SID_DB_APP_TABLE_OPEN,     CommandGroup::EDIT );
1483*b1cdbd2cSJim Jagielski 
1484*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBQueryDelete",      SID_DB_APP_QUERY_DELETE,   CommandGroup::EDIT );
1485*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBQueryRename",      SID_DB_APP_QUERY_RENAME,   CommandGroup::EDIT );
1486*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBQueryEdit",        SID_DB_APP_QUERY_EDIT,     CommandGroup::EDIT );
1487*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBQueryOpen",        SID_DB_APP_QUERY_OPEN,     CommandGroup::EDIT );
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBFormDelete",       SID_DB_APP_FORM_DELETE,    CommandGroup::EDIT );
1490*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBFormRename",       SID_DB_APP_FORM_RENAME,    CommandGroup::EDIT );
1491*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBFormEdit",         SID_DB_APP_FORM_EDIT,      CommandGroup::EDIT );
1492*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBFormOpen",         SID_DB_APP_FORM_OPEN,      CommandGroup::EDIT );
1493*b1cdbd2cSJim Jagielski 
1494*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBReportDelete",     SID_DB_APP_REPORT_DELETE,  CommandGroup::EDIT );
1495*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBReportRename",     SID_DB_APP_REPORT_RENAME,  CommandGroup::EDIT );
1496*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBReportEdit",       SID_DB_APP_REPORT_EDIT,    CommandGroup::EDIT );
1497*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBReportOpen",       SID_DB_APP_REPORT_OPEN,    CommandGroup::EDIT );
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:SelectAll",          SID_SELECTALL,             CommandGroup::EDIT );
1500*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:Undo",               ID_BROWSER_UNDO,           CommandGroup::EDIT );
1501*b1cdbd2cSJim Jagielski 
1502*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:Sortup",             ID_BROWSER_SORTUP,         CommandGroup::VIEW );
1503*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:SortDown",           ID_BROWSER_SORTDOWN,       CommandGroup::VIEW );
1504*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBRelationDesign",   SID_DB_APP_DSRELDESIGN,    CommandGroup::APPLICATION );
1505*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBUserAdmin",        SID_DB_APP_DSUSERADMIN,    CommandGroup::APPLICATION );
1506*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBTableFilter",      SID_DB_APP_TABLEFILTER,    CommandGroup::APPLICATION );
1507*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDSProperties",     SID_DB_APP_DSPROPS,        CommandGroup::EDIT );
1508*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDSConnectionType", SID_DB_APP_DSCONNECTION_TYPE,
1509*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::EDIT );
1510*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDSAdvancedSettings",
1511*b1cdbd2cSJim Jagielski                                                              SID_DB_APP_DSADVANCED_SETTINGS,
1512*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::EDIT );
1513*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:PasteSpecial",       SID_DB_APP_PASTE_SPECIAL,  CommandGroup::EDIT );
1514*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBConvertToView",    SID_DB_APP_CONVERTTOVIEW,  CommandGroup::EDIT );
1515*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBRefreshTables",    SID_DB_APP_REFRESH_TABLES, CommandGroup::APPLICATION );
1516*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDirectSQL",        ID_DIRECT_SQL,             CommandGroup::APPLICATION );
1517*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBMigrateScripts",   ID_MIGRATE_SCRIPTS,        CommandGroup::APPLICATION );
1518*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBViewTables",       SID_DB_APP_VIEW_TABLES,    CommandGroup::VIEW );
1519*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBViewQueries",      SID_DB_APP_VIEW_QUERIES,   CommandGroup::VIEW );
1520*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBViewForms",        SID_DB_APP_VIEW_FORMS,     CommandGroup::VIEW );
1521*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBViewReports",      SID_DB_APP_VIEW_REPORTS,   CommandGroup::VIEW );
1522*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBDisablePreview",   SID_DB_APP_DISABLE_PREVIEW,CommandGroup::VIEW );
1523*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBShowDocInfoPreview",
1524*b1cdbd2cSJim Jagielski                                                              SID_DB_APP_VIEW_DOCINFO_PREVIEW,
1525*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::VIEW );
1526*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBShowDocPreview",   SID_DB_APP_VIEW_DOC_PREVIEW,
1527*b1cdbd2cSJim Jagielski                                                                                         CommandGroup::VIEW );
1528*b1cdbd2cSJim Jagielski 
1529*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:OpenUrl",            SID_OPENURL,               CommandGroup::APPLICATION );
1530*b1cdbd2cSJim Jagielski 
1531*b1cdbd2cSJim Jagielski     // this one should not appear under Tools->Customize->Keyboard
1532*b1cdbd2cSJim Jagielski     implDescribeSupportedFeature( ".uno:DBNewReportWithPreSelection",
1533*b1cdbd2cSJim Jagielski                                                              SID_APP_NEW_REPORT_PRE_SEL,CommandGroup::INTERNAL );
1534*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBDSImport",		SID_DB_APP_DSIMPORT, CommandGroup::INTERNAL);
1535*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBDSExport",		SID_DB_APP_DSEXPORT, CommandGroup::INTERNAL);
1536*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBDBAdmin",			SID_DB_APP_DBADMIN, CommandGroup::INTERNAL);
1537*b1cdbd2cSJim Jagielski 
1538*b1cdbd2cSJim Jagielski 	// status info
1539*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBStatusType",		SID_DB_APP_STATUS_TYPE, CommandGroup::INTERNAL);
1540*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBStatusDBName",	SID_DB_APP_STATUS_DBNAME, CommandGroup::INTERNAL);
1541*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBStatusUserName",	SID_DB_APP_STATUS_USERNAME, CommandGroup::INTERNAL);
1542*b1cdbd2cSJim Jagielski 	implDescribeSupportedFeature( ".uno:DBStatusHostName",	SID_DB_APP_STATUS_HOSTNAME, CommandGroup::INTERNAL);
1543*b1cdbd2cSJim Jagielski }
1544*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getContainer() const1545*b1cdbd2cSJim Jagielski OApplicationView*	OApplicationController::getContainer() const
1546*b1cdbd2cSJim Jagielski {
1547*b1cdbd2cSJim Jagielski 	return static_cast< OApplicationView* >( getView() );
1548*b1cdbd2cSJim Jagielski }
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
1551*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XContainerListener
elementInserted(const ContainerEvent & _rEvent)1552*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::elementInserted( const ContainerEvent& _rEvent ) throw(RuntimeException)
1553*b1cdbd2cSJim Jagielski {
1554*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
1555*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
1556*b1cdbd2cSJim Jagielski 
1557*b1cdbd2cSJim Jagielski 	Reference< XContainer > xContainer(_rEvent.Source, UNO_QUERY);
1558*b1cdbd2cSJim Jagielski 	if ( ::std::find(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),xContainer) != m_aCurrentContainers.end() )
1559*b1cdbd2cSJim Jagielski 	{
1560*b1cdbd2cSJim Jagielski 		OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
1561*b1cdbd2cSJim Jagielski 		if ( getContainer() )
1562*b1cdbd2cSJim Jagielski 		{
1563*b1cdbd2cSJim Jagielski 			::rtl::OUString sName;
1564*b1cdbd2cSJim Jagielski 			_rEvent.Accessor >>= sName;
1565*b1cdbd2cSJim Jagielski 			ElementType eType = getElementType(xContainer);
1566*b1cdbd2cSJim Jagielski 
1567*b1cdbd2cSJim Jagielski 			switch( eType )
1568*b1cdbd2cSJim Jagielski 			{
1569*b1cdbd2cSJim Jagielski 				case E_TABLE:
1570*b1cdbd2cSJim Jagielski 					ensureConnection();
1571*b1cdbd2cSJim Jagielski 					break;
1572*b1cdbd2cSJim Jagielski 				case E_FORM:
1573*b1cdbd2cSJim Jagielski 				case E_REPORT:
1574*b1cdbd2cSJim Jagielski 					{
1575*b1cdbd2cSJim Jagielski 						Reference< XContainer > xSubContainer(_rEvent.Element,UNO_QUERY);
1576*b1cdbd2cSJim Jagielski 						if ( xSubContainer.is() )
1577*b1cdbd2cSJim Jagielski 							containerFound(xSubContainer);
1578*b1cdbd2cSJim Jagielski 					}
1579*b1cdbd2cSJim Jagielski 					break;
1580*b1cdbd2cSJim Jagielski                 default:
1581*b1cdbd2cSJim Jagielski                     break;
1582*b1cdbd2cSJim Jagielski 			}
1583*b1cdbd2cSJim Jagielski 			getContainer()->elementAdded(eType,sName,_rEvent.Element);
1584*b1cdbd2cSJim Jagielski 		}
1585*b1cdbd2cSJim Jagielski 	}
1586*b1cdbd2cSJim Jagielski }
1587*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
elementRemoved(const ContainerEvent & _rEvent)1588*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::elementRemoved( const ContainerEvent& _rEvent ) throw(RuntimeException)
1589*b1cdbd2cSJim Jagielski {
1590*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
1591*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
1592*b1cdbd2cSJim Jagielski 
1593*b1cdbd2cSJim Jagielski 	Reference< XContainer > xContainer(_rEvent.Source, UNO_QUERY);
1594*b1cdbd2cSJim Jagielski 	if ( ::std::find(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),xContainer) != m_aCurrentContainers.end() )
1595*b1cdbd2cSJim Jagielski 	{
1596*b1cdbd2cSJim Jagielski 		OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
1597*b1cdbd2cSJim Jagielski 		::rtl::OUString sName;
1598*b1cdbd2cSJim Jagielski 		_rEvent.Accessor >>= sName;
1599*b1cdbd2cSJim Jagielski 		ElementType eType = getElementType(xContainer);
1600*b1cdbd2cSJim Jagielski 		switch( eType )
1601*b1cdbd2cSJim Jagielski 		{
1602*b1cdbd2cSJim Jagielski 			case E_TABLE:
1603*b1cdbd2cSJim Jagielski 				ensureConnection();
1604*b1cdbd2cSJim Jagielski 				break;
1605*b1cdbd2cSJim Jagielski 			case E_FORM:
1606*b1cdbd2cSJim Jagielski 			case E_REPORT:
1607*b1cdbd2cSJim Jagielski 				{
1608*b1cdbd2cSJim Jagielski 					Reference<XContent> xContent(xContainer,UNO_QUERY);
1609*b1cdbd2cSJim Jagielski 					if ( xContent.is() )
1610*b1cdbd2cSJim Jagielski 					{
1611*b1cdbd2cSJim Jagielski 						sName = xContent->getIdentifier()->getContentIdentifier() + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) + sName;
1612*b1cdbd2cSJim Jagielski 					}
1613*b1cdbd2cSJim Jagielski 				}
1614*b1cdbd2cSJim Jagielski 				break;
1615*b1cdbd2cSJim Jagielski             default:
1616*b1cdbd2cSJim Jagielski                 break;
1617*b1cdbd2cSJim Jagielski 		}
1618*b1cdbd2cSJim Jagielski 		getContainer()->elementRemoved(eType,sName);
1619*b1cdbd2cSJim Jagielski 	}
1620*b1cdbd2cSJim Jagielski }
1621*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
elementReplaced(const ContainerEvent & _rEvent)1622*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::elementReplaced( const ContainerEvent& _rEvent ) throw(RuntimeException)
1623*b1cdbd2cSJim Jagielski {
1624*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
1625*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
1626*b1cdbd2cSJim Jagielski 
1627*b1cdbd2cSJim Jagielski 	Reference< XContainer > xContainer(_rEvent.Source, UNO_QUERY);
1628*b1cdbd2cSJim Jagielski 	if ( ::std::find(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),xContainer) != m_aCurrentContainers.end() )
1629*b1cdbd2cSJim Jagielski 	{
1630*b1cdbd2cSJim Jagielski 		OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
1631*b1cdbd2cSJim Jagielski 		::rtl::OUString sName;
1632*b1cdbd2cSJim Jagielski 		try
1633*b1cdbd2cSJim Jagielski 		{
1634*b1cdbd2cSJim Jagielski 			_rEvent.Accessor >>= sName;
1635*b1cdbd2cSJim Jagielski 			Reference<XConnection> xConnection;
1636*b1cdbd2cSJim Jagielski 			Reference<XPropertySet> xProp(_rEvent.Element,UNO_QUERY);
1637*b1cdbd2cSJim Jagielski 			::rtl::OUString sNewName;
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski 			ElementType eType = getElementType(xContainer);
1640*b1cdbd2cSJim Jagielski 			switch( eType )
1641*b1cdbd2cSJim Jagielski 			{
1642*b1cdbd2cSJim Jagielski 				case E_TABLE:
1643*b1cdbd2cSJim Jagielski                 {
1644*b1cdbd2cSJim Jagielski 					ensureConnection();
1645*b1cdbd2cSJim Jagielski 					if ( xProp.is() && m_xMetaData.is() )
1646*b1cdbd2cSJim Jagielski 						sNewName = ::dbaui::composeTableName( m_xMetaData, xProp, ::dbtools::eInDataManipulation, false, false, false );
1647*b1cdbd2cSJim Jagielski                 }
1648*b1cdbd2cSJim Jagielski 				break;
1649*b1cdbd2cSJim Jagielski 				case E_FORM:
1650*b1cdbd2cSJim Jagielski 				case E_REPORT:
1651*b1cdbd2cSJim Jagielski 					{
1652*b1cdbd2cSJim Jagielski 						Reference<XContent> xContent(xContainer,UNO_QUERY);
1653*b1cdbd2cSJim Jagielski 						if ( xContent.is() )
1654*b1cdbd2cSJim Jagielski 						{
1655*b1cdbd2cSJim Jagielski 							sName = xContent->getIdentifier()->getContentIdentifier() + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")) + sName;
1656*b1cdbd2cSJim Jagielski 						}
1657*b1cdbd2cSJim Jagielski 					}
1658*b1cdbd2cSJim Jagielski 					break;
1659*b1cdbd2cSJim Jagielski                 default:
1660*b1cdbd2cSJim Jagielski                     break;
1661*b1cdbd2cSJim Jagielski 			}
1662*b1cdbd2cSJim Jagielski 			//	getContainer()->elementReplaced(getContainer()->getElementType(),sName,sNewName);
1663*b1cdbd2cSJim Jagielski 		}
1664*b1cdbd2cSJim Jagielski 		catch( Exception& )
1665*b1cdbd2cSJim Jagielski 		{
1666*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
1667*b1cdbd2cSJim Jagielski 		}
1668*b1cdbd2cSJim Jagielski 	}
1669*b1cdbd2cSJim Jagielski }
1670*b1cdbd2cSJim Jagielski namespace
1671*b1cdbd2cSJim Jagielski {
lcl_getToolBarResource(ElementType _eType)1672*b1cdbd2cSJim Jagielski 	::rtl::OUString lcl_getToolBarResource(ElementType _eType)
1673*b1cdbd2cSJim Jagielski 	{
1674*b1cdbd2cSJim Jagielski 		::rtl::OUString sToolbar;
1675*b1cdbd2cSJim Jagielski 		switch(_eType)
1676*b1cdbd2cSJim Jagielski 		{
1677*b1cdbd2cSJim Jagielski 			case E_TABLE:
1678*b1cdbd2cSJim Jagielski 				sToolbar = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/tableobjectbar" ));
1679*b1cdbd2cSJim Jagielski 				break;
1680*b1cdbd2cSJim Jagielski 			case E_QUERY:
1681*b1cdbd2cSJim Jagielski 				sToolbar = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/queryobjectbar" ));
1682*b1cdbd2cSJim Jagielski 				break;
1683*b1cdbd2cSJim Jagielski 			case E_FORM:
1684*b1cdbd2cSJim Jagielski 				sToolbar = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/formobjectbar" ));
1685*b1cdbd2cSJim Jagielski 				break;
1686*b1cdbd2cSJim Jagielski 			case E_REPORT:
1687*b1cdbd2cSJim Jagielski 				sToolbar = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/reportobjectbar" ));
1688*b1cdbd2cSJim Jagielski 				break;
1689*b1cdbd2cSJim Jagielski 			case E_NONE:
1690*b1cdbd2cSJim Jagielski 				break;
1691*b1cdbd2cSJim Jagielski 			default:
1692*b1cdbd2cSJim Jagielski 				OSL_ENSURE(0,"Invalid ElementType!");
1693*b1cdbd2cSJim Jagielski 				break;
1694*b1cdbd2cSJim Jagielski 		}
1695*b1cdbd2cSJim Jagielski 		return sToolbar;
1696*b1cdbd2cSJim Jagielski 	}
1697*b1cdbd2cSJim Jagielski }
1698*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onContainerSelect(ElementType _eType)1699*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::onContainerSelect(ElementType _eType)
1700*b1cdbd2cSJim Jagielski {
1701*b1cdbd2cSJim Jagielski 	OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
1702*b1cdbd2cSJim Jagielski 
1703*b1cdbd2cSJim Jagielski     if ( m_eCurrentType != _eType && _eType != E_NONE )
1704*b1cdbd2cSJim Jagielski 	{
1705*b1cdbd2cSJim Jagielski         SelectionGuard aSelGuard( *m_pSelectionNotifier );
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski         if ( _eType == E_TABLE )
1708*b1cdbd2cSJim Jagielski 		{
1709*b1cdbd2cSJim Jagielski 			try
1710*b1cdbd2cSJim Jagielski 			{
1711*b1cdbd2cSJim Jagielski 				SharedConnection xConnection( ensureConnection() );
1712*b1cdbd2cSJim Jagielski 				if ( xConnection.is() && getContainer()->getDetailView() )
1713*b1cdbd2cSJim Jagielski 				{
1714*b1cdbd2cSJim Jagielski 					getContainer()->getDetailView()->createTablesPage(xConnection);
1715*b1cdbd2cSJim Jagielski 					Reference<XTablesSupplier> xTabSup(xConnection,UNO_QUERY);
1716*b1cdbd2cSJim Jagielski 					if ( xTabSup.is() )
1717*b1cdbd2cSJim Jagielski 						addContainerListener(xTabSup->getTables());
1718*b1cdbd2cSJim Jagielski 				}
1719*b1cdbd2cSJim Jagielski 				else
1720*b1cdbd2cSJim Jagielski 				{
1721*b1cdbd2cSJim Jagielski 					return sal_False;
1722*b1cdbd2cSJim Jagielski 				}
1723*b1cdbd2cSJim Jagielski 			}
1724*b1cdbd2cSJim Jagielski 			catch( const Exception& )
1725*b1cdbd2cSJim Jagielski 			{
1726*b1cdbd2cSJim Jagielski 				return sal_False;
1727*b1cdbd2cSJim Jagielski 			}
1728*b1cdbd2cSJim Jagielski 		}
1729*b1cdbd2cSJim Jagielski         Reference< XLayoutManager > xLayoutManager = getLayoutManager( getFrame() );
1730*b1cdbd2cSJim Jagielski         if ( xLayoutManager.is() )
1731*b1cdbd2cSJim Jagielski         {
1732*b1cdbd2cSJim Jagielski 		    ::rtl::OUString sToolbar = lcl_getToolBarResource(_eType);
1733*b1cdbd2cSJim Jagielski 		    ::rtl::OUString sDestroyToolbar = lcl_getToolBarResource(m_eCurrentType);
1734*b1cdbd2cSJim Jagielski 
1735*b1cdbd2cSJim Jagielski 		    xLayoutManager->lock();
1736*b1cdbd2cSJim Jagielski 		    xLayoutManager->destroyElement( sDestroyToolbar );
1737*b1cdbd2cSJim Jagielski 		    if ( sToolbar.getLength() )
1738*b1cdbd2cSJim Jagielski 		    {
1739*b1cdbd2cSJim Jagielski 			    xLayoutManager->createElement( sToolbar );
1740*b1cdbd2cSJim Jagielski 			    xLayoutManager->requestElement( sToolbar );
1741*b1cdbd2cSJim Jagielski 		    }
1742*b1cdbd2cSJim Jagielski 		    xLayoutManager->unlock();
1743*b1cdbd2cSJim Jagielski 		    xLayoutManager->doLayout();
1744*b1cdbd2cSJim Jagielski         }
1745*b1cdbd2cSJim Jagielski 
1746*b1cdbd2cSJim Jagielski 		if ( _eType != E_TABLE && getContainer()->getDetailView() )
1747*b1cdbd2cSJim Jagielski 		{
1748*b1cdbd2cSJim Jagielski 			Reference< XNameAccess > xContainer = getElements(_eType);
1749*b1cdbd2cSJim Jagielski 			addContainerListener(xContainer);
1750*b1cdbd2cSJim Jagielski 			getContainer()->getDetailView()->createPage(_eType,xContainer);
1751*b1cdbd2cSJim Jagielski 		}
1752*b1cdbd2cSJim Jagielski 
1753*b1cdbd2cSJim Jagielski         SelectionByElementType::iterator pendingSelection = m_aPendingSelection.find( _eType );
1754*b1cdbd2cSJim Jagielski         if ( pendingSelection != m_aPendingSelection.end() )
1755*b1cdbd2cSJim Jagielski         {
1756*b1cdbd2cSJim Jagielski             Sequence< ::rtl::OUString > aSelected( pendingSelection->second.size() );
1757*b1cdbd2cSJim Jagielski             ::std::copy( pendingSelection->second.begin(), pendingSelection->second.end(), aSelected.getArray() );
1758*b1cdbd2cSJim Jagielski             getContainer()->selectElements( aSelected );
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski             m_aPendingSelection.erase( pendingSelection );
1761*b1cdbd2cSJim Jagielski         }
1762*b1cdbd2cSJim Jagielski 
1763*b1cdbd2cSJim Jagielski 		InvalidateAll();
1764*b1cdbd2cSJim Jagielski 	}
1765*b1cdbd2cSJim Jagielski 	m_eCurrentType = _eType;
1766*b1cdbd2cSJim Jagielski 
1767*b1cdbd2cSJim Jagielski 	return sal_True;
1768*b1cdbd2cSJim Jagielski }
1769*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onEntryDoubleClick(SvTreeListBox & _rTree)1770*b1cdbd2cSJim Jagielski bool OApplicationController::onEntryDoubleClick( SvTreeListBox& _rTree )
1771*b1cdbd2cSJim Jagielski {
1772*b1cdbd2cSJim Jagielski 	if ( getContainer() && getContainer()->isLeaf( _rTree.GetHdlEntry() ) )
1773*b1cdbd2cSJim Jagielski 	{
1774*b1cdbd2cSJim Jagielski 		try
1775*b1cdbd2cSJim Jagielski 		{
1776*b1cdbd2cSJim Jagielski 			openElement(
1777*b1cdbd2cSJim Jagielski                 getContainer()->getQualifiedName( _rTree.GetHdlEntry() ),
1778*b1cdbd2cSJim Jagielski                 getContainer()->getElementType(),
1779*b1cdbd2cSJim Jagielski                 E_OPEN_NORMAL
1780*b1cdbd2cSJim Jagielski             );
1781*b1cdbd2cSJim Jagielski             return true;    // handled
1782*b1cdbd2cSJim Jagielski 		}
1783*b1cdbd2cSJim Jagielski 		catch(const Exception&)
1784*b1cdbd2cSJim Jagielski 		{
1785*b1cdbd2cSJim Jagielski 			DBG_UNHANDLED_EXCEPTION();
1786*b1cdbd2cSJim Jagielski 		}
1787*b1cdbd2cSJim Jagielski 	}
1788*b1cdbd2cSJim Jagielski     return false;   // not handled
1789*b1cdbd2cSJim Jagielski }
1790*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
impl_isAlterableView_nothrow(const::rtl::OUString & _rTableOrViewName) const1791*b1cdbd2cSJim Jagielski bool OApplicationController::impl_isAlterableView_nothrow( const ::rtl::OUString& _rTableOrViewName ) const
1792*b1cdbd2cSJim Jagielski {
1793*b1cdbd2cSJim Jagielski     OSL_PRECOND( m_xDataSourceConnection.is(), "OApplicationController::impl_isAlterableView_nothrow: no connection!" );
1794*b1cdbd2cSJim Jagielski 
1795*b1cdbd2cSJim Jagielski     bool bIsAlterableView( false );
1796*b1cdbd2cSJim Jagielski     try
1797*b1cdbd2cSJim Jagielski     {
1798*b1cdbd2cSJim Jagielski         Reference< XViewsSupplier > xViewsSupp( m_xDataSourceConnection, UNO_QUERY );
1799*b1cdbd2cSJim Jagielski         Reference< XNameAccess > xViews;
1800*b1cdbd2cSJim Jagielski         if ( xViewsSupp.is() )
1801*b1cdbd2cSJim Jagielski             xViews = xViewsSupp->getViews();
1802*b1cdbd2cSJim Jagielski 
1803*b1cdbd2cSJim Jagielski         Reference< XAlterView > xAsAlterableView;
1804*b1cdbd2cSJim Jagielski         if ( xViews.is() && xViews->hasByName( _rTableOrViewName ) )
1805*b1cdbd2cSJim Jagielski             xAsAlterableView.set( xViews->getByName( _rTableOrViewName ), UNO_QUERY );
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski         bIsAlterableView = xAsAlterableView.is();
1808*b1cdbd2cSJim Jagielski     }
1809*b1cdbd2cSJim Jagielski     catch( const Exception& )
1810*b1cdbd2cSJim Jagielski     {
1811*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
1812*b1cdbd2cSJim Jagielski     }
1813*b1cdbd2cSJim Jagielski     return bIsAlterableView;
1814*b1cdbd2cSJim Jagielski }
1815*b1cdbd2cSJim Jagielski 
1816*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
openElement(const::rtl::OUString & _sName,ElementType _eType,ElementOpenMode _eOpenMode,sal_uInt16 _nInstigatorCommand)1817*b1cdbd2cSJim Jagielski Reference< XComponent > OApplicationController::openElement(const ::rtl::OUString& _sName, ElementType _eType,
1818*b1cdbd2cSJim Jagielski     ElementOpenMode _eOpenMode, sal_uInt16 _nInstigatorCommand )
1819*b1cdbd2cSJim Jagielski {
1820*b1cdbd2cSJim Jagielski     return openElementWithArguments( _sName, _eType, _eOpenMode, _nInstigatorCommand, ::comphelper::NamedValueCollection() );
1821*b1cdbd2cSJim Jagielski }
1822*b1cdbd2cSJim Jagielski 
1823*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
openElementWithArguments(const::rtl::OUString & _sName,ElementType _eType,ElementOpenMode _eOpenMode,sal_uInt16 _nInstigatorCommand,const::comphelper::NamedValueCollection & _rAdditionalArguments)1824*b1cdbd2cSJim Jagielski Reference< XComponent > OApplicationController::openElementWithArguments( const ::rtl::OUString& _sName, ElementType _eType,
1825*b1cdbd2cSJim Jagielski     ElementOpenMode _eOpenMode, sal_uInt16 _nInstigatorCommand, const ::comphelper::NamedValueCollection& _rAdditionalArguments )
1826*b1cdbd2cSJim Jagielski {
1827*b1cdbd2cSJim Jagielski     OSL_PRECOND( getContainer(), "OApplicationController::openElementWithArguments: no view!" );
1828*b1cdbd2cSJim Jagielski     if ( !getContainer() )
1829*b1cdbd2cSJim Jagielski         return NULL;
1830*b1cdbd2cSJim Jagielski 
1831*b1cdbd2cSJim Jagielski 	Reference< XComponent > xRet;
1832*b1cdbd2cSJim Jagielski 	if ( _eOpenMode == E_OPEN_DESIGN )
1833*b1cdbd2cSJim Jagielski 	{
1834*b1cdbd2cSJim Jagielski 		// OJ: http://www.openoffice.org/issues/show_bug.cgi?id=30382
1835*b1cdbd2cSJim Jagielski 		getContainer()->showPreview(NULL);
1836*b1cdbd2cSJim Jagielski 	}
1837*b1cdbd2cSJim Jagielski 
1838*b1cdbd2cSJim Jagielski     bool isStandaloneDocument = false;
1839*b1cdbd2cSJim Jagielski     switch ( _eType )
1840*b1cdbd2cSJim Jagielski 	{
1841*b1cdbd2cSJim Jagielski 	case E_REPORT:
1842*b1cdbd2cSJim Jagielski         if ( _eOpenMode != E_OPEN_DESIGN )
1843*b1cdbd2cSJim Jagielski         {
1844*b1cdbd2cSJim Jagielski             // reports which are opened in a mode other than design are no sub components of our application
1845*b1cdbd2cSJim Jagielski             // component, but standalone documents.
1846*b1cdbd2cSJim Jagielski             isStandaloneDocument = true;
1847*b1cdbd2cSJim Jagielski         }
1848*b1cdbd2cSJim Jagielski         // NO break!
1849*b1cdbd2cSJim Jagielski 	case E_FORM:
1850*b1cdbd2cSJim Jagielski 	{
1851*b1cdbd2cSJim Jagielski         if ( isStandaloneDocument || !m_pSubComponentManager->activateSubFrame( _sName, _eType, _eOpenMode, xRet ) )
1852*b1cdbd2cSJim Jagielski         {
1853*b1cdbd2cSJim Jagielski 		    ::std::auto_ptr< OLinkedDocumentsAccess > aHelper = getDocumentsAccess( _eType );
1854*b1cdbd2cSJim Jagielski             if ( !aHelper->isConnected() )
1855*b1cdbd2cSJim Jagielski                 break;
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski 		    Reference< XComponent > xDefinition;
1858*b1cdbd2cSJim Jagielski 		    xRet = aHelper->open( _sName, xDefinition, _eOpenMode, _rAdditionalArguments );
1859*b1cdbd2cSJim Jagielski 
1860*b1cdbd2cSJim Jagielski             if ( !isStandaloneDocument )
1861*b1cdbd2cSJim Jagielski 		        onDocumentOpened( _sName, _eType, _eOpenMode, xRet, xDefinition );
1862*b1cdbd2cSJim Jagielski         }
1863*b1cdbd2cSJim Jagielski 	}
1864*b1cdbd2cSJim Jagielski 	break;
1865*b1cdbd2cSJim Jagielski 
1866*b1cdbd2cSJim Jagielski 	case E_QUERY:
1867*b1cdbd2cSJim Jagielski 	case E_TABLE:
1868*b1cdbd2cSJim Jagielski 	{
1869*b1cdbd2cSJim Jagielski         if ( !m_pSubComponentManager->activateSubFrame( _sName, _eType, _eOpenMode, xRet ) )
1870*b1cdbd2cSJim Jagielski         {
1871*b1cdbd2cSJim Jagielski 		    SharedConnection xConnection( ensureConnection() );
1872*b1cdbd2cSJim Jagielski 		    if ( !xConnection.is() )
1873*b1cdbd2cSJim Jagielski                 break;
1874*b1cdbd2cSJim Jagielski 
1875*b1cdbd2cSJim Jagielski             ::std::auto_ptr< DatabaseObjectView > pDesigner;
1876*b1cdbd2cSJim Jagielski             ::comphelper::NamedValueCollection aArguments( _rAdditionalArguments );
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski             Any aDataSource;
1879*b1cdbd2cSJim Jagielski 		    if ( _eOpenMode == E_OPEN_DESIGN )
1880*b1cdbd2cSJim Jagielski 		    {
1881*b1cdbd2cSJim Jagielski                 bool bAddViewTypeArg = false;
1882*b1cdbd2cSJim Jagielski 
1883*b1cdbd2cSJim Jagielski 			    if ( _eType == E_TABLE )
1884*b1cdbd2cSJim Jagielski 			    {
1885*b1cdbd2cSJim Jagielski                     if ( impl_isAlterableView_nothrow( _sName ) )
1886*b1cdbd2cSJim Jagielski                     {
1887*b1cdbd2cSJim Jagielski                         pDesigner.reset( new QueryDesigner( getORB(), this, m_aCurrentFrame.getFrame(), true ) );
1888*b1cdbd2cSJim Jagielski                         bAddViewTypeArg = true;
1889*b1cdbd2cSJim Jagielski                     }
1890*b1cdbd2cSJim Jagielski                     else
1891*b1cdbd2cSJim Jagielski                     {
1892*b1cdbd2cSJim Jagielski                         pDesigner.reset( new TableDesigner( getORB(), this, m_aCurrentFrame.getFrame() ) );
1893*b1cdbd2cSJim Jagielski                     }
1894*b1cdbd2cSJim Jagielski 			    }
1895*b1cdbd2cSJim Jagielski 			    else if ( _eType == E_QUERY )
1896*b1cdbd2cSJim Jagielski 			    {
1897*b1cdbd2cSJim Jagielski                     pDesigner.reset( new QueryDesigner( getORB(), this, m_aCurrentFrame.getFrame(), false ) );
1898*b1cdbd2cSJim Jagielski                     bAddViewTypeArg = true;
1899*b1cdbd2cSJim Jagielski 			    }
1900*b1cdbd2cSJim Jagielski 			    aDataSource <<= m_xDataSource;
1901*b1cdbd2cSJim Jagielski 
1902*b1cdbd2cSJim Jagielski                 if ( bAddViewTypeArg )
1903*b1cdbd2cSJim Jagielski                 {
1904*b1cdbd2cSJim Jagielski                     const bool bQueryGraphicalMode =( _nInstigatorCommand != SID_DB_APP_EDIT_SQL_VIEW );
1905*b1cdbd2cSJim Jagielski                     aArguments.put( (::rtl::OUString)PROPERTY_GRAPHICAL_DESIGN, bQueryGraphicalMode );
1906*b1cdbd2cSJim Jagielski                 }
1907*b1cdbd2cSJim Jagielski 
1908*b1cdbd2cSJim Jagielski 		    }
1909*b1cdbd2cSJim Jagielski 		    else
1910*b1cdbd2cSJim Jagielski 		    {
1911*b1cdbd2cSJim Jagielski 			    pDesigner.reset( new ResultSetBrowser( getORB(), this, m_aCurrentFrame.getFrame(), _eType == E_TABLE ) );
1912*b1cdbd2cSJim Jagielski 
1913*b1cdbd2cSJim Jagielski                 if ( !aArguments.has( (::rtl::OUString)PROPERTY_SHOWMENU ) )
1914*b1cdbd2cSJim Jagielski                     aArguments.put( (::rtl::OUString)PROPERTY_SHOWMENU, makeAny( (sal_Bool)sal_True ) );
1915*b1cdbd2cSJim Jagielski 
1916*b1cdbd2cSJim Jagielski 		        aDataSource <<= getDatabaseName();
1917*b1cdbd2cSJim Jagielski 		    }
1918*b1cdbd2cSJim Jagielski 
1919*b1cdbd2cSJim Jagielski 		    xRet.set( pDesigner->openExisting( aDataSource, _sName, aArguments ) );
1920*b1cdbd2cSJim Jagielski 	        onDocumentOpened( _sName, _eType, _eOpenMode, xRet, NULL );
1921*b1cdbd2cSJim Jagielski         }
1922*b1cdbd2cSJim Jagielski 	}
1923*b1cdbd2cSJim Jagielski 	break;
1924*b1cdbd2cSJim Jagielski 
1925*b1cdbd2cSJim Jagielski     default:
1926*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "OApplicationController::openElement: illegal object type!" );
1927*b1cdbd2cSJim Jagielski         break;
1928*b1cdbd2cSJim Jagielski 	}
1929*b1cdbd2cSJim Jagielski 	return xRet;
1930*b1cdbd2cSJim Jagielski }
1931*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
IMPL_LINK(OApplicationController,OnSelectContainer,void *,_pType)1932*b1cdbd2cSJim Jagielski IMPL_LINK( OApplicationController, OnSelectContainer, void*, _pType )
1933*b1cdbd2cSJim Jagielski {
1934*b1cdbd2cSJim Jagielski     ElementType eType = (ElementType)reinterpret_cast< sal_IntPtr >( _pType );
1935*b1cdbd2cSJim Jagielski     getContainer()->selectContainer(eType);
1936*b1cdbd2cSJim Jagielski     return 0L;
1937*b1cdbd2cSJim Jagielski }
1938*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
IMPL_LINK(OApplicationController,OnCreateWithPilot,void *,_pType)1939*b1cdbd2cSJim Jagielski IMPL_LINK( OApplicationController, OnCreateWithPilot, void*, _pType )
1940*b1cdbd2cSJim Jagielski {
1941*b1cdbd2cSJim Jagielski     ElementType eType = (ElementType)reinterpret_cast< sal_IntPtr >( _pType );
1942*b1cdbd2cSJim Jagielski     newElementWithPilot( eType );
1943*b1cdbd2cSJim Jagielski     return 0L;
1944*b1cdbd2cSJim Jagielski }
1945*b1cdbd2cSJim Jagielski 
1946*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
newElementWithPilot(ElementType _eType)1947*b1cdbd2cSJim Jagielski void OApplicationController::newElementWithPilot( ElementType _eType )
1948*b1cdbd2cSJim Jagielski {
1949*b1cdbd2cSJim Jagielski     CloseVeto aKeepDoc( getFrame() );
1950*b1cdbd2cSJim Jagielski         // prevent the document being closed while the wizard is open
1951*b1cdbd2cSJim Jagielski 
1952*b1cdbd2cSJim Jagielski     OSL_ENSURE( getContainer(), "OApplicationController::newElementWithPilot: without a view?" );
1953*b1cdbd2cSJim Jagielski 
1954*b1cdbd2cSJim Jagielski 	switch ( _eType )
1955*b1cdbd2cSJim Jagielski 	{
1956*b1cdbd2cSJim Jagielski 		case E_REPORT:
1957*b1cdbd2cSJim Jagielski 		case E_FORM:
1958*b1cdbd2cSJim Jagielski 		{
1959*b1cdbd2cSJim Jagielski 			::std::auto_ptr<OLinkedDocumentsAccess> aHelper = getDocumentsAccess(_eType);
1960*b1cdbd2cSJim Jagielski             if ( aHelper->isConnected() )
1961*b1cdbd2cSJim Jagielski 			{
1962*b1cdbd2cSJim Jagielski                 sal_Int32 nCommandType = -1;
1963*b1cdbd2cSJim Jagielski                 const ::rtl::OUString sCurrentSelected( getCurrentlySelectedName( nCommandType ) );
1964*b1cdbd2cSJim Jagielski 				if ( E_REPORT == _eType )
1965*b1cdbd2cSJim Jagielski 					aHelper->newReportWithPilot( nCommandType, sCurrentSelected );
1966*b1cdbd2cSJim Jagielski 				else
1967*b1cdbd2cSJim Jagielski 					aHelper->newFormWithPilot( nCommandType, sCurrentSelected );
1968*b1cdbd2cSJim Jagielski 			}
1969*b1cdbd2cSJim Jagielski         }
1970*b1cdbd2cSJim Jagielski         break;
1971*b1cdbd2cSJim Jagielski         case E_QUERY:
1972*b1cdbd2cSJim Jagielski         case E_TABLE:
1973*b1cdbd2cSJim Jagielski  		{
1974*b1cdbd2cSJim Jagielski 		    ::std::auto_ptr<OLinkedDocumentsAccess> aHelper = getDocumentsAccess(_eType);
1975*b1cdbd2cSJim Jagielski             if ( aHelper->isConnected() )
1976*b1cdbd2cSJim Jagielski             {
1977*b1cdbd2cSJim Jagielski 		        if ( E_QUERY == _eType )
1978*b1cdbd2cSJim Jagielski 			        aHelper->newQueryWithPilot();
1979*b1cdbd2cSJim Jagielski 		        else
1980*b1cdbd2cSJim Jagielski 			        aHelper->newTableWithPilot();
1981*b1cdbd2cSJim Jagielski 		    }
1982*b1cdbd2cSJim Jagielski  		}
1983*b1cdbd2cSJim Jagielski  		break;
1984*b1cdbd2cSJim Jagielski         case E_NONE:
1985*b1cdbd2cSJim Jagielski             break;
1986*b1cdbd2cSJim Jagielski     }
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski     // no need for onDocumentOpened, the table wizard opens the created table by using
1989*b1cdbd2cSJim Jagielski     // XDatabaseDocumentUI::loadComponent method.
1990*b1cdbd2cSJim Jagielski }
1991*b1cdbd2cSJim Jagielski 
1992*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
newElement(ElementType _eType,const::comphelper::NamedValueCollection & i_rAdditionalArguments,Reference<XComponent> & o_rDocumentDefinition)1993*b1cdbd2cSJim Jagielski Reference< XComponent > OApplicationController::newElement( ElementType _eType, const ::comphelper::NamedValueCollection& i_rAdditionalArguments,
1994*b1cdbd2cSJim Jagielski                                                            Reference< XComponent >& o_rDocumentDefinition )
1995*b1cdbd2cSJim Jagielski {
1996*b1cdbd2cSJim Jagielski 	OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
1997*b1cdbd2cSJim Jagielski 
1998*b1cdbd2cSJim Jagielski     Reference< XComponent > xComponent;
1999*b1cdbd2cSJim Jagielski     o_rDocumentDefinition.clear();
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 	switch ( _eType )
2002*b1cdbd2cSJim Jagielski 	{
2003*b1cdbd2cSJim Jagielski         case E_FORM:
2004*b1cdbd2cSJim Jagielski 		case E_REPORT:
2005*b1cdbd2cSJim Jagielski 		{
2006*b1cdbd2cSJim Jagielski 			::std::auto_ptr<OLinkedDocumentsAccess> aHelper = getDocumentsAccess( _eType );
2007*b1cdbd2cSJim Jagielski             if ( !aHelper->isConnected() )
2008*b1cdbd2cSJim Jagielski                 break;
2009*b1cdbd2cSJim Jagielski 
2010*b1cdbd2cSJim Jagielski             xComponent = aHelper->newDocument( _eType == E_FORM ? ID_FORM_NEW_TEXT : ID_REPORT_NEW_TEXT, i_rAdditionalArguments, o_rDocumentDefinition );
2011*b1cdbd2cSJim Jagielski 		}
2012*b1cdbd2cSJim Jagielski 		break;
2013*b1cdbd2cSJim Jagielski 
2014*b1cdbd2cSJim Jagielski 		case E_QUERY:
2015*b1cdbd2cSJim Jagielski 		case E_TABLE:
2016*b1cdbd2cSJim Jagielski 		{
2017*b1cdbd2cSJim Jagielski 			::std::auto_ptr< DatabaseObjectView > pDesigner;
2018*b1cdbd2cSJim Jagielski 			SharedConnection xConnection( ensureConnection() );
2019*b1cdbd2cSJim Jagielski 			if ( !xConnection.is() )
2020*b1cdbd2cSJim Jagielski                 break;
2021*b1cdbd2cSJim Jagielski 
2022*b1cdbd2cSJim Jagielski             if ( _eType == E_TABLE )
2023*b1cdbd2cSJim Jagielski 			{
2024*b1cdbd2cSJim Jagielski 				pDesigner.reset( new TableDesigner( getORB(), this, getFrame() ) );
2025*b1cdbd2cSJim Jagielski 			}
2026*b1cdbd2cSJim Jagielski 			else if ( _eType == E_QUERY )
2027*b1cdbd2cSJim Jagielski 			{
2028*b1cdbd2cSJim Jagielski 				pDesigner.reset( new QueryDesigner( getORB(), this, getFrame(), false ) );
2029*b1cdbd2cSJim Jagielski 			}
2030*b1cdbd2cSJim Jagielski 
2031*b1cdbd2cSJim Jagielski             Reference< XDataSource > xDataSource( m_xDataSource, UNO_QUERY );
2032*b1cdbd2cSJim Jagielski 			xComponent.set( pDesigner->createNew( xDataSource, i_rAdditionalArguments ), UNO_QUERY );
2033*b1cdbd2cSJim Jagielski 		}
2034*b1cdbd2cSJim Jagielski 		break;
2035*b1cdbd2cSJim Jagielski 
2036*b1cdbd2cSJim Jagielski         default:
2037*b1cdbd2cSJim Jagielski             OSL_ENSURE( false, "OApplicationController::newElement: illegal type!" );
2038*b1cdbd2cSJim Jagielski             break;
2039*b1cdbd2cSJim Jagielski 	}
2040*b1cdbd2cSJim Jagielski 
2041*b1cdbd2cSJim Jagielski     if ( xComponent.is() )
2042*b1cdbd2cSJim Jagielski         onDocumentOpened( ::rtl::OUString(), _eType, E_OPEN_DESIGN, xComponent, o_rDocumentDefinition );
2043*b1cdbd2cSJim Jagielski 
2044*b1cdbd2cSJim Jagielski     return xComponent;
2045*b1cdbd2cSJim Jagielski }
2046*b1cdbd2cSJim Jagielski 
2047*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
addContainerListener(const Reference<XNameAccess> & _xCollection)2048*b1cdbd2cSJim Jagielski void OApplicationController::addContainerListener(const Reference<XNameAccess>& _xCollection)
2049*b1cdbd2cSJim Jagielski {
2050*b1cdbd2cSJim Jagielski 	try
2051*b1cdbd2cSJim Jagielski 	{
2052*b1cdbd2cSJim Jagielski 		Reference< XContainer > xCont(_xCollection, UNO_QUERY);
2053*b1cdbd2cSJim Jagielski 		if ( xCont.is() )
2054*b1cdbd2cSJim Jagielski 		{
2055*b1cdbd2cSJim Jagielski 			// add as listener to get notified if elements are inserted or removed
2056*b1cdbd2cSJim Jagielski 			TContainerVector::iterator aFind = ::std::find(m_aCurrentContainers.begin(),m_aCurrentContainers.end(),xCont);
2057*b1cdbd2cSJim Jagielski 			if ( aFind == m_aCurrentContainers.end() )
2058*b1cdbd2cSJim Jagielski 			{
2059*b1cdbd2cSJim Jagielski 				xCont->addContainerListener(this);
2060*b1cdbd2cSJim Jagielski 				m_aCurrentContainers.push_back(xCont);
2061*b1cdbd2cSJim Jagielski 			}
2062*b1cdbd2cSJim Jagielski 		}
2063*b1cdbd2cSJim Jagielski 	}
2064*b1cdbd2cSJim Jagielski 	catch( const Exception& )
2065*b1cdbd2cSJim Jagielski 	{
2066*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
2067*b1cdbd2cSJim Jagielski 	}
2068*b1cdbd2cSJim Jagielski }
2069*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
renameEntry()2070*b1cdbd2cSJim Jagielski void OApplicationController::renameEntry()
2071*b1cdbd2cSJim Jagielski {
2072*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard(Application::GetSolarMutex());
2073*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
2074*b1cdbd2cSJim Jagielski 
2075*b1cdbd2cSJim Jagielski 	OSL_ENSURE(getContainer(),"View is NULL! -> GPF");
2076*b1cdbd2cSJim Jagielski 	::std::vector< ::rtl::OUString> aList;
2077*b1cdbd2cSJim Jagielski 	getSelectionElementNames(aList);
2078*b1cdbd2cSJim Jagielski 
2079*b1cdbd2cSJim Jagielski 	Reference< XNameAccess > xContainer = getElements(getContainer()->getElementType());
2080*b1cdbd2cSJim Jagielski 	OSL_ENSURE(aList.size() == 1,"Invalid rename call here. More than one element!");
2081*b1cdbd2cSJim Jagielski     if ( aList.empty() )
2082*b1cdbd2cSJim Jagielski         return;
2083*b1cdbd2cSJim Jagielski 
2084*b1cdbd2cSJim Jagielski 	try
2085*b1cdbd2cSJim Jagielski 	{
2086*b1cdbd2cSJim Jagielski 		if ( xContainer.is() )
2087*b1cdbd2cSJim Jagielski 		{
2088*b1cdbd2cSJim Jagielski             ::std::auto_ptr< IObjectNameCheck > pNameChecker;
2089*b1cdbd2cSJim Jagielski             ::std::auto_ptr< OSaveAsDlg > aDialog;
2090*b1cdbd2cSJim Jagielski 
2091*b1cdbd2cSJim Jagielski 			Reference<XRename> xRename;
2092*b1cdbd2cSJim Jagielski 			const ElementType eType = getContainer()->getElementType();
2093*b1cdbd2cSJim Jagielski 			switch( eType )
2094*b1cdbd2cSJim Jagielski 			{
2095*b1cdbd2cSJim Jagielski 				case E_FORM:
2096*b1cdbd2cSJim Jagielski 				case E_REPORT:
2097*b1cdbd2cSJim Jagielski 					{
2098*b1cdbd2cSJim Jagielski 						Reference<XHierarchicalNameContainer> xHNames(xContainer, UNO_QUERY);
2099*b1cdbd2cSJim Jagielski 						if ( xHNames.is() )
2100*b1cdbd2cSJim Jagielski 						{
2101*b1cdbd2cSJim Jagielski 							String sLabel;
2102*b1cdbd2cSJim Jagielski 							if ( eType == E_FORM )
2103*b1cdbd2cSJim Jagielski 								sLabel = String(ModuleRes( STR_FRM_LABEL ));
2104*b1cdbd2cSJim Jagielski 							else
2105*b1cdbd2cSJim Jagielski 								sLabel = String(ModuleRes( STR_RPT_LABEL ));
2106*b1cdbd2cSJim Jagielski 
2107*b1cdbd2cSJim Jagielski 							::rtl::OUString sName = *aList.begin();
2108*b1cdbd2cSJim Jagielski 							if ( xHNames->hasByHierarchicalName(sName) )
2109*b1cdbd2cSJim Jagielski 							{
2110*b1cdbd2cSJim Jagielski 								xRename.set(xHNames->getByHierarchicalName(sName),UNO_QUERY);
2111*b1cdbd2cSJim Jagielski 								Reference<XChild> xChild(xRename,UNO_QUERY);
2112*b1cdbd2cSJim Jagielski 								if ( xChild.is() )
2113*b1cdbd2cSJim Jagielski 								{
2114*b1cdbd2cSJim Jagielski 									Reference<XHierarchicalNameContainer> xParent(xChild->getParent(),UNO_QUERY);
2115*b1cdbd2cSJim Jagielski 									if ( xParent.is() )
2116*b1cdbd2cSJim Jagielski 									{
2117*b1cdbd2cSJim Jagielski 										xHNames = xParent;
2118*b1cdbd2cSJim Jagielski 										Reference<XPropertySet>(xRename,UNO_QUERY)->getPropertyValue(PROPERTY_NAME) >>= sName;
2119*b1cdbd2cSJim Jagielski 									}
2120*b1cdbd2cSJim Jagielski 								}
2121*b1cdbd2cSJim Jagielski                                 pNameChecker.reset( new HierarchicalNameCheck( xHNames.get(), String() ) );
2122*b1cdbd2cSJim Jagielski 								aDialog.reset( new OSaveAsDlg(
2123*b1cdbd2cSJim Jagielski                                     getView(), getORB(), sName, sLabel, *pNameChecker, SAD_TITLE_RENAME ) );
2124*b1cdbd2cSJim Jagielski 							}
2125*b1cdbd2cSJim Jagielski 						}
2126*b1cdbd2cSJim Jagielski 					}
2127*b1cdbd2cSJim Jagielski 					break;
2128*b1cdbd2cSJim Jagielski 				case E_TABLE:
2129*b1cdbd2cSJim Jagielski                     ensureConnection();
2130*b1cdbd2cSJim Jagielski                     if ( !getConnection().is() )
2131*b1cdbd2cSJim Jagielski                         break;
2132*b1cdbd2cSJim Jagielski                     // NO break
2133*b1cdbd2cSJim Jagielski 				case E_QUERY:
2134*b1cdbd2cSJim Jagielski 					if ( xContainer->hasByName(*aList.begin()) )
2135*b1cdbd2cSJim Jagielski 					{
2136*b1cdbd2cSJim Jagielski 						xRename.set(xContainer->getByName(*aList.begin()),UNO_QUERY);
2137*b1cdbd2cSJim Jagielski                         sal_Int32 nCommandType = eType == E_QUERY ? CommandType::QUERY : CommandType::TABLE;
2138*b1cdbd2cSJim Jagielski 
2139*b1cdbd2cSJim Jagielski                         ensureConnection();
2140*b1cdbd2cSJim Jagielski                         pNameChecker.reset( new DynamicTableOrQueryNameCheck( getConnection(), nCommandType ) );
2141*b1cdbd2cSJim Jagielski 					    aDialog.reset( new OSaveAsDlg(
2142*b1cdbd2cSJim Jagielski                             getView(), nCommandType, getORB(), getConnection(),
2143*b1cdbd2cSJim Jagielski                                 *aList.begin(), *pNameChecker, SAD_TITLE_RENAME ) );
2144*b1cdbd2cSJim Jagielski 					}
2145*b1cdbd2cSJim Jagielski 					break;
2146*b1cdbd2cSJim Jagielski                 default:
2147*b1cdbd2cSJim Jagielski                     break;
2148*b1cdbd2cSJim Jagielski 			}
2149*b1cdbd2cSJim Jagielski 
2150*b1cdbd2cSJim Jagielski 			if ( xRename.is() && aDialog.get() )
2151*b1cdbd2cSJim Jagielski 			{
2152*b1cdbd2cSJim Jagielski 
2153*b1cdbd2cSJim Jagielski 				sal_Bool bTryAgain = sal_True;
2154*b1cdbd2cSJim Jagielski 				while( bTryAgain )
2155*b1cdbd2cSJim Jagielski 				{
2156*b1cdbd2cSJim Jagielski 					if ( aDialog->Execute() == RET_OK )
2157*b1cdbd2cSJim Jagielski 					{
2158*b1cdbd2cSJim Jagielski 						try
2159*b1cdbd2cSJim Jagielski 						{
2160*b1cdbd2cSJim Jagielski 							::rtl::OUString sNewName;
2161*b1cdbd2cSJim Jagielski 							if ( eType == E_TABLE )
2162*b1cdbd2cSJim Jagielski 							{
2163*b1cdbd2cSJim Jagielski 								::rtl::OUString sName = aDialog->getName();
2164*b1cdbd2cSJim Jagielski 								::rtl::OUString sCatalog = aDialog->getCatalog();
2165*b1cdbd2cSJim Jagielski 								::rtl::OUString sSchema	 = aDialog->getSchema();
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski 								sNewName = ::dbtools::composeTableName( m_xMetaData, sCatalog, sSchema, sName, sal_False, ::dbtools::eInDataManipulation );
2168*b1cdbd2cSJim Jagielski 							}
2169*b1cdbd2cSJim Jagielski 							else
2170*b1cdbd2cSJim Jagielski 								sNewName = aDialog->getName();
2171*b1cdbd2cSJim Jagielski 
2172*b1cdbd2cSJim Jagielski 							::rtl::OUString sOldName = *aList.begin();
2173*b1cdbd2cSJim Jagielski 							if ( eType == E_FORM || eType == E_REPORT )
2174*b1cdbd2cSJim Jagielski 							{
2175*b1cdbd2cSJim Jagielski 								Reference<XContent> xContent(xRename,UNO_QUERY);
2176*b1cdbd2cSJim Jagielski 								if ( xContent.is() )
2177*b1cdbd2cSJim Jagielski 								{
2178*b1cdbd2cSJim Jagielski 									sOldName = xContent->getIdentifier()->getContentIdentifier();
2179*b1cdbd2cSJim Jagielski 								}
2180*b1cdbd2cSJim Jagielski 							}
2181*b1cdbd2cSJim Jagielski 
2182*b1cdbd2cSJim Jagielski 							xRename->rename(sNewName);
2183*b1cdbd2cSJim Jagielski 
2184*b1cdbd2cSJim Jagielski                             if ( eType == E_TABLE )
2185*b1cdbd2cSJim Jagielski                             {
2186*b1cdbd2cSJim Jagielski                                 Reference<XPropertySet> xProp(xRename,UNO_QUERY);
2187*b1cdbd2cSJim Jagielski                                 sNewName = ::dbaui::composeTableName( m_xMetaData, xProp, ::dbtools::eInDataManipulation, false, false, false );
2188*b1cdbd2cSJim Jagielski                             }
2189*b1cdbd2cSJim Jagielski 							getContainer()->elementReplaced( eType , sOldName, sNewName );
2190*b1cdbd2cSJim Jagielski 
2191*b1cdbd2cSJim Jagielski 							bTryAgain = sal_False;
2192*b1cdbd2cSJim Jagielski 						}
2193*b1cdbd2cSJim Jagielski 						catch(const SQLException& )
2194*b1cdbd2cSJim Jagielski                         {
2195*b1cdbd2cSJim Jagielski                             showError( SQLExceptionInfo( ::cppu::getCaughtException() ) );
2196*b1cdbd2cSJim Jagielski 
2197*b1cdbd2cSJim Jagielski 						}
2198*b1cdbd2cSJim Jagielski 						catch(const ElementExistException& e)
2199*b1cdbd2cSJim Jagielski 						{
2200*b1cdbd2cSJim Jagielski 							static ::rtl::OUString sStatus = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000"));
2201*b1cdbd2cSJim Jagielski 							String sMsg = String( ModuleRes( STR_NAME_ALREADY_EXISTS ) );
2202*b1cdbd2cSJim Jagielski 							sMsg.SearchAndReplace('#',e.Message);
2203*b1cdbd2cSJim Jagielski 							showError(SQLExceptionInfo(SQLException(sMsg, e.Context, sStatus, 0, Any())));
2204*b1cdbd2cSJim Jagielski 						}
2205*b1cdbd2cSJim Jagielski 						catch(const Exception& )
2206*b1cdbd2cSJim Jagielski 						{
2207*b1cdbd2cSJim Jagielski                             DBG_UNHANDLED_EXCEPTION();
2208*b1cdbd2cSJim Jagielski 						}
2209*b1cdbd2cSJim Jagielski 					}
2210*b1cdbd2cSJim Jagielski 					else
2211*b1cdbd2cSJim Jagielski 						bTryAgain = sal_False;
2212*b1cdbd2cSJim Jagielski 				}
2213*b1cdbd2cSJim Jagielski 			}
2214*b1cdbd2cSJim Jagielski 		}
2215*b1cdbd2cSJim Jagielski 	}
2216*b1cdbd2cSJim Jagielski 	catch(const Exception& )
2217*b1cdbd2cSJim Jagielski 	{
2218*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
2219*b1cdbd2cSJim Jagielski 	}
2220*b1cdbd2cSJim Jagielski }
2221*b1cdbd2cSJim Jagielski 
2222*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onSelectionChanged()2223*b1cdbd2cSJim Jagielski void OApplicationController::onSelectionChanged()
2224*b1cdbd2cSJim Jagielski {
2225*b1cdbd2cSJim Jagielski 	InvalidateAll();
2226*b1cdbd2cSJim Jagielski 
2227*b1cdbd2cSJim Jagielski     SelectionGuard aSelGuard( *m_pSelectionNotifier );
2228*b1cdbd2cSJim Jagielski 
2229*b1cdbd2cSJim Jagielski 	OApplicationView* pView = getContainer();
2230*b1cdbd2cSJim Jagielski     if ( !pView )
2231*b1cdbd2cSJim Jagielski         return;
2232*b1cdbd2cSJim Jagielski 
2233*b1cdbd2cSJim Jagielski     if ( pView->getSelectionCount() == 1 )
2234*b1cdbd2cSJim Jagielski     {
2235*b1cdbd2cSJim Jagielski         const ElementType eType = pView->getElementType();
2236*b1cdbd2cSJim Jagielski   	    if ( pView->isALeafSelected() )
2237*b1cdbd2cSJim Jagielski         {
2238*b1cdbd2cSJim Jagielski             const ::rtl::OUString sName = pView->getQualifiedName( NULL /* means 'first selected' */ );
2239*b1cdbd2cSJim Jagielski             showPreviewFor( eType, sName );
2240*b1cdbd2cSJim Jagielski         }
2241*b1cdbd2cSJim Jagielski     }
2242*b1cdbd2cSJim Jagielski }
2243*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
showPreviewFor(const ElementType _eType,const::rtl::OUString & _sName)2244*b1cdbd2cSJim Jagielski void OApplicationController::showPreviewFor(const ElementType _eType,const ::rtl::OUString& _sName)
2245*b1cdbd2cSJim Jagielski {
2246*b1cdbd2cSJim Jagielski     if ( m_ePreviewMode == E_PREVIEWNONE )
2247*b1cdbd2cSJim Jagielski         return;
2248*b1cdbd2cSJim Jagielski 
2249*b1cdbd2cSJim Jagielski     OApplicationView* pView = getContainer();
2250*b1cdbd2cSJim Jagielski     if ( !pView )
2251*b1cdbd2cSJim Jagielski         return;
2252*b1cdbd2cSJim Jagielski 
2253*b1cdbd2cSJim Jagielski 	try
2254*b1cdbd2cSJim Jagielski 	{
2255*b1cdbd2cSJim Jagielski 		switch( _eType )
2256*b1cdbd2cSJim Jagielski 		{
2257*b1cdbd2cSJim Jagielski 			case E_FORM:
2258*b1cdbd2cSJim Jagielski 			case E_REPORT:
2259*b1cdbd2cSJim Jagielski             {
2260*b1cdbd2cSJim Jagielski 				Reference< XHierarchicalNameAccess > xContainer( getElements( _eType ), UNO_QUERY_THROW );
2261*b1cdbd2cSJim Jagielski                 Reference< XContent> xContent( xContainer->getByHierarchicalName( _sName ), UNO_QUERY_THROW );
2262*b1cdbd2cSJim Jagielski 	            pView->showPreview( xContent );
2263*b1cdbd2cSJim Jagielski             }
2264*b1cdbd2cSJim Jagielski 			break;
2265*b1cdbd2cSJim Jagielski 
2266*b1cdbd2cSJim Jagielski             case E_TABLE:
2267*b1cdbd2cSJim Jagielski 			case E_QUERY:
2268*b1cdbd2cSJim Jagielski                 {
2269*b1cdbd2cSJim Jagielski                     SharedConnection xConnection( ensureConnection() );
2270*b1cdbd2cSJim Jagielski 					if ( xConnection.is() )
2271*b1cdbd2cSJim Jagielski 						pView->showPreview( getDatabaseName(), xConnection, _sName, _eType == E_TABLE );
2272*b1cdbd2cSJim Jagielski                 }
2273*b1cdbd2cSJim Jagielski 				return;
2274*b1cdbd2cSJim Jagielski 
2275*b1cdbd2cSJim Jagielski             default:
2276*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, "OApplicationController::showPreviewFor: unexpected element type!" );
2277*b1cdbd2cSJim Jagielski                 break;
2278*b1cdbd2cSJim Jagielski 		}
2279*b1cdbd2cSJim Jagielski 	}
2280*b1cdbd2cSJim Jagielski 	catch( const SQLException& )
2281*b1cdbd2cSJim Jagielski 	{
2282*b1cdbd2cSJim Jagielski         showError( SQLExceptionInfo( ::cppu::getCaughtException() ) );
2283*b1cdbd2cSJim Jagielski 	}
2284*b1cdbd2cSJim Jagielski 	catch(const Exception& )
2285*b1cdbd2cSJim Jagielski 	{
2286*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
2287*b1cdbd2cSJim Jagielski 	}
2288*b1cdbd2cSJim Jagielski }
2289*b1cdbd2cSJim Jagielski 
2290*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IMPL_LINK(OApplicationController,OnClipboardChanged,void *,EMPTYARG)2291*b1cdbd2cSJim Jagielski IMPL_LINK( OApplicationController, OnClipboardChanged, void*, EMPTYARG )
2292*b1cdbd2cSJim Jagielski {
2293*b1cdbd2cSJim Jagielski 	return OnInvalidateClipboard( NULL );
2294*b1cdbd2cSJim Jagielski }
2295*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IMPL_LINK(OApplicationController,OnInvalidateClipboard,void *,EMPTYARG)2296*b1cdbd2cSJim Jagielski IMPL_LINK(OApplicationController, OnInvalidateClipboard, void*, EMPTYARG)
2297*b1cdbd2cSJim Jagielski {
2298*b1cdbd2cSJim Jagielski 	InvalidateFeature(ID_BROWSER_CUT);
2299*b1cdbd2cSJim Jagielski 	InvalidateFeature(ID_BROWSER_COPY);
2300*b1cdbd2cSJim Jagielski 	InvalidateFeature(ID_BROWSER_PASTE);
2301*b1cdbd2cSJim Jagielski 	InvalidateFeature(SID_DB_APP_PASTE_SPECIAL);
2302*b1cdbd2cSJim Jagielski 	return 0L;
2303*b1cdbd2cSJim Jagielski }
2304*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onCutEntry()2305*b1cdbd2cSJim Jagielski void OApplicationController::onCutEntry()
2306*b1cdbd2cSJim Jagielski {
2307*b1cdbd2cSJim Jagielski }
2308*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onCopyEntry()2309*b1cdbd2cSJim Jagielski void OApplicationController::onCopyEntry()
2310*b1cdbd2cSJim Jagielski {
2311*b1cdbd2cSJim Jagielski 	Execute(ID_BROWSER_COPY,Sequence<PropertyValue>());
2312*b1cdbd2cSJim Jagielski }
2313*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onPasteEntry()2314*b1cdbd2cSJim Jagielski void OApplicationController::onPasteEntry()
2315*b1cdbd2cSJim Jagielski {
2316*b1cdbd2cSJim Jagielski 	Execute(ID_BROWSER_PASTE,Sequence<PropertyValue>());
2317*b1cdbd2cSJim Jagielski }
2318*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onDeleteEntry()2319*b1cdbd2cSJim Jagielski void OApplicationController::onDeleteEntry()
2320*b1cdbd2cSJim Jagielski {
2321*b1cdbd2cSJim Jagielski 	ElementType eType = getContainer()->getElementType();
2322*b1cdbd2cSJim Jagielski 	sal_uInt16 nId = 0;
2323*b1cdbd2cSJim Jagielski 	switch(eType)
2324*b1cdbd2cSJim Jagielski 	{
2325*b1cdbd2cSJim Jagielski 		case E_TABLE:
2326*b1cdbd2cSJim Jagielski 			nId = SID_DB_APP_TABLE_DELETE;
2327*b1cdbd2cSJim Jagielski 			break;
2328*b1cdbd2cSJim Jagielski 		case E_QUERY:
2329*b1cdbd2cSJim Jagielski 			nId = SID_DB_APP_QUERY_DELETE;
2330*b1cdbd2cSJim Jagielski 			break;
2331*b1cdbd2cSJim Jagielski 		case E_FORM:
2332*b1cdbd2cSJim Jagielski 			nId = SID_DB_APP_FORM_DELETE;
2333*b1cdbd2cSJim Jagielski 			break;
2334*b1cdbd2cSJim Jagielski 		case E_REPORT:
2335*b1cdbd2cSJim Jagielski 			nId = SID_DB_APP_REPORT_DELETE;
2336*b1cdbd2cSJim Jagielski 			break;
2337*b1cdbd2cSJim Jagielski 		default:
2338*b1cdbd2cSJim Jagielski 			OSL_ENSURE(0,"Invalid ElementType!");
2339*b1cdbd2cSJim Jagielski 			break;
2340*b1cdbd2cSJim Jagielski 	}
2341*b1cdbd2cSJim Jagielski 	executeChecked(nId,Sequence<PropertyValue>());
2342*b1cdbd2cSJim Jagielski }
2343*b1cdbd2cSJim Jagielski 
2344*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeUnChecked(const URL & _rCommand,const Sequence<PropertyValue> & aArgs)2345*b1cdbd2cSJim Jagielski void OApplicationController::executeUnChecked(const URL& _rCommand, const Sequence< PropertyValue>& aArgs)
2346*b1cdbd2cSJim Jagielski {
2347*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::executeUnChecked( _rCommand, aArgs );
2348*b1cdbd2cSJim Jagielski }
2349*b1cdbd2cSJim Jagielski 
2350*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeChecked(const URL & _rCommand,const Sequence<PropertyValue> & aArgs)2351*b1cdbd2cSJim Jagielski void OApplicationController::executeChecked(const URL& _rCommand, const Sequence< PropertyValue>& aArgs)
2352*b1cdbd2cSJim Jagielski {
2353*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::executeChecked( _rCommand, aArgs );
2354*b1cdbd2cSJim Jagielski }
2355*b1cdbd2cSJim Jagielski 
2356*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeUnChecked(sal_uInt16 _nCommandId,const Sequence<PropertyValue> & aArgs)2357*b1cdbd2cSJim Jagielski void OApplicationController::executeUnChecked(sal_uInt16 _nCommandId, const Sequence< PropertyValue>& aArgs)
2358*b1cdbd2cSJim Jagielski {
2359*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::executeUnChecked( _nCommandId, aArgs );
2360*b1cdbd2cSJim Jagielski }
2361*b1cdbd2cSJim Jagielski 
2362*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeChecked(sal_uInt16 _nCommandId,const Sequence<PropertyValue> & aArgs)2363*b1cdbd2cSJim Jagielski void OApplicationController::executeChecked(sal_uInt16 _nCommandId, const Sequence< PropertyValue>& aArgs)
2364*b1cdbd2cSJim Jagielski {
2365*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::executeChecked( _nCommandId, aArgs );
2366*b1cdbd2cSJim Jagielski }
2367*b1cdbd2cSJim Jagielski 
2368*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
isCommandEnabled(sal_uInt16 _nCommandId) const2369*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::isCommandEnabled(sal_uInt16 _nCommandId) const
2370*b1cdbd2cSJim Jagielski {
2371*b1cdbd2cSJim Jagielski     return OApplicationController_CBASE::isCommandEnabled( _nCommandId );
2372*b1cdbd2cSJim Jagielski }
2373*b1cdbd2cSJim Jagielski 
2374*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
isCommandEnabled(const::rtl::OUString & _rCompleteCommandURL) const2375*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::isCommandEnabled( const ::rtl::OUString& _rCompleteCommandURL ) const
2376*b1cdbd2cSJim Jagielski {
2377*b1cdbd2cSJim Jagielski     return OApplicationController_CBASE::isCommandEnabled( _rCompleteCommandURL );
2378*b1cdbd2cSJim Jagielski }
2379*b1cdbd2cSJim Jagielski 
2380*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
registerCommandURL(const::rtl::OUString & _rCompleteCommandURL)2381*b1cdbd2cSJim Jagielski sal_uInt16 OApplicationController::registerCommandURL( const ::rtl::OUString& _rCompleteCommandURL )
2382*b1cdbd2cSJim Jagielski {
2383*b1cdbd2cSJim Jagielski     return OApplicationController_CBASE::registerCommandURL( _rCompleteCommandURL );
2384*b1cdbd2cSJim Jagielski }
2385*b1cdbd2cSJim Jagielski 
2386*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
notifyHiContrastChanged()2387*b1cdbd2cSJim Jagielski void OApplicationController::notifyHiContrastChanged()
2388*b1cdbd2cSJim Jagielski {
2389*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::notifyHiContrastChanged();
2390*b1cdbd2cSJim Jagielski }
2391*b1cdbd2cSJim Jagielski 
2392*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getXController()2393*b1cdbd2cSJim Jagielski Reference< XController > OApplicationController::getXController() throw( RuntimeException )
2394*b1cdbd2cSJim Jagielski {
2395*b1cdbd2cSJim Jagielski     return OApplicationController_CBASE::getXController();
2396*b1cdbd2cSJim Jagielski }
2397*b1cdbd2cSJim Jagielski 
2398*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
interceptUserInput(const NotifyEvent & _rEvent)2399*b1cdbd2cSJim Jagielski bool OApplicationController::interceptUserInput( const NotifyEvent& _rEvent )
2400*b1cdbd2cSJim Jagielski {
2401*b1cdbd2cSJim Jagielski     return OApplicationController_CBASE::interceptUserInput( _rEvent );
2402*b1cdbd2cSJim Jagielski }
2403*b1cdbd2cSJim Jagielski 
2404*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getContextMenu(Control &) const2405*b1cdbd2cSJim Jagielski PopupMenu* OApplicationController::getContextMenu( Control& /*_rControl*/ ) const
2406*b1cdbd2cSJim Jagielski {
2407*b1cdbd2cSJim Jagielski     return new PopupMenu( ModuleRes( RID_MENU_APP_EDIT ) );
2408*b1cdbd2cSJim Jagielski }
2409*b1cdbd2cSJim Jagielski 
2410*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getCommandController()2411*b1cdbd2cSJim Jagielski IController& OApplicationController::getCommandController()
2412*b1cdbd2cSJim Jagielski {
2413*b1cdbd2cSJim Jagielski     return *static_cast< IApplicationController* >( this );
2414*b1cdbd2cSJim Jagielski }
2415*b1cdbd2cSJim Jagielski 
2416*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getContextMenuInterceptors()2417*b1cdbd2cSJim Jagielski ::cppu::OInterfaceContainerHelper* OApplicationController::getContextMenuInterceptors()
2418*b1cdbd2cSJim Jagielski {
2419*b1cdbd2cSJim Jagielski     return &m_aContextMenuInterceptors;
2420*b1cdbd2cSJim Jagielski }
2421*b1cdbd2cSJim Jagielski 
2422*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getCurrentSelection(Control & _rControl) const2423*b1cdbd2cSJim Jagielski Any OApplicationController::getCurrentSelection( Control& _rControl ) const
2424*b1cdbd2cSJim Jagielski {
2425*b1cdbd2cSJim Jagielski     Sequence< NamedDatabaseObject > aSelection;
2426*b1cdbd2cSJim Jagielski 	getContainer()->describeCurrentSelectionForControl( _rControl, aSelection );
2427*b1cdbd2cSJim Jagielski     return makeAny( aSelection );
2428*b1cdbd2cSJim Jagielski }
2429*b1cdbd2cSJim Jagielski 
2430*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
requestQuickHelp(const SvLBoxEntry *,String &) const2431*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::requestQuickHelp( const SvLBoxEntry* /*_pEntry*/, String& /*_rText*/ ) const
2432*b1cdbd2cSJim Jagielski {
2433*b1cdbd2cSJim Jagielski     return sal_False;
2434*b1cdbd2cSJim Jagielski }
2435*b1cdbd2cSJim Jagielski 
2436*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
requestDrag(sal_Int8,const Point &)2437*b1cdbd2cSJim Jagielski sal_Bool OApplicationController::requestDrag( sal_Int8 /*_nAction*/, const Point& /*_rPosPixel*/ )
2438*b1cdbd2cSJim Jagielski {
2439*b1cdbd2cSJim Jagielski 	TransferableHelper* pTransfer = NULL;
2440*b1cdbd2cSJim Jagielski 	if ( getContainer() && getContainer()->getSelectionCount() )
2441*b1cdbd2cSJim Jagielski 	{
2442*b1cdbd2cSJim Jagielski 		try
2443*b1cdbd2cSJim Jagielski 		{
2444*b1cdbd2cSJim Jagielski 			pTransfer = copyObject( );
2445*b1cdbd2cSJim Jagielski 			Reference< XTransferable> xEnsureDelete = pTransfer;
2446*b1cdbd2cSJim Jagielski 
2447*b1cdbd2cSJim Jagielski 			if ( pTransfer && getContainer()->getDetailView() )
2448*b1cdbd2cSJim Jagielski 			{
2449*b1cdbd2cSJim Jagielski 				ElementType eType = getContainer()->getElementType();
2450*b1cdbd2cSJim Jagielski 				pTransfer->StartDrag( getContainer()->getDetailView()->getTreeWindow(), ((eType == E_FORM || eType == E_REPORT) ? DND_ACTION_COPYMOVE : DND_ACTION_COPY) );
2451*b1cdbd2cSJim Jagielski 			}
2452*b1cdbd2cSJim Jagielski 		}
2453*b1cdbd2cSJim Jagielski 		catch(const Exception& )
2454*b1cdbd2cSJim Jagielski 		{
2455*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
2456*b1cdbd2cSJim Jagielski 		}
2457*b1cdbd2cSJim Jagielski 	}
2458*b1cdbd2cSJim Jagielski 
2459*b1cdbd2cSJim Jagielski 	return NULL != pTransfer;
2460*b1cdbd2cSJim Jagielski }
2461*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
queryDrop(const AcceptDropEvent & _rEvt,const DataFlavorExVector & _rFlavors)2462*b1cdbd2cSJim Jagielski sal_Int8 OApplicationController::queryDrop( const AcceptDropEvent& _rEvt, const DataFlavorExVector& _rFlavors )
2463*b1cdbd2cSJim Jagielski {
2464*b1cdbd2cSJim Jagielski 	sal_Int8 nActionAskedFor = _rEvt.mnAction;
2465*b1cdbd2cSJim Jagielski 	// check if we're a table or query container
2466*b1cdbd2cSJim Jagielski 	OApplicationView* pView = getContainer();
2467*b1cdbd2cSJim Jagielski 	if ( pView && !isDataSourceReadOnly() )
2468*b1cdbd2cSJim Jagielski 	{
2469*b1cdbd2cSJim Jagielski 		ElementType eType = pView->getElementType();
2470*b1cdbd2cSJim Jagielski 		if ( eType != E_NONE && (eType != E_TABLE || !isConnectionReadOnly()) )
2471*b1cdbd2cSJim Jagielski 		{
2472*b1cdbd2cSJim Jagielski 			// check for the concrete type
2473*b1cdbd2cSJim Jagielski 			if(::std::find_if(_rFlavors.begin(),_rFlavors.end(),TAppSupportedSotFunctor(eType,sal_True)) != _rFlavors.end())
2474*b1cdbd2cSJim Jagielski 				return DND_ACTION_COPY;
2475*b1cdbd2cSJim Jagielski 			if ( eType == E_FORM || eType == E_REPORT )
2476*b1cdbd2cSJim Jagielski 			{
2477*b1cdbd2cSJim Jagielski 				sal_Int8 nAction = OComponentTransferable::canExtractComponentDescriptor(_rFlavors,eType == E_FORM) ? DND_ACTION_COPY : DND_ACTION_NONE;
2478*b1cdbd2cSJim Jagielski 				if ( nAction != DND_ACTION_NONE )
2479*b1cdbd2cSJim Jagielski 				{
2480*b1cdbd2cSJim Jagielski 					SvLBoxEntry* pHitEntry = pView->getEntry(_rEvt.maPosPixel);
2481*b1cdbd2cSJim Jagielski 					::rtl::OUString sName;
2482*b1cdbd2cSJim Jagielski 					if ( pHitEntry )
2483*b1cdbd2cSJim Jagielski 					{
2484*b1cdbd2cSJim Jagielski 						sName = pView->getQualifiedName( pHitEntry );
2485*b1cdbd2cSJim Jagielski 						if ( sName.getLength() )
2486*b1cdbd2cSJim Jagielski 						{
2487*b1cdbd2cSJim Jagielski 							Reference< XHierarchicalNameAccess > xContainer(getElements(pView->getElementType()),UNO_QUERY);
2488*b1cdbd2cSJim Jagielski 							if ( xContainer.is() && xContainer->hasByHierarchicalName(sName) )
2489*b1cdbd2cSJim Jagielski 							{
2490*b1cdbd2cSJim Jagielski 								Reference< XHierarchicalNameAccess > xHitObject(xContainer->getByHierarchicalName(sName),UNO_QUERY);
2491*b1cdbd2cSJim Jagielski 								if ( xHitObject.is() )
2492*b1cdbd2cSJim Jagielski 									nAction = nActionAskedFor & DND_ACTION_COPYMOVE;
2493*b1cdbd2cSJim Jagielski 							}
2494*b1cdbd2cSJim Jagielski 							else
2495*b1cdbd2cSJim Jagielski 								nAction = DND_ACTION_NONE;
2496*b1cdbd2cSJim Jagielski 						}
2497*b1cdbd2cSJim Jagielski 					}
2498*b1cdbd2cSJim Jagielski 					/*else
2499*b1cdbd2cSJim Jagielski 						nAction = nActionAskedFor & DND_ACTION_COPYMOVE;
2500*b1cdbd2cSJim Jagielski                     */
2501*b1cdbd2cSJim Jagielski 				}
2502*b1cdbd2cSJim Jagielski 				return nAction;
2503*b1cdbd2cSJim Jagielski 			}
2504*b1cdbd2cSJim Jagielski 		}
2505*b1cdbd2cSJim Jagielski 	}
2506*b1cdbd2cSJim Jagielski 
2507*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
2508*b1cdbd2cSJim Jagielski }
2509*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
executeDrop(const ExecuteDropEvent & _rEvt)2510*b1cdbd2cSJim Jagielski sal_Int8 OApplicationController::executeDrop( const ExecuteDropEvent& _rEvt )
2511*b1cdbd2cSJim Jagielski {
2512*b1cdbd2cSJim Jagielski 	OApplicationView* pView = getContainer();
2513*b1cdbd2cSJim Jagielski 	if ( !pView || pView->getElementType() == E_NONE )
2514*b1cdbd2cSJim Jagielski 	{
2515*b1cdbd2cSJim Jagielski 		DBG_ERROR("OApplicationController::executeDrop: what the hell did queryDrop do?");
2516*b1cdbd2cSJim Jagielski 			// queryDrop shoud not have allowed us to reach this situation ....
2517*b1cdbd2cSJim Jagielski 		return DND_ACTION_NONE;
2518*b1cdbd2cSJim Jagielski 	}
2519*b1cdbd2cSJim Jagielski 
2520*b1cdbd2cSJim Jagielski 	// a TransferableDataHelper for accessing the dropped data
2521*b1cdbd2cSJim Jagielski 	TransferableDataHelper aDroppedData(_rEvt.maDropEvent.Transferable);
2522*b1cdbd2cSJim Jagielski 
2523*b1cdbd2cSJim Jagielski 
2524*b1cdbd2cSJim Jagielski 	// reset the data of the previous async drop (if any)
2525*b1cdbd2cSJim Jagielski 	if ( m_nAsyncDrop )
2526*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent(m_nAsyncDrop);
2527*b1cdbd2cSJim Jagielski 
2528*b1cdbd2cSJim Jagielski 
2529*b1cdbd2cSJim Jagielski 	m_nAsyncDrop = 0;
2530*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.aDroppedData.clear();
2531*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.nType			= pView->getElementType();
2532*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.nAction		= _rEvt.mnAction;
2533*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.bError			= sal_False;
2534*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.bHtml			= sal_False;
2535*b1cdbd2cSJim Jagielski 	m_aAsyncDrop.aUrl			= ::rtl::OUString();
2536*b1cdbd2cSJim Jagielski 
2537*b1cdbd2cSJim Jagielski 
2538*b1cdbd2cSJim Jagielski 	// loop through the available formats and see what we can do ...
2539*b1cdbd2cSJim Jagielski 	// first we have to check if it is our own format, if not we have to copy the stream :-(
2540*b1cdbd2cSJim Jagielski 	if ( ODataAccessObjectTransferable::canExtractObjectDescriptor(aDroppedData.GetDataFlavorExVector()) )
2541*b1cdbd2cSJim Jagielski 	{
2542*b1cdbd2cSJim Jagielski 		m_aAsyncDrop.aDroppedData	= ODataAccessObjectTransferable::extractObjectDescriptor(aDroppedData);
2543*b1cdbd2cSJim Jagielski 
2544*b1cdbd2cSJim Jagielski 		// asyncron because we some dialogs and we aren't allowed to show them while in D&D
2545*b1cdbd2cSJim Jagielski 		m_nAsyncDrop = Application::PostUserEvent(LINK(this, OApplicationController, OnAsyncDrop));
2546*b1cdbd2cSJim Jagielski 		return DND_ACTION_COPY;
2547*b1cdbd2cSJim Jagielski 	}
2548*b1cdbd2cSJim Jagielski 	else if ( OComponentTransferable::canExtractComponentDescriptor(aDroppedData.GetDataFlavorExVector(),m_aAsyncDrop.nType == E_FORM) )
2549*b1cdbd2cSJim Jagielski 	{
2550*b1cdbd2cSJim Jagielski 		m_aAsyncDrop.aDroppedData = OComponentTransferable::extractComponentDescriptor(aDroppedData);
2551*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pHitEntry = pView->getEntry(_rEvt.maPosPixel);
2552*b1cdbd2cSJim Jagielski 		if ( pHitEntry )
2553*b1cdbd2cSJim Jagielski 			m_aAsyncDrop.aUrl = pView->getQualifiedName( pHitEntry );
2554*b1cdbd2cSJim Jagielski 
2555*b1cdbd2cSJim Jagielski 		sal_Int8 nAction = _rEvt.mnAction;
2556*b1cdbd2cSJim Jagielski 		Reference<XContent> xContent;
2557*b1cdbd2cSJim Jagielski 		m_aAsyncDrop.aDroppedData[daComponent] >>= xContent;
2558*b1cdbd2cSJim Jagielski 		if ( xContent.is() )
2559*b1cdbd2cSJim Jagielski 		{
2560*b1cdbd2cSJim Jagielski 			::rtl::OUString sName = xContent->getIdentifier()->getContentIdentifier();
2561*b1cdbd2cSJim Jagielski 			sal_Int32 nIndex = 0;
2562*b1cdbd2cSJim Jagielski 			sName = sName.copy(sName.getToken(0,'/',nIndex).getLength() + 1);
2563*b1cdbd2cSJim Jagielski 			if ( m_aAsyncDrop.aUrl.Len() >= sName.getLength() && 0 == sName.compareTo(m_aAsyncDrop.aUrl,sName.getLength()) )
2564*b1cdbd2cSJim Jagielski 			{
2565*b1cdbd2cSJim Jagielski 				m_aAsyncDrop.aDroppedData.clear();
2566*b1cdbd2cSJim Jagielski 				return DND_ACTION_NONE;
2567*b1cdbd2cSJim Jagielski 			}
2568*b1cdbd2cSJim Jagielski 
2569*b1cdbd2cSJim Jagielski 			// check if move is allowed, if another object with the same name exists only copy is allowed
2570*b1cdbd2cSJim Jagielski 			Reference< XHierarchicalNameAccess > xContainer(getElements(m_aAsyncDrop.nType),UNO_QUERY);
2571*b1cdbd2cSJim Jagielski 			Reference<XNameAccess> xNameAccess(xContainer,UNO_QUERY);
2572*b1cdbd2cSJim Jagielski 
2573*b1cdbd2cSJim Jagielski 			if ( m_aAsyncDrop.aUrl.Len() && xContainer.is() && xContainer->hasByHierarchicalName(m_aAsyncDrop.aUrl) )
2574*b1cdbd2cSJim Jagielski 				xNameAccess.set(xContainer->getByHierarchicalName(m_aAsyncDrop.aUrl),UNO_QUERY);
2575*b1cdbd2cSJim Jagielski 
2576*b1cdbd2cSJim Jagielski 			if ( xNameAccess.is() )
2577*b1cdbd2cSJim Jagielski 			{
2578*b1cdbd2cSJim Jagielski 				Reference<XPropertySet> xProp(xContent,UNO_QUERY);
2579*b1cdbd2cSJim Jagielski 				if ( xProp.is() )
2580*b1cdbd2cSJim Jagielski 				{
2581*b1cdbd2cSJim Jagielski 					xProp->getPropertyValue(PROPERTY_NAME) >>= sName;
2582*b1cdbd2cSJim Jagielski 					if ( xNameAccess.is() && xNameAccess->hasByName(sName) )
2583*b1cdbd2cSJim Jagielski 						nAction &= ~DND_ACTION_MOVE;
2584*b1cdbd2cSJim Jagielski 				}
2585*b1cdbd2cSJim Jagielski 				else
2586*b1cdbd2cSJim Jagielski 					nAction &= ~DND_ACTION_MOVE;
2587*b1cdbd2cSJim Jagielski 			}
2588*b1cdbd2cSJim Jagielski 		}
2589*b1cdbd2cSJim Jagielski 		if ( nAction != DND_ACTION_NONE )
2590*b1cdbd2cSJim Jagielski 		{
2591*b1cdbd2cSJim Jagielski 			m_aAsyncDrop.nAction = nAction;
2592*b1cdbd2cSJim Jagielski 			// asyncron because we some dialogs and we aren't allowed to show them while in D&D
2593*b1cdbd2cSJim Jagielski 			m_nAsyncDrop = Application::PostUserEvent(LINK(this, OApplicationController, OnAsyncDrop));
2594*b1cdbd2cSJim Jagielski 		}
2595*b1cdbd2cSJim Jagielski 		else
2596*b1cdbd2cSJim Jagielski 			m_aAsyncDrop.aDroppedData.clear();
2597*b1cdbd2cSJim Jagielski 		return nAction;
2598*b1cdbd2cSJim Jagielski 	}
2599*b1cdbd2cSJim Jagielski 	else
2600*b1cdbd2cSJim Jagielski 	{
2601*b1cdbd2cSJim Jagielski         SharedConnection xConnection( ensureConnection() );
2602*b1cdbd2cSJim Jagielski         if ( xConnection.is() && m_aTableCopyHelper.copyTagTable( aDroppedData, m_aAsyncDrop, xConnection ) )
2603*b1cdbd2cSJim Jagielski         {
2604*b1cdbd2cSJim Jagielski 			// asyncron because we some dialogs and we aren't allowed to show them while in D&D
2605*b1cdbd2cSJim Jagielski 			m_nAsyncDrop = Application::PostUserEvent(LINK(this, OApplicationController, OnAsyncDrop));
2606*b1cdbd2cSJim Jagielski 			return DND_ACTION_COPY;
2607*b1cdbd2cSJim Jagielski 		}
2608*b1cdbd2cSJim Jagielski 	}
2609*b1cdbd2cSJim Jagielski 
2610*b1cdbd2cSJim Jagielski 	return DND_ACTION_NONE;
2611*b1cdbd2cSJim Jagielski }
2612*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getModel(void)2613*b1cdbd2cSJim Jagielski Reference< XModel >  SAL_CALL OApplicationController::getModel(void) throw( RuntimeException )
2614*b1cdbd2cSJim Jagielski {
2615*b1cdbd2cSJim Jagielski 	return m_xModel;
2616*b1cdbd2cSJim Jagielski }
2617*b1cdbd2cSJim Jagielski 
2618*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
onAttachedFrame()2619*b1cdbd2cSJim Jagielski void OApplicationController::onAttachedFrame()
2620*b1cdbd2cSJim Jagielski {
2621*b1cdbd2cSJim Jagielski     sal_Int32 nConnectedControllers( 0 );
2622*b1cdbd2cSJim Jagielski     try
2623*b1cdbd2cSJim Jagielski     {
2624*b1cdbd2cSJim Jagielski         Reference< XModel2 > xModel( m_xModel, UNO_QUERY_THROW );
2625*b1cdbd2cSJim Jagielski         Reference< XEnumeration > xEnumControllers( xModel->getControllers(), UNO_SET_THROW );
2626*b1cdbd2cSJim Jagielski         while ( xEnumControllers->hasMoreElements() )
2627*b1cdbd2cSJim Jagielski         {
2628*b1cdbd2cSJim Jagielski             Reference< XController > xController( xEnumControllers->nextElement(), UNO_QUERY_THROW );
2629*b1cdbd2cSJim Jagielski             ++nConnectedControllers;
2630*b1cdbd2cSJim Jagielski         }
2631*b1cdbd2cSJim Jagielski     }
2632*b1cdbd2cSJim Jagielski     catch( const Exception& )
2633*b1cdbd2cSJim Jagielski     {
2634*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
2635*b1cdbd2cSJim Jagielski     }
2636*b1cdbd2cSJim Jagielski 
2637*b1cdbd2cSJim Jagielski     if ( nConnectedControllers > 1 )
2638*b1cdbd2cSJim Jagielski     {   // we are not the first connected controller, there were already others
2639*b1cdbd2cSJim Jagielski         return;
2640*b1cdbd2cSJim Jagielski     }
2641*b1cdbd2cSJim Jagielski 
2642*b1cdbd2cSJim Jagielski     m_aControllerConnectedEvent.Call();
2643*b1cdbd2cSJim Jagielski }
2644*b1cdbd2cSJim Jagielski 
2645*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
2646*b1cdbd2cSJim Jagielski IMPL_LINK( OApplicationController, OnFirstControllerConnected, void*, /**/ )
2647*b1cdbd2cSJim Jagielski {
2648*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
2649*b1cdbd2cSJim Jagielski 
2650*b1cdbd2cSJim Jagielski     if ( !m_xModel.is() )
2651*b1cdbd2cSJim Jagielski     {
2652*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "OApplicationController::OnFirstControllerConnected: too late!" );
2653*b1cdbd2cSJim Jagielski     }
2654*b1cdbd2cSJim Jagielski 
2655*b1cdbd2cSJim Jagielski     // if we have forms or reports which contain macros/scripts, then show a warning
2656*b1cdbd2cSJim Jagielski     // which suggests the user to migrate them to the database document
2657*b1cdbd2cSJim Jagielski     Reference< XEmbeddedScripts > xDocumentScripts( m_xModel, UNO_QUERY );
2658*b1cdbd2cSJim Jagielski     if ( xDocumentScripts.is() )
2659*b1cdbd2cSJim Jagielski     {
2660*b1cdbd2cSJim Jagielski         // no need to show this warning, obviously the document supports embedding scripts
2661*b1cdbd2cSJim Jagielski         // into itself, so there are no "old-style" forms/reports which have macros/scripts
2662*b1cdbd2cSJim Jagielski         // themselves
2663*b1cdbd2cSJim Jagielski         return 0L;
2664*b1cdbd2cSJim Jagielski     }
2665*b1cdbd2cSJim Jagielski 
2666*b1cdbd2cSJim Jagielski     try
2667*b1cdbd2cSJim Jagielski     {
2668*b1cdbd2cSJim Jagielski         // If the migration just happened, but was not successful, the document is reloaded.
2669*b1cdbd2cSJim Jagielski         // In this case, we should not show the warning, again.
2670*b1cdbd2cSJim Jagielski         ::comphelper::NamedValueCollection aModelArgs( m_xModel->getArgs() );
2671*b1cdbd2cSJim Jagielski         if ( aModelArgs.getOrDefault( "SuppressMigrationWarning", sal_False ) )
2672*b1cdbd2cSJim Jagielski             return 0L;
2673*b1cdbd2cSJim Jagielski 
2674*b1cdbd2cSJim Jagielski         // also, if the document is read-only, then no migration is possible, and the
2675*b1cdbd2cSJim Jagielski         // respective menu entry is hidden. So, don't show the warning in this case, too.
2676*b1cdbd2cSJim Jagielski         if ( Reference< XStorable >( m_xModel, UNO_QUERY_THROW )->isReadonly() )
2677*b1cdbd2cSJim Jagielski             return 0L;
2678*b1cdbd2cSJim Jagielski 
2679*b1cdbd2cSJim Jagielski         SQLWarning aWarning;
2680*b1cdbd2cSJim Jagielski         aWarning.Message = String( ModuleRes( STR_SUB_DOCS_WITH_SCRIPTS ) );
2681*b1cdbd2cSJim Jagielski         SQLException aDetail;
2682*b1cdbd2cSJim Jagielski         aDetail.Message = String( ModuleRes( STR_SUB_DOCS_WITH_SCRIPTS_DETAIL ) );
2683*b1cdbd2cSJim Jagielski         aWarning.NextException <<= aDetail;
2684*b1cdbd2cSJim Jagielski 
2685*b1cdbd2cSJim Jagielski         ::comphelper::ComponentContext aContext( getORB() );
2686*b1cdbd2cSJim Jagielski         Sequence< Any > aArgs(1);
2687*b1cdbd2cSJim Jagielski         aArgs[0] <<= NamedValue( PROPERTY_SQLEXCEPTION, makeAny( aWarning ) );
2688*b1cdbd2cSJim Jagielski         Reference< XExecutableDialog > xDialog(
2689*b1cdbd2cSJim Jagielski             aContext.createComponentWithArguments( "com.sun.star.sdb.ErrorMessageDialog", aArgs ),
2690*b1cdbd2cSJim Jagielski             UNO_QUERY_THROW );
2691*b1cdbd2cSJim Jagielski         xDialog->execute();
2692*b1cdbd2cSJim Jagielski     }
2693*b1cdbd2cSJim Jagielski     catch( const Exception& )
2694*b1cdbd2cSJim Jagielski     {
2695*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
2696*b1cdbd2cSJim Jagielski     }
2697*b1cdbd2cSJim Jagielski 
2698*b1cdbd2cSJim Jagielski     return 1L;
2699*b1cdbd2cSJim Jagielski }
2700*b1cdbd2cSJim Jagielski 
2701*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
attachFrame(const Reference<XFrame> & i_rxFrame)2702*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::attachFrame( const Reference< XFrame > & i_rxFrame ) throw( RuntimeException )
2703*b1cdbd2cSJim Jagielski {
2704*b1cdbd2cSJim Jagielski     OApplicationController_CBASE::attachFrame( i_rxFrame );
2705*b1cdbd2cSJim Jagielski     if ( getFrame().is() )
2706*b1cdbd2cSJim Jagielski         onAttachedFrame();
2707*b1cdbd2cSJim Jagielski }
2708*b1cdbd2cSJim Jagielski 
2709*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
attachModel(const Reference<XModel> & _rxModel)2710*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL OApplicationController::attachModel(const Reference< XModel > & _rxModel) throw( RuntimeException )
2711*b1cdbd2cSJim Jagielski {
2712*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
2713*b1cdbd2cSJim Jagielski     const Reference< XOfficeDatabaseDocument > xOfficeDoc( _rxModel, UNO_QUERY );
2714*b1cdbd2cSJim Jagielski     const Reference< XModifiable > xDocModify( _rxModel, UNO_QUERY );
2715*b1cdbd2cSJim Jagielski     if ( ( !xOfficeDoc.is() || !xDocModify.is() ) && _rxModel.is() )
2716*b1cdbd2cSJim Jagielski     {
2717*b1cdbd2cSJim Jagielski         DBG_ERROR( "OApplicationController::attachModel: invalid model!" );
2718*b1cdbd2cSJim Jagielski         return sal_False;
2719*b1cdbd2cSJim Jagielski     }
2720*b1cdbd2cSJim Jagielski 
2721*b1cdbd2cSJim Jagielski     if ( m_xModel.is() && ( m_xModel != _rxModel ) && ( _rxModel.is() ) )
2722*b1cdbd2cSJim Jagielski     {
2723*b1cdbd2cSJim Jagielski         OSL_ENSURE( false, "OApplicationController::attachModel: missing implementation: setting a new model while we have another one!" );
2724*b1cdbd2cSJim Jagielski         // we'd need to completely update our view here, close sub components, and the like
2725*b1cdbd2cSJim Jagielski         return sal_False;
2726*b1cdbd2cSJim Jagielski     }
2727*b1cdbd2cSJim Jagielski 
2728*b1cdbd2cSJim Jagielski     const ::rtl::OUString aPropertyNames[] =
2729*b1cdbd2cSJim Jagielski     {
2730*b1cdbd2cSJim Jagielski         PROPERTY_URL, PROPERTY_USER
2731*b1cdbd2cSJim Jagielski     };
2732*b1cdbd2cSJim Jagielski 
2733*b1cdbd2cSJim Jagielski     // disconnect from old model
2734*b1cdbd2cSJim Jagielski     try
2735*b1cdbd2cSJim Jagielski     {
2736*b1cdbd2cSJim Jagielski         if ( m_xDataSource.is() )
2737*b1cdbd2cSJim Jagielski         {
2738*b1cdbd2cSJim Jagielski             for ( size_t i=0; i < sizeof( aPropertyNames ) / sizeof( aPropertyNames[0] ); ++i )
2739*b1cdbd2cSJim Jagielski             {
2740*b1cdbd2cSJim Jagielski                 m_xDataSource->removePropertyChangeListener( aPropertyNames[i], this );
2741*b1cdbd2cSJim Jagielski             }
2742*b1cdbd2cSJim Jagielski         }
2743*b1cdbd2cSJim Jagielski 
2744*b1cdbd2cSJim Jagielski 		Reference< XModifyBroadcaster >  xBroadcaster( m_xModel, UNO_QUERY );
2745*b1cdbd2cSJim Jagielski         if ( xBroadcaster.is() )
2746*b1cdbd2cSJim Jagielski 		    xBroadcaster->removeModifyListener( this );
2747*b1cdbd2cSJim Jagielski     }
2748*b1cdbd2cSJim Jagielski     catch( const Exception& )
2749*b1cdbd2cSJim Jagielski     {
2750*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
2751*b1cdbd2cSJim Jagielski     }
2752*b1cdbd2cSJim Jagielski 
2753*b1cdbd2cSJim Jagielski     m_xModel = _rxModel;
2754*b1cdbd2cSJim Jagielski     m_xDocumentModify = xDocModify;
2755*b1cdbd2cSJim Jagielski     m_xDataSource.set( xOfficeDoc.is() ? xOfficeDoc->getDataSource() : Reference< XDataSource >(), UNO_QUERY );
2756*b1cdbd2cSJim Jagielski 
2757*b1cdbd2cSJim Jagielski     // connect to new model
2758*b1cdbd2cSJim Jagielski     try
2759*b1cdbd2cSJim Jagielski     {
2760*b1cdbd2cSJim Jagielski         if ( m_xDataSource.is() )
2761*b1cdbd2cSJim Jagielski         {
2762*b1cdbd2cSJim Jagielski             for ( size_t i=0; i < sizeof( aPropertyNames ) / sizeof( aPropertyNames[0] ); ++i )
2763*b1cdbd2cSJim Jagielski             {
2764*b1cdbd2cSJim Jagielski                 m_xDataSource->addPropertyChangeListener( aPropertyNames[i], this );
2765*b1cdbd2cSJim Jagielski             }
2766*b1cdbd2cSJim Jagielski         }
2767*b1cdbd2cSJim Jagielski 
2768*b1cdbd2cSJim Jagielski 		Reference< XModifyBroadcaster >  xBroadcaster( m_xModel, UNO_QUERY_THROW );
2769*b1cdbd2cSJim Jagielski 		xBroadcaster->addModifyListener( this );
2770*b1cdbd2cSJim Jagielski 
2771*b1cdbd2cSJim Jagielski     }
2772*b1cdbd2cSJim Jagielski     catch( const Exception& )
2773*b1cdbd2cSJim Jagielski     {
2774*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
2775*b1cdbd2cSJim Jagielski     }
2776*b1cdbd2cSJim Jagielski 
2777*b1cdbd2cSJim Jagielski     // initial preview mode
2778*b1cdbd2cSJim Jagielski 	if ( m_xDataSource.is() )
2779*b1cdbd2cSJim Jagielski 	{
2780*b1cdbd2cSJim Jagielski 		try
2781*b1cdbd2cSJim Jagielski 		{
2782*b1cdbd2cSJim Jagielski 			// to get the 'modified' for the data source
2783*b1cdbd2cSJim Jagielski             ::comphelper::NamedValueCollection aLayoutInfo( m_xDataSource->getPropertyValue( PROPERTY_LAYOUTINFORMATION ) );
2784*b1cdbd2cSJim Jagielski             if ( aLayoutInfo.has( (rtl::OUString)INFO_PREVIEW ) )
2785*b1cdbd2cSJim Jagielski             {
2786*b1cdbd2cSJim Jagielski                 const sal_Int32 nPreviewMode( aLayoutInfo.getOrDefault( (rtl::OUString)INFO_PREVIEW, (sal_Int32)0 ) );
2787*b1cdbd2cSJim Jagielski 				m_ePreviewMode = static_cast< PreviewMode >( nPreviewMode );
2788*b1cdbd2cSJim Jagielski                 if ( getView() )
2789*b1cdbd2cSJim Jagielski                     getContainer()->switchPreview( m_ePreviewMode );
2790*b1cdbd2cSJim Jagielski 			}
2791*b1cdbd2cSJim Jagielski 		}
2792*b1cdbd2cSJim Jagielski 		catch( const Exception& )
2793*b1cdbd2cSJim Jagielski 		{
2794*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
2795*b1cdbd2cSJim Jagielski 		}
2796*b1cdbd2cSJim Jagielski 	}
2797*b1cdbd2cSJim Jagielski 
2798*b1cdbd2cSJim Jagielski 	return sal_True;
2799*b1cdbd2cSJim Jagielski }
2800*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
containerFound(const Reference<XContainer> & _xContainer)2801*b1cdbd2cSJim Jagielski void OApplicationController::containerFound( const Reference< XContainer >& _xContainer)
2802*b1cdbd2cSJim Jagielski {
2803*b1cdbd2cSJim Jagielski 	try
2804*b1cdbd2cSJim Jagielski 	{
2805*b1cdbd2cSJim Jagielski 		if ( _xContainer.is() )
2806*b1cdbd2cSJim Jagielski 		{
2807*b1cdbd2cSJim Jagielski 			m_aCurrentContainers.push_back(_xContainer);
2808*b1cdbd2cSJim Jagielski 			_xContainer->addContainerListener(this);
2809*b1cdbd2cSJim Jagielski 		}
2810*b1cdbd2cSJim Jagielski 	}
2811*b1cdbd2cSJim Jagielski 	catch(const Exception&)
2812*b1cdbd2cSJim Jagielski 	{
2813*b1cdbd2cSJim Jagielski 		DBG_UNHANDLED_EXCEPTION();
2814*b1cdbd2cSJim Jagielski 	}
2815*b1cdbd2cSJim Jagielski }
2816*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getCurrentlySelectedName(sal_Int32 & _rnCommandType) const2817*b1cdbd2cSJim Jagielski ::rtl::OUString OApplicationController::getCurrentlySelectedName(sal_Int32& _rnCommandType) const
2818*b1cdbd2cSJim Jagielski {
2819*b1cdbd2cSJim Jagielski     _rnCommandType = ( (getContainer()->getElementType() == E_QUERY)
2820*b1cdbd2cSJim Jagielski 								? CommandType::QUERY : ( (getContainer()->getElementType() == E_TABLE) ? CommandType::TABLE : -1 ));
2821*b1cdbd2cSJim Jagielski 
2822*b1cdbd2cSJim Jagielski 
2823*b1cdbd2cSJim Jagielski 	::rtl::OUString sName;
2824*b1cdbd2cSJim Jagielski 	if ( _rnCommandType != -1 )
2825*b1cdbd2cSJim Jagielski 	{
2826*b1cdbd2cSJim Jagielski 		try
2827*b1cdbd2cSJim Jagielski 		{
2828*b1cdbd2cSJim Jagielski 			sName = getContainer()->getQualifiedName( NULL );
2829*b1cdbd2cSJim Jagielski             OSL_ENSURE( sName.getLength(), "OApplicationController::getCurrentlySelectedName: no name given!" );
2830*b1cdbd2cSJim Jagielski 		}
2831*b1cdbd2cSJim Jagielski 		catch( const Exception& )
2832*b1cdbd2cSJim Jagielski 		{
2833*b1cdbd2cSJim Jagielski             DBG_UNHANDLED_EXCEPTION();
2834*b1cdbd2cSJim Jagielski 		}
2835*b1cdbd2cSJim Jagielski 	}
2836*b1cdbd2cSJim Jagielski     return sName;
2837*b1cdbd2cSJim Jagielski }
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
addSelectionChangeListener(const Reference<view::XSelectionChangeListener> & _Listener)2840*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::addSelectionChangeListener( const Reference< view::XSelectionChangeListener >& _Listener ) throw (RuntimeException)
2841*b1cdbd2cSJim Jagielski {
2842*b1cdbd2cSJim Jagielski     m_pSelectionNotifier->addListener( _Listener );
2843*b1cdbd2cSJim Jagielski }
2844*b1cdbd2cSJim Jagielski 
2845*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
removeSelectionChangeListener(const Reference<view::XSelectionChangeListener> & _Listener)2846*b1cdbd2cSJim Jagielski void SAL_CALL OApplicationController::removeSelectionChangeListener( const Reference< view::XSelectionChangeListener >& _Listener ) throw (RuntimeException)
2847*b1cdbd2cSJim Jagielski {
2848*b1cdbd2cSJim Jagielski     m_pSelectionNotifier->removeListener( _Listener );
2849*b1cdbd2cSJim Jagielski }
2850*b1cdbd2cSJim Jagielski 
2851*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
select(const Any & _aSelection)2852*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL OApplicationController::select( const Any& _aSelection ) throw (IllegalArgumentException, RuntimeException)
2853*b1cdbd2cSJim Jagielski {
2854*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
2855*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( getMutex() );
2856*b1cdbd2cSJim Jagielski     Sequence< ::rtl::OUString> aSelection;
2857*b1cdbd2cSJim Jagielski     if ( !_aSelection.hasValue() || !getView() )
2858*b1cdbd2cSJim Jagielski     {
2859*b1cdbd2cSJim Jagielski         getContainer()->selectElements(aSelection);
2860*b1cdbd2cSJim Jagielski         return sal_True;
2861*b1cdbd2cSJim Jagielski     }
2862*b1cdbd2cSJim Jagielski 
2863*b1cdbd2cSJim Jagielski     // --------------------------------------------------------------
2864*b1cdbd2cSJim Jagielski     // BEGIN compatibility
2865*b1cdbd2cSJim Jagielski     Sequence< NamedValue > aCurrentSelection;
2866*b1cdbd2cSJim Jagielski     if ( (_aSelection >>= aCurrentSelection) && aCurrentSelection.getLength() )
2867*b1cdbd2cSJim Jagielski     {
2868*b1cdbd2cSJim Jagielski         ElementType eType = E_NONE;
2869*b1cdbd2cSJim Jagielski         const NamedValue* pIter = aCurrentSelection.getConstArray();
2870*b1cdbd2cSJim Jagielski         const NamedValue* pEnd	= pIter + aCurrentSelection.getLength();
2871*b1cdbd2cSJim Jagielski         for(;pIter != pEnd;++pIter)
2872*b1cdbd2cSJim Jagielski         {
2873*b1cdbd2cSJim Jagielski             if ( pIter->Name.equalsAscii("Type") )
2874*b1cdbd2cSJim Jagielski             {
2875*b1cdbd2cSJim Jagielski                 sal_Int32 nType = 0;
2876*b1cdbd2cSJim Jagielski                 pIter->Value >>= nType;
2877*b1cdbd2cSJim Jagielski                 if ( nType < DatabaseObject::TABLE || nType > DatabaseObject::REPORT )
2878*b1cdbd2cSJim Jagielski                     throw IllegalArgumentException();
2879*b1cdbd2cSJim Jagielski                 eType = static_cast< ElementType >( nType );
2880*b1cdbd2cSJim Jagielski             }
2881*b1cdbd2cSJim Jagielski             else if ( pIter->Name.equalsAscii("Selection") )
2882*b1cdbd2cSJim Jagielski                 pIter->Value >>= aSelection;
2883*b1cdbd2cSJim Jagielski         }
2884*b1cdbd2cSJim Jagielski 
2885*b1cdbd2cSJim Jagielski         m_aSelectContainerEvent.CancelCall();   // just in case the async select request was running
2886*b1cdbd2cSJim Jagielski         getContainer()->selectContainer(eType);
2887*b1cdbd2cSJim Jagielski         getContainer()->selectElements(aSelection);
2888*b1cdbd2cSJim Jagielski         return sal_True;
2889*b1cdbd2cSJim Jagielski     }
2890*b1cdbd2cSJim Jagielski     // END compatibility
2891*b1cdbd2cSJim Jagielski     // --------------------------------------------------------------
2892*b1cdbd2cSJim Jagielski 
2893*b1cdbd2cSJim Jagielski     Sequence< NamedDatabaseObject > aSelectedObjects;
2894*b1cdbd2cSJim Jagielski     if ( !( _aSelection >>= aSelectedObjects ) )
2895*b1cdbd2cSJim Jagielski     {
2896*b1cdbd2cSJim Jagielski         aSelectedObjects.realloc( 1 );
2897*b1cdbd2cSJim Jagielski         if ( !( _aSelection >>= aSelectedObjects[0] ) )
2898*b1cdbd2cSJim Jagielski             throw IllegalArgumentException();
2899*b1cdbd2cSJim Jagielski     }
2900*b1cdbd2cSJim Jagielski 
2901*b1cdbd2cSJim Jagielski     SelectionByElementType aSelectedElements;
2902*b1cdbd2cSJim Jagielski     ElementType eSelectedCategory = E_NONE;
2903*b1cdbd2cSJim Jagielski     for (   const NamedDatabaseObject* pObject = aSelectedObjects.getConstArray();
2904*b1cdbd2cSJim Jagielski             pObject != aSelectedObjects.getConstArray() + aSelectedObjects.getLength();
2905*b1cdbd2cSJim Jagielski             ++pObject
2906*b1cdbd2cSJim Jagielski         )
2907*b1cdbd2cSJim Jagielski     {
2908*b1cdbd2cSJim Jagielski         switch ( pObject->Type )
2909*b1cdbd2cSJim Jagielski         {
2910*b1cdbd2cSJim Jagielski             case DatabaseObject::TABLE:
2911*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::SCHEMA:
2912*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::CATALOG:
2913*b1cdbd2cSJim Jagielski                 aSelectedElements[ E_TABLE ].push_back( pObject->Name );
2914*b1cdbd2cSJim Jagielski                 break;
2915*b1cdbd2cSJim Jagielski             case DatabaseObject::QUERY:
2916*b1cdbd2cSJim Jagielski                 aSelectedElements[ E_QUERY ].push_back( pObject->Name );
2917*b1cdbd2cSJim Jagielski                 break;
2918*b1cdbd2cSJim Jagielski             case DatabaseObject::FORM:
2919*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::FORMS_FOLDER:
2920*b1cdbd2cSJim Jagielski                 aSelectedElements[ E_FORM ].push_back( pObject->Name );
2921*b1cdbd2cSJim Jagielski                 break;
2922*b1cdbd2cSJim Jagielski             case DatabaseObject::REPORT:
2923*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::REPORTS_FOLDER:
2924*b1cdbd2cSJim Jagielski                 aSelectedElements[ E_REPORT ].push_back( pObject->Name );
2925*b1cdbd2cSJim Jagielski                 break;
2926*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::TABLES:
2927*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::QUERIES:
2928*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::FORMS:
2929*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::REPORTS:
2930*b1cdbd2cSJim Jagielski                 if ( eSelectedCategory != E_NONE )
2931*b1cdbd2cSJim Jagielski                     throw IllegalArgumentException(
2932*b1cdbd2cSJim Jagielski                         String(ModuleRes(RID_STR_NO_DIFF_CAT)),
2933*b1cdbd2cSJim Jagielski                         *this, sal_Int16( pObject - aSelectedObjects.getConstArray() ) );
2934*b1cdbd2cSJim Jagielski                 eSelectedCategory =
2935*b1cdbd2cSJim Jagielski                         ( pObject->Type == DatabaseObjectContainer::TABLES )  ? E_TABLE
2936*b1cdbd2cSJim Jagielski                     :   ( pObject->Type == DatabaseObjectContainer::QUERIES ) ? E_QUERY
2937*b1cdbd2cSJim Jagielski                     :   ( pObject->Type == DatabaseObjectContainer::FORMS )   ? E_FORM
2938*b1cdbd2cSJim Jagielski                     :   ( pObject->Type == DatabaseObjectContainer::REPORTS ) ? E_REPORT
2939*b1cdbd2cSJim Jagielski                     :   E_NONE;
2940*b1cdbd2cSJim Jagielski                 break;
2941*b1cdbd2cSJim Jagielski 
2942*b1cdbd2cSJim Jagielski             default:
2943*b1cdbd2cSJim Jagielski             case DatabaseObjectContainer::DATA_SOURCE:
2944*b1cdbd2cSJim Jagielski             {
2945*b1cdbd2cSJim Jagielski                 ::rtl::OUString sMessage = String(ModuleRes( RID_STR_UNSUPPORTED_OBJECT_TYPE ));
2946*b1cdbd2cSJim Jagielski                 ::comphelper::string::searchAndReplaceAsciiI( sMessage, "$type$", ::rtl::OUString::valueOf(sal_Int32( pObject->Type )) );
2947*b1cdbd2cSJim Jagielski                 throw IllegalArgumentException(sMessage, *this, sal_Int16( pObject - aSelectedObjects.getConstArray() ));
2948*b1cdbd2cSJim Jagielski             }
2949*b1cdbd2cSJim Jagielski         }
2950*b1cdbd2cSJim Jagielski     }
2951*b1cdbd2cSJim Jagielski 
2952*b1cdbd2cSJim Jagielski     for (   SelectionByElementType::const_iterator sel = aSelectedElements.begin();
2953*b1cdbd2cSJim Jagielski             sel != aSelectedElements.end();
2954*b1cdbd2cSJim Jagielski             ++sel
2955*b1cdbd2cSJim Jagielski         )
2956*b1cdbd2cSJim Jagielski     {
2957*b1cdbd2cSJim Jagielski         if ( sel->first == m_eCurrentType )
2958*b1cdbd2cSJim Jagielski         {
2959*b1cdbd2cSJim Jagielski             Sequence< ::rtl::OUString > aSelected( sel->second.size() );
2960*b1cdbd2cSJim Jagielski             ::std::copy( sel->second.begin(), sel->second.end(), aSelected.getArray() );
2961*b1cdbd2cSJim Jagielski             getContainer()->selectElements( aSelected );
2962*b1cdbd2cSJim Jagielski         }
2963*b1cdbd2cSJim Jagielski         else
2964*b1cdbd2cSJim Jagielski         {
2965*b1cdbd2cSJim Jagielski             m_aPendingSelection[ sel->first ] = sel->second;
2966*b1cdbd2cSJim Jagielski         }
2967*b1cdbd2cSJim Jagielski     }
2968*b1cdbd2cSJim Jagielski 
2969*b1cdbd2cSJim Jagielski     m_aSelectContainerEvent.CancelCall();   // just in case the async select request was running
2970*b1cdbd2cSJim Jagielski     getContainer()->selectContainer( eSelectedCategory );
2971*b1cdbd2cSJim Jagielski 
2972*b1cdbd2cSJim Jagielski     return sal_True;
2973*b1cdbd2cSJim Jagielski }
2974*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
getSelection()2975*b1cdbd2cSJim Jagielski Any SAL_CALL OApplicationController::getSelection(  ) throw (RuntimeException)
2976*b1cdbd2cSJim Jagielski {
2977*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard( Application::GetSolarMutex() );
2978*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( getMutex() );
2979*b1cdbd2cSJim Jagielski 
2980*b1cdbd2cSJim Jagielski     Sequence< NamedDatabaseObject > aCurrentSelection;
2981*b1cdbd2cSJim Jagielski     const ElementType eType( getContainer()->getElementType() );
2982*b1cdbd2cSJim Jagielski     if ( eType != E_NONE )
2983*b1cdbd2cSJim Jagielski     {
2984*b1cdbd2cSJim Jagielski         getContainer()->describeCurrentSelectionForType( eType, aCurrentSelection );
2985*b1cdbd2cSJim Jagielski         if ( aCurrentSelection.getLength() == 0 )
2986*b1cdbd2cSJim Jagielski         {   // if no objects are selected, add an entry to the sequence which describes the overall category
2987*b1cdbd2cSJim Jagielski             // which is selected currently
2988*b1cdbd2cSJim Jagielski             aCurrentSelection.realloc(1);
2989*b1cdbd2cSJim Jagielski             aCurrentSelection[0].Name = getDatabaseName();
2990*b1cdbd2cSJim Jagielski             switch ( eType )
2991*b1cdbd2cSJim Jagielski             {
2992*b1cdbd2cSJim Jagielski             case E_TABLE:   aCurrentSelection[0].Type = DatabaseObjectContainer::TABLES;   break;
2993*b1cdbd2cSJim Jagielski             case E_QUERY:   aCurrentSelection[0].Type = DatabaseObjectContainer::QUERIES;  break;
2994*b1cdbd2cSJim Jagielski             case E_FORM:    aCurrentSelection[0].Type = DatabaseObjectContainer::FORMS;    break;
2995*b1cdbd2cSJim Jagielski             case E_REPORT:  aCurrentSelection[0].Type = DatabaseObjectContainer::REPORTS;  break;
2996*b1cdbd2cSJim Jagielski             default:
2997*b1cdbd2cSJim Jagielski                 OSL_ENSURE( false, "OApplicationController::getSelection: unexpected current element type!" );
2998*b1cdbd2cSJim Jagielski                 break;
2999*b1cdbd2cSJim Jagielski             }
3000*b1cdbd2cSJim Jagielski         }
3001*b1cdbd2cSJim Jagielski     }
3002*b1cdbd2cSJim Jagielski     return makeAny( aCurrentSelection );
3003*b1cdbd2cSJim Jagielski }
3004*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
impl_migrateScripts_nothrow()3005*b1cdbd2cSJim Jagielski void OApplicationController::impl_migrateScripts_nothrow()
3006*b1cdbd2cSJim Jagielski {
3007*b1cdbd2cSJim Jagielski     try
3008*b1cdbd2cSJim Jagielski     {
3009*b1cdbd2cSJim Jagielski         ::rtl::OUString sDialogService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.application.MacroMigrationWizard" ) );
3010*b1cdbd2cSJim Jagielski         ::comphelper::ComponentContext aContext( getORB() );
3011*b1cdbd2cSJim Jagielski         Sequence< Any > aDialogArgs(1);
3012*b1cdbd2cSJim Jagielski         aDialogArgs[0] <<= Reference< XOfficeDatabaseDocument >( m_xModel, UNO_QUERY_THROW );
3013*b1cdbd2cSJim Jagielski         Reference< XExecutableDialog > xDialog(
3014*b1cdbd2cSJim Jagielski             aContext.createComponentWithArguments( sDialogService, aDialogArgs ),
3015*b1cdbd2cSJim Jagielski             UNO_QUERY );
3016*b1cdbd2cSJim Jagielski 
3017*b1cdbd2cSJim Jagielski         if ( !xDialog.is() )
3018*b1cdbd2cSJim Jagielski         {
3019*b1cdbd2cSJim Jagielski             ShowServiceNotAvailableError( getView(), sDialogService, true );
3020*b1cdbd2cSJim Jagielski             return;
3021*b1cdbd2cSJim Jagielski         }
3022*b1cdbd2cSJim Jagielski 
3023*b1cdbd2cSJim Jagielski         xDialog->execute();
3024*b1cdbd2cSJim Jagielski     }
3025*b1cdbd2cSJim Jagielski     catch( const Exception& )
3026*b1cdbd2cSJim Jagielski     {
3027*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
3028*b1cdbd2cSJim Jagielski     }
3029*b1cdbd2cSJim Jagielski }
3030*b1cdbd2cSJim Jagielski 
3031*b1cdbd2cSJim Jagielski //........................................................................
3032*b1cdbd2cSJim Jagielski }	// namespace dbaui
3033*b1cdbd2cSJim Jagielski //........................................................................
3034*b1cdbd2cSJim Jagielski 
3035