12a97ec55SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
32a97ec55SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
42a97ec55SAndrew Rist * or more contributor license agreements. See the NOTICE file
52a97ec55SAndrew Rist * distributed with this work for additional information
62a97ec55SAndrew Rist * regarding copyright ownership. The ASF licenses this file
72a97ec55SAndrew Rist * to you under the Apache License, Version 2.0 (the
82a97ec55SAndrew Rist * "License"); you may not use this file except in compliance
92a97ec55SAndrew Rist * with the License. You may obtain a copy of the License at
102a97ec55SAndrew Rist *
112a97ec55SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
122a97ec55SAndrew Rist *
132a97ec55SAndrew Rist * Unless required by applicable law or agreed to in writing,
142a97ec55SAndrew Rist * software distributed under the License is distributed on an
152a97ec55SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
162a97ec55SAndrew Rist * KIND, either express or implied. See the License for the
172a97ec55SAndrew Rist * specific language governing permissions and limitations
182a97ec55SAndrew Rist * under the License.
192a97ec55SAndrew Rist *
202a97ec55SAndrew Rist *************************************************************/
212a97ec55SAndrew Rist
222a97ec55SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_extensions.hxx"
26cdf0e10cSrcweir #include <vcl/waitobj.hxx>
27cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.hxx>
28cdf0e10cSrcweir #include <com/sun/star/util/URL.hpp>
29cdf0e10cSrcweir #include <osl/mutex.hxx>
30cdf0e10cSrcweir #include <vcl/msgbox.hxx>
31cdf0e10cSrcweir #include <tools/debug.hxx>
32cdf0e10cSrcweir #include <vcl/stdtext.hxx>
33cdf0e10cSrcweir #include <comphelper/types.hxx>
34cdf0e10cSrcweir #include <comphelper/sequence.hxx>
35cdf0e10cSrcweir #include "framectr.hxx"
36cdf0e10cSrcweir #include "datman.hxx"
37cdf0e10cSrcweir #include "bibresid.hxx"
38cdf0e10cSrcweir #include "bib.hrc"
39cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
40cdf0e10cSrcweir #include "bibconfig.hxx"
41cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> // helper for implementations
42cdf0e10cSrcweir #include <vcl/svapp.hxx>
43cdf0e10cSrcweir #include "bibliography.hrc"
44cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
45cdf0e10cSrcweir #include <com/sun/star/form/XConfirmDeleteListener.hpp>
46cdf0e10cSrcweir #include <com/sun/star/form/runtime/XFormController.hpp>
47cdf0e10cSrcweir #include <com/sun/star/beans/PropertyState.hpp>
48cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
49cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
50cdf0e10cSrcweir #include <com/sun/star/sdbcx/Privilege.hpp>
51cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSetUpdate.hpp>
52cdf0e10cSrcweir #include <com/sun/star/sdb/RowChangeAction.hpp>
53cdf0e10cSrcweir #include <com/sun/star/frame/CommandGroup.hpp>
54cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
55cdf0e10cSrcweir #include <sot/exchange.hxx>
56cdf0e10cSrcweir #include <sot/formats.hxx>
57cdf0e10cSrcweir #include <vcl/edit.hxx>
58cdf0e10cSrcweir #include <vos/mutex.hxx>
59cdf0e10cSrcweir
60cdf0e10cSrcweir #include <hash_map>
61cdf0e10cSrcweir
62cdf0e10cSrcweir using namespace osl;
63cdf0e10cSrcweir using namespace cppu;
64cdf0e10cSrcweir using namespace rtl;
65cdf0e10cSrcweir using namespace com::sun::star::sdbc;
66cdf0e10cSrcweir using namespace com::sun::star::frame;
67cdf0e10cSrcweir using namespace com::sun::star::uno;
68cdf0e10cSrcweir using namespace com::sun::star;
69cdf0e10cSrcweir
70cdf0e10cSrcweir #define C2U(cChar) OUString::createFromAscii(cChar)
71cdf0e10cSrcweir
72cdf0e10cSrcweir struct DispatchInfo
73cdf0e10cSrcweir {
74cdf0e10cSrcweir const char* pCommand;
75cdf0e10cSrcweir sal_Int16 nGroupId;
76cdf0e10cSrcweir sal_Bool bActiveConnection;
77cdf0e10cSrcweir };
78cdf0e10cSrcweir
79cdf0e10cSrcweir struct CacheDispatchInfo
80cdf0e10cSrcweir {
81cdf0e10cSrcweir sal_Int16 nGroupId;
82cdf0e10cSrcweir sal_Bool bActiveConnection;
83cdf0e10cSrcweir };
84cdf0e10cSrcweir
85cdf0e10cSrcweir // Attention: commands must be sorted by command groups. Implementation is dependent
86cdf0e10cSrcweir // on this!!
87cdf0e10cSrcweir static DispatchInfo SupportedCommandsArray[] =
88cdf0e10cSrcweir {
89cdf0e10cSrcweir { ".uno:Undo" , frame::CommandGroup::EDIT , sal_False },
90cdf0e10cSrcweir { ".uno:Cut" , frame::CommandGroup::EDIT , sal_False },
91cdf0e10cSrcweir { ".uno:Copy" , frame::CommandGroup::EDIT , sal_False },
92cdf0e10cSrcweir { ".uno:Paste" , frame::CommandGroup::EDIT , sal_False },
93cdf0e10cSrcweir { ".uno:SelectAll" , frame::CommandGroup::EDIT , sal_False },
94cdf0e10cSrcweir { ".uno:CloseDoc" , frame::CommandGroup::DOCUMENT , sal_False },
95cdf0e10cSrcweir { ".uno:StatusBarVisible" , frame::CommandGroup::VIEW , sal_False },
96cdf0e10cSrcweir { ".uno:AvailableToolbars" , frame::CommandGroup::VIEW , sal_False },
97cdf0e10cSrcweir { ".uno:Bib/standardFilter" , frame::CommandGroup::DATA , sal_True },
98cdf0e10cSrcweir { ".uno:Bib/DeleteRecord" , frame::CommandGroup::DATA , sal_True },
99cdf0e10cSrcweir { ".uno:Bib/InsertRecord" , frame::CommandGroup::DATA , sal_True },
100cdf0e10cSrcweir { ".uno:Bib/query" , frame::CommandGroup::DATA , sal_True },
101cdf0e10cSrcweir { ".uno:Bib/autoFilter" , frame::CommandGroup::DATA , sal_True },
102cdf0e10cSrcweir { ".uno:Bib/source" , frame::CommandGroup::DATA , sal_True },
103cdf0e10cSrcweir { ".uno:Bib/removeFilter" , frame::CommandGroup::DATA , sal_True },
104cdf0e10cSrcweir { ".uno:Bib/sdbsource" , frame::CommandGroup::DATA , sal_True },
105cdf0e10cSrcweir { ".uno:Bib/Mapping" , frame::CommandGroup::DATA , sal_True },
106cdf0e10cSrcweir { 0 , 0 , sal_False }
107cdf0e10cSrcweir };
108cdf0e10cSrcweir
109cdf0e10cSrcweir typedef ::std::hash_map< ::rtl::OUString, CacheDispatchInfo, rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > CmdToInfoCache;
110cdf0e10cSrcweir
111cdf0e10cSrcweir SV_IMPL_PTRARR( BibStatusDispatchArr, BibStatusDispatchPtr );
112cdf0e10cSrcweir
GetCommandToInfoCache()113cdf0e10cSrcweir const CmdToInfoCache& GetCommandToInfoCache()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir static sal_Bool bCacheInitialized = sal_False;
116cdf0e10cSrcweir static CmdToInfoCache aCmdToInfoCache;
117cdf0e10cSrcweir
118cdf0e10cSrcweir if ( !bCacheInitialized )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
121cdf0e10cSrcweir if ( !bCacheInitialized )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir sal_Int32 i( 0 );
124cdf0e10cSrcweir while ( SupportedCommandsArray[i].pCommand != 0 )
125cdf0e10cSrcweir {
126cdf0e10cSrcweir rtl::OUString aCommand( rtl::OUString::createFromAscii( SupportedCommandsArray[i].pCommand ));
127cdf0e10cSrcweir
128cdf0e10cSrcweir CacheDispatchInfo aDispatchInfo;
129cdf0e10cSrcweir aDispatchInfo.nGroupId = SupportedCommandsArray[i].nGroupId;
130cdf0e10cSrcweir aDispatchInfo.bActiveConnection = SupportedCommandsArray[i].bActiveConnection;
131cdf0e10cSrcweir aCmdToInfoCache.insert( CmdToInfoCache::value_type( aCommand, aDispatchInfo ));
132cdf0e10cSrcweir ++i;
133cdf0e10cSrcweir }
134cdf0e10cSrcweir bCacheInitialized = sal_True;
135cdf0e10cSrcweir }
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
138cdf0e10cSrcweir return aCmdToInfoCache;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir
141cdf0e10cSrcweir
142cdf0e10cSrcweir class BibFrameCtrl_Impl : public cppu::WeakImplHelper1 < XFrameActionListener >
143cdf0e10cSrcweir {
144cdf0e10cSrcweir public:
145cdf0e10cSrcweir Mutex aMutex;
146cdf0e10cSrcweir OMultiTypeInterfaceContainerHelper aLC;
147cdf0e10cSrcweir
148cdf0e10cSrcweir BibFrameController_Impl* pController;
149cdf0e10cSrcweir
BibFrameCtrl_Impl()150cdf0e10cSrcweir BibFrameCtrl_Impl()
151cdf0e10cSrcweir : aLC( aMutex )
152cdf0e10cSrcweir , pController(0)
153cdf0e10cSrcweir {}
154cdf0e10cSrcweir
155cdf0e10cSrcweir ~BibFrameCtrl_Impl();
156cdf0e10cSrcweir
157cdf0e10cSrcweir virtual void SAL_CALL frameAction(const FrameActionEvent& aEvent) throw( RuntimeException );
158cdf0e10cSrcweir virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
159cdf0e10cSrcweir };
160cdf0e10cSrcweir
161cdf0e10cSrcweir
~BibFrameCtrl_Impl()162cdf0e10cSrcweir BibFrameCtrl_Impl::~BibFrameCtrl_Impl()
163cdf0e10cSrcweir {
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
frameAction(const FrameActionEvent & aEvent)166cdf0e10cSrcweir void BibFrameCtrl_Impl::frameAction(const FrameActionEvent& aEvent) throw( uno::RuntimeException )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir if ( pController && aEvent.Frame == pController->getFrame())
169cdf0e10cSrcweir {
170cdf0e10cSrcweir if(aEvent.Action == FrameAction_FRAME_ACTIVATED)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir pController->activate();
173cdf0e10cSrcweir }
174cdf0e10cSrcweir else if(aEvent.Action == FrameAction_FRAME_DEACTIVATING)
175cdf0e10cSrcweir {
176cdf0e10cSrcweir pController->deactivate();
177cdf0e10cSrcweir }
178cdf0e10cSrcweir }
179cdf0e10cSrcweir }
180cdf0e10cSrcweir
disposing(const lang::EventObject &)181cdf0e10cSrcweir void BibFrameCtrl_Impl::disposing( const lang::EventObject& /*Source*/ )
182cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
183cdf0e10cSrcweir {
184cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
185cdf0e10cSrcweir if ( pController )
186cdf0e10cSrcweir pController->getFrame()->removeFrameActionListener( this );
187cdf0e10cSrcweir }
188cdf0e10cSrcweir
BibFrameController_Impl(const uno::Reference<awt::XWindow> & xComponent,BibDataManager * pDataManager)189cdf0e10cSrcweir BibFrameController_Impl::BibFrameController_Impl( const uno::Reference< awt::XWindow > & xComponent,
190cdf0e10cSrcweir BibDataManager* pDataManager)
191cdf0e10cSrcweir :xWindow( xComponent )
192cdf0e10cSrcweir ,m_xDatMan( pDataManager )
193cdf0e10cSrcweir ,pDatMan( pDataManager )
194cdf0e10cSrcweir ,pBibMod(NULL)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir Window* pParent = VCLUnoHelper::GetWindow( xWindow );
197cdf0e10cSrcweir pParent->SetUniqueId(UID_BIB_FRAME_WINDOW);
198cdf0e10cSrcweir bDisposing=sal_False;
199cdf0e10cSrcweir bHierarchical=sal_True;
200cdf0e10cSrcweir pImp = new BibFrameCtrl_Impl;
201cdf0e10cSrcweir pImp->pController = this;
202cdf0e10cSrcweir pImp->acquire();
203cdf0e10cSrcweir }
204cdf0e10cSrcweir
~BibFrameController_Impl()205cdf0e10cSrcweir BibFrameController_Impl::~BibFrameController_Impl()
206cdf0e10cSrcweir {
207cdf0e10cSrcweir pImp->pController = NULL;
208cdf0e10cSrcweir pImp->release();
209cdf0e10cSrcweir delete pDatMan;
210cdf0e10cSrcweir if(pBibMod)
211cdf0e10cSrcweir CloseBibModul(pBibMod);
212cdf0e10cSrcweir }
213cdf0e10cSrcweir
getImplementationName()214cdf0e10cSrcweir ::rtl::OUString SAL_CALL BibFrameController_Impl::getImplementationName() throw (::com::sun::star::uno::RuntimeException)
215cdf0e10cSrcweir {
216cdf0e10cSrcweir return ::rtl::OUString::createFromAscii("com.sun.star.comp.extensions.Bibliography");
217cdf0e10cSrcweir }
218cdf0e10cSrcweir
supportsService(const::rtl::OUString & sServiceName)219cdf0e10cSrcweir sal_Bool SAL_CALL BibFrameController_Impl::supportsService( const ::rtl::OUString& sServiceName ) throw (::com::sun::star::uno::RuntimeException)
220cdf0e10cSrcweir {
221cdf0e10cSrcweir return (
222cdf0e10cSrcweir sServiceName.equalsAscii("com.sun.star.frame.Bibliography") ||
223cdf0e10cSrcweir sServiceName.equalsAscii("com.sun.star.frame.Controller")
224cdf0e10cSrcweir );
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
getSupportedServiceNames()227cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL BibFrameController_Impl::getSupportedServiceNames() throw (::com::sun::star::uno::RuntimeException)
228cdf0e10cSrcweir {
229cdf0e10cSrcweir // return only top level services ...
230cdf0e10cSrcweir // base services are included there and should be asked by uno-rtti.
231cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString > lNames(1);
232cdf0e10cSrcweir lNames[0] = ::rtl::OUString::createFromAscii("com.sun.star.frame.Bibliography");
233cdf0e10cSrcweir return lNames;
234cdf0e10cSrcweir }
235cdf0e10cSrcweir
attachFrame(const uno::Reference<XFrame> & xArg)236cdf0e10cSrcweir void BibFrameController_Impl::attachFrame( const uno::Reference< XFrame > & xArg ) throw (::com::sun::star::uno::RuntimeException)
237cdf0e10cSrcweir {
238cdf0e10cSrcweir xFrame = xArg;
239cdf0e10cSrcweir xFrame->addFrameActionListener( pImp );
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
attachModel(const uno::Reference<XModel> &)242cdf0e10cSrcweir sal_Bool BibFrameController_Impl::attachModel( const uno::Reference< XModel > & /*xModel*/ ) throw (::com::sun::star::uno::RuntimeException)
243cdf0e10cSrcweir {
244cdf0e10cSrcweir return sal_False;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir
suspend(sal_Bool bSuspend)247cdf0e10cSrcweir sal_Bool BibFrameController_Impl::suspend( sal_Bool bSuspend ) throw (::com::sun::star::uno::RuntimeException)
248cdf0e10cSrcweir {
249cdf0e10cSrcweir if ( bSuspend )
250cdf0e10cSrcweir getFrame()->removeFrameActionListener( pImp );
251cdf0e10cSrcweir else
252cdf0e10cSrcweir getFrame()->addFrameActionListener( pImp );
253cdf0e10cSrcweir return sal_True;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir
getViewData()256cdf0e10cSrcweir uno::Any BibFrameController_Impl::getViewData() throw (::com::sun::star::uno::RuntimeException)
257cdf0e10cSrcweir {
258cdf0e10cSrcweir return uno::Any();
259cdf0e10cSrcweir }
260cdf0e10cSrcweir
restoreViewData(const uno::Any &)261cdf0e10cSrcweir void BibFrameController_Impl::restoreViewData( const uno::Any& /*Value*/ ) throw (::com::sun::star::uno::RuntimeException)
262cdf0e10cSrcweir {
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
getFrame()265cdf0e10cSrcweir uno::Reference< XFrame > BibFrameController_Impl::getFrame() throw (::com::sun::star::uno::RuntimeException)
266cdf0e10cSrcweir {
267cdf0e10cSrcweir return xFrame;
268cdf0e10cSrcweir }
269cdf0e10cSrcweir
getModel()270cdf0e10cSrcweir uno::Reference< XModel > BibFrameController_Impl::getModel() throw (::com::sun::star::uno::RuntimeException)
271cdf0e10cSrcweir {
272cdf0e10cSrcweir return uno::Reference< XModel > ();
273cdf0e10cSrcweir }
274cdf0e10cSrcweir
dispose()275cdf0e10cSrcweir void BibFrameController_Impl::dispose() throw (::com::sun::star::uno::RuntimeException)
276cdf0e10cSrcweir {
277cdf0e10cSrcweir bDisposing = sal_True;
278cdf0e10cSrcweir lang::EventObject aObject;
279cdf0e10cSrcweir aObject.Source = (XController*)this;
280cdf0e10cSrcweir pImp->aLC.disposeAndClear(aObject);
281cdf0e10cSrcweir m_xDatMan = 0;
282cdf0e10cSrcweir pDatMan = 0;
283cdf0e10cSrcweir aStatusListeners.DeleteAndDestroy( 0, aStatusListeners.Count() );
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
addEventListener(const uno::Reference<lang::XEventListener> & aListener)286cdf0e10cSrcweir void BibFrameController_Impl::addEventListener( const uno::Reference< lang::XEventListener > & aListener ) throw (::com::sun::star::uno::RuntimeException)
287cdf0e10cSrcweir {
288cdf0e10cSrcweir pImp->aLC.addInterface( ::getCppuType((const Reference< lang::XEventListener >*)0), aListener );
289cdf0e10cSrcweir }
290cdf0e10cSrcweir
removeEventListener(const uno::Reference<lang::XEventListener> & aListener)291cdf0e10cSrcweir void BibFrameController_Impl::removeEventListener( const uno::Reference< lang::XEventListener > & aListener ) throw (::com::sun::star::uno::RuntimeException)
292cdf0e10cSrcweir {
293cdf0e10cSrcweir pImp->aLC.removeInterface( ::getCppuType((const Reference< lang::XEventListener >*)0), aListener );
294cdf0e10cSrcweir }
295cdf0e10cSrcweir
queryDispatch(const util::URL & aURL,const rtl::OUString &,sal_Int32)296cdf0e10cSrcweir uno::Reference< frame::XDispatch > BibFrameController_Impl::queryDispatch( const util::URL& aURL, const rtl::OUString& /*aTarget*/, sal_Int32 /*nSearchFlags*/ ) throw (::com::sun::star::uno::RuntimeException)
297cdf0e10cSrcweir {
298cdf0e10cSrcweir if ( !bDisposing )
299cdf0e10cSrcweir {
300cdf0e10cSrcweir const CmdToInfoCache& rCmdCache = GetCommandToInfoCache();
301cdf0e10cSrcweir CmdToInfoCache::const_iterator pIter = rCmdCache.find( aURL.Complete );
302cdf0e10cSrcweir if ( pIter != rCmdCache.end() )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir if (( pDatMan->HasActiveConnection() ) ||
305cdf0e10cSrcweir ( !pIter->second.bActiveConnection ))
306cdf0e10cSrcweir return (frame::XDispatch*) this;
307cdf0e10cSrcweir }
308cdf0e10cSrcweir }
309cdf0e10cSrcweir
310cdf0e10cSrcweir return uno::Reference< frame::XDispatch > ();
311cdf0e10cSrcweir }
312cdf0e10cSrcweir
queryDispatches(const uno::Sequence<DispatchDescriptor> & aDescripts)313cdf0e10cSrcweir uno::Sequence<uno::Reference< XDispatch > > BibFrameController_Impl::queryDispatches( const uno::Sequence<DispatchDescriptor>& aDescripts ) throw (::com::sun::star::uno::RuntimeException)
314cdf0e10cSrcweir {
315cdf0e10cSrcweir uno::Sequence< uno::Reference< XDispatch > > aDispatches( aDescripts.getLength() );
316cdf0e10cSrcweir for ( sal_Int32 i=0; i<aDescripts.getLength(); ++i )
317cdf0e10cSrcweir aDispatches[i] = queryDispatch( aDescripts[i].FeatureURL, aDescripts[i].FrameName, aDescripts[i].SearchFlags );
318cdf0e10cSrcweir return aDispatches;
319cdf0e10cSrcweir }
320cdf0e10cSrcweir
getSupportedCommandGroups()321cdf0e10cSrcweir uno::Sequence< ::sal_Int16 > SAL_CALL BibFrameController_Impl::getSupportedCommandGroups()
322cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir uno::Sequence< ::sal_Int16 > aDispatchInfo( 4 );
325cdf0e10cSrcweir
326cdf0e10cSrcweir aDispatchInfo[0] = frame::CommandGroup::EDIT;
327cdf0e10cSrcweir aDispatchInfo[1] = frame::CommandGroup::DOCUMENT;
328cdf0e10cSrcweir aDispatchInfo[2] = frame::CommandGroup::DATA;
329cdf0e10cSrcweir aDispatchInfo[3] = frame::CommandGroup::VIEW;
330cdf0e10cSrcweir
331cdf0e10cSrcweir return aDispatchInfo;
332cdf0e10cSrcweir }
333cdf0e10cSrcweir
getConfigurableDispatchInformation(::sal_Int16 nCommandGroup)334cdf0e10cSrcweir uno::Sequence< frame::DispatchInformation > SAL_CALL BibFrameController_Impl::getConfigurableDispatchInformation( ::sal_Int16 nCommandGroup )
335cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
336cdf0e10cSrcweir {
337cdf0e10cSrcweir const CmdToInfoCache& rCmdCache = GetCommandToInfoCache();
338cdf0e10cSrcweir
339cdf0e10cSrcweir sal_Bool bGroupFound( sal_False );
340cdf0e10cSrcweir frame::DispatchInformation aDispatchInfo;
341cdf0e10cSrcweir std::list< frame::DispatchInformation > aDispatchInfoList;
342cdf0e10cSrcweir
343cdf0e10cSrcweir if (( nCommandGroup == frame::CommandGroup::EDIT ) ||
344cdf0e10cSrcweir ( nCommandGroup == frame::CommandGroup::DOCUMENT ) ||
345cdf0e10cSrcweir ( nCommandGroup == frame::CommandGroup::DATA ) ||
346cdf0e10cSrcweir ( nCommandGroup == frame::CommandGroup::VIEW ))
347cdf0e10cSrcweir {
348cdf0e10cSrcweir CmdToInfoCache::const_iterator pIter = rCmdCache.begin();
349cdf0e10cSrcweir while ( pIter != rCmdCache.end() )
350cdf0e10cSrcweir {
351cdf0e10cSrcweir if ( pIter->second.nGroupId == nCommandGroup )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir bGroupFound = sal_True;
354cdf0e10cSrcweir aDispatchInfo.Command = pIter->first;
355cdf0e10cSrcweir aDispatchInfo.GroupId = pIter->second.nGroupId;
356cdf0e10cSrcweir aDispatchInfoList.push_back( aDispatchInfo );
357cdf0e10cSrcweir }
358cdf0e10cSrcweir else if ( bGroupFound )
359cdf0e10cSrcweir break;
360cdf0e10cSrcweir
361cdf0e10cSrcweir ++pIter;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
365cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::frame::DispatchInformation > aSeq =
366cdf0e10cSrcweir comphelper::containerToSequence< ::com::sun::star::frame::DispatchInformation, std::list< ::com::sun::star::frame::DispatchInformation > >( aDispatchInfoList );
367cdf0e10cSrcweir
368cdf0e10cSrcweir return aSeq;
369cdf0e10cSrcweir }
370cdf0e10cSrcweir
canInsertRecords(const Reference<beans::XPropertySet> & _rxCursorSet)371cdf0e10cSrcweir sal_Bool canInsertRecords(const Reference< beans::XPropertySet>& _rxCursorSet)
372cdf0e10cSrcweir {
373cdf0e10cSrcweir sal_Int32 nPriv = 0;
374cdf0e10cSrcweir _rxCursorSet->getPropertyValue(C2U("Privileges")) >>= nPriv;
375cdf0e10cSrcweir return ((_rxCursorSet.is() && (nPriv & sdbcx::Privilege::INSERT) != 0));
376cdf0e10cSrcweir }
377cdf0e10cSrcweir /* -----------------------------08.05.2002 08:58------------------------------
378cdf0e10cSrcweir
379cdf0e10cSrcweir ---------------------------------------------------------------------------*/
SaveModified(const Reference<form::runtime::XFormController> & xController)380cdf0e10cSrcweir sal_Bool BibFrameController_Impl::SaveModified(const Reference< form::runtime::XFormController>& xController)
381cdf0e10cSrcweir {
382cdf0e10cSrcweir if (!xController.is())
383cdf0e10cSrcweir return sal_False;
384cdf0e10cSrcweir sal_Bool bInserted = sal_False;
385cdf0e10cSrcweir
386cdf0e10cSrcweir Reference< XResultSetUpdate> _xCursor = Reference< XResultSetUpdate>(xController->getModel(), UNO_QUERY);
387cdf0e10cSrcweir
388cdf0e10cSrcweir if (!_xCursor.is())
389cdf0e10cSrcweir return sal_False;
390cdf0e10cSrcweir
391cdf0e10cSrcweir Reference< beans::XPropertySet> _xSet = Reference< beans::XPropertySet>(_xCursor, UNO_QUERY);
392cdf0e10cSrcweir if (!_xSet.is())
393cdf0e10cSrcweir return sal_False;
394cdf0e10cSrcweir
395cdf0e10cSrcweir // mu� gespeichert werden ?
396cdf0e10cSrcweir sal_Bool bIsNew = ::comphelper::getBOOL(_xSet->getPropertyValue(C2U("IsNew")));
397cdf0e10cSrcweir sal_Bool bIsModified = ::comphelper::getBOOL(_xSet->getPropertyValue(C2U("IsModified")));
398cdf0e10cSrcweir sal_Bool bResult = !bIsModified;
399cdf0e10cSrcweir if (bIsModified)
400cdf0e10cSrcweir {
401cdf0e10cSrcweir try
402cdf0e10cSrcweir {
403cdf0e10cSrcweir if (bIsNew)
404cdf0e10cSrcweir _xCursor->insertRow();
405cdf0e10cSrcweir else
406cdf0e10cSrcweir _xCursor->updateRow();
407cdf0e10cSrcweir bResult = sal_True;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir catch(Exception&)
410cdf0e10cSrcweir {
411*07a3d7f1SPedro Giffuni DBG_ERROR("SaveModified: Exception occurred!");
412cdf0e10cSrcweir }
413cdf0e10cSrcweir
414cdf0e10cSrcweir bInserted = bIsNew && bResult;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir return bResult;
417cdf0e10cSrcweir }
418cdf0e10cSrcweir
lcl_GetFocusChild(Window * pParent)419cdf0e10cSrcweir Window* lcl_GetFocusChild( Window* pParent )
420cdf0e10cSrcweir {
421cdf0e10cSrcweir sal_uInt16 nChildren = pParent->GetChildCount();
422cdf0e10cSrcweir for( sal_uInt16 nChild = 0; nChild < nChildren; ++nChild)
423cdf0e10cSrcweir {
424cdf0e10cSrcweir Window* pChild = pParent->GetChild( nChild );
425cdf0e10cSrcweir if(pChild->HasFocus())
426cdf0e10cSrcweir return pChild;
427cdf0e10cSrcweir Window* pSubChild = lcl_GetFocusChild( pChild );
428cdf0e10cSrcweir if(pSubChild)
429cdf0e10cSrcweir return pSubChild;
430cdf0e10cSrcweir }
431cdf0e10cSrcweir return 0;
432cdf0e10cSrcweir }
433cdf0e10cSrcweir
434cdf0e10cSrcweir //class XDispatch
dispatch(const util::URL & _rURL,const uno::Sequence<beans::PropertyValue> & aArgs)435cdf0e10cSrcweir void BibFrameController_Impl::dispatch(const util::URL& _rURL, const uno::Sequence< beans::PropertyValue >& aArgs) throw (::com::sun::star::uno::RuntimeException)
436cdf0e10cSrcweir {
437cdf0e10cSrcweir if ( !bDisposing )
438cdf0e10cSrcweir {
439cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
440cdf0e10cSrcweir Window* pParent = VCLUnoHelper::GetWindow( xWindow );
441cdf0e10cSrcweir WaitObject aWaitObject( pParent );
442cdf0e10cSrcweir
443cdf0e10cSrcweir String aCommand( _rURL.Path);
444cdf0e10cSrcweir if(aCommand.EqualsAscii("Bib/Mapping"))
445cdf0e10cSrcweir {
446cdf0e10cSrcweir pDatMan->CreateMappingDialog(pParent);
447cdf0e10cSrcweir }
448cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/source"))
449cdf0e10cSrcweir {
450cdf0e10cSrcweir ChangeDataSource(aArgs);
451cdf0e10cSrcweir }
452cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/sdbsource"))
453cdf0e10cSrcweir {
454cdf0e10cSrcweir rtl::OUString aURL = pDatMan->CreateDBChangeDialog(pParent);
455cdf0e10cSrcweir if(aURL.getLength())
456cdf0e10cSrcweir {
457cdf0e10cSrcweir try
458cdf0e10cSrcweir {
459cdf0e10cSrcweir uno::Sequence< beans::PropertyValue > aNewDataSource(2);
460cdf0e10cSrcweir beans::PropertyValue* pProps = aNewDataSource.getArray();
461cdf0e10cSrcweir pProps[0].Value <<= rtl::OUString();
462cdf0e10cSrcweir pProps[1].Value <<= aURL;
463cdf0e10cSrcweir ChangeDataSource(aNewDataSource);
464cdf0e10cSrcweir }
465cdf0e10cSrcweir catch(const Exception&)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir DBG_ERROR("Exception catched while changing the data source");
468cdf0e10cSrcweir }
469cdf0e10cSrcweir }
470cdf0e10cSrcweir }
471cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/autoFilter"))
472cdf0e10cSrcweir {
473cdf0e10cSrcweir sal_uInt16 nCount = aStatusListeners.Count();
474cdf0e10cSrcweir for ( sal_uInt16 n=0; n<nCount; n++ )
475cdf0e10cSrcweir {
476cdf0e10cSrcweir BibStatusDispatch *pObj = aStatusListeners[n];
477cdf0e10cSrcweir if ( pObj->aURL.Path == C2U("Bib/removeFilter") )
478cdf0e10cSrcweir {
479cdf0e10cSrcweir FeatureStateEvent aEvent;
480cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
481cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
482cdf0e10cSrcweir aEvent.Requery = sal_False;
483cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
484cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
485cdf0e10cSrcweir //break; because there are more than one
486cdf0e10cSrcweir }
487cdf0e10cSrcweir }
488cdf0e10cSrcweir
489cdf0e10cSrcweir const beans::PropertyValue* pPropertyValue = aArgs.getConstArray();
490cdf0e10cSrcweir uno::Any aValue=pPropertyValue[0].Value;
491cdf0e10cSrcweir rtl::OUString aQuery;
492cdf0e10cSrcweir aValue >>= aQuery;
493cdf0e10cSrcweir
494cdf0e10cSrcweir aValue=pPropertyValue[1].Value;
495cdf0e10cSrcweir rtl::OUString aQueryField;
496cdf0e10cSrcweir aValue >>= aQueryField;
497cdf0e10cSrcweir BibConfig* pConfig = BibModul::GetConfig();
498cdf0e10cSrcweir pConfig->setQueryField(aQueryField);
499cdf0e10cSrcweir pDatMan->startQueryWith(aQuery);
500cdf0e10cSrcweir }
501cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/standardFilter"))
502cdf0e10cSrcweir {
503cdf0e10cSrcweir try
504cdf0e10cSrcweir {
505cdf0e10cSrcweir uno::Reference< lang::XMultiServiceFactory > xORB = ::comphelper::getProcessServiceFactory();
506cdf0e10cSrcweir
507cdf0e10cSrcweir // build the arguments for the filter dialog to be created
508cdf0e10cSrcweir Sequence< Any > aDialogCreationArgs( 3 );
509cdf0e10cSrcweir Any* pDialogCreationArgs = aDialogCreationArgs.getArray();
510cdf0e10cSrcweir // the query composer
511cdf0e10cSrcweir *pDialogCreationArgs++ <<= beans::PropertyValue( ::rtl::OUString::createFromAscii( "QueryComposer" ),
512cdf0e10cSrcweir -1,
513cdf0e10cSrcweir makeAny( pDatMan->getParser() ),
514cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE
515cdf0e10cSrcweir );
516cdf0e10cSrcweir
517cdf0e10cSrcweir // the rowset
518cdf0e10cSrcweir *pDialogCreationArgs++ <<= beans::PropertyValue( ::rtl::OUString::createFromAscii( "RowSet" ),
519cdf0e10cSrcweir -1,
520cdf0e10cSrcweir makeAny( pDatMan->getForm() ),
521cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE
522cdf0e10cSrcweir );
523cdf0e10cSrcweir // the parent window for the dialog
524cdf0e10cSrcweir *pDialogCreationArgs++ <<= beans::PropertyValue( ::rtl::OUString::createFromAscii( "ParentWindow" ),
525cdf0e10cSrcweir -1,
526cdf0e10cSrcweir makeAny( xWindow ),
527cdf0e10cSrcweir beans::PropertyState_DIRECT_VALUE
528cdf0e10cSrcweir );
529cdf0e10cSrcweir
530cdf0e10cSrcweir // create the dialog object
531cdf0e10cSrcweir const ::rtl::OUString sDialogServiceName = ::rtl::OUString::createFromAscii( "com.sun.star.sdb.FilterDialog" );
532cdf0e10cSrcweir uno::Reference< uno::XInterface > xDialog = xORB->createInstanceWithArguments(
533cdf0e10cSrcweir sDialogServiceName,
534cdf0e10cSrcweir aDialogCreationArgs
535cdf0e10cSrcweir );
536cdf0e10cSrcweir if ( !xDialog.is() )
537cdf0e10cSrcweir {
538cdf0e10cSrcweir ShowServiceNotAvailableError( VCLUnoHelper::GetWindow( xWindow ), sDialogServiceName, sal_True );
539cdf0e10cSrcweir }
540cdf0e10cSrcweir else
541cdf0e10cSrcweir {
542cdf0e10cSrcweir // execute it
543cdf0e10cSrcweir uno::Reference< ui::dialogs::XExecutableDialog > xExec( xDialog, UNO_QUERY );
544cdf0e10cSrcweir DBG_ASSERT( xExec.is(), "BibFrameController_Impl::dispatch: missing an interface on the dialog!" );
545cdf0e10cSrcweir if ( xExec.is() )
546cdf0e10cSrcweir if ( xExec->execute( ) )
547cdf0e10cSrcweir {
548cdf0e10cSrcweir // the dialog has been executed successfully, and the filter on the query composer
549cdf0e10cSrcweir // has been changed
550cdf0e10cSrcweir ::rtl::OUString sNewFilter = pDatMan->getParser()->getFilter();
551cdf0e10cSrcweir pDatMan->setFilter( sNewFilter );
552cdf0e10cSrcweir }
553cdf0e10cSrcweir }
554cdf0e10cSrcweir }
555cdf0e10cSrcweir catch( const uno::Exception& )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir DBG_ERROR( "BibFrameController_Impl::dispatch: caught an exception!" );
558cdf0e10cSrcweir }
559cdf0e10cSrcweir
560cdf0e10cSrcweir sal_uInt16 nCount = aStatusListeners.Count();
561cdf0e10cSrcweir for ( sal_uInt16 n=0; n<nCount; n++ )
562cdf0e10cSrcweir {
563cdf0e10cSrcweir BibStatusDispatch *pObj = aStatusListeners[n];
564cdf0e10cSrcweir if ( pObj->aURL.Path == C2U("Bib/removeFilter") && pDatMan->getParser().is())
565cdf0e10cSrcweir {
566cdf0e10cSrcweir FeatureStateEvent aEvent;
567cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
568cdf0e10cSrcweir aEvent.IsEnabled = 0 != pDatMan->getParser()->getFilter().getLength();
569cdf0e10cSrcweir aEvent.Requery = sal_False;
570cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
571cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
572cdf0e10cSrcweir }
573cdf0e10cSrcweir }
574cdf0e10cSrcweir }
575cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/removeFilter"))
576cdf0e10cSrcweir {
577cdf0e10cSrcweir RemoveFilter();
578cdf0e10cSrcweir }
579cdf0e10cSrcweir else if(_rURL.Complete.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("slot:5503")) ||
580cdf0e10cSrcweir aCommand.EqualsAscii("CloseDoc"))
581cdf0e10cSrcweir {
582cdf0e10cSrcweir Application::PostUserEvent( STATIC_LINK( this, BibFrameController_Impl,
583cdf0e10cSrcweir DisposeHdl ), 0 );
584cdf0e10cSrcweir
585cdf0e10cSrcweir }
586cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/InsertRecord"))
587cdf0e10cSrcweir {
588cdf0e10cSrcweir Reference<form::runtime::XFormController > xFormCtrl = pDatMan->GetFormController();
589cdf0e10cSrcweir if(SaveModified(xFormCtrl))
590cdf0e10cSrcweir {
591cdf0e10cSrcweir try
592cdf0e10cSrcweir {
593cdf0e10cSrcweir Reference< sdbc::XResultSet > xCursor( pDatMan->getForm(), UNO_QUERY );
594cdf0e10cSrcweir xCursor->last();
595cdf0e10cSrcweir
596cdf0e10cSrcweir Reference< XResultSetUpdate > xUpdateCursor( pDatMan->getForm(), UNO_QUERY );
597cdf0e10cSrcweir xUpdateCursor->moveToInsertRow();
598cdf0e10cSrcweir }
599cdf0e10cSrcweir catch(Exception&)
600cdf0e10cSrcweir {
601cdf0e10cSrcweir DBG_ERROR("Exception in last() or moveToInsertRow()");
602cdf0e10cSrcweir }
603cdf0e10cSrcweir }
604cdf0e10cSrcweir }
605cdf0e10cSrcweir else if(aCommand.EqualsAscii("Bib/DeleteRecord"))
606cdf0e10cSrcweir {
607cdf0e10cSrcweir Reference< ::com::sun::star::sdbc::XResultSet > xCursor(pDatMan->getForm(), UNO_QUERY);
608cdf0e10cSrcweir Reference< XResultSetUpdate > xUpdateCursor(xCursor, UNO_QUERY);
609cdf0e10cSrcweir Reference< beans::XPropertySet > xSet(pDatMan->getForm(), UNO_QUERY);
610cdf0e10cSrcweir sal_Bool bIsNew = ::comphelper::getBOOL(xSet->getPropertyValue(C2U("IsNew")));
611cdf0e10cSrcweir if(!bIsNew)
612cdf0e10cSrcweir {
613cdf0e10cSrcweir sal_uInt32 nCount = 0;
614cdf0e10cSrcweir xSet->getPropertyValue(C2U("RowCount")) >>= nCount;
615cdf0e10cSrcweir // naechste position festellen
616cdf0e10cSrcweir sal_Bool bSuccess = sal_False;
617cdf0e10cSrcweir sal_Bool bLeft = sal_False;
618cdf0e10cSrcweir sal_Bool bRight = sal_False;
619cdf0e10cSrcweir try
620cdf0e10cSrcweir {
621cdf0e10cSrcweir bLeft = xCursor->isLast() && nCount > 1;
622cdf0e10cSrcweir bRight= !xCursor->isLast();
623cdf0e10cSrcweir // ask for confirmation
624cdf0e10cSrcweir Reference< frame::XController > xCtrl = pImp->pController;
625cdf0e10cSrcweir Reference< form::XConfirmDeleteListener > xConfirm(pDatMan->GetFormController(),UNO_QUERY);
626cdf0e10cSrcweir if (xConfirm.is())
627cdf0e10cSrcweir {
628cdf0e10cSrcweir sdb::RowChangeEvent aEvent;
629cdf0e10cSrcweir aEvent.Source = Reference< XInterface > (xCursor, UNO_QUERY);
630cdf0e10cSrcweir aEvent.Action = sdb::RowChangeAction::DELETE;
631cdf0e10cSrcweir aEvent.Rows = 1;
632cdf0e10cSrcweir bSuccess = xConfirm->confirmDelete(aEvent);
633cdf0e10cSrcweir }
634cdf0e10cSrcweir
635cdf0e10cSrcweir // das Ding loeschen
636cdf0e10cSrcweir if (bSuccess)
637cdf0e10cSrcweir xUpdateCursor->deleteRow();
638cdf0e10cSrcweir }
639cdf0e10cSrcweir catch(Exception&)
640cdf0e10cSrcweir {
641cdf0e10cSrcweir bSuccess = sal_False;
642cdf0e10cSrcweir }
643cdf0e10cSrcweir if (bSuccess)
644cdf0e10cSrcweir {
645cdf0e10cSrcweir if (bLeft || bRight)
646cdf0e10cSrcweir xCursor->relative(bRight ? 1 : -1);
647cdf0e10cSrcweir else
648cdf0e10cSrcweir {
649cdf0e10cSrcweir sal_Bool bCanInsert = canInsertRecords(xSet);
650cdf0e10cSrcweir // kann noch ein Datensatz eingefuegt weden
651cdf0e10cSrcweir try
652cdf0e10cSrcweir {
653cdf0e10cSrcweir if (bCanInsert)
654cdf0e10cSrcweir xUpdateCursor->moveToInsertRow();
655cdf0e10cSrcweir else
656cdf0e10cSrcweir // Datensatz bewegen um Stati neu zu setzen
657cdf0e10cSrcweir xCursor->first();
658cdf0e10cSrcweir }
659cdf0e10cSrcweir catch(Exception&)
660cdf0e10cSrcweir {
661cdf0e10cSrcweir DBG_ERROR("DeleteRecord : exception caught !");
662cdf0e10cSrcweir }
663cdf0e10cSrcweir }
664cdf0e10cSrcweir }
665cdf0e10cSrcweir }
666cdf0e10cSrcweir }
667cdf0e10cSrcweir else if(aCommand.EqualsAscii("Cut"))
668cdf0e10cSrcweir {
669cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
670cdf0e10cSrcweir if(pChild)
671cdf0e10cSrcweir {
672cdf0e10cSrcweir KeyEvent aEvent( 0, KEYFUNC_CUT );
673cdf0e10cSrcweir pChild->KeyInput( aEvent );
674cdf0e10cSrcweir }
675cdf0e10cSrcweir }
676cdf0e10cSrcweir else if(aCommand.EqualsAscii("Copy"))
677cdf0e10cSrcweir {
678cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
679cdf0e10cSrcweir if(pChild)
680cdf0e10cSrcweir {
681cdf0e10cSrcweir KeyEvent aEvent( 0, KEYFUNC_COPY );
682cdf0e10cSrcweir pChild->KeyInput( aEvent );
683cdf0e10cSrcweir }
684cdf0e10cSrcweir }
685cdf0e10cSrcweir else if(aCommand.EqualsAscii("Paste"))
686cdf0e10cSrcweir {
687cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
688cdf0e10cSrcweir if(pChild)
689cdf0e10cSrcweir {
690cdf0e10cSrcweir KeyEvent aEvent( 0, KEYFUNC_PASTE );
691cdf0e10cSrcweir pChild->KeyInput( aEvent );
692cdf0e10cSrcweir }
693cdf0e10cSrcweir }
694cdf0e10cSrcweir }
695cdf0e10cSrcweir }
IMPL_STATIC_LINK(BibFrameController_Impl,DisposeHdl,void *,EMPTYARG)696cdf0e10cSrcweir IMPL_STATIC_LINK( BibFrameController_Impl, DisposeHdl, void*, EMPTYARG )
697cdf0e10cSrcweir {
698cdf0e10cSrcweir pThis->xFrame->dispose();
699cdf0e10cSrcweir return 0;
700cdf0e10cSrcweir };
701cdf0e10cSrcweir
702cdf0e10cSrcweir //-----------------------------------------------------------------------------
addStatusListener(const uno::Reference<frame::XStatusListener> & aListener,const util::URL & aURL)703cdf0e10cSrcweir void BibFrameController_Impl::addStatusListener(
704cdf0e10cSrcweir const uno::Reference< frame::XStatusListener > & aListener,
705cdf0e10cSrcweir const util::URL& aURL)
706cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
707cdf0e10cSrcweir {
708cdf0e10cSrcweir BibConfig* pConfig = BibModul::GetConfig();
709cdf0e10cSrcweir // create a new Reference and insert into listener array
710cdf0e10cSrcweir aStatusListeners.Insert( new BibStatusDispatch( aURL, aListener ), aStatusListeners.Count() );
711cdf0e10cSrcweir
712cdf0e10cSrcweir // den ersten Status synchron zusenden
713cdf0e10cSrcweir FeatureStateEvent aEvent;
714cdf0e10cSrcweir aEvent.FeatureURL = aURL;
715cdf0e10cSrcweir aEvent.Requery = sal_False;
716cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
717cdf0e10cSrcweir if ( aURL.Path == C2U("StatusBarVisible") )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir aEvent.IsEnabled = sal_False;
720cdf0e10cSrcweir aEvent.State <<= sal_Bool( sal_False );
721cdf0e10cSrcweir }
722cdf0e10cSrcweir else if ( aURL.Path == C2U("Bib/hierarchical") )
723cdf0e10cSrcweir {
724cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
725cdf0e10cSrcweir const char* pHier = bHierarchical? "" : "*" ;
726cdf0e10cSrcweir aEvent.State <<= rtl::OUString::createFromAscii(pHier);
727cdf0e10cSrcweir }
728cdf0e10cSrcweir else if(aURL.Path == C2U("Bib/MenuFilter"))
729cdf0e10cSrcweir {
730cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
731cdf0e10cSrcweir aEvent.FeatureDescriptor=pDatMan->getQueryField();
732cdf0e10cSrcweir
733cdf0e10cSrcweir uno::Sequence<rtl::OUString> aStringSeq=pDatMan->getQueryFields();
734cdf0e10cSrcweir aEvent.State.setValue(&aStringSeq,::getCppuType((uno::Sequence<rtl::OUString>*)0));
735cdf0e10cSrcweir
736cdf0e10cSrcweir }
737cdf0e10cSrcweir else if ( aURL.Path == C2U("Bib/source"))
738cdf0e10cSrcweir {
739cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
740cdf0e10cSrcweir aEvent.FeatureDescriptor=pDatMan->getActiveDataTable();
741cdf0e10cSrcweir
742cdf0e10cSrcweir uno::Sequence<rtl::OUString> aStringSeq=pDatMan->getDataSources();
743cdf0e10cSrcweir aEvent.State.setValue(&aStringSeq,::getCppuType((uno::Sequence<rtl::OUString>*)0));
744cdf0e10cSrcweir }
745cdf0e10cSrcweir else if(aURL.Path == C2U("Bib/sdbsource") ||
746cdf0e10cSrcweir aURL.Path == C2U("Bib/Mapping") ||
747cdf0e10cSrcweir aURL.Path == C2U("Bib/autoFilter") ||
748cdf0e10cSrcweir aURL.Path.equalsAscii("Bib/standardFilter"))
749cdf0e10cSrcweir {
750cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
751cdf0e10cSrcweir }
752cdf0e10cSrcweir else if(aURL.Path == C2U("Bib/query"))
753cdf0e10cSrcweir {
754cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
755cdf0e10cSrcweir aEvent.State <<= pConfig->getQueryText();
756cdf0e10cSrcweir }
757cdf0e10cSrcweir else if (aURL.Path == C2U("Bib/removeFilter") )
758cdf0e10cSrcweir {
759cdf0e10cSrcweir rtl::OUString aFilterStr=pDatMan->getFilter();
760cdf0e10cSrcweir aEvent.IsEnabled = (aFilterStr.getLength() > 0);
761cdf0e10cSrcweir }
762cdf0e10cSrcweir else if(aURL.Path == C2U("Cut"))
763cdf0e10cSrcweir {
764cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
765cdf0e10cSrcweir Edit* pEdit = dynamic_cast<Edit*>( pChild );
766cdf0e10cSrcweir if( pEdit )
767cdf0e10cSrcweir aEvent.IsEnabled = !pEdit->IsReadOnly() && pEdit->GetSelection().Len();
768cdf0e10cSrcweir }
769cdf0e10cSrcweir if(aURL.Path == C2U("Copy"))
770cdf0e10cSrcweir {
771cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
772cdf0e10cSrcweir Edit* pEdit = dynamic_cast<Edit*>( pChild );
773cdf0e10cSrcweir if( pEdit )
774cdf0e10cSrcweir aEvent.IsEnabled = pEdit->GetSelection().Len() > 0;
775cdf0e10cSrcweir }
776cdf0e10cSrcweir else if(aURL.Path == C2U("Paste") )
777cdf0e10cSrcweir {
778cdf0e10cSrcweir aEvent.IsEnabled = sal_False;
779cdf0e10cSrcweir Window* pChild = lcl_GetFocusChild( VCLUnoHelper::GetWindow( xWindow ) );
780cdf0e10cSrcweir if(pChild)
781cdf0e10cSrcweir {
782cdf0e10cSrcweir uno::Reference< datatransfer::clipboard::XClipboard > xClip = pChild->GetClipboard();
783cdf0e10cSrcweir if(xClip.is())
784cdf0e10cSrcweir {
785cdf0e10cSrcweir uno::Reference< datatransfer::XTransferable > xDataObj;
786cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex();
787cdf0e10cSrcweir try
788cdf0e10cSrcweir {
789cdf0e10cSrcweir xDataObj = xClip->getContents();
790cdf0e10cSrcweir }
791cdf0e10cSrcweir catch( const uno::Exception& )
792cdf0e10cSrcweir {
793cdf0e10cSrcweir }
794cdf0e10cSrcweir Application::AcquireSolarMutex( nRef );
795cdf0e10cSrcweir
796cdf0e10cSrcweir if ( xDataObj.is() )
797cdf0e10cSrcweir {
798cdf0e10cSrcweir datatransfer::DataFlavor aFlavor;
799cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
800cdf0e10cSrcweir try
801cdf0e10cSrcweir {
802cdf0e10cSrcweir uno::Any aData = xDataObj->getTransferData( aFlavor );
803cdf0e10cSrcweir ::rtl::OUString aText;
804cdf0e10cSrcweir aData >>= aText;
805cdf0e10cSrcweir aEvent.IsEnabled = aText.getLength() > 0;
806cdf0e10cSrcweir }
807cdf0e10cSrcweir catch( const uno::Exception& )
808cdf0e10cSrcweir {
809cdf0e10cSrcweir }
810cdf0e10cSrcweir }
811cdf0e10cSrcweir }
812cdf0e10cSrcweir uno::Reference< datatransfer::XTransferable > xContents = xClip->getContents( );
813cdf0e10cSrcweir }
814cdf0e10cSrcweir }
815cdf0e10cSrcweir else if(aURL.Path == C2U("Bib/DeleteRecord"))
816cdf0e10cSrcweir {
817cdf0e10cSrcweir Reference< ::com::sun::star::sdbc::XResultSet > xCursor(pDatMan->getForm(), UNO_QUERY);
818cdf0e10cSrcweir Reference< XResultSetUpdate > xUpdateCursor(xCursor, UNO_QUERY);
819cdf0e10cSrcweir Reference< beans::XPropertySet > xSet(pDatMan->getForm(), UNO_QUERY);
820cdf0e10cSrcweir sal_Bool bIsNew = ::comphelper::getBOOL(xSet->getPropertyValue(C2U("IsNew")));
821cdf0e10cSrcweir if(!bIsNew)
822cdf0e10cSrcweir {
823cdf0e10cSrcweir sal_uInt32 nCount = 0;
824cdf0e10cSrcweir xSet->getPropertyValue(C2U("RowCount")) >>= nCount;
825cdf0e10cSrcweir aEvent.IsEnabled = nCount > 0;
826cdf0e10cSrcweir }
827cdf0e10cSrcweir }
828cdf0e10cSrcweir else if (aURL.Path == C2U("Bib/InsertRecord"))
829cdf0e10cSrcweir {
830cdf0e10cSrcweir Reference< beans::XPropertySet > xSet(pDatMan->getForm(), UNO_QUERY);
831cdf0e10cSrcweir aEvent.IsEnabled = canInsertRecords(xSet);
832cdf0e10cSrcweir }
833cdf0e10cSrcweir aListener->statusChanged( aEvent );
834cdf0e10cSrcweir }
835cdf0e10cSrcweir //-----------------------------------------------------------------------------
removeStatusListener(const uno::Reference<frame::XStatusListener> & aObject,const util::URL & aURL)836cdf0e10cSrcweir void BibFrameController_Impl::removeStatusListener(
837cdf0e10cSrcweir const uno::Reference< frame::XStatusListener > & aObject, const util::URL& aURL)
838cdf0e10cSrcweir throw (::com::sun::star::uno::RuntimeException)
839cdf0e10cSrcweir {
840cdf0e10cSrcweir // search listener array for given listener
841cdf0e10cSrcweir // for checking equality always "cast" to XInterface
842cdf0e10cSrcweir if ( !bDisposing )
843cdf0e10cSrcweir {
844cdf0e10cSrcweir sal_uInt16 nCount = aStatusListeners.Count();
845cdf0e10cSrcweir for ( sal_uInt16 n=0; n<nCount; n++ )
846cdf0e10cSrcweir {
847cdf0e10cSrcweir BibStatusDispatch *pObj = aStatusListeners[n];
848cdf0e10cSrcweir sal_Bool bFlag=pObj->xListener.is();
849cdf0e10cSrcweir if (!bFlag || (pObj->xListener == aObject &&
850cdf0e10cSrcweir ( !aURL.Complete.getLength() || pObj->aURL.Path == aURL.Path )))
851cdf0e10cSrcweir {
852cdf0e10cSrcweir aStatusListeners.DeleteAndDestroy( n );
853cdf0e10cSrcweir break;
854cdf0e10cSrcweir }
855cdf0e10cSrcweir }
856cdf0e10cSrcweir }
857cdf0e10cSrcweir }
858cdf0e10cSrcweir //-----------------------------------------------------------------------------
RemoveFilter()859cdf0e10cSrcweir void BibFrameController_Impl::RemoveFilter()
860cdf0e10cSrcweir {
861cdf0e10cSrcweir rtl::OUString aQuery;
862cdf0e10cSrcweir pDatMan->startQueryWith(aQuery);
863cdf0e10cSrcweir
864cdf0e10cSrcweir sal_uInt16 nCount = aStatusListeners.Count();
865cdf0e10cSrcweir
866cdf0e10cSrcweir sal_Bool bRemoveFilter=sal_False;
867cdf0e10cSrcweir sal_Bool bQueryText=sal_False;
868cdf0e10cSrcweir
869cdf0e10cSrcweir for ( sal_uInt16 n=0; n<nCount; n++ )
870cdf0e10cSrcweir {
871cdf0e10cSrcweir BibStatusDispatch *pObj = aStatusListeners[n];
872cdf0e10cSrcweir if ( pObj->aURL.Path == C2U("Bib/removeFilter") )
873cdf0e10cSrcweir {
874cdf0e10cSrcweir FeatureStateEvent aEvent;
875cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
876cdf0e10cSrcweir aEvent.IsEnabled = sal_False;
877cdf0e10cSrcweir aEvent.Requery = sal_False;
878cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
879cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
880cdf0e10cSrcweir bRemoveFilter=sal_True;
881cdf0e10cSrcweir }
882cdf0e10cSrcweir else if(pObj->aURL.Path == C2U("Bib/query"))
883cdf0e10cSrcweir {
884cdf0e10cSrcweir FeatureStateEvent aEvent;
885cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
886cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
887cdf0e10cSrcweir aEvent.Requery = sal_False;
888cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
889cdf0e10cSrcweir aEvent.State <<= aQuery;
890cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
891cdf0e10cSrcweir bQueryText=sal_True;
892cdf0e10cSrcweir }
893cdf0e10cSrcweir
894cdf0e10cSrcweir if(bRemoveFilter && bQueryText)
895cdf0e10cSrcweir break;
896cdf0e10cSrcweir
897cdf0e10cSrcweir }
898cdf0e10cSrcweir }
899cdf0e10cSrcweir //-----------------------------------------------------------------------------
ChangeDataSource(const uno::Sequence<beans::PropertyValue> & aArgs)900cdf0e10cSrcweir void BibFrameController_Impl::ChangeDataSource(const uno::Sequence< beans::PropertyValue >& aArgs)
901cdf0e10cSrcweir {
902cdf0e10cSrcweir const beans::PropertyValue* pPropertyValue = aArgs.getConstArray();
903cdf0e10cSrcweir uno::Any aValue=pPropertyValue[0].Value;
904cdf0e10cSrcweir rtl::OUString aDBTableName;
905cdf0e10cSrcweir aValue >>= aDBTableName;
906cdf0e10cSrcweir
907cdf0e10cSrcweir
908cdf0e10cSrcweir if(aArgs.getLength() > 1)
909cdf0e10cSrcweir {
910cdf0e10cSrcweir uno::Any aDB = pPropertyValue[1].Value;
911cdf0e10cSrcweir rtl::OUString aURL;
912cdf0e10cSrcweir aDB >>= aURL;
913cdf0e10cSrcweir pDatMan->setActiveDataSource(aURL);
914cdf0e10cSrcweir aDBTableName = pDatMan->getActiveDataTable();
915cdf0e10cSrcweir }
916cdf0e10cSrcweir else
917cdf0e10cSrcweir {
918cdf0e10cSrcweir m_xDatMan->unload();
919cdf0e10cSrcweir pDatMan->setActiveDataTable(aDBTableName);
920cdf0e10cSrcweir pDatMan->updateGridModel();
921cdf0e10cSrcweir m_xDatMan->load();
922cdf0e10cSrcweir }
923cdf0e10cSrcweir
924cdf0e10cSrcweir
925cdf0e10cSrcweir sal_uInt16 nCount = aStatusListeners.Count();
926cdf0e10cSrcweir
927cdf0e10cSrcweir sal_Bool bMenuFilter=sal_False;
928cdf0e10cSrcweir sal_Bool bQueryText=sal_False;
929cdf0e10cSrcweir for ( sal_uInt16 n=0; n<nCount; n++ )
930cdf0e10cSrcweir {
931cdf0e10cSrcweir BibStatusDispatch *pObj = aStatusListeners[n];
932cdf0e10cSrcweir if(COMPARE_EQUAL == pObj->aURL.Path.compareToAscii("Bib/MenuFilter"))
933cdf0e10cSrcweir {
934cdf0e10cSrcweir FeatureStateEvent aEvent;
935cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
936cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
937cdf0e10cSrcweir aEvent.Requery = sal_False;
938cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
939cdf0e10cSrcweir aEvent.FeatureDescriptor=pDatMan->getQueryField();
940cdf0e10cSrcweir
941cdf0e10cSrcweir uno::Sequence<rtl::OUString> aStringSeq=pDatMan->getQueryFields();
942cdf0e10cSrcweir aEvent.State = makeAny( aStringSeq );
943cdf0e10cSrcweir
944cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
945cdf0e10cSrcweir bMenuFilter=sal_True;
946cdf0e10cSrcweir }
947cdf0e10cSrcweir else if(COMPARE_EQUAL == pObj->aURL.Path.compareToAscii("Bib/query"))
948cdf0e10cSrcweir {
949cdf0e10cSrcweir FeatureStateEvent aEvent;
950cdf0e10cSrcweir aEvent.FeatureURL = pObj->aURL;
951cdf0e10cSrcweir aEvent.IsEnabled = sal_True;
952cdf0e10cSrcweir aEvent.Requery = sal_False;
953cdf0e10cSrcweir aEvent.Source = (XDispatch *) this;
954cdf0e10cSrcweir BibConfig* pConfig = BibModul::GetConfig();
955cdf0e10cSrcweir aEvent.State <<= pConfig->getQueryText();
956cdf0e10cSrcweir pObj->xListener->statusChanged( aEvent );
957cdf0e10cSrcweir bQueryText=sal_True;
958cdf0e10cSrcweir }
959cdf0e10cSrcweir
960cdf0e10cSrcweir if (bMenuFilter && bQueryText)
961cdf0e10cSrcweir break;
962cdf0e10cSrcweir
963cdf0e10cSrcweir }
964cdf0e10cSrcweir }
965cdf0e10cSrcweir
activate()966cdf0e10cSrcweir void BibFrameController_Impl::activate()
967cdf0e10cSrcweir {
968cdf0e10cSrcweir }
deactivate()969cdf0e10cSrcweir void BibFrameController_Impl::deactivate()
970cdf0e10cSrcweir {
971cdf0e10cSrcweir }
972cdf0e10cSrcweir
973cdf0e10cSrcweir
974