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