xref: /aoo41x/main/sc/source/ui/view/viewfun4.cxx (revision cdf0e10c)
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