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 <svtools/stdctrl.hxx>
21 :
22 : #include "anyrefdg.hxx"
23 : #include "rangeutl.hxx"
24 : #include "dbdata.hxx"
25 : #include "viewdata.hxx"
26 : #include "document.hxx"
27 : #include "queryparam.hxx"
28 : #include "globalnames.hxx"
29 :
30 : #include "foptmgr.hxx"
31 :
32 :
33 : // ScFilterOptionsMgr (.ui's option helper)
34 :
35 :
36 0 : ScFilterOptionsMgr::ScFilterOptionsMgr(
37 : ScViewData* ptrViewData,
38 : const ScQueryParam& refQueryData,
39 : CheckBox* refBtnCase,
40 : CheckBox* refBtnRegExp,
41 : CheckBox* refBtnHeader,
42 : CheckBox* refBtnUnique,
43 : CheckBox* refBtnCopyResult,
44 : CheckBox* refBtnDestPers,
45 : ListBox* refLbCopyArea,
46 : Edit* refEdCopyArea,
47 : formula::RefButton* refRbCopyArea,
48 : FixedText* refFtDbAreaLabel,
49 : FixedText* refFtDbArea,
50 : const OUString& refStrUndefined )
51 :
52 : : pViewData ( ptrViewData ),
53 : pDoc ( ptrViewData ? ptrViewData->GetDocument() : NULL ),
54 : pBtnCase ( refBtnCase ),
55 : pBtnRegExp ( refBtnRegExp ),
56 : pBtnHeader ( refBtnHeader ),
57 : pBtnUnique ( refBtnUnique ),
58 : pBtnCopyResult ( refBtnCopyResult ),
59 : pBtnDestPers ( refBtnDestPers ),
60 : pLbCopyArea ( refLbCopyArea ),
61 : pEdCopyArea ( refEdCopyArea ),
62 : pRbCopyArea ( refRbCopyArea ),
63 : pFtDbAreaLabel ( refFtDbAreaLabel ),
64 : pFtDbArea ( refFtDbArea ),
65 : rStrUndefined ( refStrUndefined ),
66 0 : rQueryData ( refQueryData )
67 : {
68 0 : Init();
69 0 : }
70 :
71 :
72 0 : ScFilterOptionsMgr::~ScFilterOptionsMgr()
73 : {
74 0 : sal_uInt16 nEntries = pLbCopyArea->GetEntryCount();
75 : sal_uInt16 i;
76 :
77 0 : for ( i=2; i<nEntries; i++ )
78 0 : delete (OUString*)pLbCopyArea->GetEntryData( i );
79 0 : }
80 :
81 :
82 0 : void ScFilterOptionsMgr::Init()
83 : {
84 : //moggi:TODO
85 : OSL_ENSURE( pViewData && pDoc, "Init failed :-/" );
86 :
87 0 : pLbCopyArea->SetSelectHdl ( LINK( this, ScFilterOptionsMgr, LbAreaSelHdl ) );
88 0 : pEdCopyArea->SetModifyHdl ( LINK( this, ScFilterOptionsMgr, EdAreaModifyHdl ) );
89 0 : pBtnCopyResult->SetToggleHdl ( LINK( this, ScFilterOptionsMgr, BtnCopyResultHdl ) );
90 :
91 0 : pBtnCase ->Check( rQueryData.bCaseSens );
92 0 : pBtnHeader ->Check( rQueryData.bHasHeader );
93 0 : pBtnRegExp ->Check( rQueryData.bRegExp );
94 0 : pBtnUnique ->Check( !rQueryData.bDuplicate );
95 :
96 0 : if ( pViewData && pDoc )
97 : {
98 0 : OUString theAreaStr;
99 : ScRange theCurArea ( ScAddress( rQueryData.nCol1,
100 : rQueryData.nRow1,
101 0 : pViewData->GetTabNo() ),
102 : ScAddress( rQueryData.nCol2,
103 : rQueryData.nRow2,
104 0 : pViewData->GetTabNo() ) );
105 0 : ScDBCollection* pDBColl = pDoc->GetDBCollection();
106 0 : OUStringBuffer theDbArea;
107 0 : OUString theDbName(STR_DB_LOCAL_NONAME);
108 0 : const formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
109 :
110 0 : theAreaStr = theCurArea.Format(SCR_ABS_3D, pDoc, eConv);
111 :
112 : // Zielbereichsliste fuellen
113 :
114 0 : pLbCopyArea->Clear();
115 0 : pLbCopyArea->InsertEntry( rStrUndefined, 0 );
116 :
117 0 : ScAreaNameIterator aIter( pDoc );
118 0 : OUString aName;
119 0 : ScRange aRange;
120 0 : while ( aIter.Next( aName, aRange ) )
121 : {
122 0 : sal_uInt16 nInsert = pLbCopyArea->InsertEntry( aName );
123 :
124 0 : OUString aRefStr(aRange.aStart.Format(SCA_ABS_3D, pDoc, eConv));
125 0 : pLbCopyArea->SetEntryData( nInsert, new OUString( aRefStr ) );
126 0 : }
127 :
128 0 : pBtnDestPers->Check( true ); // beim Aufruf immer an
129 0 : pLbCopyArea->SelectEntryPos( 0 );
130 0 : pEdCopyArea->SetText( EMPTY_OUSTRING );
131 :
132 : /*
133 : * Ueberpruefen, ob es sich bei dem uebergebenen
134 : * Bereich um einen Datenbankbereich handelt:
135 : */
136 :
137 0 : theDbArea = theAreaStr;
138 :
139 0 : if ( pDBColl )
140 : {
141 0 : ScAddress& rStart = theCurArea.aStart;
142 0 : ScAddress& rEnd = theCurArea.aEnd;
143 : const ScDBData* pDBData = pDBColl->GetDBAtArea(
144 0 : rStart.Tab(), rStart.Col(), rStart.Row(), rEnd.Col(), rEnd.Row());
145 :
146 0 : if ( pDBData )
147 : {
148 0 : pBtnHeader->Check( pDBData->HasHeader() );
149 0 : theDbName = pDBData->GetName();
150 :
151 0 : if ( theDbName == STR_DB_LOCAL_NONAME )
152 0 : pBtnHeader->Enable();
153 : else
154 0 : pBtnHeader->Disable();
155 : }
156 : }
157 :
158 0 : if ( theDbName != STR_DB_LOCAL_NONAME )
159 : {
160 0 : theDbArea.append(" (");
161 0 : theDbArea.append(theDbName).append(')');
162 0 : pFtDbArea->SetText( theDbArea.makeStringAndClear() );
163 : }
164 : else
165 : {
166 0 : pFtDbAreaLabel->SetText( OUString() );
167 0 : pFtDbArea->SetText( OUString() );
168 : }
169 :
170 :
171 : // Kopierposition:
172 :
173 0 : if ( !rQueryData.bInplace )
174 : {
175 : OUString aString =
176 : ScAddress( rQueryData.nDestCol,
177 : rQueryData.nDestRow,
178 : rQueryData.nDestTab
179 0 : ).Format(SCA_ABS_3D, pDoc, eConv);
180 :
181 0 : pBtnCopyResult->Check( true );
182 0 : pEdCopyArea->SetText( aString );
183 0 : EdAreaModifyHdl( pEdCopyArea );
184 0 : pLbCopyArea->Enable();
185 0 : pEdCopyArea->Enable();
186 0 : pRbCopyArea->Enable();
187 0 : pBtnDestPers->Enable();
188 : }
189 : else
190 : {
191 0 : pBtnCopyResult->Check( false );
192 0 : pEdCopyArea->SetText( EMPTY_OUSTRING );
193 0 : pLbCopyArea->Disable();
194 0 : pEdCopyArea->Disable();
195 0 : pRbCopyArea->Disable();
196 0 : pBtnDestPers->Disable();
197 0 : }
198 : }
199 : else
200 0 : pEdCopyArea->SetText( EMPTY_OUSTRING );
201 0 : }
202 :
203 0 : bool ScFilterOptionsMgr::VerifyPosStr( const OUString& rPosStr ) const
204 : {
205 0 : OUString aPosStr( rPosStr );
206 0 : sal_Int32 nColonPos = aPosStr.indexOf( ':' );
207 :
208 0 : if ( -1 != nColonPos )
209 0 : aPosStr = aPosStr.copy( 0, nColonPos );
210 :
211 0 : sal_uInt16 nResult = ScAddress().Parse( aPosStr, pDoc, pDoc->GetAddressConvention() );
212 :
213 0 : return ( SCA_VALID == (nResult & SCA_VALID) );
214 : }
215 :
216 :
217 : // Handler:
218 :
219 0 : IMPL_LINK( ScFilterOptionsMgr, LbAreaSelHdl, ListBox*, pLb )
220 : {
221 0 : if ( pLb == pLbCopyArea )
222 : {
223 0 : OUString aString;
224 0 : sal_uInt16 nSelPos = pLbCopyArea->GetSelectEntryPos();
225 :
226 0 : if ( nSelPos > 0 )
227 0 : aString = *(OUString*)pLbCopyArea->GetEntryData( nSelPos );
228 :
229 0 : pEdCopyArea->SetText( aString );
230 : }
231 :
232 0 : return 0;
233 : }
234 :
235 :
236 0 : IMPL_LINK( ScFilterOptionsMgr, EdAreaModifyHdl, Edit*, pEd )
237 : {
238 0 : if ( pEd == pEdCopyArea )
239 : {
240 0 : OUString theCurPosStr = pEd->GetText();
241 0 : sal_uInt16 nResult = ScAddress().Parse( theCurPosStr, pDoc, pDoc->GetAddressConvention() );
242 :
243 0 : if ( SCA_VALID == (nResult & SCA_VALID) )
244 : {
245 0 : OUString* pStr = NULL;
246 0 : sal_Bool bFound = false;
247 0 : sal_uInt16 i = 0;
248 0 : sal_uInt16 nCount = pLbCopyArea->GetEntryCount();
249 :
250 0 : for ( i=2; i<nCount && !bFound; i++ )
251 : {
252 0 : pStr = (OUString*)pLbCopyArea->GetEntryData( i );
253 0 : bFound = (theCurPosStr == *pStr);
254 : }
255 :
256 0 : if ( bFound )
257 0 : pLbCopyArea->SelectEntryPos( --i );
258 : else
259 0 : pLbCopyArea->SelectEntryPos( 0 );
260 : }
261 : else
262 0 : pLbCopyArea->SelectEntryPos( 0 );
263 : }
264 :
265 0 : return 0;
266 : }
267 :
268 :
269 0 : IMPL_LINK( ScFilterOptionsMgr, BtnCopyResultHdl, CheckBox*, pBox )
270 : {
271 0 : if ( pBox == pBtnCopyResult )
272 : {
273 0 : if ( pBox->IsChecked() )
274 : {
275 0 : pBtnDestPers->Enable();
276 0 : pLbCopyArea->Enable();
277 0 : pEdCopyArea->Enable();
278 0 : pRbCopyArea->Enable();
279 0 : pEdCopyArea->GrabFocus();
280 : }
281 : else
282 : {
283 0 : pBtnDestPers->Disable();
284 0 : pLbCopyArea->Disable();
285 0 : pEdCopyArea->Disable();
286 0 : pRbCopyArea->Disable();
287 : }
288 : }
289 :
290 0 : return 0;
291 0 : }
292 :
293 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|