Lines 111-520
void ScDocShell::DBAreaDeleted( SCTAB nTab, SCCOL nX1, SCROW nY1, SCCOL nX2, SCR
Link Here
|
111 |
aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); |
111 |
aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); |
112 |
} |
112 |
} |
113 |
|
113 |
|
114 |
ScDBData* lcl_GetDBNearCursor( ScDBCollection* pColl, SCCOL nCol, SCROW nRow, SCTAB nTab ) |
|
|
115 |
{ |
116 |
//! nach document/dbcolect verschieben |
117 |
|
118 |
if (!pColl) |
119 |
return NULL; |
120 |
|
121 |
ScDBData* pNoNameData = NULL; |
122 |
ScDBData* pNearData = NULL; |
123 |
sal_uInt16 nCount = pColl->GetCount(); |
124 |
String aNoName = ScGlobal::GetRscString( STR_DB_NONAME ); |
125 |
SCTAB nAreaTab; |
126 |
SCCOL nStartCol, nEndCol; |
127 |
SCROW nStartRow, nEndRow; |
128 |
for (sal_uInt16 i = 0; i < nCount; i++) |
129 |
{ |
130 |
ScDBData* pDB = (*pColl)[i]; |
131 |
pDB->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
132 |
if ( nTab == nAreaTab && nCol+1 >= nStartCol && nCol <= nEndCol+1 && |
133 |
nRow+1 >= nStartRow && nRow <= nEndRow+1 ) |
134 |
{ |
135 |
if ( pDB->GetName() == aNoName ) |
136 |
pNoNameData = pDB; |
137 |
else if ( nCol < nStartCol || nCol > nEndCol || nRow < nStartRow || nRow > nEndRow ) |
138 |
{ |
139 |
if (!pNearData) |
140 |
pNearData = pDB; // ersten angrenzenden Bereich merken |
141 |
} |
142 |
else |
143 |
return pDB; // nicht "unbenannt" und Cursor steht wirklich drin |
144 |
} |
145 |
} |
146 |
if (pNearData) |
147 |
return pNearData; // angrenzender, wenn nichts direkt getroffen |
148 |
return pNoNameData; // "unbenannt" nur zurueck, wenn sonst nichts gefunden |
149 |
} |
150 |
|
114 |
|
151 |
ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel ) |
115 |
ScDBData* lcl_GetDBNearCursor( |
|
|
116 |
const ScDBCollection* pColl, |
117 |
const SCCOL nCol, |
118 |
const SCROW nRow, |
119 |
const SCTAB nTab ) |
152 |
{ |
120 |
{ |
153 |
if ( eMode == SC_DB_MAKE_FILTER || eMode == SC_DB_MAKE_SORT || eMode == SC_DB_MAKE_SUBTOTAL || eMode == SC_DB_OLD_FILTER ) |
121 |
//! nach document/dbcolect verschieben |
154 |
return GetDBDataAdd(rMarked, eMode, eSel); |
122 |
|
155 |
SCCOL nCol = rMarked.aStart.Col(); |
123 |
if (!pColl) |
156 |
SCROW nRow = rMarked.aStart.Row(); |
124 |
return NULL; |
157 |
SCTAB nTab = rMarked.aStart.Tab(); |
125 |
|
158 |
|
126 |
ScDBData* pInternalDBData = NULL; |
159 |
SCCOL nStartCol = nCol; |
127 |
ScDBData* pNearData = NULL; |
160 |
SCROW nStartRow = nRow; |
128 |
sal_uInt16 nCount = pColl->GetCount(); |
161 |
SCTAB nStartTab = nTab; |
129 |
SCTAB nAreaTab; |
162 |
SCCOL nEndCol = rMarked.aEnd.Col(); |
130 |
SCCOL nStartCol, nEndCol; |
163 |
SCROW nEndRow = rMarked.aEnd.Row(); |
131 |
SCROW nStartRow, nEndRow; |
164 |
SCTAB nEndTab = rMarked.aEnd.Tab(); |
132 |
for (sal_uInt16 i = 0; i < nCount; i++) |
165 |
|
133 |
{ |
166 |
// Wegen #49655# nicht einfach GetDBAtCursor: Der zusammenhaengende Datenbereich |
134 |
ScDBData* pDB = (*pColl)[i]; |
167 |
// fuer "unbenannt" (GetDataArea) kann neben dem Cursor legen, also muss auch ein |
135 |
pDB->GetArea( nAreaTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
168 |
// benannter DB-Bereich dort gesucht werden. |
136 |
if ( nTab == nAreaTab |
169 |
|
137 |
&& nCol+1 >= nStartCol |
170 |
ScDBData* pData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
138 |
&& nCol <= nEndCol+1 |
171 |
if (!pData) |
139 |
&& nRow+1 >= nStartRow |
172 |
pData = lcl_GetDBNearCursor( aDocument.GetDBCollection(), nCol, nRow, nTab ); |
140 |
&& nRow <= nEndRow+1 ) |
173 |
|
141 |
{ |
174 |
sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK || |
142 |
if ( pDB->IsInternalUnnamed() |
175 |
(rMarked.aStart != rMarked.aEnd && eSel != SC_DBSEL_ROW_DOWN) ); |
143 |
|| pDB->IsInternalForAutoFilter() ) |
176 |
bool bOnlyDown = (!bSelected && eSel == SC_DBSEL_ROW_DOWN && rMarked.aStart.Row() == rMarked.aEnd.Row()); |
|
|
177 |
|
178 |
sal_Bool bUseThis = sal_False; |
179 |
if (pData) |
180 |
{ |
181 |
// Bereich nehmen, wenn nichts anderes markiert |
182 |
|
183 |
SCTAB nDummy; |
184 |
SCCOL nOldCol1; |
185 |
SCROW nOldRow1; |
186 |
SCCOL nOldCol2; |
187 |
SCROW nOldRow2; |
188 |
pData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 ); |
189 |
// sal_Bool bIsNoName = ( pData->GetName() == ScGlobal::GetRscString( STR_DB_NONAME ) ); |
190 |
sal_Bool bIsNoName = pData->IsBuildin(); |
191 |
|
192 |
if (!bSelected) |
193 |
{ |
194 |
bUseThis = sal_True; |
195 |
if ( bIsNoName && eMode == SC_DB_MAKE ) |
196 |
{ |
197 |
// If nothing marked or only one row marked, adapt |
198 |
// "unbenannt"/"unnamed" to contiguous area. |
199 |
nStartCol = nCol; |
200 |
nStartRow = nRow; |
201 |
if (bOnlyDown) |
202 |
{ |
203 |
nEndCol = rMarked.aEnd.Col(); |
204 |
nEndRow = rMarked.aEnd.Row(); |
205 |
} |
206 |
else |
207 |
{ |
208 |
nEndCol = nStartCol; |
209 |
nEndRow = nStartRow; |
210 |
} |
211 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
212 |
if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow ) |
213 |
bUseThis = sal_False; // passt gar nicht |
214 |
else if ( nOldRow2 != nEndRow ) |
215 |
{ |
216 |
// Bereich auf neue End-Zeile erweitern |
217 |
pData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow ); |
218 |
} |
219 |
} |
220 |
} |
221 |
else |
222 |
{ |
223 |
if ( nOldCol1 == nStartCol && nOldRow1 == nStartRow && |
224 |
nOldCol2 == nEndCol && nOldRow2 == nEndRow ) // genau markiert? |
225 |
bUseThis = sal_True; |
226 |
else |
227 |
bUseThis = sal_False; // immer Markierung nehmen (Bug 11964) |
228 |
} |
229 |
|
230 |
// fuer Import nie "unbenannt" nehmen |
231 |
|
232 |
if ( bUseThis && eMode == SC_DB_IMPORT && bIsNoName ) |
233 |
bUseThis = sal_False; |
234 |
} |
235 |
|
236 |
if ( bUseThis ) |
237 |
{ |
238 |
pData->GetArea( nStartTab, nStartCol,nStartRow, nEndCol,nEndRow ); |
239 |
nEndTab = nStartTab; |
240 |
} |
241 |
else if ( eMode == SC_DB_OLD ) |
242 |
{ |
243 |
pData = NULL; // nichts gefunden |
244 |
nStartCol = nEndCol = nCol; |
245 |
nStartRow = nEndRow = nRow; |
246 |
nStartTab = nEndTab = nTab; |
247 |
// bMark = sal_False; // nichts zu markieren |
248 |
} |
249 |
else |
250 |
{ |
251 |
if ( bSelected ) |
252 |
{ |
253 |
// bMark = sal_False; |
254 |
} |
255 |
else |
256 |
{ // zusammenhaengender Bereich |
257 |
nStartCol = nCol; |
258 |
nStartRow = nRow; |
259 |
if (bOnlyDown) |
260 |
{ |
261 |
nEndCol = rMarked.aEnd.Col(); |
262 |
nEndRow = rMarked.aEnd.Row(); |
263 |
} |
264 |
else |
265 |
{ |
144 |
{ |
266 |
nEndCol = nStartCol; |
145 |
pInternalDBData = pDB; |
267 |
nEndRow = nStartRow; |
|
|
268 |
} |
146 |
} |
269 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
147 |
else if ( nCol < nStartCol || nCol > nEndCol || nRow < nStartRow || nRow > nEndRow ) |
270 |
} |
|
|
271 |
|
272 |
sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab ); |
273 |
|
274 |
ScDBData* pNoNameData; |
275 |
sal_uInt16 nNoNameIndex; |
276 |
ScDBCollection* pColl = aDocument.GetDBCollection(); |
277 |
if ( eMode != SC_DB_IMPORT && |
278 |
pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nNoNameIndex ) ) |
279 |
{ |
280 |
pNoNameData = (*pColl)[nNoNameIndex]; |
281 |
|
282 |
if ( !pOldAutoDBRange ) |
283 |
{ |
148 |
{ |
284 |
// store the old unnamed database range with its settings for undo |
149 |
if ( !pNearData ) |
285 |
// (store at the first change, get the state before all changes) |
150 |
pNearData = pDB; // ersten angrenzenden Bereich merken |
286 |
pOldAutoDBRange = new ScDBData( *pNoNameData ); |
|
|
287 |
} |
151 |
} |
288 |
|
152 |
else |
289 |
SCCOL nOldX1; // alten Bereich sauber wegnehmen |
153 |
return pDB; // nicht "unbenannt" und Cursor steht wirklich drin |
290 |
SCROW nOldY1; //! (UNDO ???) |
154 |
} |
291 |
SCCOL nOldX2; |
155 |
} |
292 |
SCROW nOldY2; |
156 |
if (pNearData) |
293 |
SCTAB nOldTab; |
157 |
return pNearData; // angrenzender, wenn nichts direkt getroffen |
294 |
pNoNameData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
158 |
return pInternalDBData; |
295 |
DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
|
|
296 |
|
297 |
pNoNameData->SetSortParam( ScSortParam() ); // Parameter zuruecksetzen |
298 |
pNoNameData->SetQueryParam( ScQueryParam() ); |
299 |
pNoNameData->SetSubTotalParam( ScSubTotalParam() ); |
300 |
|
301 |
pNoNameData->SetArea( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); // neu setzen |
302 |
pNoNameData->SetByRow( sal_True ); |
303 |
pNoNameData->SetHeader( bHasHeader ); |
304 |
pNoNameData->SetAutoFilter( sal_False ); |
305 |
} |
306 |
else |
307 |
{ |
308 |
ScDBCollection* pUndoColl = NULL; |
309 |
|
310 |
String aNewName; |
311 |
if (eMode==SC_DB_IMPORT) |
312 |
{ |
313 |
aDocument.CompileDBFormula( sal_True ); // CreateFormulaString |
314 |
pUndoColl = new ScDBCollection( *pColl ); // Undo fuer Import1-Bereich |
315 |
|
316 |
String aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT ); |
317 |
long nCount = 0; |
318 |
sal_uInt16 nDummy; |
319 |
do |
320 |
{ |
321 |
++nCount; |
322 |
aNewName = aImport; |
323 |
aNewName += String::CreateFromInt32( nCount ); |
324 |
} |
325 |
while (pColl->SearchName( aNewName, nDummy )); |
326 |
} |
327 |
else |
328 |
//aNewName = ScGlobal::GetRscString( STR_DB_NONAME ); |
329 |
aNewName = pColl->GetNewDefaultDBName(); |
330 |
|
331 |
pNoNameData = new ScDBData( aNewName, nTab, |
332 |
nStartCol,nStartRow, nEndCol,nEndRow, |
333 |
sal_True, bHasHeader ); |
334 |
pColl->Insert( pNoNameData ); |
335 |
|
336 |
if ( pUndoColl ) |
337 |
{ |
338 |
aDocument.CompileDBFormula( sal_False ); // CompileFormulaString |
339 |
|
340 |
ScDBCollection* pRedoColl = new ScDBCollection( *pColl ); |
341 |
GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) ); |
342 |
} |
343 |
|
344 |
// neuen Bereich am Sba anmelden nicht mehr noetig |
345 |
|
346 |
// "Import1" etc am Navigator bekanntmachen |
347 |
if (eMode==SC_DB_IMPORT) |
348 |
SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); |
349 |
} |
350 |
pData = pNoNameData; |
351 |
} |
352 |
|
353 |
// if (bMark) |
354 |
// MarkRange( ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ), sal_False ); |
355 |
|
356 |
return pData; |
357 |
} |
159 |
} |
358 |
|
160 |
|
359 |
ScDBData* ScDocShell::GetDBDataAdd( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel ) |
161 |
ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGetDBSelection eSel ) |
360 |
{ |
162 |
{ |
361 |
SCCOL nCol = rMarked.aStart.Col(); |
163 |
const SCCOL nCol = rMarked.aStart.Col(); |
362 |
SCROW nRow = rMarked.aStart.Row(); |
164 |
const SCROW nRow = rMarked.aStart.Row(); |
363 |
SCTAB nTab = rMarked.aStart.Tab(); |
165 |
const SCTAB nTab = rMarked.aStart.Tab(); |
364 |
|
166 |
|
365 |
SCCOL nStartCol = nCol; |
167 |
SCCOL nStartCol = nCol; |
366 |
SCROW nStartRow = nRow; |
168 |
SCROW nStartRow = nRow; |
367 |
SCCOL nEndCol = rMarked.aEnd.Col(); |
169 |
SCCOL nEndCol = rMarked.aEnd.Col(); |
368 |
SCROW nEndRow = rMarked.aEnd.Row(); |
170 |
SCROW nEndRow = rMarked.aEnd.Row(); |
369 |
|
171 |
|
370 |
ScDBData* pData = NULL; |
172 |
ScDBData* pFoundDBData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
371 |
ScDBData* pCursorData; |
173 |
if ( pFoundDBData == NULL ) |
372 |
pCursorData = aDocument.GetDBAtArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
174 |
{ |
373 |
if ( !pCursorData ) |
175 |
pFoundDBData = lcl_GetDBNearCursor( aDocument.GetDBCollection(), nCol, nRow, nTab ); |
374 |
pCursorData = aDocument.GetDBAtCursor( nStartCol, nStartRow, nTab ); |
176 |
} |
375 |
|
|
|
376 |
//Get DBData at current table |
377 |
ScDBData* pTableData = aDocument.GetDBAtTable( nTab, eMode ); |
378 |
|
379 |
if ( eMode == SC_DB_OLD_FILTER ) |
380 |
return pTableData; |
381 |
|
177 |
|
382 |
sal_Bool bSelected = ( eSel == SC_DBSEL_FORCE_MARK || rMarked.aStart != rMarked.aEnd ); |
178 |
const bool bSelected = |
383 |
bool bOnlyDown = (!bSelected && eSel == SC_DBSEL_ROW_DOWN && rMarked.aStart.Row() == rMarked.aEnd.Row()); |
179 |
( eSel == SC_DBSEL_FORCE_MARK |
|
|
180 |
|| ( rMarked.aStart != rMarked.aEnd |
181 |
&& eSel != SC_DBSEL_ROW_DOWN ) ); |
182 |
const bool bOnlyDown = ( !bSelected |
183 |
&& eSel == SC_DBSEL_ROW_DOWN |
184 |
&& rMarked.aStart.Row() == rMarked.aEnd.Row()); |
384 |
|
185 |
|
385 |
sal_Bool bUseThis = sal_False; |
186 |
bool bUseFoundDBData = false; |
386 |
if (pCursorData) |
187 |
if ( pFoundDBData ) |
387 |
{ |
188 |
{ |
|
|
189 |
// check, if found database range can be used |
388 |
SCTAB nDummy; |
190 |
SCTAB nDummy; |
389 |
SCCOL nOldCol1; |
191 |
SCCOL nOldCol1; |
390 |
SCROW nOldRow1; |
192 |
SCROW nOldRow1; |
391 |
SCCOL nOldCol2; |
193 |
SCCOL nOldCol2; |
392 |
SCROW nOldRow2; |
194 |
SCROW nOldRow2; |
393 |
pCursorData->GetArea( nDummy, nOldCol1,nOldRow1, nOldCol2,nOldRow2 ); |
195 |
pFoundDBData->GetArea( nDummy, nOldCol1, nOldRow1, nOldCol2, nOldRow2 ); |
|
|
196 |
|
197 |
const bool bIsUnnamedOne = pFoundDBData->IsInternalUnnamed(); |
198 |
const bool bIsInternalForAutoFilter = pFoundDBData->IsInternalForAutoFilter(); |
394 |
if ( !bSelected ) |
199 |
if ( !bSelected ) |
395 |
{ |
200 |
{ |
396 |
ScRange tmpRange; |
201 |
bUseFoundDBData = true; |
397 |
if ( !pCursorData->IsBuildin() && pCursorData->GetAdvancedQuerySource(tmpRange)) |
202 |
if ( ( bIsUnnamedOne || bIsInternalForAutoFilter ) |
398 |
bUseThis = sal_True; |
203 |
&& ( eMode == SC_DB_MAKE || eMode == SC_DB_MAKE_AUTOFILTER ) ) |
399 |
else |
204 |
{ |
400 |
{ |
205 |
// If nothing marked or only one row marked, adapt found database range to contiguous area. |
401 |
nStartCol = nCol; |
206 |
nStartCol = nCol; |
402 |
nStartRow = nRow; |
207 |
nStartRow = nRow; |
403 |
nEndCol = nStartCol; |
208 |
if ( bOnlyDown ) |
404 |
nEndRow = nStartRow; |
209 |
{ |
405 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
210 |
nEndCol = rMarked.aEnd.Col(); |
406 |
if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow ) |
211 |
nEndRow = rMarked.aEnd.Row(); |
407 |
bUseThis = sal_False; |
212 |
} |
408 |
else |
213 |
else |
409 |
{ |
214 |
{ |
410 |
bUseThis = sal_True; |
215 |
nEndCol = nStartCol; |
411 |
if ( nOldRow2 != nEndRow )// Range of new end-line expand |
216 |
nEndRow = nStartRow; |
412 |
pCursorData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow ); |
217 |
} |
413 |
} |
218 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
|
|
219 |
if ( nOldCol1 != nStartCol || nOldCol2 != nEndCol || nOldRow1 != nStartRow ) |
220 |
{ |
221 |
bUseFoundDBData = false; |
222 |
} |
223 |
else if ( nOldRow2 != nEndRow ) |
224 |
{ |
225 |
// adapt found internal database range to new end row |
226 |
pFoundDBData->SetArea( nTab, nOldCol1,nOldRow1, nOldCol2,nEndRow ); |
227 |
} |
414 |
} |
228 |
} |
415 |
|
|
|
416 |
} |
229 |
} |
417 |
else |
230 |
else |
418 |
{ |
231 |
{ |
419 |
if ( nOldCol1 == nStartCol && nOldRow1 == nStartRow && nOldCol2 == nEndCol && nOldRow2 == nEndRow ) |
232 |
if ( nOldCol1 == nStartCol |
420 |
bUseThis = sal_True; |
233 |
&& nOldRow1 == nStartRow |
|
|
234 |
&& nOldCol2 == nEndCol |
235 |
&& nOldRow2 == nEndRow ) |
236 |
{ |
237 |
bUseFoundDBData = true; |
238 |
} |
421 |
else |
239 |
else |
422 |
bUseThis = sal_False; // Always take mark (Bug 11964) |
240 |
{ |
|
|
241 |
bUseFoundDBData = false; |
242 |
} |
423 |
} |
243 |
} |
424 |
} |
|
|
425 |
|
244 |
|
426 |
if ( bUseThis ) |
245 |
// adapt internal unnamed database range to an auto filter one |
427 |
{ |
246 |
// otherwise the auto filter is lost when the internal unnamed one is changed/reused/deleted |
428 |
pData = pCursorData; |
247 |
if ( bUseFoundDBData |
429 |
if ( pTableData && eMode == SC_DB_MAKE_FILTER && !(*pTableData == *pCursorData ) ) |
248 |
&& eMode == SC_DB_MAKE_AUTOFILTER |
|
|
249 |
&& bIsUnnamedOne ) |
430 |
{ |
250 |
{ |
431 |
if ( !pOldAutoDBRange ) |
251 |
pFoundDBData->SetName( aDocument.GetDBCollection()->GetNewDefaultDBName() ); |
432 |
pOldAutoDBRange = new ScDBData(*pTableData); |
252 |
} |
433 |
SCCOL nOldX1; |
|
|
434 |
SCROW nOldY1; |
435 |
SCCOL nOldX2; |
436 |
SCROW nOldY2; |
437 |
SCTAB nOldTab; |
438 |
pTableData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
439 |
|
440 |
if (pTableData->HasQueryParam()) |
441 |
{ |
442 |
ScQueryParam aParam; |
443 |
pTableData->GetQueryParam(aParam); |
444 |
SCSIZE nEC = aParam.GetEntryCount(); |
445 |
for (SCSIZE i=0; i<nEC; i++) |
446 |
aParam.GetEntry(i).bDoQuery = sal_False; |
447 |
aParam.bDuplicate = sal_True; |
448 |
ScDBDocFunc aDBDocFunc( *this ); |
449 |
aDBDocFunc.Query( nTab, aParam, NULL, sal_False, sal_False ); |
450 |
} |
451 |
|
253 |
|
452 |
DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
254 |
// no internal database range for Import |
453 |
pTableData->SetQueryParam( ScQueryParam() ); |
255 |
if ( bUseFoundDBData |
454 |
pTableData->SetAutoFilter( sal_False ); |
256 |
&& eMode == SC_DB_IMPORT |
|
|
257 |
&& ( bIsUnnamedOne || bIsInternalForAutoFilter ) ) |
258 |
{ |
259 |
bUseFoundDBData = false; |
455 |
} |
260 |
} |
|
|
261 |
} |
262 |
|
263 |
if ( bUseFoundDBData ) |
264 |
{ |
265 |
return pFoundDBData; |
266 |
} |
456 |
|
267 |
|
|
|
268 |
if ( eMode == SC_DB_OLD ) |
269 |
{ |
270 |
// no existing database range found |
271 |
return NULL; |
457 |
} |
272 |
} |
458 |
else |
273 |
else // eMode == SC_DB_MAKE||SC_DB_IMPORT||SC_DB_MAKE_AUTOFILTER |
459 |
{ |
274 |
{ |
460 |
if ( bSelected ) |
275 |
if ( !bSelected ) |
461 |
{ |
|
|
462 |
// bMark = sal_False; |
463 |
} |
464 |
else |
465 |
{ |
276 |
{ |
466 |
nStartCol = nCol; |
277 |
nStartCol = nCol; |
467 |
nStartRow = nRow; |
278 |
nStartRow = nRow; |
468 |
nEndCol = nStartCol; |
279 |
if (bOnlyDown) |
469 |
nEndRow = nStartRow; |
280 |
{ |
470 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
281 |
nEndCol = rMarked.aEnd.Col(); |
|
|
282 |
nEndRow = rMarked.aEnd.Row(); |
283 |
} |
284 |
else |
285 |
{ |
286 |
nEndCol = nStartCol; |
287 |
nEndRow = nStartRow; |
288 |
} |
289 |
aDocument.GetDataArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_False, bOnlyDown ); |
471 |
} |
290 |
} |
472 |
sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol,nStartRow, nEndCol,nEndRow, nTab ); |
291 |
|
|
|
292 |
const sal_Bool bHasHeader = aDocument.HasColHeader( nStartCol, nStartRow, nEndCol, nEndRow, nTab ); |
293 |
|
294 |
ScDBData* pDBData = NULL; |
295 |
sal_uInt16 nUnnamedDBIndex; |
473 |
ScDBCollection* pColl = aDocument.GetDBCollection(); |
296 |
ScDBCollection* pColl = aDocument.GetDBCollection(); |
474 |
if ( pTableData ) |
297 |
if ( eMode == SC_DB_MAKE && |
|
|
298 |
pColl->SearchName( ScGlobal::GetRscString( STR_DB_NONAME ), nUnnamedDBIndex ) ) |
475 |
{ |
299 |
{ |
|
|
300 |
// adapt existing unnamed database range |
301 |
pDBData = (*pColl)[nUnnamedDBIndex]; |
302 |
|
476 |
if ( !pOldAutoDBRange ) |
303 |
if ( !pOldAutoDBRange ) |
477 |
pOldAutoDBRange = new ScDBData(*pTableData); |
304 |
{ |
|
|
305 |
// store the old unnamed database range with its settings for undo |
306 |
// (store at the first change, get the state before all changes) |
307 |
pOldAutoDBRange = new ScDBData( *pDBData ); |
308 |
} |
309 |
|
478 |
SCCOL nOldX1; |
310 |
SCCOL nOldX1; |
479 |
SCROW nOldY1; |
311 |
SCROW nOldY1; |
480 |
SCCOL nOldX2; |
312 |
SCCOL nOldX2; |
481 |
SCROW nOldY2; |
313 |
SCROW nOldY2; |
482 |
SCTAB nOldTab; |
314 |
SCTAB nOldTab; |
483 |
pTableData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
315 |
pDBData->GetArea( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
|
|
316 |
DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
317 |
|
318 |
pDBData->SetSortParam( ScSortParam() ); |
319 |
pDBData->SetQueryParam( ScQueryParam() ); |
320 |
pDBData->SetSubTotalParam( ScSubTotalParam() ); |
321 |
|
322 |
pDBData->SetArea( nTab, nStartCol,nStartRow, nEndCol,nEndRow ); |
323 |
pDBData->SetByRow( sal_True ); |
324 |
pDBData->SetHeader( bHasHeader ); |
325 |
pDBData->SetAutoFilter( sal_False ); |
326 |
} |
327 |
else |
328 |
{ |
329 |
ScDBCollection* pUndoColl = NULL; |
330 |
|
331 |
String aNewName; |
332 |
switch ( eMode ) |
333 |
{ |
334 |
case SC_DB_IMPORT: |
335 |
{ |
336 |
aDocument.CompileDBFormula( sal_True ); |
337 |
pUndoColl = new ScDBCollection( *pColl ); |
338 |
|
339 |
String aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT ); |
340 |
long nCount = 0; |
341 |
sal_uInt16 nDummy; |
342 |
do |
343 |
{ |
344 |
++nCount; |
345 |
aNewName = aImport; |
346 |
aNewName += String::CreateFromInt32( nCount ); |
347 |
} |
348 |
while (pColl->SearchName( aNewName, nDummy )); |
349 |
} |
350 |
break; |
351 |
|
352 |
case SC_DB_MAKE_AUTOFILTER: |
353 |
{ |
354 |
aDocument.CompileDBFormula( sal_True ); |
355 |
pUndoColl = new ScDBCollection( *pColl ); |
356 |
|
357 |
aNewName = pColl->GetNewDefaultDBName(); |
358 |
} |
359 |
break; |
484 |
|
360 |
|
485 |
if (pTableData->HasQueryParam()) |
361 |
case SC_DB_MAKE: |
486 |
{ |
362 |
{ |
487 |
ScQueryParam aParam; |
363 |
aNewName = ScGlobal::GetRscString( STR_DB_NONAME ); |
488 |
pTableData->GetQueryParam(aParam); |
|
|
489 |
SCSIZE nEC = aParam.GetEntryCount(); |
490 |
for (SCSIZE i=0; i<nEC; i++) |
491 |
aParam.GetEntry(i).bDoQuery = sal_False; |
492 |
aParam.bDuplicate = sal_True; |
493 |
ScDBDocFunc aDBDocFunc( *this ); |
494 |
aDBDocFunc.Query( nTab, aParam, NULL, sal_False, sal_False ); |
495 |
} |
364 |
} |
|
|
365 |
break; |
496 |
|
366 |
|
497 |
DBAreaDeleted( nOldTab, nOldX1, nOldY1, nOldX2, nOldY2 ); |
367 |
default: |
|
|
368 |
DBG_ERROR( "<ScDocShell::GetDBData(..)> - unexcepted <eMode>" ); |
369 |
break; |
370 |
} |
498 |
|
371 |
|
499 |
pTableData->SetSortParam( ScSortParam() ); |
372 |
pDBData = new ScDBData( |
500 |
pTableData->SetQueryParam( ScQueryParam() ); |
373 |
aNewName, nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_True, bHasHeader ); |
501 |
pTableData->SetSubTotalParam( ScSubTotalParam() ); |
374 |
pColl->Insert( pDBData ); |
502 |
|
375 |
|
503 |
pTableData->SetArea( nTab, nStartCol, nStartRow, nEndCol, nEndRow ); |
376 |
if ( pUndoColl ) |
504 |
pTableData->SetByRow( sal_True ); |
377 |
{ |
505 |
pTableData->SetHeader( bHasHeader ); |
378 |
aDocument.CompileDBFormula( sal_False ); |
506 |
pTableData->SetAutoFilter( sal_False ); |
379 |
|
507 |
} |
380 |
ScDBCollection* pRedoColl = new ScDBCollection( *pColl ); |
508 |
else |
381 |
GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) ); |
509 |
{ |
382 |
} |
510 |
String aNewName = pColl->GetNewDefaultDBName(); |
383 |
|
511 |
pTableData = new ScDBData( aNewName, nTab, nStartCol,nStartRow, nEndCol,nEndRow, sal_True, bHasHeader ); |
384 |
// notify Navigator about database range "Import[X]" |
512 |
pColl->Insert( pTableData ); |
385 |
if ( eMode==SC_DB_IMPORT ) |
|
|
386 |
{ |
387 |
SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); |
388 |
} |
513 |
} |
389 |
} |
514 |
pData = pTableData; |
390 |
|
|
|
391 |
return pDBData; |
515 |
} |
392 |
} |
516 |
|
393 |
|
517 |
return pData; |
394 |
return NULL; // never reached |
518 |
} |
395 |
} |
519 |
|
396 |
|
520 |
|
397 |
|
Lines 656-676
void ScDocShell::RefreshPivotTables( const ScRange& rSource )
Link Here
|
656 |
|
533 |
|
657 |
String lcl_GetAreaName( ScDocument* pDoc, ScArea* pArea ) |
534 |
String lcl_GetAreaName( ScDocument* pDoc, ScArea* pArea ) |
658 |
{ |
535 |
{ |
659 |
String aName; |
536 |
String aName; |
660 |
sal_Bool bOk = sal_False; |
537 |
bool bOk = false; |
661 |
ScDBData* pData = pDoc->GetDBAtArea( pArea->nTab, pArea->nColStart, pArea->nRowStart, |
538 |
ScDBData* pData = pDoc->GetDBAtArea( pArea->nTab, pArea->nColStart, pArea->nRowStart, pArea->nColEnd, pArea->nRowEnd ); |
662 |
pArea->nColEnd, pArea->nRowEnd ); |
539 |
if (pData) |
663 |
if (pData) |
540 |
{ |
664 |
{ |
541 |
pData->GetName( aName ); |
665 |
pData->GetName( aName ); |
542 |
if ( !pData->IsInternalUnnamed() ) |
666 |
if ( aName != ScGlobal::GetRscString( STR_DB_NONAME ) ) |
543 |
bOk = true; |
667 |
bOk = sal_True; |
544 |
} |
668 |
} |
|
|
669 |
|
545 |
|
670 |
if (!bOk) |
546 |
if (!bOk) |
671 |
pDoc->GetName( pArea->nTab, aName ); |
547 |
{ |
|
|
548 |
pDoc->GetName( pArea->nTab, aName ); |
549 |
} |
672 |
|
550 |
|
673 |
return aName; |
551 |
return aName; |
674 |
} |
552 |
} |
675 |
|
553 |
|
676 |
void ScDocShell::DoConsolidate( const ScConsolidateParam& rParam, sal_Bool bRecord ) |
554 |
void ScDocShell::DoConsolidate( const ScConsolidateParam& rParam, sal_Bool bRecord ) |