Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "queryorder.hrc"
21 : #include "queryorder.hxx"
22 : #include "dbustrings.hrc"
23 : #include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
24 : #include <com/sun/star/sdbc/ColumnSearch.hpp>
25 : #include <com/sun/star/container/XNameAccess.hpp>
26 : #include <tools/debug.hxx>
27 : #include "moduledbu.hxx"
28 : #include <connectivity/sqliterator.hxx>
29 : #include <connectivity/dbtools.hxx>
30 : #include <comphelper/extract.hxx>
31 : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
32 : #include <tools/diagnose_ex.h>
33 : #include <algorithm>
34 :
35 : using namespace dbaui;
36 : using namespace connectivity;
37 : using namespace ::com::sun::star::uno;
38 : using namespace ::com::sun::star::container;
39 : using namespace ::com::sun::star::util;
40 : using namespace ::com::sun::star::sdb;
41 : using namespace ::com::sun::star::sdbc;
42 : using namespace ::com::sun::star::sdbcx;
43 : using namespace ::com::sun::star::beans;
44 :
45 : DBG_NAME(DlgOrderCrit)
46 :
47 0 : DlgOrderCrit::DlgOrderCrit( Window * pParent,
48 : const Reference< XConnection>& _rxConnection,
49 : const Reference< XSingleSelectQueryComposer >& _rxComposer,
50 : const Reference< XNameAccess>& _rxCols)
51 : :ModalDialog( pParent, ModuleRes(DLG_ORDERCRIT) )
52 : ,aLB_ORDERFIELD1( this, ModuleRes( LB_ORDERFIELD1 ) )
53 : ,aLB_ORDERVALUE1( this, ModuleRes( LB_ORDERVALUE1 ) )
54 : ,aLB_ORDERFIELD2( this, ModuleRes( LB_ORDERFIELD2 ) )
55 : ,aLB_ORDERVALUE2( this, ModuleRes( LB_ORDERVALUE2 ) )
56 : ,aLB_ORDERFIELD3( this, ModuleRes( LB_ORDERFIELD3 ) )
57 : ,aLB_ORDERVALUE3( this, ModuleRes( LB_ORDERVALUE3 ) )
58 : ,aFT_ORDERFIELD( this, ModuleRes( FT_ORDERFIELD ) )
59 : ,aFT_ORDERAFTER1( this, ModuleRes( FT_ORDERAFTER1 ) )
60 : ,aFT_ORDERAFTER2( this, ModuleRes( FT_ORDERAFTER2 ) )
61 : ,aFT_ORDEROPER( this, ModuleRes( FT_ORDEROPER ) )
62 : ,aFT_ORDERDIR( this, ModuleRes( FT_ORDERDIR ) )
63 : ,aBT_OK( this, ModuleRes( BT_OK ) )
64 : ,aBT_CANCEL( this, ModuleRes( BT_CANCEL ) )
65 : ,aBT_HELP( this, ModuleRes( BT_HELP ) )
66 : ,aFL_ORDER( this, ModuleRes( FL_ORDER ) )
67 : ,aSTR_NOENTRY( ModuleRes( STR_NOENTRY ) )
68 : ,m_xQueryComposer( _rxComposer )
69 : ,m_xColumns(_rxCols)
70 0 : ,m_xConnection(_rxConnection)
71 : {
72 : DBG_CTOR(DlgOrderCrit,NULL);
73 :
74 0 : AllSettings aSettings( GetSettings() );
75 0 : StyleSettings aStyle( aSettings.GetStyleSettings() );
76 0 : aStyle.SetAutoMnemonic( sal_False );
77 0 : aSettings.SetStyleSettings( aStyle );
78 0 : SetSettings( aSettings );
79 :
80 0 : m_aColumnList[0] = &aLB_ORDERFIELD1;
81 0 : m_aColumnList[1] = &aLB_ORDERFIELD2;
82 0 : m_aColumnList[2] = &aLB_ORDERFIELD3;
83 :
84 0 : m_aValueList[0] = &aLB_ORDERVALUE1;
85 0 : m_aValueList[1] = &aLB_ORDERVALUE2;
86 0 : m_aValueList[2] = &aLB_ORDERVALUE3;
87 :
88 : xub_StrLen j;
89 0 : for(j=0 ; j < DOG_ROWS ; j++ )
90 : {
91 0 : m_aColumnList[j]->InsertEntry( aSTR_NOENTRY );
92 : }
93 :
94 0 : for( j=0 ; j < DOG_ROWS ; j++ )
95 : {
96 0 : m_aColumnList[j]->SelectEntryPos(0);
97 0 : m_aValueList[j]->SelectEntryPos(0);
98 : }
99 : try
100 : {
101 : // ... also the remaining fields
102 0 : Sequence< ::rtl::OUString> aNames = m_xColumns->getElementNames();
103 0 : const ::rtl::OUString* pIter = aNames.getConstArray();
104 0 : const ::rtl::OUString* pEnd = pIter + aNames.getLength();
105 0 : Reference<XPropertySet> xColumn;
106 0 : for(;pIter != pEnd;++pIter)
107 : {
108 0 : xColumn.set(m_xColumns->getByName(*pIter),UNO_QUERY);
109 : OSL_ENSURE(xColumn.is(),"Column is null!");
110 0 : if ( xColumn.is() )
111 : {
112 0 : sal_Int32 nDataType = 0;
113 0 : xColumn->getPropertyValue(PROPERTY_TYPE) >>= nDataType;
114 0 : sal_Int32 eColumnSearch = dbtools::getSearchColumnFlag(m_xConnection,nDataType);
115 0 : if(eColumnSearch != ColumnSearch::NONE)
116 : {
117 0 : for( j=0 ; j < DOG_ROWS ; j++ )
118 : {
119 0 : m_aColumnList[j]->InsertEntry(*pIter);
120 : }
121 : }
122 : }
123 : }
124 :
125 0 : m_sOrgOrder = m_xQueryComposer->getOrder();
126 0 : impl_initializeOrderList_nothrow();
127 : }
128 0 : catch(const Exception&)
129 : {
130 : DBG_UNHANDLED_EXCEPTION();
131 : }
132 0 : EnableLines();
133 :
134 0 : aLB_ORDERFIELD1.SetSelectHdl(LINK(this,DlgOrderCrit,FieldListSelectHdl));
135 0 : aLB_ORDERFIELD2.SetSelectHdl(LINK(this,DlgOrderCrit,FieldListSelectHdl));
136 :
137 0 : FreeResource();
138 0 : }
139 :
140 0 : DlgOrderCrit::~DlgOrderCrit()
141 : {
142 : DBG_DTOR(DlgOrderCrit,NULL);
143 0 : }
144 :
145 0 : IMPL_LINK_INLINE_START( DlgOrderCrit, FieldListSelectHdl, ListBox *, /*pListBox*/ )
146 : {
147 : DBG_CHKTHIS(DlgOrderCrit,NULL);
148 0 : EnableLines();
149 0 : return 0;
150 : }
151 0 : IMPL_LINK_INLINE_END( DlgOrderCrit, FieldListSelectHdl, ListBox *, pListBox )
152 :
153 0 : void DlgOrderCrit::impl_initializeOrderList_nothrow()
154 : {
155 : try
156 : {
157 0 : const ::rtl::OUString sNameProperty = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) );
158 0 : const ::rtl::OUString sAscendingProperty = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsAscending" ) );
159 :
160 0 : Reference< XIndexAccess > xOrderColumns( m_xQueryComposer->getOrderColumns(), UNO_QUERY_THROW );
161 0 : sal_Int32 nColumns = xOrderColumns->getCount();
162 0 : if ( nColumns > DOG_ROWS )
163 0 : nColumns = DOG_ROWS;
164 :
165 0 : for ( sal_Int32 i = 0; i < nColumns; ++i )
166 : {
167 0 : Reference< XPropertySet > xColumn( xOrderColumns->getByIndex( i ), UNO_QUERY_THROW );
168 :
169 0 : ::rtl::OUString sColumnName;
170 0 : sal_Bool bIsAscending( sal_True );
171 :
172 0 : xColumn->getPropertyValue( sNameProperty ) >>= sColumnName;
173 0 : xColumn->getPropertyValue( sAscendingProperty ) >>= bIsAscending;
174 :
175 0 : m_aColumnList[i]->SelectEntry( sColumnName );
176 0 : m_aValueList[i]->SelectEntryPos( bIsAscending ? 0 : 1 );
177 0 : }
178 : }
179 0 : catch( const Exception& )
180 : {
181 : DBG_UNHANDLED_EXCEPTION();
182 : }
183 0 : }
184 :
185 0 : void DlgOrderCrit::EnableLines()
186 : {
187 : DBG_CHKTHIS(DlgOrderCrit,NULL);
188 :
189 0 : if ( aLB_ORDERFIELD1.GetSelectEntryPos() == 0 )
190 : {
191 0 : aLB_ORDERFIELD2.Disable();
192 0 : aLB_ORDERVALUE2.Disable();
193 :
194 0 : aLB_ORDERFIELD2.SelectEntryPos( 0 );
195 0 : aLB_ORDERVALUE2.SelectEntryPos( 0 );
196 : }
197 : else
198 : {
199 0 : aLB_ORDERFIELD2.Enable();
200 0 : aLB_ORDERVALUE2.Enable();
201 : }
202 :
203 0 : if ( aLB_ORDERFIELD2.GetSelectEntryPos() == 0 )
204 : {
205 0 : aLB_ORDERFIELD3.Disable();
206 0 : aLB_ORDERVALUE3.Disable();
207 :
208 0 : aLB_ORDERFIELD3.SelectEntryPos( 0 );
209 0 : aLB_ORDERVALUE3.SelectEntryPos( 0 );
210 : }
211 : else
212 : {
213 0 : aLB_ORDERFIELD3.Enable();
214 0 : aLB_ORDERVALUE3.Enable();
215 : }
216 0 : }
217 :
218 0 : ::rtl::OUString DlgOrderCrit::GetOrderList( ) const
219 : {
220 : DBG_CHKTHIS(DlgOrderCrit,NULL);
221 0 : Reference<XDatabaseMetaData> xMetaData = m_xConnection->getMetaData();
222 0 : ::rtl::OUString sQuote = xMetaData.is() ? xMetaData->getIdentifierQuoteString() : ::rtl::OUString();
223 0 : static const ::rtl::OUString sDESC(RTL_CONSTASCII_USTRINGPARAM(" DESC "));
224 0 : static const ::rtl::OUString sASC(RTL_CONSTASCII_USTRINGPARAM(" ASC "));
225 :
226 0 : Reference< XNameAccess> xColumns = Reference< XColumnsSupplier >(m_xQueryComposer,UNO_QUERY)->getColumns();
227 :
228 0 : ::rtl::OUString sOrder;
229 0 : for( sal_uInt16 i=0 ; i<DOG_ROWS; i++ )
230 : {
231 0 : if(m_aColumnList[i]->GetSelectEntryPos() != 0)
232 : {
233 0 : if(!sOrder.isEmpty())
234 0 : sOrder += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","));
235 :
236 0 : String sName = m_aColumnList[i]->GetSelectEntry();
237 : try
238 : {
239 0 : sal_Bool bFunction = sal_False;
240 0 : Reference< XPropertySet > xColumn;
241 0 : if ( xColumns.is() && xColumns->hasByName( sName ) && (xColumns->getByName( sName ) >>= xColumn) && xColumn.is() )
242 : {
243 0 : if ( xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_REALNAME) )
244 : {
245 0 : ::rtl::OUString sRealName;
246 0 : xColumn->getPropertyValue(PROPERTY_REALNAME) >>= sRealName;
247 0 : sName = sRealName;
248 0 : static ::rtl::OUString sFunction(RTL_CONSTASCII_USTRINGPARAM("Function"));
249 0 : if ( xColumn->getPropertySetInfo()->hasPropertyByName(sFunction) )
250 0 : xColumn->getPropertyValue(sFunction) >>= bFunction;
251 : }
252 : }
253 0 : if ( bFunction )
254 0 : sOrder += sName;
255 : else
256 0 : sOrder += ::dbtools::quoteName(sQuote,sName);
257 : }
258 0 : catch(const Exception&)
259 : {
260 : }
261 0 : if(m_aValueList[i]->GetSelectEntryPos())
262 0 : sOrder += sDESC;
263 : else
264 0 : sOrder += sASC;
265 : }
266 : }
267 0 : return sOrder;
268 : }
269 :
270 0 : void DlgOrderCrit::BuildOrderPart()
271 : {
272 : DBG_CHKTHIS(DlgOrderCrit,NULL);
273 0 : m_xQueryComposer->setOrder(GetOrderList());
274 0 : }
275 :
276 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|