xref: /aoo4110/main/dbaccess/source/ui/dlg/adtabdlg.cxx (revision b1cdbd2c)
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 "adtabdlg.hxx"
28*b1cdbd2cSJim Jagielski #include "adtabdlg.hrc"
29*b1cdbd2cSJim Jagielski #include "sqlmessage.hxx"
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
32*b1cdbd2cSJim Jagielski #include <svtools/localresaccess.hxx>
33*b1cdbd2cSJim Jagielski #include "dbaccess_helpid.hrc"
34*b1cdbd2cSJim Jagielski #include "dbu_resource.hrc"
35*b1cdbd2cSJim Jagielski #include "dbu_dlg.hrc"
36*b1cdbd2cSJim Jagielski #include <sfx2/sfxsids.hrc>
37*b1cdbd2cSJim Jagielski #include "QueryTableView.hxx"
38*b1cdbd2cSJim Jagielski #include "QueryDesignView.hxx"
39*b1cdbd2cSJim Jagielski #include "querycontroller.hxx"
40*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
41*b1cdbd2cSJim Jagielski #include "browserids.hxx"
42*b1cdbd2cSJim Jagielski #include <com/sun/star/sdb/XQueriesSupplier.hpp>
43*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XViewsSupplier.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
46*b1cdbd2cSJim Jagielski #include "UITools.hxx"
47*b1cdbd2cSJim Jagielski #include "imageprovider.hxx"
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <comphelper/containermultiplexer.hxx>
50*b1cdbd2cSJim Jagielski #include "cppuhelper/basemutex.hxx"
51*b1cdbd2cSJim Jagielski #include <algorithm>
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski // slot ids
54*b1cdbd2cSJim Jagielski using namespace dbaui;
55*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
56*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx;
61*b1cdbd2cSJim Jagielski using namespace dbtools;
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski //==============================================================================
64*b1cdbd2cSJim Jagielski //= TableObjectListFacade
65*b1cdbd2cSJim Jagielski //==============================================================================
~TableObjectListFacade()66*b1cdbd2cSJim Jagielski TableObjectListFacade::~TableObjectListFacade()
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski //==============================================================================
71*b1cdbd2cSJim Jagielski //= TableListFacade
72*b1cdbd2cSJim Jagielski //==============================================================================
73*b1cdbd2cSJim Jagielski class TableListFacade : public ::cppu::BaseMutex
74*b1cdbd2cSJim Jagielski                     ,   public TableObjectListFacade
75*b1cdbd2cSJim Jagielski                     ,   public ::comphelper::OContainerListener
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski     OTableTreeListBox&          m_rTableList;
78*b1cdbd2cSJim Jagielski     Reference< XConnection >    m_xConnection;
79*b1cdbd2cSJim Jagielski     ::rtl::Reference< comphelper::OContainerListenerAdapter>
80*b1cdbd2cSJim Jagielski                                 m_pContainerListener;
81*b1cdbd2cSJim Jagielski     bool                        m_bAllowViews;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski public:
TableListFacade(OTableTreeListBox & _rTableList,const Reference<XConnection> & _rxConnection)84*b1cdbd2cSJim Jagielski     TableListFacade( OTableTreeListBox& _rTableList, const Reference< XConnection >& _rxConnection )
85*b1cdbd2cSJim Jagielski         : ::comphelper::OContainerListener(m_aMutex)
86*b1cdbd2cSJim Jagielski         ,m_rTableList( _rTableList )
87*b1cdbd2cSJim Jagielski         ,m_xConnection( _rxConnection )
88*b1cdbd2cSJim Jagielski         ,m_bAllowViews(true)
89*b1cdbd2cSJim Jagielski     {
90*b1cdbd2cSJim Jagielski     }
91*b1cdbd2cSJim Jagielski     virtual ~TableListFacade();
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski private:
95*b1cdbd2cSJim Jagielski     virtual void    updateTableObjectList( bool _bAllowViews );
96*b1cdbd2cSJim Jagielski     virtual String  getSelectedName( String& _out_rAliasName ) const;
97*b1cdbd2cSJim Jagielski     virtual bool    isLeafSelected() const;
98*b1cdbd2cSJim Jagielski     // OContainerListener
99*b1cdbd2cSJim Jagielski     virtual void _elementInserted( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
100*b1cdbd2cSJim Jagielski 	virtual void _elementRemoved( const  ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
101*b1cdbd2cSJim Jagielski 	virtual void _elementReplaced( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
102*b1cdbd2cSJim Jagielski };
103*b1cdbd2cSJim Jagielski 
~TableListFacade()104*b1cdbd2cSJim Jagielski TableListFacade::~TableListFacade()
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski     if ( m_pContainerListener.is() )
107*b1cdbd2cSJim Jagielski         m_pContainerListener->dispose();
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getSelectedName(String & _out_rAliasName) const110*b1cdbd2cSJim Jagielski String TableListFacade::getSelectedName( String& _out_rAliasName ) const
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = m_rTableList.FirstSelected();
113*b1cdbd2cSJim Jagielski     if ( !pEntry )
114*b1cdbd2cSJim Jagielski         return String();
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski     ::rtl::OUString aCatalog, aSchema, aTableName;
117*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pSchema = m_rTableList.GetParent(pEntry);
118*b1cdbd2cSJim Jagielski 	if(pSchema && pSchema != m_rTableList.getAllObjectsEntry())
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski 		SvLBoxEntry* pCatalog = m_rTableList.GetParent(pSchema);
121*b1cdbd2cSJim Jagielski 		if(pCatalog && pCatalog != m_rTableList.getAllObjectsEntry())
122*b1cdbd2cSJim Jagielski 			aCatalog = m_rTableList.GetEntryText(pCatalog);
123*b1cdbd2cSJim Jagielski 		aSchema = m_rTableList.GetEntryText(pSchema);
124*b1cdbd2cSJim Jagielski 	}
125*b1cdbd2cSJim Jagielski 	aTableName = m_rTableList.GetEntryText(pEntry);
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski 	::rtl::OUString aComposedName;
128*b1cdbd2cSJim Jagielski 	try
129*b1cdbd2cSJim Jagielski 	{
130*b1cdbd2cSJim Jagielski         Reference< XDatabaseMetaData > xMeta( m_xConnection->getMetaData(), UNO_QUERY_THROW );
131*b1cdbd2cSJim Jagielski         if (  !aCatalog.getLength()
132*b1cdbd2cSJim Jagielski 			&& aSchema.getLength()
133*b1cdbd2cSJim Jagielski 			&& xMeta->supportsCatalogsInDataManipulation()
134*b1cdbd2cSJim Jagielski 			&& !xMeta->supportsSchemasInDataManipulation() )
135*b1cdbd2cSJim Jagielski 		{
136*b1cdbd2cSJim Jagielski 			aCatalog = aSchema;
137*b1cdbd2cSJim Jagielski 			aSchema = ::rtl::OUString();
138*b1cdbd2cSJim Jagielski 		}
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski 		aComposedName = ::dbtools::composeTableName(
141*b1cdbd2cSJim Jagielski             xMeta, aCatalog, aSchema, aTableName, sal_False, ::dbtools::eInDataManipulation );
142*b1cdbd2cSJim Jagielski 	}
143*b1cdbd2cSJim Jagielski 	catch ( const Exception& )
144*b1cdbd2cSJim Jagielski 	{
145*b1cdbd2cSJim Jagielski         DBG_UNHANDLED_EXCEPTION();
146*b1cdbd2cSJim Jagielski 	}
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski     _out_rAliasName = aTableName;
149*b1cdbd2cSJim Jagielski     return aComposedName;
150*b1cdbd2cSJim Jagielski }
151*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementInserted(const container::ContainerEvent &)152*b1cdbd2cSJim Jagielski void TableListFacade::_elementInserted( const container::ContainerEvent& /*_rEvent*/ )  throw(::com::sun::star::uno::RuntimeException)
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski     updateTableObjectList(m_bAllowViews);
155*b1cdbd2cSJim Jagielski }
156*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementRemoved(const container::ContainerEvent &)157*b1cdbd2cSJim Jagielski void TableListFacade::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski     updateTableObjectList(m_bAllowViews);
160*b1cdbd2cSJim Jagielski }
161*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementReplaced(const container::ContainerEvent &)162*b1cdbd2cSJim Jagielski void TableListFacade::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
updateTableObjectList(bool _bAllowViews)166*b1cdbd2cSJim Jagielski void TableListFacade::updateTableObjectList( bool _bAllowViews )
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski     m_bAllowViews = _bAllowViews;
169*b1cdbd2cSJim Jagielski     m_rTableList.Clear();
170*b1cdbd2cSJim Jagielski     try
171*b1cdbd2cSJim Jagielski     {
172*b1cdbd2cSJim Jagielski 	    Reference< XTablesSupplier > xTableSupp( m_xConnection, UNO_QUERY_THROW );
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 	    Reference< XViewsSupplier > xViewSupp;
175*b1cdbd2cSJim Jagielski 	    Reference< XNameAccess > xTables, xViews;
176*b1cdbd2cSJim Jagielski 	    Sequence< ::rtl::OUString > sTables, sViews;
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	    xTables = xTableSupp->getTables();
179*b1cdbd2cSJim Jagielski 	    if ( xTables.is() )
180*b1cdbd2cSJim Jagielski         {
181*b1cdbd2cSJim Jagielski             if ( !m_pContainerListener.is() )
182*b1cdbd2cSJim Jagielski             {
183*b1cdbd2cSJim Jagielski                 Reference< XContainer> xContainer(xTables,uno::UNO_QUERY);
184*b1cdbd2cSJim Jagielski                 if ( xContainer.is() )
185*b1cdbd2cSJim Jagielski                     m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer);
186*b1cdbd2cSJim Jagielski             }
187*b1cdbd2cSJim Jagielski 		    sTables = xTables->getElementNames();
188*b1cdbd2cSJim Jagielski         } // if ( xTables.is() )
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 	    xViewSupp.set( xTableSupp, UNO_QUERY );
191*b1cdbd2cSJim Jagielski 	    if ( xViewSupp.is() )
192*b1cdbd2cSJim Jagielski 	    {
193*b1cdbd2cSJim Jagielski 		    xViews = xViewSupp->getViews();
194*b1cdbd2cSJim Jagielski 		    if ( xViews.is() )
195*b1cdbd2cSJim Jagielski 			    sViews = xViews->getElementNames();
196*b1cdbd2cSJim Jagielski 	    }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski         // if no views are allowed remove the views also out the table name filter
199*b1cdbd2cSJim Jagielski 	    if ( !_bAllowViews )
200*b1cdbd2cSJim Jagielski 	    {
201*b1cdbd2cSJim Jagielski 		    const ::rtl::OUString* pTableBegin	= sTables.getConstArray();
202*b1cdbd2cSJim Jagielski 		    const ::rtl::OUString* pTableEnd	= pTableBegin + sTables.getLength();
203*b1cdbd2cSJim Jagielski 		    ::std::vector< ::rtl::OUString > aTables(pTableBegin,pTableEnd);
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 		    const ::rtl::OUString* pViewBegin = sViews.getConstArray();
206*b1cdbd2cSJim Jagielski 		    const ::rtl::OUString* pViewEnd	  = pViewBegin + sViews.getLength();
207*b1cdbd2cSJim Jagielski 		    ::comphelper::TStringMixEqualFunctor aEqualFunctor;
208*b1cdbd2cSJim Jagielski 		    for(;pViewBegin != pViewEnd;++pViewBegin)
209*b1cdbd2cSJim Jagielski 			    aTables.erase(::std::remove_if(aTables.begin(),aTables.end(),::std::bind2nd(aEqualFunctor,*pViewBegin)),aTables.end());
210*b1cdbd2cSJim Jagielski 		    ::rtl::OUString* pTables = aTables.empty() ? 0 : &aTables[0];
211*b1cdbd2cSJim Jagielski 		    sTables = Sequence< ::rtl::OUString>(pTables, aTables.size());
212*b1cdbd2cSJim Jagielski 		    sViews = Sequence< ::rtl::OUString>();
213*b1cdbd2cSJim Jagielski 	    }
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski 	    m_rTableList.UpdateTableList( m_xConnection, sTables, sViews );
216*b1cdbd2cSJim Jagielski 	    SvLBoxEntry* pEntry = m_rTableList.First();
217*b1cdbd2cSJim Jagielski 	    while( pEntry && m_rTableList.GetModel()->HasChilds( pEntry ) )
218*b1cdbd2cSJim Jagielski 	    {
219*b1cdbd2cSJim Jagielski 		    m_rTableList.Expand( pEntry );
220*b1cdbd2cSJim Jagielski 		    pEntry = m_rTableList.Next( pEntry );
221*b1cdbd2cSJim Jagielski 	    }
222*b1cdbd2cSJim Jagielski 	    if ( pEntry )
223*b1cdbd2cSJim Jagielski 		    m_rTableList.Select(pEntry);
224*b1cdbd2cSJim Jagielski     }
225*b1cdbd2cSJim Jagielski     catch( const Exception& )
226*b1cdbd2cSJim Jagielski     {
227*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
228*b1cdbd2cSJim Jagielski     }
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
isLeafSelected() const232*b1cdbd2cSJim Jagielski bool TableListFacade::isLeafSelected() const
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = m_rTableList.FirstSelected();
235*b1cdbd2cSJim Jagielski 	return pEntry && !m_rTableList.GetModel()->HasChilds( pEntry );
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski //==============================================================================
239*b1cdbd2cSJim Jagielski //= QueryListFacade
240*b1cdbd2cSJim Jagielski //==============================================================================
241*b1cdbd2cSJim Jagielski class QueryListFacade : public ::cppu::BaseMutex
242*b1cdbd2cSJim Jagielski                     ,   public TableObjectListFacade
243*b1cdbd2cSJim Jagielski                     ,   public ::comphelper::OContainerListener
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     SvTreeListBox&              m_rQueryList;
246*b1cdbd2cSJim Jagielski     Reference< XConnection >    m_xConnection;
247*b1cdbd2cSJim Jagielski     ::rtl::Reference< comphelper::OContainerListenerAdapter>
248*b1cdbd2cSJim Jagielski                                 m_pContainerListener;
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski public:
QueryListFacade(SvTreeListBox & _rQueryList,const Reference<XConnection> & _rxConnection)251*b1cdbd2cSJim Jagielski     QueryListFacade( SvTreeListBox& _rQueryList, const Reference< XConnection >& _rxConnection )
252*b1cdbd2cSJim Jagielski         : ::comphelper::OContainerListener(m_aMutex)
253*b1cdbd2cSJim Jagielski         ,m_rQueryList( _rQueryList )
254*b1cdbd2cSJim Jagielski         ,m_xConnection( _rxConnection )
255*b1cdbd2cSJim Jagielski     {
256*b1cdbd2cSJim Jagielski     }
257*b1cdbd2cSJim Jagielski     virtual ~QueryListFacade();
258*b1cdbd2cSJim Jagielski private:
259*b1cdbd2cSJim Jagielski     virtual void    updateTableObjectList( bool _bAllowViews );
260*b1cdbd2cSJim Jagielski     virtual String  getSelectedName( String& _out_rAliasName ) const;
261*b1cdbd2cSJim Jagielski     virtual bool    isLeafSelected() const;
262*b1cdbd2cSJim Jagielski     // OContainerListener
263*b1cdbd2cSJim Jagielski     virtual void _elementInserted( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
264*b1cdbd2cSJim Jagielski 	virtual void _elementRemoved( const  ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
265*b1cdbd2cSJim Jagielski 	virtual void _elementReplaced( const ::com::sun::star::container::ContainerEvent& _rEvent ) throw(::com::sun::star::uno::RuntimeException);
266*b1cdbd2cSJim Jagielski };
~QueryListFacade()267*b1cdbd2cSJim Jagielski QueryListFacade::~QueryListFacade()
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski     if ( m_pContainerListener.is() )
270*b1cdbd2cSJim Jagielski         m_pContainerListener->dispose();
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementInserted(const container::ContainerEvent & _rEvent)273*b1cdbd2cSJim Jagielski void QueryListFacade::_elementInserted( const container::ContainerEvent& _rEvent )  throw(::com::sun::star::uno::RuntimeException)
274*b1cdbd2cSJim Jagielski {
275*b1cdbd2cSJim Jagielski     ::rtl::OUString sName;
276*b1cdbd2cSJim Jagielski     if ( _rEvent.Accessor >>= sName )
277*b1cdbd2cSJim Jagielski         m_rQueryList.InsertEntry( sName );
278*b1cdbd2cSJim Jagielski }
279*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementRemoved(const container::ContainerEvent &)280*b1cdbd2cSJim Jagielski void QueryListFacade::_elementRemoved( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski     updateTableObjectList(true);
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
_elementReplaced(const container::ContainerEvent &)285*b1cdbd2cSJim Jagielski void QueryListFacade::_elementReplaced( const container::ContainerEvent& /*_rEvent*/ ) throw(::com::sun::star::uno::RuntimeException)
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski }
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
updateTableObjectList(bool)290*b1cdbd2cSJim Jagielski void QueryListFacade::updateTableObjectList( bool /*_bAllowViews*/ )
291*b1cdbd2cSJim Jagielski {
292*b1cdbd2cSJim Jagielski     m_rQueryList.Clear();
293*b1cdbd2cSJim Jagielski     try
294*b1cdbd2cSJim Jagielski     {
295*b1cdbd2cSJim Jagielski         ImageProvider aImageProvider( m_xConnection );
296*b1cdbd2cSJim Jagielski         Image aQueryImage( aImageProvider.getDefaultImage( DatabaseObject::QUERY, false ) );
297*b1cdbd2cSJim Jagielski         Image aQueryImageHC( aImageProvider.getDefaultImage( DatabaseObject::QUERY, true ) );
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski         m_rQueryList.SetDefaultExpandedEntryBmp( aQueryImage, BMP_COLOR_NORMAL );
300*b1cdbd2cSJim Jagielski         m_rQueryList.SetDefaultCollapsedEntryBmp( aQueryImage, BMP_COLOR_NORMAL );
301*b1cdbd2cSJim Jagielski         m_rQueryList.SetDefaultExpandedEntryBmp( aQueryImageHC, BMP_COLOR_HIGHCONTRAST );
302*b1cdbd2cSJim Jagielski         m_rQueryList.SetDefaultCollapsedEntryBmp( aQueryImageHC, BMP_COLOR_HIGHCONTRAST );
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski         Reference< XQueriesSupplier > xSuppQueries( m_xConnection, UNO_QUERY_THROW );
305*b1cdbd2cSJim Jagielski         Reference< XNameAccess > xQueries( xSuppQueries->getQueries(), UNO_QUERY_THROW );
306*b1cdbd2cSJim Jagielski         if ( !m_pContainerListener.is() )
307*b1cdbd2cSJim Jagielski         {
308*b1cdbd2cSJim Jagielski             Reference< XContainer> xContainer(xQueries,UNO_QUERY_THROW);
309*b1cdbd2cSJim Jagielski             m_pContainerListener = new ::comphelper::OContainerListenerAdapter(this,xContainer);
310*b1cdbd2cSJim Jagielski         }
311*b1cdbd2cSJim Jagielski         Sequence< ::rtl::OUString > aQueryNames = xQueries->getElementNames();
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski         const ::rtl::OUString* pQuery = aQueryNames.getConstArray();
314*b1cdbd2cSJim Jagielski         const ::rtl::OUString* pQueryEnd = aQueryNames.getConstArray() + aQueryNames.getLength();
315*b1cdbd2cSJim Jagielski         while ( pQuery != pQueryEnd )
316*b1cdbd2cSJim Jagielski             m_rQueryList.InsertEntry( *pQuery++ );
317*b1cdbd2cSJim Jagielski     }
318*b1cdbd2cSJim Jagielski     catch( const Exception& )
319*b1cdbd2cSJim Jagielski     {
320*b1cdbd2cSJim Jagielski     	DBG_UNHANDLED_EXCEPTION();
321*b1cdbd2cSJim Jagielski     }
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getSelectedName(String & _out_rAliasName) const325*b1cdbd2cSJim Jagielski String QueryListFacade::getSelectedName( String& _out_rAliasName ) const
326*b1cdbd2cSJim Jagielski {
327*b1cdbd2cSJim Jagielski     String sSelected;
328*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = m_rQueryList.FirstSelected();
329*b1cdbd2cSJim Jagielski     if ( pEntry )
330*b1cdbd2cSJim Jagielski         sSelected = _out_rAliasName = m_rQueryList.GetEntryText( pEntry );
331*b1cdbd2cSJim Jagielski     return sSelected;
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
isLeafSelected() const335*b1cdbd2cSJim Jagielski bool QueryListFacade::isLeafSelected() const
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski 	SvLBoxEntry* pEntry = m_rQueryList.FirstSelected();
338*b1cdbd2cSJim Jagielski 	return pEntry && !m_rQueryList.GetModel()->HasChilds( pEntry );
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski //==============================================================================
342*b1cdbd2cSJim Jagielski //= OAddTableDlg
343*b1cdbd2cSJim Jagielski //==============================================================================
344*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
OAddTableDlg(Window * pParent,IAddTableDialogContext & _rContext)345*b1cdbd2cSJim Jagielski OAddTableDlg::OAddTableDlg( Window* pParent, IAddTableDialogContext& _rContext )
346*b1cdbd2cSJim Jagielski 			 :ModelessDialog( pParent, ModuleRes(DLG_JOIN_TABADD) )
347*b1cdbd2cSJim Jagielski              ,m_aCaseTables( this, ModuleRes( RB_CASE_TABLES ) )
348*b1cdbd2cSJim Jagielski              ,m_aCaseQueries( this, ModuleRes( RB_CASE_QUERIES ) )
349*b1cdbd2cSJim Jagielski 			 ,m_aTableList( this, NULL, ModuleRes( LB_TABLE_OR_QUERY ), sal_False )
350*b1cdbd2cSJim Jagielski 			 ,m_aQueryList( this, ModuleRes( LB_TABLE_OR_QUERY ) )
351*b1cdbd2cSJim Jagielski 			 ,aAddButton( this, ModuleRes( PB_ADDTABLE ) )
352*b1cdbd2cSJim Jagielski 			 ,aCloseButton( this, ModuleRes( PB_CLOSE ) )
353*b1cdbd2cSJim Jagielski 			 ,aHelpButton( this, ModuleRes( PB_HELP ) )
354*b1cdbd2cSJim Jagielski 			 ,m_rContext( _rContext )
355*b1cdbd2cSJim Jagielski {
356*b1cdbd2cSJim Jagielski 	// der Close-Button hat schon einen Standard-Help-Text, den ich aber hier nicht haben moechte, also den Text ruecksetzen
357*b1cdbd2cSJim Jagielski 	// und eine neue ID verteilen
358*b1cdbd2cSJim Jagielski 	aCloseButton.SetHelpText(String());
359*b1cdbd2cSJim Jagielski 	aCloseButton.SetHelpId(HID_JOINSH_ADDTAB_CLOSE);
360*b1cdbd2cSJim Jagielski 
361*b1cdbd2cSJim Jagielski 	m_aTableList.SetHelpId( HID_JOINSH_ADDTAB_TABLELIST );
362*b1cdbd2cSJim Jagielski     m_aQueryList.SetHelpId( HID_JOINSH_ADDTAB_QUERYLIST );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
365*b1cdbd2cSJim Jagielski     m_aCaseTables.SetClickHdl( LINK( this, OAddTableDlg, OnTypeSelected ) );
366*b1cdbd2cSJim Jagielski     m_aCaseQueries.SetClickHdl( LINK( this, OAddTableDlg, OnTypeSelected ) );
367*b1cdbd2cSJim Jagielski 	aAddButton.SetClickHdl( LINK( this, OAddTableDlg, AddClickHdl ) );
368*b1cdbd2cSJim Jagielski 	aCloseButton.SetClickHdl( LINK( this, OAddTableDlg, CloseClickHdl ) );
369*b1cdbd2cSJim Jagielski 	m_aTableList.SetDoubleClickHdl( LINK( this, OAddTableDlg, TableListDoubleClickHdl ) );
370*b1cdbd2cSJim Jagielski 	m_aTableList.SetSelectHdl( LINK( this, OAddTableDlg, TableListSelectHdl ) );
371*b1cdbd2cSJim Jagielski 	m_aQueryList.SetDoubleClickHdl( LINK( this, OAddTableDlg, TableListDoubleClickHdl ) );
372*b1cdbd2cSJim Jagielski 	m_aQueryList.SetSelectHdl( LINK( this, OAddTableDlg, TableListSelectHdl ) );
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
375*b1cdbd2cSJim Jagielski 	m_aTableList.EnableInplaceEditing( sal_False );
376*b1cdbd2cSJim Jagielski 	m_aTableList.SetStyle(m_aTableList.GetStyle() | WB_BORDER | WB_HASLINES |WB_HASBUTTONS | WB_HASBUTTONSATROOT | WB_HASLINESATROOT | WB_SORT | WB_HSCROLL );
377*b1cdbd2cSJim Jagielski 	m_aTableList.EnableCheckButton( NULL ); // do not show any buttons
378*b1cdbd2cSJim Jagielski 	m_aTableList.SetSelectionMode( SINGLE_SELECTION );
379*b1cdbd2cSJim Jagielski 	m_aTableList.notifyHiContrastChanged();
380*b1cdbd2cSJim Jagielski     m_aTableList.suppressEmptyFolders();
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
383*b1cdbd2cSJim Jagielski     m_aQueryList.EnableInplaceEditing( sal_False );
384*b1cdbd2cSJim Jagielski 	m_aQueryList.SetSelectionMode( SINGLE_SELECTION );
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
387*b1cdbd2cSJim Jagielski     if ( !m_rContext.allowQueries() )
388*b1cdbd2cSJim Jagielski     {
389*b1cdbd2cSJim Jagielski         m_aCaseTables.Hide();
390*b1cdbd2cSJim Jagielski         m_aCaseQueries.Hide();
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski         long nPixelDiff = m_aTableList.GetPosPixel().Y() - m_aCaseTables.GetPosPixel().Y();
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski         Point aListPos( m_aTableList.GetPosPixel() );
395*b1cdbd2cSJim Jagielski         aListPos.Y() -= nPixelDiff;
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski         Size aListSize( m_aTableList.GetSizePixel() );
398*b1cdbd2cSJim Jagielski         aListSize.Height() += nPixelDiff;
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski         m_aTableList.SetPosSizePixel( aListPos, aListSize );
401*b1cdbd2cSJim Jagielski     }
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski     FreeResource();
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski     SetText( getDialogTitleForContext( m_rContext ) );
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OAddTableDlg()409*b1cdbd2cSJim Jagielski OAddTableDlg::~OAddTableDlg()
410*b1cdbd2cSJim Jagielski {
411*b1cdbd2cSJim Jagielski     m_rContext.onWindowClosing( this );
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski 
414*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
impl_switchTo(ObjectList _eList)415*b1cdbd2cSJim Jagielski void OAddTableDlg::impl_switchTo( ObjectList _eList )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski     switch ( _eList )
418*b1cdbd2cSJim Jagielski     {
419*b1cdbd2cSJim Jagielski     case Tables:
420*b1cdbd2cSJim Jagielski         m_aTableList.Show( sal_True );  m_aCaseTables.Check( sal_True );
421*b1cdbd2cSJim Jagielski         m_aQueryList.Show( sal_False ); m_aCaseQueries.Check( sal_False );
422*b1cdbd2cSJim Jagielski         m_pCurrentList.reset( new TableListFacade( m_aTableList, m_rContext.getConnection() ) );
423*b1cdbd2cSJim Jagielski         m_aTableList.GrabFocus();
424*b1cdbd2cSJim Jagielski         break;
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski     case Queries:
427*b1cdbd2cSJim Jagielski         m_aTableList.Show( sal_False ); m_aCaseTables.Check( sal_False );
428*b1cdbd2cSJim Jagielski         m_aQueryList.Show( sal_True );  m_aCaseQueries.Check( sal_True );
429*b1cdbd2cSJim Jagielski         m_pCurrentList.reset( new QueryListFacade( m_aQueryList, m_rContext.getConnection() ) );
430*b1cdbd2cSJim Jagielski         m_aQueryList.GrabFocus();
431*b1cdbd2cSJim Jagielski         break;
432*b1cdbd2cSJim Jagielski     }
433*b1cdbd2cSJim Jagielski     m_pCurrentList->updateTableObjectList( m_rContext.allowViews() );
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Update()437*b1cdbd2cSJim Jagielski void OAddTableDlg::Update()
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski     if ( !m_pCurrentList.get() )
440*b1cdbd2cSJim Jagielski         impl_switchTo( Tables );
441*b1cdbd2cSJim Jagielski     else
442*b1cdbd2cSJim Jagielski         m_pCurrentList->updateTableObjectList( m_rContext.allowViews() );
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
impl_addTable()446*b1cdbd2cSJim Jagielski void OAddTableDlg::impl_addTable()
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski     if ( m_pCurrentList->isLeafSelected() )
449*b1cdbd2cSJim Jagielski     {
450*b1cdbd2cSJim Jagielski         String sSelectedName, sAliasName;
451*b1cdbd2cSJim Jagielski         sSelectedName = m_pCurrentList->getSelectedName( sAliasName );
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski         m_rContext.addTableWindow( sSelectedName, sAliasName );
454*b1cdbd2cSJim Jagielski     }
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
458*b1cdbd2cSJim Jagielski IMPL_LINK( OAddTableDlg, AddClickHdl, Button*, /*pButton*/ )
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski 	TableListDoubleClickHdl(NULL);
461*b1cdbd2cSJim Jagielski 	return 0;
462*b1cdbd2cSJim Jagielski }
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
465*b1cdbd2cSJim Jagielski IMPL_LINK( OAddTableDlg, TableListDoubleClickHdl, void*, /*EMPTY_ARG*/ )
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski 	if ( impl_isAddAllowed() )
468*b1cdbd2cSJim Jagielski     {
469*b1cdbd2cSJim Jagielski 		impl_addTable();
470*b1cdbd2cSJim Jagielski 	    if ( !impl_isAddAllowed() )
471*b1cdbd2cSJim Jagielski 		    Close();
472*b1cdbd2cSJim Jagielski         return 1L;  // handled
473*b1cdbd2cSJim Jagielski     }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 	return 0L;  // not handled
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
479*b1cdbd2cSJim Jagielski IMPL_LINK( OAddTableDlg, TableListSelectHdl, void*, /*EMPTY_ARG*/ )
480*b1cdbd2cSJim Jagielski {
481*b1cdbd2cSJim Jagielski 	aAddButton.Enable( m_pCurrentList->isLeafSelected() );
482*b1cdbd2cSJim Jagielski 	return 0;
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
486*b1cdbd2cSJim Jagielski IMPL_LINK( OAddTableDlg, CloseClickHdl, Button*, /*pButton*/ )
487*b1cdbd2cSJim Jagielski {
488*b1cdbd2cSJim Jagielski 	return Close();
489*b1cdbd2cSJim Jagielski }
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
492*b1cdbd2cSJim Jagielski IMPL_LINK( OAddTableDlg, OnTypeSelected, void*, /*EMPTY_ARG*/ )
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski     if ( m_aCaseTables.IsChecked() )
495*b1cdbd2cSJim Jagielski         impl_switchTo( Tables );
496*b1cdbd2cSJim Jagielski     else
497*b1cdbd2cSJim Jagielski         impl_switchTo( Queries );
498*b1cdbd2cSJim Jagielski     return 0;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Close()502*b1cdbd2cSJim Jagielski sal_Bool OAddTableDlg::Close()
503*b1cdbd2cSJim Jagielski {
504*b1cdbd2cSJim Jagielski     m_rContext.onWindowClosing( this );
505*b1cdbd2cSJim Jagielski 	return ModelessDialog::Close();
506*b1cdbd2cSJim Jagielski }
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
impl_isAddAllowed()509*b1cdbd2cSJim Jagielski bool OAddTableDlg::impl_isAddAllowed()
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski 	return	m_rContext.allowAddition();
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
getDialogTitleForContext(IAddTableDialogContext & _rContext)515*b1cdbd2cSJim Jagielski String OAddTableDlg::getDialogTitleForContext( IAddTableDialogContext& _rContext )
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski     String sTitle;
518*b1cdbd2cSJim Jagielski 
519*b1cdbd2cSJim Jagielski     ::svt::OLocalResourceAccess aLocalRes( ModuleRes( DLG_JOIN_TABADD ), RSC_MODELESSDIALOG );
520*b1cdbd2cSJim Jagielski     if ( _rContext.allowQueries() )
521*b1cdbd2cSJim Jagielski         sTitle = String( ModuleRes( STR_ADD_TABLE_OR_QUERY ) );
522*b1cdbd2cSJim Jagielski     else
523*b1cdbd2cSJim Jagielski         sTitle = String( ModuleRes( STR_ADD_TABLES ) );
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski     return sTitle;
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
529*b1cdbd2cSJim Jagielski 
530