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