diff options
Diffstat (limited to 'sc/source/ui/view/viewfun4.cxx')
-rw-r--r-- | sc/source/ui/view/viewfun4.cxx | 828 |
1 files changed, 0 insertions, 828 deletions
diff --git a/sc/source/ui/view/viewfun4.cxx b/sc/source/ui/view/viewfun4.cxx deleted file mode 100644 index 688dbc76a..000000000 --- a/sc/source/ui/view/viewfun4.cxx +++ /dev/null @@ -1,828 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -// INCLUDE --------------------------------------------------------------- - -#include "scitems.hxx" -#include <editeng/eeitem.hxx> - -#include <editeng/editobj.hxx> -#include <editeng/editstat.hxx> -#include <editeng/editview.hxx> -#include <editeng/flditem.hxx> -#include <svx/hlnkitem.hxx> -#include <editeng/langitem.hxx> -#include <svx/svxerr.hxx> -#include <editeng/unolingu.hxx> - -#include <sfx2/bindings.hxx> -#include <sfx2/dispatch.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/fcontnr.hxx> -#include <svtools/langtab.hxx> -#include <svtools/filter.hxx> -#include <svl/stritem.hxx> -#include <svtools/transfer.hxx> -#include <svl/urlbmk.hxx> -#include <vcl/msgbox.hxx> -#include <avmedia/mediawindow.hxx> - -#include <comphelper/storagehelper.hxx> -#include <comphelper/processfactory.hxx> - -#include "viewfunc.hxx" -#include "docsh.hxx" -#include "docsh.hxx" -#include "document.hxx" -#include "docpool.hxx" -#include "globstr.hrc" -#include "global.hxx" -#include "undoblk.hxx" -#include "undocell.hxx" -#include "cell.hxx" -#include "scmod.hxx" -#include "spelleng.hxx" -#include "patattr.hxx" -#include "sc.hrc" -#include "tabvwsh.hxx" -#include "impex.hxx" -#include "editutil.hxx" -#include "editable.hxx" -#include "dociter.hxx" -#include "reffind.hxx" -#include "compiler.hxx" - -using namespace com::sun::star; - -// STATIC DATA ----------------------------------------------------------- - -sal_Bool bPasteIsDrop = false; - -//================================================================== - -void ScViewFunc::PasteRTF( SCCOL nStartCol, SCROW nStartRow, - const ::com::sun::star::uno::Reference< - ::com::sun::star::datatransfer::XTransferable >& rxTransferable ) -{ - TransferableDataHelper aDataHelper( rxTransferable ); - if ( aDataHelper.HasFormat( SOT_FORMATSTR_ID_EDITENGINE ) ) - { - HideAllCursors(); - - ScDocument* pUndoDoc = NULL; - - ScDocShell* pDocSh = GetViewData()->GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetViewData()->GetTabNo(); - const sal_Bool bRecord (pDoc->IsUndoEnabled()); - - const ScPatternAttr* pPattern = pDoc->GetPattern( nStartCol, nStartRow, nTab ); - ScTabEditEngine* pEngine = new ScTabEditEngine( *pPattern, pDoc->GetEnginePool() ); - pEngine->EnableUndo( false ); - - Window* pActWin = GetActiveWin(); - if (pActWin) - { - pEngine->SetPaperSize(Size(100000,100000)); - Window aWin( pActWin ); - EditView aEditView( pEngine, &aWin ); - aEditView.SetOutputArea(Rectangle(0,0,100000,100000)); - - // same method now for clipboard or drag&drop - // mba: clipboard always must contain absolute URLs (could be from alien source) - aEditView.InsertText( rxTransferable, String(), sal_True ); - } - - sal_uLong nParCnt = pEngine->GetParagraphCount(); - if (nParCnt) - { - SCROW nEndRow = nStartRow + static_cast<SCROW>(nParCnt) - 1; - if (nEndRow > MAXROW) - nEndRow = MAXROW; - - if (bRecord) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nStartCol,nEndRow,nTab, IDF_ALL, false, pUndoDoc ); - } - - SCROW nRow = nStartRow; - for( sal_uInt16 n = 0; n < nParCnt; n++ ) - { - EditTextObject* pObject = pEngine->CreateTextObject( n ); - EnterData( nStartCol, nRow, nTab, pObject, false, sal_True ); - // kein Undo, auf einfache Strings testen - delete pObject; - if( ++nRow > MAXROW ) - break; - } - - if (bRecord) - { - ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO ); - pRedoDoc->InitUndo( pDoc, nTab, nTab ); - pDoc->CopyToDocument( nStartCol,nStartRow,nTab, nStartCol,nEndRow,nTab, IDF_ALL|IDF_NOCAPTIONS, false, pRedoDoc ); - - ScMarkData aDestMark; - aDestMark.SelectOneTable( nTab ); - pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoPaste( pDocSh, nStartCol,nStartRow,nTab, nStartCol,nEndRow,nTab, - aDestMark, - pUndoDoc, pRedoDoc, IDF_ALL, NULL,NULL,NULL,NULL ) ); - } - } - - delete pEngine; - - ShowAllCursors(); - } - else - { - HideAllCursors(); - ScDocShell* pDocSh = GetViewData()->GetDocShell(); - ScImportExport aImpEx( pDocSh->GetDocument(), - ScAddress( nStartCol, nStartRow, GetViewData()->GetTabNo() ) ); - - ::rtl::OUString aStr; - SotStorageStreamRef xStream; - if ( aDataHelper.GetSotStorageStream( SOT_FORMAT_RTF, xStream ) && xStream.Is() ) - // mba: clipboard always must contain absolute URLs (could be from alien source) - aImpEx.ImportStream( *xStream, String(), SOT_FORMAT_RTF ); - else if ( aDataHelper.GetString( SOT_FORMAT_RTF, aStr ) ) - aImpEx.ImportString( aStr, SOT_FORMAT_RTF ); - - AdjustRowHeight( nStartRow, aImpEx.GetRange().aEnd.Row() ); - pDocSh->UpdateOle(GetViewData()); - ShowAllCursors(); - } -} -void ScViewFunc::DoRefConversion( sal_Bool bRecord ) -{ - ScDocument* pDoc = GetViewData()->GetDocument(); - ScMarkData& rMark = GetViewData()->GetMarkData(); - SCTAB nTabCount = pDoc->GetTableCount(); - if (bRecord && !pDoc->IsUndoEnabled()) - bRecord = false; - - ScRange aMarkRange; - rMark.MarkToSimple(); - sal_Bool bMulti = rMark.IsMultiMarked(); - if (bMulti) - rMark.GetMultiMarkArea( aMarkRange ); - else if (rMark.IsMarked()) - rMark.GetMarkArea( aMarkRange ); - else - { - aMarkRange = ScRange( GetViewData()->GetCurX(), - GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); - } - ScEditableTester aTester( pDoc, aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), - aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(),rMark ); - if (!aTester.IsEditable()) - { - ErrorMessage(aTester.GetMessageId()); - return; - } - - ScDocShell* pDocSh = GetViewData()->GetDocShell(); - sal_Bool bOk = false; - - ScDocument* pUndoDoc = NULL; - if (bRecord) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - SCTAB nTab = aMarkRange.aStart.Tab(); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - - if ( rMark.GetSelectCount() > 1 ) - { - ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end(); - for (; itr != itrEnd; ++itr) - if ( *itr != nTab ) - pUndoDoc->AddUndoTab( *itr, *itr ); - } - ScRange aCopyRange = aMarkRange; - aCopyRange.aStart.SetTab(0); - aCopyRange.aEnd.SetTab(nTabCount-1); - pDoc->CopyToDocument( aCopyRange, IDF_ALL, bMulti, pUndoDoc, &rMark ); - } - - ScRangeListRef xRanges; - GetViewData()->GetMultiArea( xRanges ); - size_t nCount = xRanges->size(); - - ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end(); - for (; itr != itrEnd; ++itr) - { - SCTAB i = *itr; - for (size_t j = 0; j < nCount; ++j) - { - ScRange aRange = *(*xRanges)[j]; - aRange.aStart.SetTab(i); - aRange.aEnd.SetTab(i); - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while ( pCell ) - { - if (pCell->GetCellType() == CELLTYPE_FORMULA) - { - String aOld; - ((ScFormulaCell*)pCell)->GetFormula(aOld); - xub_StrLen nLen = aOld.Len(); - ScRefFinder aFinder( aOld, aIter.GetPos(), pDoc, pDoc->GetAddressConvention() ); - aFinder.ToggleRel( 0, nLen ); - if (aFinder.GetFound()) - { - ScAddress aPos = ((ScFormulaCell*)pCell)->aPos; - String aNew = aFinder.GetText(); - ScCompiler aComp( pDoc, aPos); - aComp.SetGrammar(pDoc->GetGrammar()); - ScTokenArray* pArr = aComp.CompileString( aNew ); - ScFormulaCell* pNewCell = new ScFormulaCell( pDoc, aPos, - pArr,formula::FormulaGrammar::GRAM_DEFAULT, MM_NONE ); - pDoc->PutCell( aPos, pNewCell ); - bOk = sal_True; - } - } - pCell = aIter.GetNext(); - } - } - } - if (bRecord) - { - ScDocument* pRedoDoc = new ScDocument( SCDOCMODE_UNDO ); - SCTAB nTab = aMarkRange.aStart.Tab(); - pRedoDoc->InitUndo( pDoc, nTab, nTab ); - - if ( rMark.GetSelectCount() > 1 ) - { - itr = rMark.begin(); - for (; itr != itrEnd; ++itr) - if ( *itr != nTab ) - pRedoDoc->AddUndoTab( *itr, *itr ); - } - ScRange aCopyRange = aMarkRange; - aCopyRange.aStart.SetTab(0); - aCopyRange.aEnd.SetTab(nTabCount-1); - pDoc->CopyToDocument( aCopyRange, IDF_ALL, bMulti, pRedoDoc, &rMark ); - - pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoRefConversion( pDocSh, - aMarkRange, rMark, pUndoDoc, pRedoDoc, bMulti, IDF_ALL) ); - } - - pDocSh->PostPaint( aMarkRange, PAINT_GRID ); - pDocSh->UpdateOle(GetViewData()); - pDocSh->SetDocumentModified(); - CellContentChanged(); - - if (!bOk) - ErrorMessage(STR_ERR_NOREF); -} -// Thesaurus - Undo ok -void ScViewFunc::DoThesaurus( sal_Bool bRecord ) -{ - SCCOL nCol; - SCROW nRow; - SCTAB nTab; - ScDocShell* pDocSh = GetViewData()->GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); - ScMarkData& rMark = GetViewData()->GetMarkData(); - ScSplitPos eWhich = GetViewData()->GetActivePart(); - CellType eCellType; - EESpellState eState; - String sOldText, sNewString; - EditTextObject* pOldTObj = NULL; - const EditTextObject* pTObject = NULL; - ScBaseCell* pCell = NULL; - EditView* pEditView = NULL; - ESelection* pEditSel = NULL; - ScEditEngineDefaulter* pThesaurusEngine; - sal_Bool bIsEditMode = GetViewData()->HasEditView(eWhich); - if (bRecord && !pDoc->IsUndoEnabled()) - bRecord = false; - if (bIsEditMode) // Edit-Mode aktiv - { - GetViewData()->GetEditView(eWhich, pEditView, nCol, nRow); - pEditSel = new ESelection(pEditView->GetSelection()); - SC_MOD()->InputEnterHandler(); - GetViewData()->GetBindings().Update(); // sonst kommt der Sfx durcheinander... - } - else - { - nCol = GetViewData()->GetCurX(); - nRow = GetViewData()->GetCurY(); - } - nTab = GetViewData()->GetTabNo(); - - ScEditableTester aTester( pDoc, nCol, nRow, nCol, nRow, rMark ); - if (!aTester.IsEditable()) - { - ErrorMessage(aTester.GetMessageId()); - delete pEditSel; - return; - } - pDoc->GetCellType(nCol, nRow, nTab, eCellType); - if (eCellType != CELLTYPE_STRING && eCellType != CELLTYPE_EDIT) - { - ErrorMessage(STR_THESAURUS_NO_STRING); - return; - } - - com::sun::star::uno::Reference<com::sun::star::linguistic2::XSpellChecker1> - xSpeller = LinguMgr::GetSpellChecker(); - //! if (...) // thesaurus not available - //! { - //! ErrorMessage(STR_EXPORT_ASCII_WARNING); - //! delete pEditSel; - //! return; - //! } - - pThesaurusEngine = new ScEditEngineDefaulter( pDoc->GetEnginePool() ); - pThesaurusEngine->SetEditTextObjectPool( pDoc->GetEditPool() ); - pThesaurusEngine->SetRefDevice(GetViewData()->GetActiveWin()); - pThesaurusEngine->SetSpeller(xSpeller); - MakeEditView(pThesaurusEngine, nCol, nRow ); - const ScPatternAttr* pPattern = NULL; - SfxItemSet* pEditDefaults = new SfxItemSet(pThesaurusEngine->GetEmptyItemSet()); - pPattern = pDoc->GetPattern(nCol, nRow, nTab); - if (pPattern ) - { - pPattern->FillEditItemSet( pEditDefaults ); - pThesaurusEngine->SetDefaults( *pEditDefaults ); - } - - if (eCellType == CELLTYPE_STRING) - { - pDoc->GetString(nCol, nRow, nTab, sOldText); - pThesaurusEngine->SetText(sOldText); - } - else if (eCellType == CELLTYPE_EDIT) - { - pDoc->GetCell(nCol, nRow, nTab, pCell); - if (pCell) - { - ((ScEditCell*) pCell)->GetData(pTObject); - if (pTObject) - { - pOldTObj = pTObject->Clone(); - pThesaurusEngine->SetText(*pTObject); - } - } - } - else - { - OSL_FAIL("DoThesaurus: Keine String oder Editzelle"); - } - pEditView = GetViewData()->GetEditView(GetViewData()->GetActivePart());; - if (pEditSel) - pEditView->SetSelection(*pEditSel); - else - pEditView->SetSelection(ESelection(0,0,0,0)); - - pThesaurusEngine->ClearModifyFlag(); - - // language is now in EditEngine attributes -> no longer passed to StartThesaurus - - eState = pEditView->StartThesaurus(); - OSL_ENSURE(eState != EE_SPELL_NOSPELLER, "No SpellChecker"); - - if (eState == EE_SPELL_ERRORFOUND) // sollte spaeter durch Wrapper geschehen! - { - LanguageType eLnge = ScViewUtil::GetEffLanguage( pDoc, ScAddress( nCol, nRow, nTab ) ); - SvtLanguageTable aLangTab; - String aErr = aLangTab.GetString(eLnge); - aErr += ScGlobal::GetRscString( STR_SPELLING_NO_LANG ); - InfoBox aBox( GetViewData()->GetDialogParent(), aErr ); - aBox.Execute(); - } - if (pThesaurusEngine->IsModified()) - { - EditTextObject* pNewTObj = NULL; - if (pCell && pTObject) - { - pNewTObj = pThesaurusEngine->CreateTextObject(); - pCell = new ScEditCell( pNewTObj, pDoc, - pThesaurusEngine->GetEditTextObjectPool() ); - pDoc->PutCell( nCol, nRow, nTab, pCell ); - } - else - { - sNewString = pThesaurusEngine->GetText(); - pDoc->SetString(nCol, nRow, nTab, sNewString); - } -// erack! it's broadcasted -// pDoc->SetDirty(); - pDocSh->SetDocumentModified(); - if (bRecord) - { - GetViewData()->GetDocShell()->GetUndoManager()->AddUndoAction( - new ScUndoThesaurus( GetViewData()->GetDocShell(), - nCol, nRow, nTab, - sOldText, pOldTObj, sNewString, pNewTObj)); - } - delete pNewTObj; - } - KillEditView(sal_True); - delete pEditDefaults; - delete pThesaurusEngine; - delete pOldTObj; - delete pEditSel; - pDocSh->PostPaintGridAll(); -} - -void ScViewFunc::DoHangulHanjaConversion( sal_Bool bRecord ) -{ - ScConversionParam aConvParam( SC_CONVERSION_HANGULHANJA, LANGUAGE_KOREAN, 0, true ); - DoSheetConversion( aConvParam, bRecord ); -} - -void ScViewFunc::DoSheetConversion( const ScConversionParam& rConvParam, sal_Bool bRecord ) -{ - SCCOL nCol; - SCROW nRow; - SCTAB nTab; - ScViewData& rViewData = *GetViewData(); - ScDocShell* pDocSh = rViewData.GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); - ScMarkData& rMark = rViewData.GetMarkData(); - ScSplitPos eWhich = rViewData.GetActivePart(); - EditView* pEditView = NULL; - sal_Bool bIsEditMode = rViewData.HasEditView(eWhich); - if (bRecord && !pDoc->IsUndoEnabled()) - bRecord = false; - if (bIsEditMode) // Edit-Mode aktiv - { - rViewData.GetEditView(eWhich, pEditView, nCol, nRow); - SC_MOD()->InputEnterHandler(); - } - else - { - nCol = rViewData.GetCurX(); - nRow = rViewData.GetCurY(); - - AlignToCursor( nCol, nRow, SC_FOLLOW_JUMP); - } - nTab = rViewData.GetTabNo(); - - rMark.MarkToMulti(); - sal_Bool bMarked = rMark.IsMultiMarked(); - if (bMarked) - { - ScEditableTester aTester( pDoc, rMark ); - if (!aTester.IsEditable()) - { - ErrorMessage(aTester.GetMessageId()); - return; - } - } - - ScDocument* pUndoDoc = NULL; - ScDocument* pRedoDoc = NULL; - if (bRecord) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - pRedoDoc = new ScDocument( SCDOCMODE_UNDO ); - pRedoDoc->InitUndo( pDoc, nTab, nTab ); - - if ( rMark.GetSelectCount() > 1 ) - { - ScMarkData::iterator itr = rMark.begin(), itrEnd = rMark.end(); - for (; itr != itrEnd; ++itr) - if ( *itr != nTab ) - { - pUndoDoc->AddUndoTab( *itr, *itr ); - pRedoDoc->AddUndoTab( *itr, *itr ); - } - } - } - - // ab hier kein return mehr - - sal_Bool bOldDis = pDoc->IsIdleDisabled(); - pDoc->DisableIdle( true ); // stop online spelling - - // *** create and init the edit engine *** -------------------------------- - - ScConversionEngineBase* pEngine = NULL; - switch( rConvParam.GetType() ) - { - case SC_CONVERSION_SPELLCHECK: - pEngine = new ScSpellingEngine( - pDoc->GetEnginePool(), rViewData, pUndoDoc, pRedoDoc, LinguMgr::GetSpellChecker() ); - break; - case SC_CONVERSION_HANGULHANJA: - case SC_CONVERSION_CHINESE_TRANSL: - pEngine = new ScTextConversionEngine( - pDoc->GetEnginePool(), rViewData, rConvParam, pUndoDoc, pRedoDoc ); - break; - default: - OSL_FAIL( "ScViewFunc::DoSheetConversion - unknown conversion type" ); - } - - MakeEditView( pEngine, nCol, nRow ); - pEngine->SetRefDevice( rViewData.GetActiveWin() ); - // dummy Zelle simulieren: - pEditView = rViewData.GetEditView( rViewData.GetActivePart() ); - rViewData.SetSpellingView( pEditView ); - Rectangle aRect( Point( 0, 0 ), Point( 0, 0 ) ); - pEditView->SetOutputArea( aRect ); - pEngine->SetControlWord( EE_CNTRL_USECHARATTRIBS ); - pEngine->EnableUndo( false ); - pEngine->SetPaperSize( aRect.GetSize() ); - pEngine->SetText( EMPTY_STRING ); - - // *** do the conversion *** ---------------------------------------------- - - pEngine->ClearModifyFlag(); - pEngine->ConvertAll( *pEditView ); - - // *** undo/redo *** ------------------------------------------------------ - - if( pEngine->IsAnyModified() ) - { - if (bRecord) - { - SCCOL nNewCol = rViewData.GetCurX(); - SCROW nNewRow = rViewData.GetCurY(); - rViewData.GetDocShell()->GetUndoManager()->AddUndoAction( - new ScUndoConversion( - pDocSh, rMark, - nCol, nRow, nTab, pUndoDoc, - nNewCol, nNewRow, nTab, pRedoDoc, rConvParam ) ); - } - pDoc->SetDirty(); - pDocSh->SetDocumentModified(); - } - else - { - delete pUndoDoc; - delete pRedoDoc; - } - - // *** final cleanup *** -------------------------------------------------- - - rViewData.SetSpellingView( NULL ); - KillEditView(sal_True); - delete pEngine; - pDocSh->PostPaintGridAll(); - rViewData.GetViewShell()->UpdateInputHandler(); - pDoc->DisableIdle(bOldDis); -} - -// Pasten von FORMAT_FILE-Items -// wird nicht direkt aus Drop aufgerufen, sondern asynchron -> Dialoge sind erlaubt - -sal_Bool ScViewFunc::PasteFile( const Point& rPos, const String& rFile, sal_Bool bLink ) -{ - INetURLObject aURL; - aURL.SetSmartURL( rFile ); - String aStrURL = aURL.GetMainURL( INetURLObject::NO_DECODE ); - - // is it a media URL? - if( ::avmedia::MediaWindow::isMediaURL( aStrURL ) ) - { - const SfxStringItem aMediaURLItem( SID_INSERT_AVMEDIA, aStrURL ); - return sal_Bool( 0 != GetViewData()->GetDispatcher().Execute( - SID_INSERT_AVMEDIA, SFX_CALLMODE_SYNCHRON, - &aMediaURLItem, 0L ) ); - } - - if (!bLink) // bei bLink nur Grafik oder URL - { - // 1. Kann ich die Datei oeffnen? - const SfxFilter* pFlt = NULL; - - // nur nach eigenen Filtern suchen, ohne Auswahlbox (wie in ScDocumentLoader) - SfxFilterMatcher aMatcher( ScDocShell::Factory().GetFilterContainer()->GetName() ); - SfxMedium aSfxMedium( aStrURL, (STREAM_READ | STREAM_SHARE_DENYNONE), false ); - // #i73992# GuessFilter no longer calls UseInteractionHandler. - // This is UI, so it can be called here. - aSfxMedium.UseInteractionHandler(sal_True); - ErrCode nErr = aMatcher.GuessFilter( aSfxMedium, &pFlt ); - - if ( pFlt && !nErr ) - { - // Code aus dem SFX geklaut! - SfxDispatcher &rDispatcher = GetViewData()->GetDispatcher(); - SfxStringItem aFileNameItem( SID_FILE_NAME, aStrURL ); - SfxStringItem aFilterItem( SID_FILTER_NAME, pFlt->GetName() ); - // #i69524# add target, as in SfxApplication when the Open dialog is used - SfxStringItem aTargetItem( SID_TARGETNAME, String::CreateFromAscii("_default") ); - - // Asynchron oeffnen, kann naemlich auch aus D&D heraus passieren - // und das bekommt dem MAC nicht so gut ... - return sal_Bool( 0 != rDispatcher.Execute( SID_OPENDOC, - SFX_CALLMODE_ASYNCHRON, &aFileNameItem, &aFilterItem, &aTargetItem, 0L) ); - } - } - - // 2. Kann die Datei ueber die Grafik-Filter eingefuegt werden? - // (als Link, weil Gallery das so anbietet) - - sal_uInt16 nFilterFormat; - Graphic aGraphic; - GraphicFilter& rGraphicFilter = GraphicFilter::GetGraphicFilter(); - - - if (!rGraphicFilter.ImportGraphic(aGraphic, aURL, - GRFILTER_FORMAT_DONTKNOW, &nFilterFormat )) - { - if ( bLink ) - { - String aFltName = rGraphicFilter.GetImportFormatName(nFilterFormat); - return PasteGraphic( rPos, aGraphic, aStrURL, aFltName ); - } - else - { - // #i76709# if bLink isn't set, pass empty URL/filter, so a non-linked image is inserted - return PasteGraphic( rPos, aGraphic, EMPTY_STRING, EMPTY_STRING ); - } - } - - if (bLink) // bei bLink alles, was nicht Grafik ist, als URL - { - Rectangle aRect( rPos, Size(0,0) ); - ScRange aRange = GetViewData()->GetDocument()-> - GetRange( GetViewData()->GetTabNo(), aRect ); - SCCOL nPosX = aRange.aStart.Col(); - SCROW nPosY = aRange.aStart.Row(); - - InsertBookmark( aStrURL, aStrURL, nPosX, nPosY ); - return sal_True; - } - else - { - // 3. Kann die Datei als OLE eingefuegt werden? - // auch nicht-Storages, z.B. Sounds (#38282#) - uno::Reference < embed::XStorage > xStorage = comphelper::OStorageHelper::GetTemporaryStorage(); - - //TODO/LATER: what about "bLink"? - - uno::Sequence < beans::PropertyValue > aMedium(1); - aMedium[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) ); - aMedium[0].Value <<= ::rtl::OUString( aStrURL ); - - comphelper::EmbeddedObjectContainer aCnt( xStorage ); - ::rtl::OUString aName; - uno::Reference < embed::XEmbeddedObject > xObj = aCnt.InsertEmbeddedObject( aMedium, aName ); - if( xObj.is() ) - return PasteObject( rPos, xObj ); - - // If an OLE object can't be created, insert a URL button - - GetViewData()->GetViewShell()->InsertURLButton( aStrURL, aStrURL, EMPTY_STRING, &rPos ); - return sal_True; - } -} - -sal_Bool ScViewFunc::PasteBookmark( sal_uLong nFormatId, - const ::com::sun::star::uno::Reference< - ::com::sun::star::datatransfer::XTransferable >& rxTransferable, - SCCOL nPosX, SCROW nPosY ) -{ - INetBookmark aBookmark; - TransferableDataHelper aDataHelper( rxTransferable ); - if ( !aDataHelper.GetINetBookmark( nFormatId, aBookmark ) ) - return false; - - InsertBookmark( aBookmark.GetDescription(), aBookmark.GetURL(), nPosX, nPosY ); - return sal_True; -} - -void ScViewFunc::InsertBookmark( const String& rDescription, const String& rURL, - SCCOL nPosX, SCROW nPosY, const String* pTarget, - sal_Bool bTryReplace ) -{ - ScViewData* pViewData = GetViewData(); - if ( pViewData->HasEditView( pViewData->GetActivePart() ) && - nPosX >= pViewData->GetEditStartCol() && nPosX <= pViewData->GetEditEndCol() && - nPosY >= pViewData->GetEditStartRow() && nPosY <= pViewData->GetEditEndRow() ) - { - // in die gerade editierte Zelle einfuegen - - String aTargetFrame; - if (pTarget) - aTargetFrame = *pTarget; - pViewData->GetViewShell()->InsertURLField( rDescription, rURL, aTargetFrame ); - return; - } - - // in nicht editierte Zelle einfuegen - - ScDocument* pDoc = GetViewData()->GetDocument(); - SCTAB nTab = GetViewData()->GetTabNo(); - ScAddress aCellPos( nPosX, nPosY, nTab ); - ScBaseCell* pCell = pDoc->GetCell( aCellPos ); - EditEngine aEngine( pDoc->GetEnginePool() ); - if (pCell) - { - if (pCell->GetCellType() == CELLTYPE_EDIT) - { - const EditTextObject* pOld = ((ScEditCell*)pCell)->GetData(); - if (pOld) - aEngine.SetText(*pOld); - } - else - { - String aOld; - pDoc->GetInputString( nPosX, nPosY, nTab, aOld ); - if (aOld.Len()) - aEngine.SetText(aOld); - } - } - - sal_uInt16 nPara = aEngine.GetParagraphCount(); - if (nPara) - --nPara; - xub_StrLen nTxtLen = aEngine.GetTextLen(nPara); - ESelection aInsSel( nPara, nTxtLen, nPara, nTxtLen ); - - if ( bTryReplace && HasBookmarkAtCursor( NULL ) ) - { - // if called from hyperlink slot and cell contains only a URL, - // replace old URL with new one - - aInsSel = ESelection( 0, 0, 0, 1 ); // replace first character (field) - } - - SvxURLField aField( rURL, rDescription, SVXURLFORMAT_APPDEFAULT ); - if (pTarget) - aField.SetTargetFrame(*pTarget); - aEngine.QuickInsertField( SvxFieldItem( aField, EE_FEATURE_FIELD ), aInsSel ); - - EditTextObject* pData = aEngine.CreateTextObject(); - EnterData( nPosX, nPosY, nTab, pData ); - delete pData; -} - -sal_Bool ScViewFunc::HasBookmarkAtCursor( SvxHyperlinkItem* pContent ) -{ - ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ); - ScDocument* pDoc = GetViewData()->GetDocShell()->GetDocument(); - - ScBaseCell* pCell = pDoc->GetCell( aPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_EDIT ) - { - const EditTextObject* pData = ((ScEditCell*)pCell)->GetData(); - if (pData) - { - sal_Bool bField = pData->IsFieldObject(); - if (bField) - { - const SvxFieldItem* pFieldItem = pData->GetField(); - if (pFieldItem) - { - const SvxFieldData* pField = pFieldItem->GetField(); - if ( pField && pField->ISA(SvxURLField) ) - { - if (pContent) - { - const SvxURLField* pURLField = (const SvxURLField*)pField; - pContent->SetName( pURLField->GetRepresentation() ); - pContent->SetURL( pURLField->GetURL() ); - pContent->SetTargetFrame( pURLField->GetTargetFrame() ); - } - return sal_True; - } - } - } - } - } - return false; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |