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