diff options
Diffstat (limited to 'sd/source/ui/view/sdview.cxx')
-rw-r--r-- | sd/source/ui/view/sdview.cxx | 1289 |
1 files changed, 0 insertions, 1289 deletions
diff --git a/sd/source/ui/view/sdview.cxx b/sd/source/ui/view/sdview.cxx deleted file mode 100644 index 4933d8bdd..000000000 --- a/sd/source/ui/view/sdview.cxx +++ /dev/null @@ -1,1289 +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_sd.hxx" -#include <com/sun/star/embed/NoVisualAreaSizeException.hpp> -#include <com/sun/star/linguistic2/XSpellChecker1.hpp> - -#include "View.hxx" -#include <editeng/unolingu.hxx> -#include <sfx2/request.hxx> -#include <svx/obj3d.hxx> -#include <svx/fmview.hxx> -#include <editeng/outliner.hxx> -#include <svx/svxids.hrc> -#include <svx/svdograf.hxx> -#include <svx/svdoole2.hxx> -#include <svx/svdundo.hxx> -#include <vcl/msgbox.hxx> -#include <sfx2/dispatch.hxx> -#include <sfx2/app.hxx> -#include <svx/svdpagv.hxx> -#include <sfx2/docfile.hxx> -#include <svx/svdoutl.hxx> -#include <svx/sdr/contact/displayinfo.hxx> - -#include <svx/svdetc.hxx> -#include <editeng/editstat.hxx> - -#include <svx/dialogs.hrc> -#include <sfx2/viewfrm.hxx> -#include <svx/svdopage.hxx> -#include <toolkit/helper/vclunohelper.hxx> -#include <svx/xlndsit.hxx> -#include <svx/xlineit0.hxx> -#include <svx/xlnclit.hxx> -#include <vcl/virdev.hxx> - -#include "app.hrc" -#include "strings.hrc" -#include "Window.hxx" -#include "Client.hxx" -#include "drawdoc.hxx" -#include "DrawDocShell.hxx" -#include "app.hxx" -#include "sdpage.hxx" -#include "glob.hrc" -#include "sdresid.hxx" -#include "DrawViewShell.hxx" -#include "futext.hxx" -#include "fuinsfil.hxx" -#include "slideshow.hxx" -#include "stlpool.hxx" -#include "FrameView.hxx" -#include "ViewClipboard.hxx" -#include "undo/undomanager.hxx" -#include <svx/sdr/contact/viewobjectcontact.hxx> -#include <svx/sdr/contact/viewcontact.hxx> -#include <svx/sdr/contact/displayinfo.hxx> -#include "EventMultiplexer.hxx" -#include "ViewShellBase.hxx" -#include "ViewShellManager.hxx" - -#include <basegfx/polygon/b2dpolygontools.hxx> -#include <basegfx/color/bcolor.hxx> -#include <drawinglayer/primitive2d/polygonprimitive2d.hxx> -#include <drawinglayer/primitive2d/textlayoutdevice.hxx> -#include <drawinglayer/primitive2d/groupprimitive2d.hxx> -#include <svx/sdr/contact/objectcontact.hxx> -#include <basegfx/matrix/b2dhommatrix.hxx> -#include <drawinglayer/primitive2d/textprimitive2d.hxx> -#include <svx/unoapi.hxx> -#include <basegfx/matrix/b2dhommatrixtools.hxx> - -#include <numeric> - -using namespace com::sun::star; -using namespace com::sun::star::uno; -namespace sd { - -#ifndef SO2_DECL_SVINPLACEOBJECT_DEFINED -#define SO2_DECL_SVINPLACEOBJECT_DEFINED -SO2_DECL_REF(SvInPlaceObject) -#endif - -TYPEINIT1(View, FmFormView); - -/************************************************************************* -|* -|* Ctor -|* -\************************************************************************/ - -View::View(SdDrawDocument* pDrawDoc, OutputDevice* pOutDev, - ViewShell* pViewShell) - : FmFormView(pDrawDoc, pOutDev), - mpDoc(pDrawDoc), - mpDocSh( pDrawDoc->GetDocSh() ), - mpViewSh(pViewShell), - mpDragSrcMarkList(NULL), - mpDropMarkerObj(NULL), - mpDropMarker(NULL), - mnDragSrcPgNum(SDRPAGE_NOTFOUND), - mnAction(DND_ACTION_NONE), - mnLockRedrawSmph(0), - mbIsDropAllowed(sal_True), - maSmartTags(*this), - mpClipboard (new ViewClipboard (*this)) -{ - // #i73602# Use default from the configuration - SetBufferedOverlayAllowed(getOptionsDrawinglayer().IsOverlayBuffer_DrawImpress()); - - // #i74769#, #i75172# Use default from the configuration - SetBufferedOutputAllowed(getOptionsDrawinglayer().IsPaintBuffer_DrawImpress()); - - EnableExtendedKeyInputDispatcher(sal_False); - EnableExtendedMouseEventDispatcher(sal_False); - EnableExtendedCommandEventDispatcher(sal_False); - - SetUseIncompatiblePathCreateInterface(sal_False); - SetMarkHdlWhenTextEdit(sal_True); - EnableTextEditOnObjectsWithoutTextIfTextTool(sal_True); - - SetMinMoveDistancePixel(2); - SetHitTolerancePixel(2); - SetMeasureLayer(String(SdResId(STR_LAYER_MEASURELINES))); - - // Timer fuer verzoegertes Drop (muss fuer MAC sein) - maDropErrorTimer.SetTimeoutHdl( LINK(this, View, DropErrorHdl) ); - maDropErrorTimer.SetTimeout(50); - maDropInsertFileTimer.SetTimeoutHdl( LINK(this, View, DropInsertFileHdl) ); - maDropInsertFileTimer.SetTimeout(50); -} - -void View::ImplClearDrawDropMarker() -{ - if(mpDropMarker) - { - delete mpDropMarker; - mpDropMarker = 0L; - } -} - -/************************************************************************* -|* -|* Dtor -|* -\************************************************************************/ - -View::~View() -{ - maSmartTags.Dispose(); - - // release content of selection clipboard, if we own the content - UpdateSelectionClipboard( sal_True ); - - maDropErrorTimer.Stop(); - maDropInsertFileTimer.Stop(); - - ImplClearDrawDropMarker(); - - while(PaintWindowCount()) - { - // Alle angemeldeten OutDevs entfernen - DeleteWindowFromPaintView(GetFirstOutputDevice() /*GetWin(0)*/); - } -} - - -class ViewRedirector : public ::sdr::contact::ViewObjectContactRedirector -{ -public: - ViewRedirector(); - virtual ~ViewRedirector(); - - // all default implementations just call the same methods at the original. To do something - // different, overload the method and at least do what the method does. - virtual drawinglayer::primitive2d::Primitive2DSequence createRedirectedPrimitive2DSequence( - const sdr::contact::ViewObjectContact& rOriginal, - const sdr::contact::DisplayInfo& rDisplayInfo); -}; - -ViewRedirector::ViewRedirector() -{ -} - -ViewRedirector::~ViewRedirector() -{ -} - -drawinglayer::primitive2d::Primitive2DSequence ViewRedirector::createRedirectedPrimitive2DSequence( - const sdr::contact::ViewObjectContact& rOriginal, - const sdr::contact::DisplayInfo& rDisplayInfo) -{ - SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject(); - drawinglayer::primitive2d::Primitive2DSequence xRetval; - - if(pObject && pObject->GetPage()) - { - const bool bDoCreateGeometry(pObject->GetPage()->checkVisibility( rOriginal, rDisplayInfo, true )); - - if(!bDoCreateGeometry && !(( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_PAGE )) ) - return xRetval; - - PresObjKind eKind(PRESOBJ_NONE); - const bool bSubContentProcessing(rDisplayInfo.GetSubContentActive()); - const bool bIsMasterPageObject(pObject->GetPage()->IsMasterPage()); - const bool bIsPrinting(rOriginal.GetObjectContact().isOutputToPrinter()); - const SdrPageView* pPageView = rOriginal.GetObjectContact().TryToGetSdrPageView(); - const SdrPage* pVisualizedPage = GetSdrPageFromXDrawPage(rOriginal.GetObjectContact().getViewInformation2D().getVisualizedPage()); - const SdPage* pObjectsSdPage = dynamic_cast< SdPage* >(pObject->GetPage()); - const bool bIsInsidePageObj(pPageView && pPageView->GetPage() != pVisualizedPage); - - // check if we need to draw a placeholder border. Never do it for - // objects inside a SdrPageObj and never when printing - if(!bIsInsidePageObj && !bIsPrinting) - { - bool bCreateOutline(false); - - if( pObject->IsEmptyPresObj() && pObject->ISA(SdrTextObj) ) - { - if( !bSubContentProcessing || !pObject->IsNotVisibleAsMaster() ) - { - eKind = pObjectsSdPage ? pObjectsSdPage->GetPresObjKind(pObject) : PRESOBJ_NONE; - bCreateOutline = true; - } - } - else if( ( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_TEXT ) ) - { - if( pObjectsSdPage ) - { - eKind = pObjectsSdPage->GetPresObjKind(pObject); - - if((eKind == PRESOBJ_FOOTER) || (eKind == PRESOBJ_HEADER) || (eKind == PRESOBJ_DATETIME) || (eKind == PRESOBJ_SLIDENUMBER) ) - { - if( !bSubContentProcessing ) - { - // only draw a boundary for header&footer objects on the masterpage itself - bCreateOutline = true; - } - } - } - } - else if( ( pObject->GetObjInventor() == SdrInventor ) && ( pObject->GetObjIdentifier() == OBJ_PAGE ) ) - { - // only for handout page, else this frame will be created for each - // page preview object in SlideSorter and PagePane - if(pObjectsSdPage && PK_HANDOUT == pObjectsSdPage->GetPageKind()) - { - bCreateOutline = true; - } - } - - if(bCreateOutline) - { - // empty presentation objects get a gray frame - const svtools::ColorConfig aColorConfig; - const svtools::ColorConfigValue aColor( aColorConfig.GetColorValue( svtools::OBJECTBOUNDARIES ) ); - - if( aColor.bIsVisible ) - { - // get basic object transformation - const basegfx::BColor aRGBColor(Color(aColor.nColor).getBColor()); - basegfx::B2DHomMatrix aObjectMatrix; - basegfx::B2DPolyPolygon aObjectPolyPolygon; - pObject->TRGetBaseGeometry(aObjectMatrix, aObjectPolyPolygon); - - // create dashed border - { - // create object polygon - basegfx::B2DPolygon aPolygon(basegfx::tools::createUnitPolygon()); - aPolygon.transform(aObjectMatrix); - - // create line and stroke attribute - ::std::vector< double > aDotDashArray; - - aDotDashArray.push_back(160.0); - aDotDashArray.push_back(80.0); - - const double fFullDotDashLen(::std::accumulate(aDotDashArray.begin(), aDotDashArray.end(), 0.0)); - const drawinglayer::attribute::LineAttribute aLine(aRGBColor); - const drawinglayer::attribute::StrokeAttribute aStroke(aDotDashArray, fFullDotDashLen); - - // create primitive and add - const drawinglayer::primitive2d::Primitive2DReference xRef(new drawinglayer::primitive2d::PolygonStrokePrimitive2D( - aPolygon, - aLine, - aStroke)); - drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xRef); - } - - // now paint the placeholder description, but only when masterpage - // is displayed as page directly (MasterPage view) - if(!bSubContentProcessing && bIsMasterPageObject) - { - String aObjectString; - - switch( eKind ) - { - case PRESOBJ_TITLE: - { - if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PK_STANDARD) - { - static String aTitleAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_TITLE ) ); - aObjectString = aTitleAreaStr; - } - - break; - } - case PRESOBJ_OUTLINE: - { - static String aOutlineAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_OUTLINE ) ); - aObjectString = aOutlineAreaStr; - break; - } - case PRESOBJ_FOOTER: - { - static String aFooterAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_FOOTER ) ); - aObjectString = aFooterAreaStr; - break; - } - case PRESOBJ_HEADER: - { - static String aHeaderAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_HEADER ) ); - aObjectString = aHeaderAreaStr; - break; - } - case PRESOBJ_DATETIME: - { - static String aDateTimeStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_DATETIME ) ); - aObjectString = aDateTimeStr; - break; - } - case PRESOBJ_NOTES: - { - static String aDateTimeStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_NOTES ) ); - aObjectString = aDateTimeStr; - break; - } - case PRESOBJ_SLIDENUMBER: - { - if(pObjectsSdPage && pObjectsSdPage->GetPageKind() == PK_STANDARD) - { - static String aSlideAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_SLIDE ) ); - aObjectString = aSlideAreaStr; - } - else - { - static String aNumberAreaStr( SdResId( STR_PLACEHOLDER_DESCRIPTION_NUMBER ) ); - aObjectString = aNumberAreaStr; - } - break; - } - default: - { - break; - } - } - - if( aObjectString.Len() ) - { - // decompose object matrix to be able to place text correctly - basegfx::B2DTuple aScale; - basegfx::B2DTuple aTranslate; - double fRotate, fShearX; - aObjectMatrix.decompose(aScale, aTranslate, fRotate, fShearX); - - // create font - SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObject ); - const SdrTextVertAdjust eTVA(pTextObj ? pTextObj->GetTextVerticalAdjust() : SDRTEXTVERTADJUST_CENTER); - Font aScaledVclFont; - - // use a text size factor to get more reliable text sizes from the text layouter - // (and from vcl), tipp from HDU - static sal_uInt32 nTextSizeFactor(100); - - // use a factor to get more linear text size calculations - aScaledVclFont.SetHeight( 500 * nTextSizeFactor ); - - // get basic geometry and get text size - drawinglayer::primitive2d::TextLayouterDevice aTextLayouter; - aTextLayouter.setFont(aScaledVclFont); - const xub_StrLen nTextLength(aObjectString.Len()); - - // do not forget to use the factor again to get the width for the 500 - const double fTextWidth(aTextLayouter.getTextWidth(aObjectString, 0, nTextLength) * (1.0 / nTextSizeFactor)); - const double fTextHeight(aTextLayouter.getTextHeight() * (1.0 / nTextSizeFactor)); - - // calculate text primitive position. If text is at bottom, use top for - // the extra text and vice versa - const double fHorDist(125); - const double fVerDist(125); - const double fPosX((aTranslate.getX() + aScale.getX()) - fTextWidth - fHorDist); - const double fPosY((SDRTEXTVERTADJUST_BOTTOM == eTVA) - ? aTranslate.getY() - fVerDist + fTextHeight - : (aTranslate.getY() + aScale.getY()) - fVerDist); - - // get font attributes; use normally scaled font - const basegfx::BColor aFontColor(aRGBColor); - Font aVclFont; - basegfx::B2DVector aTextSizeAttribute; - - aVclFont.SetHeight( 500 ); - - const drawinglayer::attribute::FontAttribute aFontAttribute( - drawinglayer::primitive2d::getFontAttributeFromVclFont( - aTextSizeAttribute, - aVclFont, - false, - false)); - - // fill text matrix - const basegfx::B2DHomMatrix aTextMatrix(basegfx::tools::createScaleShearXRotateTranslateB2DHomMatrix( - aTextSizeAttribute.getX(), aTextSizeAttribute.getY(), - fShearX, - fRotate, - fPosX, fPosY)); - - // create DXTextArray (can be empty one) - const ::std::vector< double > aDXArray; - - // create locale; this may need some more information in the future - const ::com::sun::star::lang::Locale aLocale; - - // create primitive and add - const drawinglayer::primitive2d::Primitive2DReference xRef( - new drawinglayer::primitive2d::TextSimplePortionPrimitive2D( - aTextMatrix, - aObjectString, - 0, - nTextLength, - aDXArray, - aFontAttribute, - aLocale, - aFontColor)); - drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(xRetval, xRef); - } - } - } - } - } - - if(bDoCreateGeometry) - { - drawinglayer::primitive2d::appendPrimitive2DSequenceToPrimitive2DSequence( - xRetval, - sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence( - rOriginal, - rDisplayInfo)); - } - } - else - { - // not a SdrObject visualisation (maybe e.g. page) or no page - xRetval = sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo); - } - - return xRetval; -} - -/************************************************************************* -|* -|* Paint-Methode: das Ereignis wird an die View weitergeleitet -|* -\************************************************************************/ - -void View::CompleteRedraw(OutputDevice* pOutDev, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector /*=0L*/) -{ - // ausfuehren ?? - if (mnLockRedrawSmph == 0) - { - SdrPageView* pPgView = GetSdrPageView(); - - if (pPgView) - { - SdPage* pPage = (SdPage*) pPgView->GetPage(); - if( pPage ) - { - SdrOutliner& rOutl=mpDoc->GetDrawOutliner(NULL); - bool bScreenDisplay(true); - - if(bScreenDisplay && pOutDev && OUTDEV_PRINTER == pOutDev->GetOutDevType()) - { - // #i75566# printing; suppress AutoColor BackgroundColor generation - // for visibility reasons by giving GetPageBackgroundColor() - // the needed hint - bScreenDisplay = false; - } - - if(bScreenDisplay && pOutDev && pOutDev->GetPDFWriter()) - { - // #i75566# PDF export; suppress AutoColor BackgroundColor generation (see above) - bScreenDisplay = false; - } - - // #i75566# Name change GetBackgroundColor -> GetPageBackgroundColor and - // hint value if screen display. Only then the AutoColor mechanisms shall be applied - rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor(pPgView, bScreenDisplay) ); - } - } - - ViewRedirector aViewRedirector; - FmFormView::CompleteRedraw(pOutDev, rReg, pRedirector ? pRedirector : &aViewRedirector); - } - // oder speichern? - else - { - SdViewRedrawRec* pRec = new SdViewRedrawRec; - pRec->mpOut = pOutDev; - pRec->aRect = rReg.GetBoundRect(); - maLockedRedraws.push_back(pRec); - } -} - - -/************************************************************************* -|* -|* Selektion hat sich geaendert -|* -\************************************************************************/ - -void View::MarkListHasChanged() -{ - FmFormView::MarkListHasChanged(); - - if( GetMarkedObjectCount() > 0 ) - maSmartTags.deselect(); -} - - -/************************************************************************* -|* -|* Attribute setzen -|* -\************************************************************************/ - -sal_Bool View::SetAttributes(const SfxItemSet& rSet, sal_Bool bReplaceAll) -{ - sal_Bool bOk = FmFormView::SetAttributes(rSet, bReplaceAll); - return (bOk); -} - - -/************************************************************************* -|* -|* Attribute holen -|* -\************************************************************************/ - -sal_Bool View::GetAttributes( SfxItemSet& rTargetSet, sal_Bool bOnlyHardAttr ) const -{ - return( FmFormView::GetAttributes( rTargetSet, bOnlyHardAttr ) ); -} - - -/************************************************************************* -|* -|* Ist ein Praesentationsobjekt selektiert? -|* -\************************************************************************/ - -sal_Bool View::IsPresObjSelected(sal_Bool bOnPage, sal_Bool bOnMasterPage, sal_Bool bCheckPresObjListOnly, sal_Bool bCheckLayoutOnly) const -{ - /************************************************************************** - * Ist ein Presentationsobjekt selektiert? - **************************************************************************/ - SdrMarkList* pMarkList; - - if (mnDragSrcPgNum != SDRPAGE_NOTFOUND && - mnDragSrcPgNum != GetSdrPageView()->GetPage()->GetPageNum()) - { - // Es laeuft gerade Drag&Drop - // Source- und Destination-Page unterschiedlich: - // es wird die gemerkte MarkList verwendet - pMarkList = mpDragSrcMarkList; - } - else - { - // Es wird die aktuelle MarkList verwendet - pMarkList = new SdrMarkList(GetMarkedObjectList()); - } - - SdrMark* pMark; - SdPage* pPage; - SdrObject* pObj; - - sal_Bool bSelected = sal_False; - sal_Bool bMasterPage = sal_False; - long nMark; - long nMarkMax = long(pMarkList->GetMarkCount()) - 1; - - for (nMark = nMarkMax; (nMark >= 0) && !bSelected; nMark--) - { - // Rueckwaerts durch die Marklist - pMark = pMarkList->GetMark(nMark); - pObj = pMark->GetMarkedSdrObj(); - - if ( pObj && ( bCheckPresObjListOnly || pObj->IsEmptyPresObj() || pObj->GetUserCall() ) ) - { - pPage = (SdPage*) pObj->GetPage(); - bMasterPage = pPage->IsMasterPage(); - - if ( (bMasterPage && bOnMasterPage) || (!bMasterPage && bOnPage) ) - { - if ( pPage && pPage->IsPresObj(pObj) ) - { - if( bCheckLayoutOnly ) - { - PresObjKind eKind = pPage->GetPresObjKind(pObj); - - if((eKind != PRESOBJ_FOOTER) && (eKind != PRESOBJ_HEADER) && (eKind != PRESOBJ_DATETIME) && (eKind != PRESOBJ_SLIDENUMBER) ) - bSelected = sal_True; - } - else - { - bSelected = sal_True; - } - } - } - } - } - - if (pMarkList != mpDragSrcMarkList) - { - delete pMarkList; - } - - return (bSelected); -} - -/************************************************************************* -|* -|* Alles selektieren -|* -\************************************************************************/ - -void View::SelectAll() -{ - if ( IsTextEdit() ) - { - OutlinerView* pOLV = GetTextEditOutlinerView(); - const ::Outliner* pOutliner = GetTextEditOutliner(); - pOLV->SelectRange( 0, (sal_uInt16) pOutliner->GetParagraphCount() ); - } - else - { - MarkAll(); - } -} - - -/************************************************************************* -|* -|* Dokument hat sich geaendert -|* -\************************************************************************/ - -void View::ModelHasChanged() -{ - // Erst SdrView benachrichtigen - FmFormView::ModelHasChanged(); -} - -/************************************************************************* -|* -|* StyleSheet setzen -|* -\************************************************************************/ - -sal_Bool View::SetStyleSheet(SfxStyleSheet* pStyleSheet, sal_Bool bDontRemoveHardAttr) -{ - // weiter an SdrView - return FmFormView::SetStyleSheet(pStyleSheet, bDontRemoveHardAttr); -} - - -/************************************************************************* -|* -|* Texteingabe beginnen -|* -\************************************************************************/ - -static void SetSpellOptions( SdDrawDocument* pDoc, sal_uLong& rCntrl ) -{ - sal_Bool bOnlineSpell = pDoc->GetOnlineSpell(); - - if( bOnlineSpell ) - rCntrl |= EE_CNTRL_ONLINESPELLING; - else - rCntrl &= ~EE_CNTRL_ONLINESPELLING; -} - -sal_Bool View::SdrBeginTextEdit( - SdrObject* pObj, SdrPageView* pPV, ::Window* pWin, - sal_Bool bIsNewObj, - SdrOutliner* pOutl, OutlinerView* pGivenOutlinerView, - sal_Bool bDontDeleteOutliner, sal_Bool bOnlyOneView, sal_Bool bGrabFocus ) -{ - GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent( - sd::tools::EventMultiplexerEvent::EID_BEGIN_TEXT_EDIT, (void*)pObj ); - - if( pOutl==NULL && pObj ) - pOutl = SdrMakeOutliner( OUTLINERMODE_TEXTOBJECT, pObj->GetModel() ); - - // make draw&impress specific initialisations - if( pOutl ) - { - pOutl->SetStyleSheetPool((SfxStyleSheetPool*) mpDoc->GetStyleSheetPool()); - pOutl->SetCalcFieldValueHdl(LINK(SD_MOD(), SdModule, CalcFieldValueHdl)); - sal_uLong nCntrl = pOutl->GetControlWord(); - nCntrl |= EE_CNTRL_ALLOWBIGOBJS; - nCntrl |= EE_CNTRL_URLSFXEXECUTE; - nCntrl |= EE_CNTRL_MARKFIELDS; - nCntrl |= EE_CNTRL_AUTOCORRECT; - - nCntrl &= ~EE_CNTRL_ULSPACESUMMATION; - if ( mpDoc->IsSummationOfParagraphs() ) - nCntrl |= EE_CNTRL_ULSPACESUMMATION; - - SetSpellOptions( mpDoc, nCntrl ); - - pOutl->SetControlWord(nCntrl); - - Reference< linguistic2::XSpellChecker1 > xSpellChecker( LinguMgr::GetSpellChecker() ); - if ( xSpellChecker.is() ) - pOutl->SetSpeller( xSpellChecker ); - - Reference< linguistic2::XHyphenator > xHyphenator( LinguMgr::GetHyphenator() ); - if( xHyphenator.is() ) - pOutl->SetHyphenator( xHyphenator ); - - pOutl->SetDefaultLanguage( Application::GetSettings().GetLanguage() ); - } - - sal_Bool bReturn = FmFormView::SdrBeginTextEdit( - pObj, pPV, pWin, bIsNewObj, pOutl, - pGivenOutlinerView, bDontDeleteOutliner, - bOnlyOneView, bGrabFocus); - - if (bReturn) - { - ::Outliner* pOL = GetTextEditOutliner(); - - if( pObj && pObj->GetPage() ) - { - Color aBackground; - if( pObj->GetObjInventor() == SdrInventor && pObj->GetObjIdentifier() == OBJ_TABLE ) - { - aBackground = GetTextEditBackgroundColor(*this); - } - else - { - aBackground = pObj->GetPage()->GetPageBackgroundColor(pPV); - } - pOL->SetBackgroundColor( aBackground ); - } - - pOL->SetParaInsertedHdl(LINK(this, View, OnParagraphInsertedHdl)); - pOL->SetParaRemovingHdl(LINK(this, View, OnParagraphRemovingHdl)); - } - - return(bReturn); -} - -/** ends current text editing */ -SdrEndTextEditKind View::SdrEndTextEdit(sal_Bool bDontDeleteReally ) -{ - SdrObjectWeakRef xObj( GetTextEditObject() ); - - sal_Bool bDefaultTextRestored = RestoreDefaultText( dynamic_cast< SdrTextObj* >( GetTextEditObject() ) ); - - SdrEndTextEditKind eKind = FmFormView::SdrEndTextEdit(bDontDeleteReally); - - if( bDefaultTextRestored ) - { - if( xObj.is() && !xObj->IsEmptyPresObj() ) - { - xObj->SetEmptyPresObj( sal_True ); - } - else - { - eKind = SDRENDTEXTEDIT_UNCHANGED; - } - } - else if( xObj.is() && xObj->IsEmptyPresObj() ) - { - SdrTextObj* pObj = dynamic_cast< SdrTextObj* >( xObj.get() ); - if( pObj && pObj->HasText() ) - { - SdrPage* pPage = pObj->GetPage(); - if( !pPage || !pPage->IsMasterPage() ) - pObj->SetEmptyPresObj( sal_False ); - } - } - - GetViewShell()->GetViewShellBase().GetEventMultiplexer()->MultiplexEvent(sd::tools::EventMultiplexerEvent::EID_END_TEXT_EDIT, (void*)xObj.get() ); - - if( xObj.is() ) - { - SdPage* pPage = dynamic_cast< SdPage* >( xObj->GetPage() ); - if( pPage ) - pPage->onEndTextEdit( xObj.get() ); - } - - return(eKind); -} - -// -------------------------------------------------------------------- - -/** restores the default text if the given text object is currently in edit mode and - no text has been entered already. Is only usefull just before text edit ends. */ -bool View::RestoreDefaultText( SdrTextObj* pTextObj ) -{ - bool bRestored = false; - - if( pTextObj && (pTextObj == GetTextEditObject()) ) - { - if( !pTextObj->HasText() ) - { - SdPage* pPage = dynamic_cast< SdPage* >( pTextObj->GetPage() ); - - if(pPage) - { - bRestored = pPage->RestoreDefaultText( pTextObj ); - if( bRestored ) - { - SdrOutliner* pOutliner = GetTextEditOutliner(); - pTextObj->SetTextEditOutliner( pOutliner ); - OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject(); - if (pOutliner) - pOutliner->SetText(*pParaObj); - } - } - } - } - - return bRestored; -} - -/************************************************************************* -|* -|* Originalgroesse der markierten Objekte setzen -|* -\************************************************************************/ - -void View::SetMarkedOriginalSize() -{ - SdrUndoGroup* pUndoGroup = new SdrUndoGroup(*mpDoc); - sal_uLong nCount = GetMarkedObjectCount(); - sal_Bool bOK = sal_False; - - for( sal_uInt32 i = 0; i < nCount; i++ ) - { - SdrObject* pObj = GetMarkedObjectByIndex(i); - - if( pObj->GetObjInventor() == SdrInventor ) - { - if( pObj->GetObjIdentifier() == OBJ_OLE2 ) - { - uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObj)->GetObjRef(); - if( xObj.is() ) - { - // TODO/LEAN: working with VisualArea can switch object to running state - - sal_Int64 nAspect = ((SdrOle2Obj*)pObj)->GetAspect(); - Size aOleSize; - - if ( nAspect == embed::Aspects::MSOLE_ICON ) - { - MapMode aMap100( MAP_100TH_MM ); - aOleSize = ((SdrOle2Obj*)pObj)->GetOrigObjSize( &aMap100 ); - bOK = sal_True; - } - else - { - MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); - try - { - awt::Size aSz = xObj->getVisualAreaSize( nAspect ); - aOleSize = OutputDevice::LogicToLogic( Size( aSz.Width, aSz.Height ), aUnit, MAP_100TH_MM ); - bOK = sal_True; - } - catch( embed::NoVisualAreaSizeException& ) - {} - } - - if ( bOK ) - { - Rectangle aDrawRect( pObj->GetLogicRect() ); - - pUndoGroup->AddAction( mpDoc->GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) ); - pObj->Resize( aDrawRect.TopLeft(), Fraction( aOleSize.Width(), aDrawRect.GetWidth() ), - Fraction( aOleSize.Height(), aDrawRect.GetHeight() ) ); - } - } - } - else if( pObj->GetObjIdentifier() == OBJ_GRAF ) - { - const MapMode aMap100( MAP_100TH_MM ); - Size aSize; - - if ( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefMapMode().GetMapUnit() == MAP_PIXEL ) - aSize = Application::GetDefaultDevice()->PixelToLogic( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefSize(), aMap100 ); - else - { - aSize = OutputDevice::LogicToLogic( static_cast< SdrGrafObj* >( pObj )->GetGrafPrefSize(), - static_cast< SdrGrafObj* >( pObj )->GetGrafPrefMapMode(), - aMap100 ); - } - - pUndoGroup->AddAction( GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pObj ) ); - Rectangle aRect( pObj->GetLogicRect() ); - aRect.SetSize( aSize ); - pObj->SetLogicRect( aRect ); - - bOK = sal_True; - } - } - } - - if( bOK ) - { - pUndoGroup->SetComment( String(SdResId(STR_UNDO_ORIGINALSIZE)) ); - mpDocSh->GetUndoManager()->AddUndoAction(pUndoGroup); - } - else - delete pUndoGroup; -} - -/************************************************************************* -|* -|* OLE-Obj am Client connecten -|* -\************************************************************************/ - -void View::DoConnect(SdrOle2Obj* pObj) -{ - if (mpViewSh) - { - uno::Reference < embed::XEmbeddedObject > xObj( pObj->GetObjRef() ); - if( xObj.is() ) - { - ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); - SfxInPlaceClient* pSdClient = mpViewSh-> GetViewShellBase().FindIPClient( xObj, pWindow ); - if ( !pSdClient ) - { - pSdClient = new Client(pObj, mpViewSh, pWindow); - Rectangle aRect = pObj->GetLogicRect(); - { - // TODO/LEAN: working with visual area can switch object to running state - Size aDrawSize = aRect.GetSize(); - awt::Size aSz; - - MapMode aMapMode( mpDoc->GetScaleUnit() ); - Size aObjAreaSize = pObj->GetOrigObjSize( &aMapMode ); - - Fraction aScaleWidth (aDrawSize.Width(), aObjAreaSize.Width() ); - Fraction aScaleHeight(aDrawSize.Height(), aObjAreaSize.Height() ); - aScaleWidth.ReduceInaccurate(10); // kompatibel zum SdrOle2Obj - aScaleHeight.ReduceInaccurate(10); - pSdClient->SetSizeScale(aScaleWidth, aScaleHeight); - - // sichtbarer Ausschnitt wird nur inplace veraendert! - // the object area must be set after the scaling, since it triggers resize - aRect.SetSize(aObjAreaSize); - pSdClient->SetObjArea(aRect); - } - } - } - } -} - -sal_Bool View::IsMorphingAllowed() const -{ - const SdrMarkList& rMarkList = GetMarkedObjectList(); - sal_Bool bRet = sal_False; - - if ( rMarkList.GetMarkCount() == 2 ) - { - const SdrObject* pObj1 = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); - const SdrObject* pObj2 = rMarkList.GetMark( 1 )->GetMarkedSdrObj(); - const sal_uInt16 nKind1 = pObj1->GetObjIdentifier(); - const sal_uInt16 nKind2 = pObj2->GetObjIdentifier(); - - if ( ( nKind1 != OBJ_TEXT && nKind2 != OBJ_TEXT ) && - ( nKind1 != OBJ_TITLETEXT && nKind2 != OBJ_TITLETEXT ) && - ( nKind1 != OBJ_OUTLINETEXT && nKind2 != OBJ_OUTLINETEXT ) && - ( nKind1 != OBJ_GRUP && nKind2 != OBJ_GRUP ) && - ( nKind1 != OBJ_LINE && nKind2 != OBJ_LINE ) && - ( nKind1 != OBJ_PLIN && nKind2 != OBJ_PLIN ) && - ( nKind1 != OBJ_PATHLINE && nKind2 != OBJ_PATHLINE ) && - ( nKind1 != OBJ_FREELINE && nKind2 != OBJ_FREELINE ) && - ( nKind1 != OBJ_PATHPLIN && nKind2 != OBJ_PATHPLIN ) && - ( nKind1 != OBJ_MEASURE && nKind2 != OBJ_MEASURE ) && - ( nKind1 != OBJ_EDGE && nKind2 != OBJ_EDGE ) && - ( nKind1 != OBJ_GRAF && nKind2 != OBJ_GRAF ) && - ( nKind1 != OBJ_OLE2 && nKind2 != OBJ_OLE2 ) && - ( nKind1 != OBJ_CAPTION && nKind2 != OBJ_CAPTION ) && - !pObj1->ISA( E3dObject) && !pObj2->ISA( E3dObject) ) - { - SfxItemSet aSet1( mpDoc->GetPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE ); - SfxItemSet aSet2( mpDoc->GetPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE ); - - aSet1.Put(pObj1->GetMergedItemSet()); - aSet2.Put(pObj2->GetMergedItemSet()); - - const XFillStyle eFillStyle1 = ( (const XFillStyleItem&) aSet1.Get( XATTR_FILLSTYLE ) ).GetValue(); - const XFillStyle eFillStyle2 = ( (const XFillStyleItem&) aSet2.Get( XATTR_FILLSTYLE ) ).GetValue(); - - if( ( eFillStyle1 == XFILL_NONE || eFillStyle1 == XFILL_SOLID ) && - ( eFillStyle2 == XFILL_NONE || eFillStyle2 == XFILL_SOLID ) ) - bRet = sal_True; - } - } - - return bRet; -} - -sal_Bool View::IsVectorizeAllowed() const -{ - const SdrMarkList& rMarkList = GetMarkedObjectList(); - sal_Bool bRet = sal_False; - - if( rMarkList.GetMarkCount() == 1 ) - { - const SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj(); - - if( pObj->ISA( SdrGrafObj ) && ( (SdrGrafObj*) pObj )->GetGraphicType() == GRAPHIC_BITMAP ) - bRet = sal_True; - } - - return bRet; -} - -void View::onAccessibilityOptionsChanged() -{ - if( mpViewSh ) - { - ::sd::Window* pWindow = mpViewSh->GetActiveWindow(); - if( pWindow ) - { - const StyleSettings& rStyleSettings = pWindow->GetSettings().GetStyleSettings(); - - sal_uInt16 nOutputSlot, nPreviewSlot; - - SvtAccessibilityOptions& aAccOptions = getAccessibilityOptions(); - - if( mpViewSh->GetViewFrame() && mpViewSh->GetViewFrame()->GetDispatcher() ) - { - if( rStyleSettings.GetHighContrastMode() ) - { - nOutputSlot = SID_OUTPUT_QUALITY_CONTRAST; - } - else - { - nOutputSlot = SID_OUTPUT_QUALITY_COLOR; - } - - if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() ) - { - nPreviewSlot = SID_PREVIEW_QUALITY_CONTRAST; - } - else - { - nPreviewSlot = SID_PREVIEW_QUALITY_COLOR; - } - - mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nOutputSlot, SFX_CALLMODE_ASYNCHRON ); - mpViewSh->GetViewFrame()->GetDispatcher()->Execute( nPreviewSlot, SFX_CALLMODE_ASYNCHRON ); - } - - mpViewSh->Invalidate(); - } - } -} - -IMPL_LINK( View, OnParagraphInsertedHdl, ::Outliner *, pOutliner ) -{ - Paragraph* pPara = pOutliner->GetHdlParagraph(); - SdrObject* pObj = GetTextEditObject(); - - if( pPara && pObj ) - { - SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() ); - if( pPage ) - pPage->onParagraphInserted( pOutliner, pPara, pObj ); - } - return 0; -} - -/************************************************************************* -|* -|* Handler fuer das Loeschen von Seiten (Absaetzen) -|* -\************************************************************************/ - -IMPL_LINK( View, OnParagraphRemovingHdl, ::Outliner *, pOutliner ) -{ - Paragraph* pPara = pOutliner->GetHdlParagraph(); - SdrObject* pObj = GetTextEditObject(); - - if( pPara && pObj ) - { - SdPage* pPage = dynamic_cast< SdPage* >( pObj->GetPage() ); - if( pPage ) - pPage->onParagraphRemoving( pOutliner, pPara, pObj ); - } - return 0; -} - -bool View::isRecordingUndo() const -{ - if( mpDoc && mpDoc->IsUndoEnabled() ) - { - sd::UndoManager* pUndoManager = mpDoc ? mpDoc->GetUndoManager() : 0; - return pUndoManager && pUndoManager->IsInListAction(); - } - else - { - return false; - } -} - -void View::AddCustomHdl() -{ - maSmartTags.addCustomHandles( aHdl ); -} - -void View::updateHandles() -{ - AdjustMarkHdl(); -} - -SdrViewContext View::GetContext() const -{ - SdrViewContext eContext = SDRCONTEXT_STANDARD; - if( maSmartTags.getContext( eContext ) ) - return eContext; - else - return FmFormView::GetContext(); -} - -sal_Bool View::HasMarkablePoints() const -{ - if( maSmartTags.HasMarkablePoints() ) - return true; - else - return FmFormView::HasMarkablePoints(); -} - -sal_uLong View::GetMarkablePointCount() const -{ - sal_uLong nCount = FmFormView::GetMarkablePointCount(); - nCount += maSmartTags.GetMarkablePointCount(); - return nCount; -} - -sal_Bool View::HasMarkedPoints() const -{ - if( maSmartTags.HasMarkedPoints() ) - return true; - else - return FmFormView::HasMarkedPoints(); -} - -sal_uLong View::GetMarkedPointCount() const -{ - sal_uLong nCount = FmFormView::GetMarkedPointCount(); - nCount += maSmartTags.GetMarkedPointCount(); - return nCount; -} - -sal_Bool View::IsPointMarkable(const SdrHdl& rHdl) const -{ - if( maSmartTags.IsPointMarkable( rHdl ) ) - return true; - else - return FmFormView::IsPointMarkable( rHdl ); -} - -sal_Bool View::MarkPoint(SdrHdl& rHdl, sal_Bool bUnmark ) -{ - if( maSmartTags.MarkPoint( rHdl, bUnmark ) ) - return true; - else - return FmFormView::MarkPoint( rHdl, bUnmark ); -} - -sal_Bool View::MarkPoints(const Rectangle* pRect, sal_Bool bUnmark) -{ - if( maSmartTags.MarkPoints( pRect, bUnmark ) ) - return true; - else - return FmFormView::MarkPoints( pRect, bUnmark ); -} - -void View::CheckPossibilities() -{ - FmFormView::CheckPossibilities(); - maSmartTags.CheckPossibilities(); -} - -void View::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfos*/ ) -{ -} - -/** this is called after a paste or drop operation, make sure that the newly inserted paragraphs - get the correct style sheet. */ -void View::OnEndPasteOrDrop( PasteOrDropInfos* pInfos ) -{ - SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( GetTextEditObject() ); - SdrOutliner* pOutliner = GetTextEditOutliner(); - if( pOutliner && pTextObj && pTextObj->GetPage() ) - { - SdPage* pPage = static_cast< SdPage* >( pTextObj->GetPage() ); - - SfxStyleSheet* pStyleSheet = 0; - - const PresObjKind eKind = pPage->GetPresObjKind(pTextObj); - if( eKind != PRESOBJ_NONE ) - pStyleSheet = pPage->GetStyleSheetForPresObj(eKind); - else - pStyleSheet = pTextObj->GetStyleSheet(); - - if( eKind == PRESOBJ_OUTLINE ) - { - // for outline shapes, set the correct outline style sheet for each - // new paragraph, depending on the paragraph depth - SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool(); - - for ( sal_uInt16 nPara = pInfos->nStartPara; nPara <= pInfos->nEndPara; nPara++ ) - { - sal_Int16 nDepth = pOutliner->GetDepth( nPara ); - - SfxStyleSheet* pStyle = 0; - if( nDepth > 0 ) - { - String aStyleSheetName( pStyleSheet->GetName() ); - aStyleSheetName.Erase( aStyleSheetName.Len() - 1, 1 ); - aStyleSheetName += String::CreateFromInt32( nDepth ); - pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyleSheet->GetFamily() ) ); - DBG_ASSERT( pStyle, "sd::View::OnEndPasteOrDrop(), Style not found!" ); - } - - if( !pStyle ) - pStyle = pStyleSheet; - - pOutliner->SetStyleSheet( nPara, pStyle ); - } - } - else - { - // just put the object style on each new paragraph - for ( sal_uInt16 nPara = pInfos->nStartPara; nPara <= pInfos->nEndPara; nPara++ ) - { - pOutliner->SetStyleSheet( nPara, pStyleSheet ); - } - } - } -} - -} // end of namespace sd - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |