xref: /aoo41x/main/sc/source/ui/dbgui/foptmgr.cxx (revision 57b4fa3c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 // System - Includes ---------------------------------------------------------
28 
29 
30 
31 // INCLUDE -------------------------------------------------------------------
32 
33 #include <vcl/morebtn.hxx>
34 #include <svtools/stdctrl.hxx>
35 
36 #include "anyrefdg.hxx"
37 #include "rangeutl.hxx"
38 #include "dbcolect.hxx"
39 #include "viewdata.hxx"
40 #include "document.hxx"
41 #include "queryparam.hxx"
42 
43 #define _FOPTMGR_CXX
44 #include "foptmgr.hxx"
45 #undef _FOPTMGR_CXX
46 
47 //----------------------------------------------------------------------------
48 
49 ScFilterOptionsMgr::ScFilterOptionsMgr(
50 								Dialog*				ptrDlg,
51 								ScViewData*			ptrViewData,
52 								const ScQueryParam&	refQueryData,
53 								MoreButton&			refBtnMore,
54 								CheckBox&			refBtnCase,
55 								CheckBox&			refBtnRegExp,
56 								CheckBox&			refBtnHeader,
57 								CheckBox&			refBtnUnique,
58 								CheckBox&			refBtnCopyResult,
59 								CheckBox&			refBtnDestPers,
60 								ListBox&			refLbCopyArea,
61 								Edit&				refEdCopyArea,
62 								formula::RefButton&		refRbCopyArea,
63 								FixedText&			refFtDbAreaLabel,
64 								FixedInfo&			refFtDbArea,
65                                 FixedLine&          refFlOptions,
66 								const String&		refStrNoName,
67 								const String&		refStrUndefined )
68 
69 	:	pDlg			( ptrDlg ),
70 		pViewData		( ptrViewData ),
71 		pDoc			( ptrViewData ? ptrViewData->GetDocument() : NULL ),
72 		rBtnMore		( refBtnMore ),
73 		rBtnCase		( refBtnCase ),
74 		rBtnRegExp		( refBtnRegExp ),
75 		rBtnHeader		( refBtnHeader ),
76 		rBtnUnique		( refBtnUnique ),
77 		rBtnCopyResult	( refBtnCopyResult ),
78 		rBtnDestPers	( refBtnDestPers ),
79 		rLbCopyPos		( refLbCopyArea ),
80 		rEdCopyPos		( refEdCopyArea ),
81 		rRbCopyPos		( refRbCopyArea ),
82 		rFtDbAreaLabel	( refFtDbAreaLabel ),
83 		rFtDbArea		( refFtDbArea ),
84         rFlOptions      ( refFlOptions ),
85 		rStrNoName		( refStrNoName ),
86 		rStrUndefined	( refStrUndefined ),
87 		rQueryData		( refQueryData )
88 {
89 	Init();
90 }
91 
92 
93 //----------------------------------------------------------------------------
94 
95 ScFilterOptionsMgr::~ScFilterOptionsMgr()
96 {
97 	sal_uInt16 nEntries = rLbCopyPos.GetEntryCount();
98 	sal_uInt16 i;
99 
100 	for ( i=2; i<nEntries; i++ )
101 		delete (String*)rLbCopyPos.GetEntryData( i );
102 }
103 
104 
105 //----------------------------------------------------------------------------
106 
107 void ScFilterOptionsMgr::Init()
108 {
109 	DBG_ASSERT( pViewData && pDoc, "Init failed :-/" );
110 
111 	rLbCopyPos.SetSelectHdl	 ( LINK( this, ScFilterOptionsMgr, LbPosSelHdl ) );
112 	rEdCopyPos.SetModifyHdl	 ( LINK( this, ScFilterOptionsMgr, EdPosModifyHdl ) );
113 	rBtnCopyResult.SetClickHdl( LINK( this, ScFilterOptionsMgr, BtnCopyResultHdl ) );
114 
115 	rBtnMore.AddWindow( &rBtnCase );
116 	rBtnMore.AddWindow( &rBtnRegExp );
117 	rBtnMore.AddWindow( &rBtnHeader );
118 	rBtnMore.AddWindow( &rBtnUnique );
119 	rBtnMore.AddWindow( &rBtnCopyResult );
120 	rBtnMore.AddWindow( &rBtnDestPers );
121 	rBtnMore.AddWindow( &rLbCopyPos );
122 	rBtnMore.AddWindow( &rEdCopyPos );
123 	rBtnMore.AddWindow( &rRbCopyPos );
124 	rBtnMore.AddWindow( &rFtDbAreaLabel );
125 	rBtnMore.AddWindow( &rFtDbArea );
126     rBtnMore.AddWindow( &rFlOptions );
127 
128 	rBtnCase	.Check( rQueryData.bCaseSens );
129 	rBtnHeader	.Check( rQueryData.bHasHeader );
130 	rBtnRegExp	.Check( rQueryData.bRegExp );
131 	rBtnUnique	.Check( !rQueryData.bDuplicate );
132 
133 	if ( pViewData && pDoc )
134 	{
135 		String			theAreaStr;
136 		ScRange			theCurArea ( ScAddress( rQueryData.nCol1,
137 												rQueryData.nRow1,
138 												pViewData->GetTabNo() ),
139 									 ScAddress( rQueryData.nCol2,
140 												rQueryData.nRow2,
141 												pViewData->GetTabNo() ) );
142 		ScDBCollection*	pDBColl		= pDoc->GetDBCollection();
143 		String			theDbArea;
144 		String			theDbName	= rStrNoName;
145         const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
146 
147 		theCurArea.Format( theAreaStr, SCR_ABS_3D, pDoc, eConv );
148 
149 		// Zielbereichsliste fuellen
150 
151 		rLbCopyPos.Clear();
152 		rLbCopyPos.InsertEntry( rStrUndefined, 0 );
153 
154 		ScAreaNameIterator aIter( pDoc );
155 		String aName;
156 		ScRange aRange;
157 		String aRefStr;
158 		while ( aIter.Next( aName, aRange ) )
159 		{
160 			sal_uInt16 nInsert = rLbCopyPos.InsertEntry( aName );
161 
162 			aRange.aStart.Format( aRefStr, SCA_ABS_3D, pDoc, eConv );
163 			rLbCopyPos.SetEntryData( nInsert, new String( aRefStr ) );
164 		}
165 
166 		rBtnDestPers.Check( sal_True );			// beim Aufruf immer an
167 		rLbCopyPos.SelectEntryPos( 0 );
168 		rEdCopyPos.SetText( EMPTY_STRING );
169 
170 		/*
171 		 * Ueberpruefen, ob es sich bei dem uebergebenen
172 		 * Bereich um einen Datenbankbereich handelt:
173 		 */
174 
175 		theDbArea = theAreaStr;
176 
177 		if ( pDBColl )
178 		{
179 			ScAddress&	rStart	= theCurArea.aStart;
180 			ScAddress&	rEnd	= theCurArea.aEnd;
181 			ScDBData*	pDBData = pDBColl->GetDBAtArea(	rStart.Tab(),
182 														rStart.Col(), rStart.Row(),
183 														rEnd.Col(),   rEnd.Row() );
184 			if ( pDBData )
185 			{
186 				rBtnHeader.Check( pDBData->HasHeader() );
187 				pDBData->GetName( theDbName );
188 
189                 if ( !pDBData->IsBuildin() )
190 				{
191 					rBtnHeader.Disable();
192 				}
193 			}
194 		}
195 
196 		theDbArea.AppendAscii(RTL_CONSTASCII_STRINGPARAM(" ("));
197 		theDbArea += theDbName;
198 		theDbArea += ')';
199 		rFtDbArea.SetText( theDbArea );
200 
201 		//------------------------------------------------------
202 		// Kopierposition:
203 
204 		if ( !rQueryData.bInplace )
205 		{
206 			String aString;
207 
208 			ScAddress( rQueryData.nDestCol,
209 					   rQueryData.nDestRow,
210 					   rQueryData.nDestTab
211 					 ).Format( aString, SCA_ABS_3D, pDoc, eConv );
212 
213 			rBtnCopyResult.Check( sal_True );
214 			rEdCopyPos.SetText( aString );
215 			EdPosModifyHdl( &rEdCopyPos );
216 			rLbCopyPos.Enable();
217 			rEdCopyPos.Enable();
218 			rRbCopyPos.Enable();
219 			rBtnDestPers.Enable();
220 		}
221 		else
222 		{
223 			rBtnCopyResult.Check( sal_False );
224 			rEdCopyPos.SetText( EMPTY_STRING );
225 			rLbCopyPos.Disable();
226 			rEdCopyPos.Disable();
227 			rRbCopyPos.Disable();
228 			rBtnDestPers.Disable();
229 		}
230 	}
231 	else
232 		rEdCopyPos.SetText( EMPTY_STRING );
233 }
234 
235 
236 //----------------------------------------------------------------------------
237 
238 sal_Bool ScFilterOptionsMgr::VerifyPosStr( const String& rPosStr ) const
239 {
240 	String aPosStr( rPosStr );
241 	xub_StrLen nColonPos = aPosStr.Search( ':' );
242 
243 	if ( STRING_NOTFOUND != nColonPos )
244 		aPosStr.Erase( nColonPos );
245 
246 	sal_uInt16 nResult = ScAddress().Parse( aPosStr, pDoc, pDoc->GetAddressConvention() );
247 
248 	return ( SCA_VALID == (nResult & SCA_VALID) );
249 }
250 
251 
252 //----------------------------------------------------------------------------
253 // Handler:
254 
255 //----------------------------------------------------------------------------
256 
257 IMPL_LINK( ScFilterOptionsMgr, LbPosSelHdl, ListBox*, pLb )
258 {
259 	if ( pLb == &rLbCopyPos )
260 	{
261 		String aString;
262 		sal_uInt16 nSelPos = rLbCopyPos.GetSelectEntryPos();
263 
264 		if ( nSelPos > 0 )
265 			aString = *(String*)rLbCopyPos.GetEntryData( nSelPos );
266 
267 		rEdCopyPos.SetText( aString );
268 	}
269 
270 	return 0;
271 }
272 
273 
274 //----------------------------------------------------------------------------
275 
276 IMPL_LINK( ScFilterOptionsMgr, EdPosModifyHdl, Edit*, pEd )
277 {
278 	if ( pEd == &rEdCopyPos )
279 	{
280 		String	theCurPosStr = pEd->GetText();
281 		sal_uInt16	nResult = ScAddress().Parse( theCurPosStr, pDoc, pDoc->GetAddressConvention() );
282 
283 		if ( SCA_VALID == (nResult & SCA_VALID) )
284 		{
285 			String*	pStr	= NULL;
286 			sal_Bool	bFound	= sal_False;
287 			sal_uInt16	i		= 0;
288 			sal_uInt16	nCount	= rLbCopyPos.GetEntryCount();
289 
290 			for ( i=2; i<nCount && !bFound; i++ )
291 			{
292 				pStr = (String*)rLbCopyPos.GetEntryData( i );
293 				bFound = (theCurPosStr == *pStr);
294 			}
295 
296 			if ( bFound )
297 				rLbCopyPos.SelectEntryPos( --i );
298 			else
299 				rLbCopyPos.SelectEntryPos( 0 );
300 		}
301 		else
302 			rLbCopyPos.SelectEntryPos( 0 );
303 	}
304 
305 	return 0;
306 }
307 
308 
309 //----------------------------------------------------------------------------
310 
311 IMPL_LINK( ScFilterOptionsMgr, BtnCopyResultHdl, CheckBox*, pBox )
312 {
313 	if ( pBox == &rBtnCopyResult )
314 	{
315 		if ( pBox->IsChecked() )
316 		{
317 			rBtnDestPers.Enable();
318 			rLbCopyPos.Enable();
319 			rEdCopyPos.Enable();
320 			rRbCopyPos.Enable();
321 			rEdCopyPos.GrabFocus();
322 		}
323 		else
324 		{
325 			rBtnDestPers.Disable();
326 			rLbCopyPos.Disable();
327 			rEdCopyPos.Disable();
328 			rRbCopyPos.Disable();
329 		}
330 	}
331 
332 	return 0;
333 }
334