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 "scitems.hxx"
21 : #include <editeng/eeitem.hxx>
22 :
23 : #include <editeng/editobj.hxx>
24 : #include <editeng/editstat.hxx>
25 : #include <editeng/editview.hxx>
26 : #include <editeng/flditem.hxx>
27 : #include <svx/hlnkitem.hxx>
28 : #include <editeng/langitem.hxx>
29 : #include <svx/svxerr.hxx>
30 : #include <editeng/unolingu.hxx>
31 :
32 : #include <sfx2/bindings.hxx>
33 : #include <sfx2/dispatch.hxx>
34 : #include <sfx2/docfile.hxx>
35 : #include <sfx2/fcontnr.hxx>
36 : #include <svtools/langtab.hxx>
37 : #include <svtools/filter.hxx>
38 : #include <svl/stritem.hxx>
39 : #include <svtools/transfer.hxx>
40 : #include <svl/urlbmk.hxx>
41 : #include <vcl/msgbox.hxx>
42 : #include <avmedia/mediawindow.hxx>
43 :
44 : #include <comphelper/storagehelper.hxx>
45 : #include <comphelper/processfactory.hxx>
46 :
47 : #include "viewfunc.hxx"
48 : #include "docsh.hxx"
49 : #include "document.hxx"
50 : #include "docpool.hxx"
51 : #include "globstr.hrc"
52 : #include "global.hxx"
53 : #include "undoblk.hxx"
54 : #include "undocell.hxx"
55 : #include "cell.hxx"
56 : #include "scmod.hxx"
57 : #include "spelleng.hxx"
58 : #include "patattr.hxx"
59 : #include "sc.hrc"
60 : #include "tabvwsh.hxx"
61 : #include "impex.hxx"
62 : #include "editutil.hxx"
63 : #include "editable.hxx"
64 : #include "dociter.hxx"
65 : #include "reffind.hxx"
66 : #include "compiler.hxx"
67 :
68 : using namespace com::sun::star;
69 :
70 : // STATIC DATA -----------------------------------------------------------
71 :
72 : sal_Bool bPasteIsDrop = false;
73 :
74 : //==================================================================
75 :
76 0 : void ScViewFunc::PasteRTF( SCCOL nStartCol, SCROW nStartRow,
77 : const ::com::sun::star::uno::Reference<
78 : ::com::sun::star::datatransfer::XTransferable >& rxTransferable )
79 : {
80 0 : TransferableDataHelper aDataHelper( rxTransferable );
81 0 : if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_EDITENGINE ) )
82 : {
83 0 : HideAllCursors();
84 :
85 0 : ScDocument* pUndoDoc = NULL;
86 :
87 0 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
88 0 : ScDocument* pDoc = pDocSh->GetDocument();
89 0 : SCTAB nTab = GetViewData()->GetTabNo();
90 0 : const sal_Bool bRecord (pDoc->IsUndoEnabled());
91 :
92 0 : const ScPatternAttr* pPattern = pDoc->GetPattern( nStartCol, nStartRow, nTab );
93 0 : ScTabEditEngine* pEngine = new ScTabEditEngine( *pPattern, pDoc->GetEnginePool() );
94 0 : pEngine->EnableUndo( false );
95 :
96 0 : Window* pActWin = GetActiveWin();
97 0 : if (pActWin)
98 : {
99 0 : pEngine->SetPaperSize(Size(100000,100000));
100 0 : Window aWin( pActWin );
101 0 : EditView aEditView( pEngine, &aWin );
102 0 : aEditView.SetOutputArea(Rectangle(0,0,100000,100000));
103 :
104 : // same method now for clipboard or drag&drop
105 : // mba: clipboard always must contain absolute URLs (could be from alien source)
106 0 : aEditView.InsertText( rxTransferable, String(), sal_True );
107 : }
108 :
109 0 : sal_uLong nParCnt = pEngine->GetParagraphCount();
110 0 : if (nParCnt)
111 : {
112 0 : SCROW nEndRow = nStartRow + static_cast<SCROW>(nParCnt) - 1;
113 0 : if (nEndRow > MAXROW)
114 0 : nEndRow = MAXROW;
115 :
116 0 : if (bRecord)
117 : {
118 0 : pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
119 0 : pUndoDoc->InitUndo( pDoc, nTab, nTab );
120 0 : pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nStartCol,nEndRow,nTab, IDF_ALL, false, pUndoDoc );
121 : }
122 :
123 0 : SCROW nRow = nStartRow;
124 :
125 : // Temporarily turn off undo generation for this lot
126 0 : bool bUndoEnabled = pDoc->IsUndoEnabled();
127 0 : pDoc->EnableUndo( false );
128 0 : for( sal_uInt16 n = 0; n < nParCnt; n++ )
129 : {
130 0 : EditTextObject* pObject = pEngine->CreateTextObject( n );
131 0 : EnterData( nStartCol, nRow, nTab, pObject, true );
132 0 : delete pObject;
133 0 : if( ++nRow > MAXROW )
134 0 : break;
135 : }
136 0 : pDoc->EnableUndo(bUndoEnabled);
137 :
138 0 : if (bRecord)
139 : {
140 0 : ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
141 0 : pRedoDoc->InitUndo( pDoc, nTab, nTab );
142 0 : pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nStartCol,nEndRow,nTab, IDF_ALL|IDF_NOCAPTIONS, false, pRedoDoc );
143 :
144 0 : ScMarkData aDestMark;
145 0 : aDestMark.SelectOneTable( nTab );
146 0 : pDocSh->GetUndoManager()->AddUndoAction(
147 : new ScUndoPaste(
148 : pDocSh, ScRange(nStartCol, nStartRow, nTab, nStartCol, nEndRow, nTab),
149 0 : aDestMark, pUndoDoc, pRedoDoc, IDF_ALL, NULL));
150 : }
151 : }
152 :
153 0 : delete pEngine;
154 :
155 0 : ShowAllCursors();
156 : }
157 : else
158 : {
159 0 : HideAllCursors();
160 0 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
161 : ScImportExport aImpEx( pDocSh->GetDocument(),
162 0 : ScAddress( nStartCol, nStartRow, GetViewData()->GetTabNo() ) );
163 :
164 0 : ::rtl::OUString aStr;
165 0 : SotStorageStreamRef xStream;
166 0 : if ( aDataHelper.GetSotStorageStream( SOT_FORMAT_RTF, xStream ) && xStream.Is() )
167 : // mba: clipboard always must contain absolute URLs (could be from alien source)
168 0 : aImpEx.ImportStream( *xStream, String(), SOT_FORMAT_RTF );
169 0 : else if ( aDataHelper.GetString( SOT_FORMAT_RTF, aStr ) )
170 0 : aImpEx.ImportString( aStr, SOT_FORMAT_RTF );
171 :
172 0 : AdjustRowHeight( nStartRow, aImpEx.GetRange().aEnd.Row() );
173 0 : pDocSh->UpdateOle(GetViewData());
174 0 : ShowAllCursors();
175 0 : }
176 0 : }
177 0 : void ScViewFunc::DoRefConversion( sal_Bool bRecord )
178 : {
179 0 : ScDocument* pDoc = GetViewData()->GetDocument();
180 0 : ScMarkData& rMark = GetViewData()->GetMarkData();
181 0 : SCTAB nTabCount = pDoc->GetTableCount();
182 0 : if (bRecord && !pDoc->IsUndoEnabled())
183 0 : bRecord = false;
184 :
185 0 : ScRange aMarkRange;
186 0 : rMark.MarkToSimple();
187 0 : sal_Bool bMulti = rMark.IsMultiMarked();
188 0 : if (bMulti)
189 0 : rMark.GetMultiMarkArea( aMarkRange );
190 0 : else if (rMark.IsMarked())
191 0 : rMark.GetMarkArea( aMarkRange );
192 : else
193 : {
194 0 : aMarkRange = ScRange( GetViewData()->GetCurX(),
195 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
196 : }
197 0 : ScEditableTester aTester( pDoc, aMarkRange.aStart.Col(), aMarkRange.aStart.Row(),
198 0 : aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(),rMark );
199 0 : if (!aTester.IsEditable())
200 : {
201 0 : ErrorMessage(aTester.GetMessageId());
202 0 : return;
203 : }
204 :
205 0 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
206 0 : sal_Bool bOk = false;
207 :
208 0 : ScDocument* pUndoDoc = NULL;
209 0 : if (bRecord)
210 : {
211 0 : pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
212 0 : SCTAB nTab = aMarkRange.aStart.Tab();
213 0 : pUndoDoc->InitUndo( pDoc, nTab, nTab );
214 :
215 0 : if ( rMark.GetSelectCount() > 1 )
216 : {
217 0 : ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
218 0 : for (; itr != itrEnd; ++itr)
219 0 : if ( *itr != nTab )
220 0 : pUndoDoc->AddUndoTab( *itr, *itr );
221 : }
222 0 : ScRange aCopyRange = aMarkRange;
223 0 : aCopyRange.aStart.SetTab(0);
224 0 : aCopyRange.aEnd.SetTab(nTabCount-1);
225 0 : pDoc->CopyToDocument( aCopyRange, IDF_ALL, bMulti, pUndoDoc, &rMark );
226 : }
227 :
228 0 : ScRangeListRef xRanges;
229 0 : GetViewData()->GetMultiArea( xRanges );
230 0 : size_t nCount = xRanges->size();
231 :
232 0 : ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
233 0 : for (; itr != itrEnd; ++itr)
234 : {
235 0 : SCTAB i = *itr;
236 0 : for (size_t j = 0; j < nCount; ++j)
237 : {
238 0 : ScRange aRange = *(*xRanges)[j];
239 0 : aRange.aStart.SetTab(i);
240 0 : aRange.aEnd.SetTab(i);
241 0 : ScCellIterator aIter( pDoc, aRange );
242 0 : ScBaseCell* pCell = aIter.GetFirst();
243 0 : while ( pCell )
244 : {
245 0 : if (pCell->GetCellType() == CELLTYPE_FORMULA)
246 : {
247 0 : rtl::OUString aOld;
248 0 : ((ScFormulaCell*)pCell)->GetFormula(aOld);
249 0 : xub_StrLen nLen = aOld.getLength();
250 0 : ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() );
251 0 : aFinder.ToggleRel( 0, nLen );
252 0 : if (aFinder.GetFound())
253 : {
254 0 : ScAddress aPos = ((ScFormulaCell*)pCell)->aPos;
255 0 : String aNew = aFinder.GetText();
256 0 : ScCompiler aComp( pDoc, aPos);
257 0 : aComp.SetGrammar(pDoc->GetGrammar());
258 0 : ScTokenArray* pArr = aComp.CompileString( aNew );
259 : ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos,
260 0 : pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE );
261 0 : pDoc->PutCell( aPos, pNewCell );
262 0 : bOk = sal_True;
263 0 : }
264 : }
265 0 : pCell = aIter.GetNext();
266 : }
267 : }
268 : }
269 0 : if (bRecord)
270 : {
271 0 : ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
272 0 : SCTAB nTab = aMarkRange.aStart.Tab();
273 0 : pRedoDoc->InitUndo( pDoc, nTab, nTab );
274 :
275 0 : if ( rMark.GetSelectCount() > 1 )
276 : {
277 0 : itr = rMark.begin();
278 0 : for (; itr != itrEnd; ++itr)
279 0 : if ( *itr != nTab )
280 0 : pRedoDoc->AddUndoTab( *itr, *itr );
281 : }
282 0 : ScRange aCopyRange = aMarkRange;
283 0 : aCopyRange.aStart.SetTab(0);
284 0 : aCopyRange.aEnd.SetTab(nTabCount-1);
285 0 : pDoc->CopyToDocument( aCopyRange, IDF_ALL, bMulti, pRedoDoc, &rMark );
286 :
287 0 : pDocSh->GetUndoManager()->AddUndoAction(
288 : new ScUndoRefConversion( pDocSh,
289 0 : aMarkRange, rMark, pUndoDoc, pRedoDoc, bMulti, IDF_ALL) );
290 : }
291 :
292 0 : pDocSh->PostPaint( aMarkRange, PAINT_GRID );
293 0 : pDocSh->UpdateOle(GetViewData());
294 0 : pDocSh->SetDocumentModified();
295 0 : CellContentChanged();
296 :
297 0 : if (!bOk)
298 0 : ErrorMessage(STR_ERR_NOREF);
299 : }
300 : // Thesaurus - Undo ok
301 0 : void ScViewFunc::DoThesaurus( sal_Bool bRecord )
302 : {
303 : SCCOL nCol;
304 : SCROW nRow;
305 : SCTAB nTab;
306 0 : ScDocShell* pDocSh = GetViewData()->GetDocShell();
307 0 : ScDocument* pDoc = pDocSh->GetDocument();
308 0 : ScMarkData& rMark = GetViewData()->GetMarkData();
309 0 : ScSplitPos eWhich = GetViewData()->GetActivePart();
310 : CellType eCellType;
311 : EESpellState eState;
312 0 : String sOldText, sNewString;
313 0 : EditTextObject* pOldTObj = NULL;
314 0 : const EditTextObject* pTObject = NULL;
315 0 : ScBaseCell* pCell = NULL;
316 0 : EditView* pEditView = NULL;
317 0 : ESelection* pEditSel = NULL;
318 : ScEditEngineDefaulter* pThesaurusEngine;
319 0 : sal_Bool bIsEditMode = GetViewData()->HasEditView(eWhich);
320 0 : if (bRecord && !pDoc->IsUndoEnabled())
321 0 : bRecord = false;
322 0 : if (bIsEditMode) // Edit-Mode aktiv
323 : {
324 0 : GetViewData()->GetEditView(eWhich, pEditView, nCol, nRow);
325 0 : pEditSel = new ESelection(pEditView->GetSelection());
326 0 : SC_MOD()->InputEnterHandler();
327 0 : GetViewData()->GetBindings().Update(); // sonst kommt der Sfx durcheinander...
328 : }
329 : else
330 : {
331 0 : nCol = GetViewData()->GetCurX();
332 0 : nRow = GetViewData()->GetCurY();
333 : }
334 0 : nTab = GetViewData()->GetTabNo();
335 :
336 0 : ScEditableTester aTester( pDoc, nCol, nRow, nCol, nRow, rMark );
337 0 : if (!aTester.IsEditable())
338 : {
339 0 : ErrorMessage(aTester.GetMessageId());
340 0 : delete pEditSel;
341 : return;
342 : }
343 0 : pDoc->GetCellType(nCol, nRow, nTab, eCellType);
344 0 : if (eCellType != CELLTYPE_STRING && eCellType != CELLTYPE_EDIT)
345 : {
346 0 : ErrorMessage(STR_THESAURUS_NO_STRING);
347 : return;
348 : }
349 :
350 : com::sun::star::uno::Reference<com::sun::star::linguistic2::XSpellChecker1>
351 0 : xSpeller = LinguMgr::GetSpellChecker();
352 :
353 0 : pThesaurusEngine = new ScEditEngineDefaulter( pDoc->GetEnginePool() );
354 0 : pThesaurusEngine->SetEditTextObjectPool( pDoc->GetEditPool() );
355 0 : pThesaurusEngine->SetRefDevice(GetViewData()->GetActiveWin());
356 0 : pThesaurusEngine->SetSpeller(xSpeller);
357 0 : MakeEditView(pThesaurusEngine, nCol, nRow );
358 0 : const ScPatternAttr* pPattern = NULL;
359 0 : SfxItemSet* pEditDefaults = new SfxItemSet(pThesaurusEngine->GetEmptyItemSet());
360 0 : pPattern = pDoc->GetPattern(nCol, nRow, nTab);
361 0 : if (pPattern )
362 : {
363 0 : pPattern->FillEditItemSet( pEditDefaults );
364 0 : pThesaurusEngine->SetDefaults( *pEditDefaults );
365 : }
366 :
367 0 : if (eCellType == CELLTYPE_STRING)
368 : {
369 0 : pDoc->GetString(nCol, nRow, nTab, sOldText);
370 0 : pThesaurusEngine->SetText(sOldText);
371 : }
372 0 : else if (eCellType == CELLTYPE_EDIT)
373 : {
374 0 : pDoc->GetCell(nCol, nRow, nTab, pCell);
375 0 : if (pCell)
376 : {
377 0 : ((ScEditCell*) pCell)->GetData(pTObject);
378 0 : if (pTObject)
379 : {
380 0 : pOldTObj = pTObject->Clone();
381 0 : pThesaurusEngine->SetText(*pTObject);
382 : }
383 : }
384 : }
385 : else
386 : {
387 : OSL_FAIL("DoThesaurus: Keine String oder Editzelle");
388 : }
389 0 : pEditView = GetViewData()->GetEditView(GetViewData()->GetActivePart());
390 0 : if (pEditSel)
391 0 : pEditView->SetSelection(*pEditSel);
392 : else
393 0 : pEditView->SetSelection(ESelection(0,0,0,0));
394 :
395 0 : pThesaurusEngine->ClearModifyFlag();
396 :
397 : // language is now in EditEngine attributes -> no longer passed to StartThesaurus
398 :
399 0 : eState = pEditView->StartThesaurus();
400 : OSL_ENSURE(eState != EE_SPELL_NOSPELLER, "No SpellChecker");
401 :
402 0 : if (eState == EE_SPELL_ERRORFOUND) // sollte spaeter durch Wrapper geschehen!
403 : {
404 0 : LanguageType eLnge = ScViewUtil::GetEffLanguage( pDoc, ScAddress( nCol, nRow, nTab ) );
405 0 : SvtLanguageTable aLangTab;
406 0 : String aErr = aLangTab.GetString(eLnge);
407 0 : aErr += ScGlobal::GetRscString( STR_SPELLING_NO_LANG );
408 0 : InfoBox aBox( GetViewData()->GetDialogParent(), aErr );
409 0 : aBox.Execute();
410 : }
411 0 : if (pThesaurusEngine->IsModified())
412 : {
413 0 : EditTextObject* pNewTObj = NULL;
414 0 : if (pCell && pTObject)
415 : {
416 0 : pNewTObj = pThesaurusEngine->CreateTextObject();
417 : pCell = new ScEditCell( pNewTObj, pDoc,
418 0 : pThesaurusEngine->GetEditTextObjectPool() );
419 0 : pDoc->PutCell( nCol, nRow, nTab, pCell );
420 : }
421 : else
422 : {
423 0 : sNewString = pThesaurusEngine->GetText();
424 0 : pDoc->SetString(nCol, nRow, nTab, sNewString);
425 : }
426 : // erack! it's broadcasted
427 : // pDoc->SetDirty();
428 0 : pDocSh->SetDocumentModified();
429 0 : if (bRecord)
430 : {
431 0 : GetViewData()->GetDocShell()->GetUndoManager()->AddUndoAction(
432 0 : new ScUndoThesaurus( GetViewData()->GetDocShell(),
433 : nCol, nRow, nTab,
434 0 : sOldText, pOldTObj, sNewString, pNewTObj));
435 : }
436 0 : delete pNewTObj;
437 : }
438 0 : KillEditView(sal_True);
439 0 : delete pEditDefaults;
440 0 : delete pThesaurusEngine;
441 0 : delete pOldTObj;
442 0 : delete pEditSel;
443 0 : pDocSh->PostPaintGridAll();
444 : }
445 :
446 0 : void ScViewFunc::DoHangulHanjaConversion( sal_Bool bRecord )
447 : {
448 0 : ScConversionParam aConvParam( SC_CONVERSION_HANGULHANJA, LANGUAGE_KOREAN, 0, true );
449 0 : DoSheetConversion( aConvParam, bRecord );
450 0 : }
451 :
452 0 : void ScViewFunc::DoSheetConversion( const ScConversionParam& rConvParam, sal_Bool bRecord )
453 : {
454 : SCCOL nCol;
455 : SCROW nRow;
456 : SCTAB nTab;
457 0 : ScViewData& rViewData = *GetViewData();
458 0 : ScDocShell* pDocSh = rViewData.GetDocShell();
459 0 : ScDocument* pDoc = pDocSh->GetDocument();
460 0 : ScMarkData& rMark = rViewData.GetMarkData();
461 0 : ScSplitPos eWhich = rViewData.GetActivePart();
462 0 : EditView* pEditView = NULL;
463 0 : sal_Bool bIsEditMode = rViewData.HasEditView(eWhich);
464 0 : if (bRecord && !pDoc->IsUndoEnabled())
465 0 : bRecord = false;
466 0 : if (bIsEditMode) // Edit-Mode aktiv
467 : {
468 0 : rViewData.GetEditView(eWhich, pEditView, nCol, nRow);
469 0 : SC_MOD()->InputEnterHandler();
470 : }
471 : else
472 : {
473 0 : nCol = rViewData.GetCurX();
474 0 : nRow = rViewData.GetCurY();
475 :
476 0 : AlignToCursor( nCol, nRow, SC_FOLLOW_JUMP);
477 : }
478 0 : nTab = rViewData.GetTabNo();
479 :
480 0 : rMark.MarkToMulti();
481 0 : sal_Bool bMarked = rMark.IsMultiMarked();
482 0 : if (bMarked)
483 : {
484 0 : ScEditableTester aTester( pDoc, rMark );
485 0 : if (!aTester.IsEditable())
486 : {
487 0 : ErrorMessage(aTester.GetMessageId());
488 0 : return;
489 0 : }
490 : }
491 :
492 0 : ScDocument* pUndoDoc = NULL;
493 0 : ScDocument* pRedoDoc = NULL;
494 0 : if (bRecord)
495 : {
496 0 : pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
497 0 : pUndoDoc->InitUndo( pDoc, nTab, nTab );
498 0 : pRedoDoc = new ScDocument( SCDOCMODE_UNDO );
499 0 : pRedoDoc->InitUndo( pDoc, nTab, nTab );
500 :
501 0 : if ( rMark.GetSelectCount() > 1 )
502 : {
503 0 : ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end();
504 0 : for (; itr != itrEnd; ++itr)
505 0 : if ( *itr != nTab )
506 : {
507 0 : pUndoDoc->AddUndoTab( *itr, *itr );
508 0 : pRedoDoc->AddUndoTab( *itr, *itr );
509 : }
510 : }
511 : }
512 :
513 : // ab hier kein return mehr
514 :
515 0 : sal_Bool bOldDis = pDoc->IsIdleDisabled();
516 0 : pDoc->DisableIdle( true ); // stop online spelling
517 :
518 : // *** create and init the edit engine *** --------------------------------
519 :
520 0 : ScConversionEngineBase* pEngine = NULL;
521 0 : switch( rConvParam.GetType() )
522 : {
523 : case SC_CONVERSION_SPELLCHECK:
524 : pEngine = new ScSpellingEngine(
525 0 : pDoc->GetEnginePool(), rViewData, pUndoDoc, pRedoDoc, LinguMgr::GetSpellChecker() );
526 0 : break;
527 : case SC_CONVERSION_HANGULHANJA:
528 : case SC_CONVERSION_CHINESE_TRANSL:
529 : pEngine = new ScTextConversionEngine(
530 0 : pDoc->GetEnginePool(), rViewData, rConvParam, pUndoDoc, pRedoDoc );
531 0 : break;
532 : default:
533 : OSL_FAIL( "ScViewFunc::DoSheetConversion - unknown conversion type" );
534 : }
535 :
536 0 : MakeEditView( pEngine, nCol, nRow );
537 0 : pEngine->SetRefDevice( rViewData.GetActiveWin() );
538 : // dummy Zelle simulieren:
539 0 : pEditView = rViewData.GetEditView( rViewData.GetActivePart() );
540 0 : rViewData.SetSpellingView( pEditView );
541 0 : Rectangle aRect( Point( 0, 0 ), Point( 0, 0 ) );
542 0 : pEditView->SetOutputArea( aRect );
543 0 : pEngine->SetControlWord( EE_CNTRL_USECHARATTRIBS );
544 0 : pEngine->EnableUndo( false );
545 0 : pEngine->SetPaperSize( aRect.GetSize() );
546 0 : pEngine->SetText( EMPTY_STRING );
547 :
548 : // *** do the conversion *** ----------------------------------------------
549 :
550 0 : pEngine->ClearModifyFlag();
551 0 : pEngine->ConvertAll( *pEditView );
552 :
553 : // *** undo/redo *** ------------------------------------------------------
554 :
555 0 : if( pEngine->IsAnyModified() )
556 : {
557 0 : if (bRecord)
558 : {
559 0 : SCCOL nNewCol = rViewData.GetCurX();
560 0 : SCROW nNewRow = rViewData.GetCurY();
561 0 : rViewData.GetDocShell()->GetUndoManager()->AddUndoAction(
562 : new ScUndoConversion(
563 : pDocSh, rMark,
564 : nCol, nRow, nTab, pUndoDoc,
565 0 : nNewCol, nNewRow, nTab, pRedoDoc, rConvParam ) );
566 : }
567 0 : pDoc->SetDirty();
568 0 : pDocSh->SetDocumentModified();
569 : }
570 : else
571 : {
572 0 : delete pUndoDoc;
573 0 : delete pRedoDoc;
574 : }
575 :
576 : // *** final cleanup *** --------------------------------------------------
577 :
578 0 : rViewData.SetSpellingView( NULL );
579 0 : KillEditView(sal_True);
580 0 : delete pEngine;
581 0 : pDocSh->PostPaintGridAll();
582 0 : rViewData.GetViewShell()->UpdateInputHandler();
583 0 : pDoc->DisableIdle(bOldDis);
584 : }
585 :
586 : // Pasten von FORMAT_FILE-Items
587 : // wird nicht direkt aus Drop aufgerufen, sondern asynchron -> Dialoge sind erlaubt
588 :
589 0 : sal_Bool ScViewFunc::PasteFile( const Point& rPos, const String& rFile, sal_Bool bLink )
590 : {
591 0 : INetURLObject aURL;
592 0 : aURL.SetSmartURL( rFile );
593 0 : String aStrURL = aURL.GetMainURL( INetURLObject::NO_DECODE );
594 :
595 : // is it a media URL?
596 0 : if( ::avmedia::MediaWindow::isMediaURL( aStrURL ) )
597 : {
598 0 : const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, aStrURL );
599 0 : return sal_Bool( 0 != GetViewData()->GetDispatcher().Execute(
600 : SID_INSERT_AVMEDIA, SFX_CALLMODE_SYNCHRON,
601 0 : &aMediaURLItem, 0L ) );
602 : }
603 :
604 0 : if (!bLink) // bei bLink nur Grafik oder URL
605 : {
606 : // 1. Kann ich die Datei oeffnen?
607 0 : const SfxFilter* pFlt = NULL;
608 :
609 : // nur nach eigenen Filtern suchen, ohne Auswahlbox (wie in ScDocumentLoader)
610 0 : SfxFilterMatcher aMatcher( ScDocShell::Factory().GetFilterContainer()->GetName() );
611 0 : SfxMedium aSfxMedium( aStrURL, (STREAM_READ | STREAM_SHARE_DENYNONE) );
612 : // #i73992# GuessFilter no longer calls UseInteractionHandler.
613 : // This is UI, so it can be called here.
614 0 : aSfxMedium.UseInteractionHandler(sal_True);
615 0 : ErrCode nErr = aMatcher.GuessFilter( aSfxMedium, &pFlt );
616 :
617 0 : if ( pFlt && !nErr )
618 : {
619 : // Code aus dem SFX geklaut!
620 0 : SfxDispatcher &rDispatcher = GetViewData()->GetDispatcher();
621 0 : SfxStringItem aFileNameItem( SID_FILE_NAME, aStrURL );
622 0 : SfxStringItem aFilterItem( SID_FILTER_NAME, pFlt->GetName() );
623 : // #i69524# add target, as in SfxApplication when the Open dialog is used
624 0 : SfxStringItem aTargetItem( SID_TARGETNAME, rtl::OUString("_default") );
625 :
626 : // Asynchron oeffnen, kann naemlich auch aus D&D heraus passieren
627 : // und das bekommt dem MAC nicht so gut ...
628 : return sal_Bool( 0 != rDispatcher.Execute( SID_OPENDOC,
629 0 : SFX_CALLMODE_ASYNCHRON, &aFileNameItem, &aFilterItem, &aTargetItem, 0L) );
630 0 : }
631 : }
632 :
633 : // 2. Kann die Datei ueber die Grafik-Filter eingefuegt werden?
634 : // (als Link, weil Gallery das so anbietet)
635 :
636 : sal_uInt16 nFilterFormat;
637 0 : Graphic aGraphic;
638 0 : GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter();
639 :
640 :
641 0 : if (!rGraphicFilter.ImportGraphic(aGraphic, aURL,
642 0 : GRFILTER_FORMAT_DONTKNOW, &nFilterFormat ))
643 : {
644 0 : if ( bLink )
645 : {
646 0 : String aFltName = rGraphicFilter.GetImportFormatName(nFilterFormat);
647 0 : return PasteGraphic( rPos, aGraphic, aStrURL, aFltName );
648 : }
649 : else
650 : {
651 : // #i76709# if bLink isn't set, pass empty URL/filter, so a non-linked image is inserted
652 0 : return PasteGraphic( rPos, aGraphic, EMPTY_STRING, EMPTY_STRING );
653 : }
654 : }
655 :
656 0 : if (bLink) // bei bLink alles, was nicht Grafik ist, als URL
657 : {
658 0 : Rectangle aRect( rPos, Size(0,0) );
659 : ScRange aRange = GetViewData()->GetDocument()->
660 0 : GetRange( GetViewData()->GetTabNo(), aRect );
661 0 : SCCOL nPosX = aRange.aStart.Col();
662 0 : SCROW nPosY = aRange.aStart.Row();
663 :
664 0 : InsertBookmark( aStrURL, aStrURL, nPosX, nPosY );
665 0 : return sal_True;
666 : }
667 : else
668 : {
669 : // 3. Kann die Datei als OLE eingefuegt werden?
670 : // auch nicht-Storages, z.B. Sounds (#38282#)
671 0 : uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage();
672 :
673 : //TODO/LATER: what about "bLink"?
674 :
675 0 : uno::Sequence < beans::PropertyValue > aMedium(1);
676 0 : aMedium[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
677 0 : aMedium[0].Value <<= ::rtl::OUString( aStrURL );
678 :
679 0 : comphelper::EmbeddedObjectContainer aCnt( xStorage );
680 0 : ::rtl::OUString aName;
681 0 : uno::Reference < embed::XEmbeddedObject > xObj = aCnt.InsertEmbeddedObject( aMedium, aName );
682 0 : if( xObj.is() )
683 0 : return PasteObject( rPos, xObj );
684 :
685 : // If an OLE object can't be created, insert a URL button
686 :
687 0 : GetViewData()->GetViewShell()->InsertURLButton( aStrURL, aStrURL, EMPTY_STRING, &rPos );
688 0 : return sal_True;
689 0 : }
690 : }
691 :
692 0 : sal_Bool ScViewFunc::PasteBookmark( sal_uLong nFormatId,
693 : const ::com::sun::star::uno::Reference<
694 : ::com::sun::star::datatransfer::XTransferable >& rxTransferable,
695 : SCCOL nPosX, SCROW nPosY )
696 : {
697 0 : INetBookmark aBookmark;
698 0 : TransferableDataHelper aDataHelper( rxTransferable );
699 0 : if ( !aDataHelper.GetINetBookmark( nFormatId, aBookmark ) )
700 0 : return false;
701 :
702 0 : InsertBookmark( aBookmark.GetDescription(), aBookmark.GetURL(), nPosX, nPosY );
703 0 : return sal_True;
704 : }
705 :
706 0 : void ScViewFunc::InsertBookmark( const String& rDescription, const String& rURL,
707 : SCCOL nPosX, SCROW nPosY, const String* pTarget,
708 : sal_Bool bTryReplace )
709 : {
710 0 : ScViewData* pViewData = GetViewData();
711 0 : if ( pViewData->HasEditView( pViewData->GetActivePart() ) &&
712 0 : nPosX >= pViewData->GetEditStartCol() && nPosX <= pViewData->GetEditEndCol() &&
713 0 : nPosY >= pViewData->GetEditStartRow() && nPosY <= pViewData->GetEditEndRow() )
714 : {
715 : // in die gerade editierte Zelle einfuegen
716 :
717 0 : String aTargetFrame;
718 0 : if (pTarget)
719 0 : aTargetFrame = *pTarget;
720 0 : pViewData->GetViewShell()->InsertURLField( rDescription, rURL, aTargetFrame );
721 0 : return;
722 : }
723 :
724 : // in nicht editierte Zelle einfuegen
725 :
726 0 : ScDocument* pDoc = GetViewData()->GetDocument();
727 0 : SCTAB nTab = GetViewData()->GetTabNo();
728 0 : ScAddress aCellPos( nPosX, nPosY, nTab );
729 0 : ScBaseCell* pCell = pDoc->GetCell( aCellPos );
730 0 : EditEngine aEngine( pDoc->GetEnginePool() );
731 0 : if (pCell)
732 : {
733 0 : if (pCell->GetCellType() == CELLTYPE_EDIT)
734 : {
735 0 : const EditTextObject* pOld = ((ScEditCell*)pCell)->GetData();
736 0 : if (pOld)
737 0 : aEngine.SetText(*pOld);
738 : }
739 : else
740 : {
741 0 : String aOld;
742 0 : pDoc->GetInputString( nPosX, nPosY, nTab, aOld );
743 0 : if (aOld.Len())
744 0 : aEngine.SetText(aOld);
745 : }
746 : }
747 :
748 0 : sal_uInt16 nPara = aEngine.GetParagraphCount();
749 0 : if (nPara)
750 0 : --nPara;
751 0 : xub_StrLen nTxtLen = aEngine.GetTextLen(nPara);
752 0 : ESelection aInsSel( nPara, nTxtLen, nPara, nTxtLen );
753 :
754 0 : if ( bTryReplace && HasBookmarkAtCursor( NULL ) )
755 : {
756 : // if called from hyperlink slot and cell contains only a URL,
757 : // replace old URL with new one
758 :
759 0 : aInsSel = ESelection( 0, 0, 0, 1 ); // replace first character (field)
760 : }
761 :
762 0 : SvxURLField aField( rURL, rDescription, SVXURLFORMAT_APPDEFAULT );
763 0 : if (pTarget)
764 0 : aField.SetTargetFrame(*pTarget);
765 0 : aEngine.QuickInsertField( SvxFieldItem( aField, EE_FEATURE_FIELD ), aInsSel );
766 :
767 0 : EditTextObject* pData = aEngine.CreateTextObject();
768 0 : EnterData( nPosX, nPosY, nTab, pData );
769 0 : delete pData;
770 : }
771 :
772 0 : sal_Bool ScViewFunc::HasBookmarkAtCursor( SvxHyperlinkItem* pContent )
773 : {
774 0 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
775 0 : ScDocument* pDoc = GetViewData()->GetDocShell()->GetDocument();
776 :
777 0 : ScBaseCell* pCell = pDoc->GetCell( aPos );
778 0 : if ( pCell && pCell->GetCellType() == CELLTYPE_EDIT )
779 : {
780 0 : const EditTextObject* pData = ((ScEditCell*)pCell)->GetData();
781 0 : if (pData)
782 : {
783 0 : sal_Bool bField = pData->IsFieldObject();
784 0 : if (bField)
785 : {
786 0 : const SvxFieldItem* pFieldItem = pData->GetField();
787 0 : if (pFieldItem)
788 : {
789 0 : const SvxFieldData* pField = pFieldItem->GetField();
790 0 : if ( pField && pField->ISA(SvxURLField) )
791 : {
792 0 : if (pContent)
793 : {
794 0 : const SvxURLField* pURLField = (const SvxURLField*)pField;
795 0 : pContent->SetName( pURLField->GetRepresentation() );
796 0 : pContent->SetURL( pURLField->GetURL() );
797 0 : pContent->SetTargetFrame( pURLField->GetTargetFrame() );
798 : }
799 0 : return sal_True;
800 : }
801 : }
802 : }
803 : }
804 : }
805 0 : return false;
806 15 : }
807 :
808 :
809 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|