2010-10-14 08:30:41 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2011-03-31 10:05:04 +02:00
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*
|
|
|
|
* This file incorporates work covered by the following license notice:
|
|
|
|
*
|
|
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
|
|
* contributor license agreements. See the NOTICE file distributed
|
|
|
|
* with this work for additional information regarding copyright
|
|
|
|
* ownership. The ASF licenses this file to you under the Apache
|
|
|
|
* License, Version 2.0 (the "License"); you may not use this file
|
|
|
|
* except in compliance with the License. You may obtain a copy of
|
|
|
|
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
|
|
|
|
*/
|
2006-09-16 20:14:38 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
#include "hintids.hxx"
|
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
#include <svx/sdrobjectfilter.hxx>
|
|
|
|
#include <svx/svditer.hxx>
|
2007-09-27 07:51:28 +00:00
|
|
|
#include <svx/svdobj.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <svx/svdouno.hxx>
|
|
|
|
#include <svx/svdoole2.hxx>
|
|
|
|
#include <svx/svdogrp.hxx>
|
2002-06-24 13:53:54 +00:00
|
|
|
#include <svx/svdocirc.hxx>
|
|
|
|
#include <svx/svdopath.hxx>
|
|
|
|
#include <svx/sxciaitm.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <svx/xfillit.hxx>
|
|
|
|
#include <svx/svdocapt.hxx>
|
|
|
|
#include <sfx2/app.hxx>
|
2010-01-08 18:32:51 +01:00
|
|
|
#include <editeng/boxitem.hxx>
|
|
|
|
#include <editeng/opaqitem.hxx>
|
|
|
|
#include <editeng/protitem.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <svx/svdpage.hxx>
|
2002-11-07 06:57:51 +00:00
|
|
|
#include <svx/svdpagv.hxx>
|
2010-11-03 15:50:00 +01:00
|
|
|
#include <IDocumentSettingAccess.hxx>
|
2014-05-25 14:10:13 +02:00
|
|
|
#include <DocumentSettingManager.hxx>
|
2010-11-03 15:50:00 +01:00
|
|
|
#include <cmdid.h>
|
2014-06-19 09:15:04 +01:00
|
|
|
#include <drawdoc.hxx>
|
2014-06-24 17:11:25 +02:00
|
|
|
#include <textboxhelper.hxx>
|
2013-10-22 15:58:57 +03:00
|
|
|
#include <poolfmt.hrc>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include <frmfmt.hxx>
|
|
|
|
#include <frmatr.hxx>
|
|
|
|
#include <fmtfsize.hxx>
|
|
|
|
#include <fmtanchr.hxx>
|
|
|
|
#include <fmtornt.hxx>
|
|
|
|
#include <fmtsrnd.hxx>
|
|
|
|
#include <fmtcntnt.hxx>
|
|
|
|
#include <fmtflcnt.hxx>
|
|
|
|
#include <fmtcnct.hxx>
|
|
|
|
#include <docary.hxx>
|
|
|
|
#include <tblsel.hxx>
|
|
|
|
#include <swtable.hxx>
|
2002-05-30 15:35:18 +00:00
|
|
|
#include <flyfrms.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include "fesh.hxx"
|
|
|
|
#include "rootfrm.hxx"
|
|
|
|
#include "pagefrm.hxx"
|
|
|
|
#include "sectfrm.hxx"
|
|
|
|
#include "doc.hxx"
|
2010-11-25 14:31:11 +01:00
|
|
|
#include <IDocumentUndoRedo.hxx>
|
2000-09-18 23:08:29 +00:00
|
|
|
#include "dview.hxx"
|
|
|
|
#include "dflyobj.hxx"
|
|
|
|
#include "dcontact.hxx"
|
|
|
|
#include "viewimp.hxx"
|
|
|
|
#include "flyfrm.hxx"
|
|
|
|
#include "pam.hxx"
|
|
|
|
#include "ndole.hxx"
|
|
|
|
#include "ndgrf.hxx"
|
|
|
|
#include "ndtxt.hxx"
|
2013-10-22 15:58:57 +03:00
|
|
|
#include "viewopt.hxx"
|
2000-09-18 23:08:29 +00:00
|
|
|
#include "swundo.hxx"
|
|
|
|
#include "notxtfrm.hxx"
|
|
|
|
#include "txtfrm.hxx"
|
|
|
|
#include "txatbase.hxx"
|
2013-10-22 15:58:57 +03:00
|
|
|
#include "mdiexp.hxx"
|
2004-08-02 13:03:20 +00:00
|
|
|
#include <sortedobjs.hxx>
|
2006-03-21 14:34:16 +00:00
|
|
|
#include <HandleAnchorNodeChg.hxx>
|
2006-11-14 14:09:49 +00:00
|
|
|
#include <basegfx/polygon/b2dpolygon.hxx>
|
2010-12-17 09:02:23 +01:00
|
|
|
#include <switerator.hxx>
|
2006-11-14 14:09:49 +00:00
|
|
|
|
2013-01-17 11:36:39 -05:00
|
|
|
#include <com/sun/star/embed/EmbedMisc.hpp>
|
|
|
|
#include <com/sun/star/embed/Aspects.hpp>
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
#define SCROLLVAL 75
|
|
|
|
|
2004-10-04 18:06:57 +00:00
|
|
|
using namespace com::sun::star;
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// tolerance limit of Drawing-SS
|
2011-01-17 15:06:54 +01:00
|
|
|
#define MINMOVE ((sal_uInt16)GetOut()->PixelToLogic(Size(Imp()->GetDrawView()->GetMarkHdlSizePixel()/2,0)).Width())
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2013-10-26 19:50:13 +02:00
|
|
|
SwFlyFrm *GetFlyFromMarked( const SdrMarkList *pLst, SwViewShell *pSh )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( !pLst )
|
2004-07-12 14:47:48 +00:00
|
|
|
pLst = pSh->HasDrawView() ? &pSh->Imp()->GetDrawView()->GetMarkedObjectList():0;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( pLst && pLst->GetMarkCount() == 1 )
|
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pO = pLst->GetMark( 0 )->GetMarkedSdrObj();
|
2010-06-13 15:22:56 +02:00
|
|
|
if ( pO && pO->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
return ((SwVirtFlyDrawObj*)pO)->GetFlyFrm();
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-10-12 16:49:40 +02:00
|
|
|
static void lcl_GrabCursor( SwFEShell* pSh, SwFlyFrm* pOldSelFly)
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwFrmFmt *pFlyFmt = pSh->SelFlyGrabCrsr();
|
|
|
|
if( pFlyFmt && !pSh->ActionPend() &&
|
|
|
|
(!pOldSelFly || pOldSelFly->GetFmt() != pFlyFmt) )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// now call set macro if applicable
|
2000-09-18 23:08:29 +00:00
|
|
|
pSh->GetFlyMacroLnk().Call( (void*)pFlyFmt );
|
2013-01-08 10:09:22 +09:00
|
|
|
extern bool bNoInterrupt; // in swapp.cxx
|
2012-01-17 20:39:02 +01:00
|
|
|
// if a dialog was started inside a macro, then
|
|
|
|
// MouseButtonUp arrives at macro and not to us. Therefore
|
|
|
|
// flag is always set here and will never be switched to
|
|
|
|
// respective Shell !!!!!!!
|
|
|
|
|
2013-01-08 10:09:22 +09:00
|
|
|
bNoInterrupt = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else if( !pFlyFmt || RES_DRAWFRMFMT == pFlyFmt->Which() )
|
2007-07-31 16:41:19 +00:00
|
|
|
{
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> assure consistent cursor
|
2007-07-31 16:41:19 +00:00
|
|
|
pSh->KillPams();
|
|
|
|
pSh->ClearMark();
|
2014-04-25 14:00:35 +02:00
|
|
|
pSh->SetCrsr( pSh->Imp()->GetDrawView()->GetAllMarkedRect().TopLeft(), true);
|
2007-07-31 16:41:19 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::SelectObj( const Point& rPt, sal_uInt8 nFlag, SdrObject *pObj )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-13 14:55:32 +00:00
|
|
|
SwDrawView *pDView = Imp()->GetDrawView();
|
|
|
|
if(!pDView)
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
SET_CURR_SHELL( this );
|
2012-01-17 23:07:43 +01:00
|
|
|
StartAction(); // action is necessary to assure only one AttrChgdNotify
|
|
|
|
// (e.g. due to Unmark->MarkListHasChgd) arrives
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = pDView->GetMarkedObjectList();
|
2012-11-24 09:06:58 +09:00
|
|
|
const bool bHadSelection = rMrkList.GetMarkCount();
|
2014-04-25 14:00:35 +02:00
|
|
|
const bool bAddSelect = 0 != (SW_ADD_SELECT & nFlag);
|
|
|
|
const bool bEnterGroup = 0 != (SW_ENTER_GROUP & nFlag);
|
2000-09-18 23:08:29 +00:00
|
|
|
SwFlyFrm* pOldSelFly = 0;
|
|
|
|
const Point aOldPos( pDView->GetAllMarkedRect().TopLeft() );
|
|
|
|
|
|
|
|
if( bHadSelection )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// call Unmark when !bAddSelect or if fly was selected
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bUnmark = !bAddSelect;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( rMrkList.GetMarkCount() == 1 )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// if fly was selected, deselect it first
|
2000-09-18 23:08:29 +00:00
|
|
|
pOldSelFly = ::GetFlyFromMarked( &rMrkList, this );
|
|
|
|
if ( pOldSelFly )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
const sal_uInt16 nType = GetCntType();
|
2002-04-09 13:21:41 +00:00
|
|
|
if( nType != CNT_TXT || (SW_LEAVE_FRAME & nFlag) ||
|
2000-09-18 23:08:29 +00:00
|
|
|
( pOldSelFly->GetFmt()->GetProtect().IsCntntProtected()
|
|
|
|
&& !IsReadOnlyAvailable() ))
|
|
|
|
{
|
2012-01-17 23:07:43 +01:00
|
|
|
// If a fly is deselected, which contains graphic, OLE or
|
|
|
|
// otherwise, the cursor should be removed from it.
|
2012-01-17 20:39:02 +01:00
|
|
|
// Similar if a fly with protected content is deselected.
|
2012-01-17 23:07:43 +01:00
|
|
|
// For simplicity we put the cursor next to the upper-left
|
|
|
|
// corner.
|
2000-09-18 23:08:29 +00:00
|
|
|
Point aPt( pOldSelFly->Frm().Pos() );
|
2013-05-17 09:17:02 +02:00
|
|
|
aPt.setX(aPt.getX() - 1);
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bUnLockView = !IsViewLocked();
|
2014-04-25 14:00:35 +02:00
|
|
|
LockView( true );
|
|
|
|
SetCrsr( aPt, true );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bUnLockView )
|
2014-04-25 14:00:35 +02:00
|
|
|
LockView( false );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if ( nType & CNT_GRF &&
|
|
|
|
((SwNoTxtFrm*)pOldSelFly->Lower())->HasAnimation() )
|
|
|
|
{
|
|
|
|
GetWin()->Invalidate( pOldSelFly->Frm().SVRect() );
|
|
|
|
}
|
2012-11-24 09:06:58 +09:00
|
|
|
bUnmark = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( bUnmark )
|
|
|
|
pDView->UnmarkAll();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
KillPams();
|
|
|
|
ClearMark();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pObj )
|
2002-05-15 12:22:47 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( !bEnterGroup, "SW_ENTER_GROUP is not supported" );
|
2002-05-15 12:22:47 +00:00
|
|
|
pDView->MarkObj( pObj, Imp()->GetPageView() );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2002-05-15 12:22:47 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->MarkObj( rPt, MINMOVE, bAddSelect, bEnterGroup );
|
2002-05-15 12:22:47 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
const bool bRet = 0 != rMrkList.GetMarkCount();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( rMrkList.GetMarkCount() > 1 )
|
|
|
|
{
|
2012-01-17 23:07:43 +01:00
|
|
|
// It sucks if Drawing objects were selected and now
|
|
|
|
// additionally a fly is selected.
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
SdrObject *pTmpObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bForget = pTmpObj->ISA(SwVirtFlyDrawObj);
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bForget )
|
|
|
|
{
|
|
|
|
pDView->UnmarkAll();
|
2010-03-17 13:44:55 +01:00
|
|
|
pDView->MarkObj( pTmpObj, Imp()->GetPageView(), bAddSelect, bEnterGroup );
|
2000-09-18 23:08:29 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-24 17:11:25 +02:00
|
|
|
// If the fly frame is a textbox of a shape, then select the shape instead.
|
|
|
|
std::map<SwFrmFmt*, SwFrmFmt*> aTextBoxShapes = SwTextBoxHelper::findShapes(mpDoc);
|
|
|
|
for (sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i)
|
|
|
|
{
|
|
|
|
SdrObject* pObject = rMrkList.GetMark(i)->GetMarkedSdrObj();
|
|
|
|
SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(GetUserCall(pObject));
|
|
|
|
SwFrmFmt* pFmt = pDrawContact->GetFmt();
|
|
|
|
if (aTextBoxShapes.find(pFmt) != aTextBoxShapes.end())
|
|
|
|
{
|
|
|
|
SdrObject* pShape = aTextBoxShapes[pFmt]->FindSdrObject();
|
|
|
|
pDView->UnmarkAll();
|
|
|
|
pDView->MarkObj(pShape, Imp()->GetPageView(), bAddSelect, bEnterGroup);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( bRet )
|
|
|
|
{
|
|
|
|
::lcl_GrabCursor(this, pOldSelFly);
|
|
|
|
if ( GetCntType() & CNT_GRF )
|
|
|
|
{
|
|
|
|
const SwFlyFrm *pTmp = GetFlyFromMarked( &rMrkList, this );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pTmp, "Graphic without Fly" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( ((SwNoTxtFrm*)pTmp->Lower())->HasAnimation() )
|
|
|
|
((SwNoTxtFrm*)pTmp->Lower())->StopAnimation( GetOut() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( !pOldSelFly && bHadSelection )
|
2014-04-25 14:00:35 +02:00
|
|
|
SetCrsr( aOldPos, true);
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( bRet || !bHadSelection )
|
|
|
|
CallChgLnk();
|
|
|
|
|
|
|
|
// update der Statuszeile
|
|
|
|
::FrameNotify( this, bRet ? FLY_DRAG_START : FLY_DRAG_END );
|
|
|
|
|
|
|
|
EndAction();
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
/*
|
|
|
|
* Description: MoveAnchor( nDir ) looked for an another Anchor for
|
|
|
|
* the selected drawing object (or fly frame) in the given direction.
|
|
|
|
* An object "as character" doesn't moves anyway.
|
|
|
|
* A page bounded object could move to the previous/next page with up/down,
|
|
|
|
* an object bounded "at paragraph" moves to the previous/next paragraph, too.
|
|
|
|
* An object bounded "at character" moves to the previous/next paragraph
|
|
|
|
* with up/down and to the previous/next character with left/right.
|
|
|
|
* If the anchor for at paragraph/character bounded objects has vertical or
|
|
|
|
* right_to_left text direction, the directions for up/down/left/right will
|
|
|
|
* interpreted accordingly.
|
|
|
|
* An object bounded "at fly" takes the center of the actual anchor and looks
|
|
|
|
* for the nearest fly frame in the given direction.
|
|
|
|
*/
|
2002-05-30 15:35:18 +00:00
|
|
|
|
2013-05-17 09:17:02 +02:00
|
|
|
#define LESS_X( aPt1, aPt2, bOld ) ( aPt1.getX() < aPt2.getX() || \
|
|
|
|
( aPt1.getX() == aPt2.getX() && ( aPt1.getY() < aPt2.getY() || \
|
|
|
|
( aPt1.getY() == aPt2.getY() && bOld ) ) ) )
|
|
|
|
#define LESS_Y( aPt1, aPt2, bOld ) ( aPt1.getY() < aPt2.getY() || \
|
|
|
|
( aPt1.getY() == aPt2.getY() && ( aPt1.getX() < aPt2.getX() || \
|
|
|
|
( aPt1.getX() == aPt2.getX() && bOld ) ) ) )
|
2002-05-28 13:05:17 +00:00
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::MoveAnchor( sal_uInt16 nDir )
|
2002-05-28 13:05:17 +00:00
|
|
|
{
|
|
|
|
const SdrMarkList* pMrkList;
|
|
|
|
if( !Imp()->GetDrawView() ||
|
2004-07-12 14:47:48 +00:00
|
|
|
0 == (pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList()) ||
|
2002-05-28 13:05:17 +00:00
|
|
|
1 != pMrkList->GetMarkCount())
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2002-05-28 13:05:17 +00:00
|
|
|
SwFrm* pOld;
|
2002-05-30 15:35:18 +00:00
|
|
|
SwFlyFrm* pFly = NULL;
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
|
2003-11-24 15:03:25 +00:00
|
|
|
if( pObj->ISA(SwVirtFlyDrawObj) )
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
|
|
|
pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
|
2004-06-28 12:34:54 +00:00
|
|
|
pOld = pFly->AnchorFrm();
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
2002-05-28 13:05:17 +00:00
|
|
|
else
|
2004-06-28 12:34:54 +00:00
|
|
|
pOld = ((SwDrawContact*)GetUserCall(pObj))->GetAnchorFrm( pObj );
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = false;
|
2002-05-28 13:05:17 +00:00
|
|
|
if( pOld )
|
|
|
|
{
|
2002-05-30 15:35:18 +00:00
|
|
|
SwFrm* pNew = pOld;
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i28701#
|
2004-08-02 13:03:20 +00:00
|
|
|
SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj );
|
|
|
|
SwFrmFmt& rFmt = pAnchoredObj->GetFrmFmt();
|
|
|
|
SwFmtAnchor aAnch( rFmt.GetAnchor() );
|
2002-05-30 15:35:18 +00:00
|
|
|
RndStdIds nAnchorId = aAnch.GetAnchorId();
|
2010-01-05 16:37:41 +01:00
|
|
|
if ( FLY_AS_CHAR == nAnchorId )
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2002-05-30 15:35:18 +00:00
|
|
|
if( pOld->IsVertical() )
|
|
|
|
{
|
|
|
|
if( pOld->IsTxtFrm() )
|
|
|
|
{
|
|
|
|
switch( nDir ) {
|
|
|
|
case SW_MOVE_UP: nDir = SW_MOVE_LEFT; break;
|
|
|
|
case SW_MOVE_DOWN: nDir = SW_MOVE_RIGHT; break;
|
|
|
|
case SW_MOVE_LEFT: nDir = SW_MOVE_DOWN; break;
|
|
|
|
case SW_MOVE_RIGHT: nDir = SW_MOVE_UP; break;
|
|
|
|
}
|
|
|
|
if( pOld->IsRightToLeft() )
|
|
|
|
{
|
|
|
|
if( nDir == SW_MOVE_LEFT )
|
|
|
|
nDir = SW_MOVE_RIGHT;
|
|
|
|
else if( nDir == SW_MOVE_RIGHT )
|
|
|
|
nDir = SW_MOVE_LEFT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
switch ( nAnchorId ) {
|
2010-01-05 16:37:41 +01:00
|
|
|
case FLY_AT_PAGE:
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( pOld->IsPageFrm(), "Wrong anchor, page expected." );
|
2002-05-30 15:35:18 +00:00
|
|
|
if( SW_MOVE_UP == nDir )
|
|
|
|
pNew = pOld->GetPrev();
|
|
|
|
else if( SW_MOVE_DOWN == nDir )
|
|
|
|
pNew = pOld->GetNext();
|
|
|
|
if( pNew && pNew != pOld )
|
|
|
|
{
|
|
|
|
aAnch.SetPageNum( ((SwPageFrm*)pNew)->GetPhyPageNum() );
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2010-01-05 16:37:41 +01:00
|
|
|
case FLY_AT_CHAR:
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( pOld->IsCntntFrm(), "Wrong anchor, page expected." );
|
2002-05-30 15:35:18 +00:00
|
|
|
if( SW_MOVE_LEFT == nDir || SW_MOVE_RIGHT == nDir )
|
|
|
|
{
|
|
|
|
SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
|
|
|
|
SwTxtNode* pTxtNd = ((SwTxtFrm*)pOld)->GetTxtNode();
|
2013-11-12 00:46:22 +01:00
|
|
|
const sal_Int32 nAct = pPos->nContent.GetIndex();
|
2002-05-30 15:35:18 +00:00
|
|
|
if( SW_MOVE_LEFT == nDir )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2002-05-30 15:35:18 +00:00
|
|
|
if( nAct )
|
|
|
|
{
|
2013-11-12 00:46:22 +01:00
|
|
|
pPos->nContent.Assign( pTxtNd, nAct-1 );
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
nDir = SW_MOVE_UP;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-11-12 00:46:22 +01:00
|
|
|
const sal_Int32 nMax =
|
2013-02-18 18:36:45 +01:00
|
|
|
static_cast<SwTxtFrm*>(pOld)->GetTxtNode()->GetTxt().getLength();
|
2002-05-30 15:35:18 +00:00
|
|
|
if( nAct < nMax )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2013-11-12 00:46:22 +01:00
|
|
|
pPos->nContent.Assign( pTxtNd, nAct+1 );
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
nDir = SW_MOVE_DOWN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} // no break!
|
2010-01-05 16:37:41 +01:00
|
|
|
case FLY_AT_PARA:
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( pOld->IsCntntFrm(), "Wrong anchor, page expected." );
|
2002-05-30 15:35:18 +00:00
|
|
|
if( SW_MOVE_UP == nDir )
|
|
|
|
pNew = pOld->FindPrev();
|
|
|
|
else if( SW_MOVE_DOWN == nDir )
|
|
|
|
pNew = pOld->FindNext();
|
|
|
|
if( pNew && pNew != pOld && pNew->IsCntntFrm() )
|
|
|
|
{
|
|
|
|
SwPosition *pPos = (SwPosition*)aAnch.GetCntntAnchor();
|
|
|
|
SwTxtNode* pTxtNd = ((SwTxtFrm*)pNew)->GetTxtNode();
|
|
|
|
pPos->nNode = *pTxtNd;
|
2013-11-12 00:46:22 +01:00
|
|
|
sal_Int32 nTmp = 0;
|
2002-05-30 15:35:18 +00:00
|
|
|
if( bRet )
|
|
|
|
{
|
2013-02-18 18:36:45 +01:00
|
|
|
nTmp = static_cast<SwTxtFrm*>(pNew)->GetTxtNode()->GetTxt().getLength();
|
2002-05-30 15:35:18 +00:00
|
|
|
if( nTmp )
|
|
|
|
--nTmp;
|
|
|
|
}
|
|
|
|
pPos->nContent.Assign( pTxtNd, nTmp );
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
else if( SW_MOVE_UP == nDir || SW_MOVE_DOWN == nDir )
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2002-05-30 15:35:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case FLY_AT_FLY:
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( pOld->IsFlyFrm(), "Wrong anchor, fly frame expected.");
|
2002-05-30 15:35:18 +00:00
|
|
|
SwPageFrm* pPage = pOld->FindPageFrm();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pPage, "Where's my page?" );
|
2002-05-30 15:35:18 +00:00
|
|
|
SwFlyFrm* pNewFly = NULL;
|
|
|
|
if( pPage->GetSortedObjs() )
|
|
|
|
{
|
|
|
|
int i;
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bOld = false;
|
2002-05-30 15:35:18 +00:00
|
|
|
Point aCenter( pOld->Frm().Left() + pOld->Frm().Width()/2,
|
|
|
|
pOld->Frm().Top() + pOld->Frm().Height()/2 );
|
|
|
|
Point aBest;
|
2011-01-17 15:06:54 +01:00
|
|
|
for( i = 0; (sal_uInt16)i<pPage->GetSortedObjs()->Count(); ++i )
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
SwAnchoredObject* pAnchObj =
|
2004-08-02 13:03:20 +00:00
|
|
|
(*pPage->GetSortedObjs())[i];
|
2007-09-27 07:51:28 +00:00
|
|
|
if( pAnchObj->ISA(SwFlyFrm) )
|
2002-05-30 15:35:18 +00:00
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
SwFlyFrm* pTmp = static_cast<SwFlyFrm*>(pAnchObj);
|
2002-05-30 15:35:18 +00:00
|
|
|
if( pTmp == pOld )
|
2012-11-24 09:06:58 +09:00
|
|
|
bOld = true;
|
2002-05-30 15:35:18 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
const SwFlyFrm* pCheck = pFly ? pTmp : 0;
|
|
|
|
while( pCheck )
|
|
|
|
{
|
|
|
|
if( pCheck == pFly )
|
|
|
|
break;
|
2004-06-28 12:34:54 +00:00
|
|
|
const SwFrm *pNxt = pCheck->GetAnchorFrm();
|
2002-05-30 15:35:18 +00:00
|
|
|
pCheck = pNxt ? pNxt->FindFlyFrm() : NULL;
|
|
|
|
}
|
|
|
|
if( pCheck || pTmp->IsProtected() )
|
|
|
|
continue;
|
|
|
|
Point aNew( pTmp->Frm().Left() +
|
|
|
|
pTmp->Frm().Width()/2,
|
|
|
|
pTmp->Frm().Top() +
|
|
|
|
pTmp->Frm().Height()/2 );
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bAccept = false;
|
2002-05-30 15:35:18 +00:00
|
|
|
switch( nDir ) {
|
|
|
|
case SW_MOVE_RIGHT:
|
|
|
|
{
|
|
|
|
bAccept = LESS_X( aCenter, aNew, bOld )
|
|
|
|
&& ( !pNewFly ||
|
2012-11-24 09:06:58 +09:00
|
|
|
LESS_X( aNew, aBest, false ) );
|
2002-05-30 15:35:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SW_MOVE_LEFT:
|
|
|
|
{
|
|
|
|
bAccept = LESS_X( aNew, aCenter, !bOld )
|
|
|
|
&& ( !pNewFly ||
|
2012-11-24 09:06:58 +09:00
|
|
|
LESS_X( aBest, aNew, true ) );
|
2002-05-30 15:35:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SW_MOVE_UP:
|
|
|
|
{
|
|
|
|
bAccept = LESS_Y( aNew, aCenter, !bOld )
|
|
|
|
&& ( !pNewFly ||
|
2012-11-24 09:06:58 +09:00
|
|
|
LESS_Y( aBest, aNew, true ) );
|
2002-05-30 15:35:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SW_MOVE_DOWN:
|
|
|
|
{
|
|
|
|
bAccept = LESS_Y( aCenter, aNew, bOld )
|
|
|
|
&& ( !pNewFly ||
|
2012-11-24 09:06:58 +09:00
|
|
|
LESS_Y( aNew, aBest, false ) );
|
2002-05-30 15:35:18 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if( bAccept )
|
|
|
|
{
|
|
|
|
pNewFly = pTmp;
|
|
|
|
aBest = aNew;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pNewFly )
|
|
|
|
{
|
|
|
|
SwPosition aPos( *pNewFly->GetFmt()->
|
|
|
|
GetCntnt().GetCntntIdx());
|
|
|
|
aAnch.SetAnchor( &aPos );
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2007-09-27 07:51:28 +00:00
|
|
|
default: break;
|
2002-05-30 15:35:18 +00:00
|
|
|
}
|
|
|
|
if( bRet )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> handle change of anchor node:
|
2006-03-21 14:34:16 +00:00
|
|
|
// if count of the anchor frame also change, the fly frames have to be
|
|
|
|
// re-created. Thus, delete all fly frames except the <this> before the
|
|
|
|
// anchor attribute is change and re-create them afterwards.
|
|
|
|
{
|
|
|
|
SwHandleAnchorNodeChg* pHandleAnchorNodeChg( 0L );
|
|
|
|
SwFlyFrmFmt* pFlyFrmFmt( dynamic_cast<SwFlyFrmFmt*>(&rFmt) );
|
|
|
|
if ( pFlyFrmFmt )
|
|
|
|
{
|
|
|
|
pHandleAnchorNodeChg =
|
|
|
|
new SwHandleAnchorNodeChg( *pFlyFrmFmt, aAnch );
|
|
|
|
}
|
|
|
|
rFmt.GetDoc()->SetAttr( aAnch, rFmt );
|
|
|
|
delete pHandleAnchorNodeChg;
|
|
|
|
}
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i28701# - no call of method
|
2004-08-02 13:03:20 +00:00
|
|
|
// <CheckCharRectAndTopOfLine()> for to-character anchored
|
|
|
|
// Writer fly frame needed. This method call can cause a
|
|
|
|
// format of the anchor frame, which is no longer intended.
|
|
|
|
// Instead clear the anchor character rectangle and
|
|
|
|
// the top of line values for all to-character anchored objects.
|
|
|
|
pAnchoredObj->ClearCharRectAndTopOfLine();
|
2002-05-30 15:35:18 +00:00
|
|
|
EndAllAction();
|
2002-05-28 13:05:17 +00:00
|
|
|
}
|
|
|
|
}
|
2002-05-30 15:35:18 +00:00
|
|
|
return bRet;
|
2002-05-28 13:05:17 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2003-07-04 12:20:40 +00:00
|
|
|
const SdrMarkList* SwFEShell::_GetMarkList() const
|
|
|
|
{
|
|
|
|
const SdrMarkList* pMarkList = NULL;
|
|
|
|
if( Imp()->GetDrawView() != NULL )
|
2004-07-12 14:47:48 +00:00
|
|
|
pMarkList = &Imp()->GetDrawView()->GetMarkedObjectList();
|
2003-07-04 12:20:40 +00:00
|
|
|
return pMarkList;
|
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 SwFEShell::GetSelFrmType() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 eType;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2003-07-04 12:20:40 +00:00
|
|
|
// get marked frame list, and check if anything is selected
|
|
|
|
const SdrMarkList* pMarkList = _GetMarkList();
|
|
|
|
if( pMarkList == NULL || pMarkList->GetMarkCount() == 0 )
|
|
|
|
eType = FRMTYPE_NONE;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// obtain marked item as fly frame; if no fly frame, it must
|
|
|
|
// be a draw object
|
2013-10-26 19:50:13 +02:00
|
|
|
const SwFlyFrm* pFly = ::GetFlyFromMarked(pMarkList, (SwViewShell*)this);
|
2003-07-04 12:20:40 +00:00
|
|
|
if ( pFly != NULL )
|
|
|
|
{
|
|
|
|
if( pFly->IsFlyLayFrm() )
|
|
|
|
eType = FRMTYPE_FLY_FREE;
|
|
|
|
else if( pFly->IsFlyAtCntFrm() )
|
|
|
|
eType = FRMTYPE_FLY_ATCNT;
|
|
|
|
else
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( pFly->IsFlyInCntFrm(), "New frametype?" );
|
2003-07-04 12:20:40 +00:00
|
|
|
eType = FRMTYPE_FLY_INCNT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
eType = FRMTYPE_DRAWOBJ;
|
|
|
|
}
|
|
|
|
|
|
|
|
return eType;
|
|
|
|
}
|
|
|
|
|
2011-02-08 08:51:51 +01:00
|
|
|
// does the draw selection contain a control?
|
2003-07-04 12:20:40 +00:00
|
|
|
bool SwFEShell::IsSelContainsControl() const
|
|
|
|
{
|
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2003-07-04 12:20:40 +00:00
|
|
|
// basically, copy the mechanism from GetSelFrmType(), but call
|
|
|
|
// CheckControl... if you get a drawing object
|
|
|
|
const SdrMarkList* pMarkList = _GetMarkList();
|
|
|
|
if( pMarkList != NULL && pMarkList->GetMarkCount() == 1 )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2003-07-04 12:20:40 +00:00
|
|
|
// if we have one marked object, get the SdrObject and check
|
|
|
|
// whether it contains a control
|
2006-07-25 11:33:25 +00:00
|
|
|
const SdrObject* pSdrObject = pMarkList->GetMark( 0 )->GetMarkedSdrObj();
|
2010-11-02 09:55:12 +01:00
|
|
|
bRet = pSdrObject && ::CheckControlLayer( pSdrObject );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2003-07-04 12:20:40 +00:00
|
|
|
return bRet;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2007-09-27 07:51:28 +00:00
|
|
|
void SwFEShell::ScrollTo( const Point &rPt )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
const SwRect aRect( rPt, rPt );
|
|
|
|
if ( IsScrollMDI( this, aRect ) &&
|
2004-07-12 14:47:48 +00:00
|
|
|
(!Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() ||
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->IsDragPossible( rPt )) )
|
|
|
|
{
|
|
|
|
ScrollMDI( this, aRect, SCROLLVAL, SCROLLVAL );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
void SwFEShell::SetDragMode( sal_uInt16 eDragMode )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
Imp()->GetDrawView()->SetDragMode( (SdrDragMode)eDragMode );
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
long SwFEShell::BeginDrag( const Point* pPt, bool )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SdrView *pView = Imp()->GetDrawView();
|
2004-07-12 14:47:48 +00:00
|
|
|
if ( pView && pView->AreObjectsMarked() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
delete pChainFrom; delete pChainTo; pChainFrom = pChainTo = 0;
|
2006-11-14 14:09:49 +00:00
|
|
|
SdrHdl* pHdl = pView->PickHandle( *pPt );
|
2010-11-22 10:32:27 +00:00
|
|
|
pView->BegDragObj( *pPt, 0, pHdl );
|
2000-09-18 23:08:29 +00:00
|
|
|
::FrameNotify( this, FLY_DRAG );
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
long SwFEShell::Drag( const Point *pPt, bool )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "Drag without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( Imp()->GetDrawView()->IsDragObj() )
|
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
ScrollTo( *pPt );
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->MovDragObj( *pPt );
|
|
|
|
Imp()->GetDrawView()->ShowDragAnchor();
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
long SwFEShell::EndDrag( const Point *, bool )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "EndDrag without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
SdrView *pView = Imp()->GetDrawView();
|
|
|
|
if ( pView->IsDragObj() )
|
|
|
|
{
|
2013-10-26 19:50:13 +02:00
|
|
|
// Setup Start-/EndActions only to the SwViewShell
|
|
|
|
SwViewShell *pSh = this;
|
2000-09-18 23:08:29 +00:00
|
|
|
do {
|
|
|
|
pSh->StartAction();
|
2013-10-26 19:50:13 +02:00
|
|
|
} while ( this != (pSh = (SwViewShell*)pSh->GetNext()) );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
StartUndo( UNDO_START );
|
|
|
|
|
2012-01-17 23:07:43 +01:00
|
|
|
// #50778# Bug during dragging: In StartAction a HideShowXor is called.
|
2012-01-17 20:39:02 +01:00
|
|
|
// In EndDragObj() this is reversed, for no reason and even wrong.
|
|
|
|
// To restore consistancy we should bring up the Xor again.
|
2002-01-29 09:41:09 +00:00
|
|
|
|
|
|
|
// Reanimation from the hack #50778 to fix bug #97057
|
|
|
|
// May be not the best solution, but the one with lowest risc at the moment.
|
2012-01-17 20:39:02 +01:00
|
|
|
// pView->ShowShownXor( GetOut() );
|
2002-01-29 09:41:09 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
pView->EndDragObj();
|
2012-01-17 20:39:02 +01:00
|
|
|
|
|
|
|
// DrawUndo on to flyframes are not stored
|
|
|
|
// The flys change the flag.
|
2010-11-25 14:31:11 +01:00
|
|
|
GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(true);
|
2012-10-23 18:35:04 +09:00
|
|
|
ChgAnchor( 0, true );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
EndUndo( UNDO_END );
|
|
|
|
|
|
|
|
do {
|
|
|
|
pSh->EndAction();
|
|
|
|
if( pSh->IsA( TYPE( SwCrsrShell ) ) )
|
|
|
|
((SwCrsrShell*)pSh)->CallChgLnk();
|
2013-10-26 19:50:13 +02:00
|
|
|
} while ( this != (pSh = (SwViewShell*)pSh->GetNext()) );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
GetDoc()->SetModified();
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::BreakDrag()
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "BreakDrag without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( Imp()->GetDrawView()->IsDragObj() )
|
|
|
|
Imp()->GetDrawView()->BrkDragObj();
|
|
|
|
SetChainMarker();
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// If a fly is selected, pulls the crsr in the first CntntFrm
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwFrmFmt* SwFEShell::SelFlyGrabCrsr()
|
|
|
|
{
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwFlyFrm *pFly = ::GetFlyFromMarked( &rMrkList, this );
|
|
|
|
|
|
|
|
if( pFly )
|
|
|
|
{
|
|
|
|
SwCntntFrm *pCFrm = pFly->ContainsCntnt();
|
|
|
|
if ( pCFrm )
|
|
|
|
{
|
|
|
|
SwCntntNode *pCNode = pCFrm->GetNode();
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> assure, that the cursor is consistent.
|
2007-07-31 16:41:19 +00:00
|
|
|
KillPams();
|
|
|
|
ClearMark();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwPaM *pCrsr = GetCrsr();
|
|
|
|
|
|
|
|
pCrsr->GetPoint()->nNode = *pCNode;
|
|
|
|
pCrsr->GetPoint()->nContent.Assign( pCNode, 0 );
|
|
|
|
|
|
|
|
SwRect& rChrRect = (SwRect&)GetCharRect();
|
|
|
|
rChrRect = pFly->Prt();
|
|
|
|
rChrRect.Pos() += pFly->Frm().Pos();
|
|
|
|
GetCrsrDocPos() = rChrRect.Pos();
|
|
|
|
}
|
|
|
|
return pFly->GetFmt();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// Selection to above/below (Z-Order)
|
2012-10-12 16:49:40 +02:00
|
|
|
static void lcl_NotifyNeighbours( const SdrMarkList *pLst )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-17 23:07:43 +01:00
|
|
|
// Rules for evasion have changed.
|
2012-01-17 20:39:02 +01:00
|
|
|
// 1. The environment of the fly and everything inside should be notified
|
|
|
|
// 2. The content of the frame itself has to be notified
|
2012-01-17 23:07:43 +01:00
|
|
|
// 3. Frames displaced by the frame have to be notified
|
|
|
|
// 4. Also Drawing objects can displace frames
|
2011-01-17 15:06:54 +01:00
|
|
|
for( sal_uInt16 j = 0; j < pLst->GetMarkCount(); ++j )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwPageFrm *pPage;
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bCheckNeighbours = false;
|
2007-09-27 07:51:28 +00:00
|
|
|
sal_Int16 aHori = text::HoriOrientation::NONE;
|
2000-09-18 23:08:29 +00:00
|
|
|
SwRect aRect;
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pO = pLst->GetMark( 0 )->GetMarkedSdrObj();
|
2003-11-24 15:03:25 +00:00
|
|
|
if ( pO->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pO)->GetFlyFrm();
|
|
|
|
|
|
|
|
const SwFmtHoriOrient &rHori = pFly->GetFmt()->GetHoriOrient();
|
|
|
|
aHori = rHori.GetHoriOrient();
|
2007-09-27 07:51:28 +00:00
|
|
|
if( text::HoriOrientation::NONE != aHori && text::HoriOrientation::CENTER != aHori &&
|
2000-09-18 23:08:29 +00:00
|
|
|
pFly->IsFlyAtCntFrm() )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bCheckNeighbours = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
pFly->InvalidatePos();
|
|
|
|
pFly->Frm().Pos().Y() += 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
pPage = pFly->FindPageFrm();
|
|
|
|
aRect = pFly->Frm();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-06-28 12:34:54 +00:00
|
|
|
SwFrm* pAnch = ( (SwDrawContact*)GetUserCall(pO) )->GetAnchorFrm( pO );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !pAnch )
|
|
|
|
continue;
|
|
|
|
pPage = pAnch->FindPageFrm();
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i68520# - naming changed
|
2006-09-15 10:41:08 +00:00
|
|
|
aRect = GetBoundRectOfAnchoredObj( pO );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2004-08-02 13:03:20 +00:00
|
|
|
sal_uInt32 nCount = pPage->GetSortedObjs() ? pPage->GetSortedObjs()->Count() : 0;
|
|
|
|
for ( sal_uInt32 i = 0; i < nCount; ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-08-02 13:03:20 +00:00
|
|
|
SwAnchoredObject* pAnchoredObj = (*pPage->GetSortedObjs())[i];
|
|
|
|
if ( !pAnchoredObj->ISA(SwFlyFrm) )
|
2000-09-18 23:08:29 +00:00
|
|
|
continue;
|
|
|
|
|
2004-08-02 13:03:20 +00:00
|
|
|
SwFlyFrm* pAct = static_cast<SwFlyFrm*>(pAnchoredObj);
|
2000-09-18 23:08:29 +00:00
|
|
|
SwRect aTmpCalcPnt( pAct->Prt() );
|
|
|
|
aTmpCalcPnt += pAct->Frm().Pos();
|
|
|
|
if ( aRect.IsOver( aTmpCalcPnt ) )
|
|
|
|
{
|
|
|
|
SwCntntFrm *pCnt = pAct->ContainsCntnt();
|
|
|
|
while ( pCnt )
|
|
|
|
{
|
|
|
|
aTmpCalcPnt = pCnt->Prt();
|
|
|
|
aTmpCalcPnt += pCnt->Frm().Pos();
|
|
|
|
if ( aRect.IsOver( aTmpCalcPnt ) )
|
|
|
|
((SwFrm*)pCnt)->Prepare( PREP_FLY_ATTR_CHG );
|
|
|
|
pCnt = pCnt->GetNextCntntFrm();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( bCheckNeighbours && pAct->IsFlyAtCntFrm() )
|
|
|
|
{
|
|
|
|
const SwFmtHoriOrient &rH = pAct->GetFmt()->GetHoriOrient();
|
|
|
|
if ( rH.GetHoriOrient() == aHori &&
|
|
|
|
pAct->Frm().Top() <= aRect.Bottom() &&
|
|
|
|
pAct->Frm().Bottom() >= aRect.Top() )
|
|
|
|
{
|
|
|
|
pAct->InvalidatePos();
|
|
|
|
pAct->Frm().Pos().Y() += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
void SwFEShell::SelectionToTop( bool bTop )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "SelectionToTop without DrawView?" );
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( rMrkList.GetMarkCount(), "No object selected." );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwFlyFrm *pFly = ::GetFlyFromMarked( &rMrkList, this );
|
|
|
|
if ( pFly && pFly->IsFlyInCntFrm() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
StartAllAction();
|
|
|
|
if ( bTop )
|
|
|
|
Imp()->GetDrawView()->PutMarkedToTop();
|
|
|
|
else
|
|
|
|
Imp()->GetDrawView()->MovMarkedToTop();
|
|
|
|
::lcl_NotifyNeighbours( &rMrkList );
|
|
|
|
GetDoc()->SetModified();
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
void SwFEShell::SelectionToBottom( bool bBottom )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "SelectionToBottom without DrawView?" );
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2012-01-17 20:39:02 +01:00
|
|
|
OSL_ENSURE( rMrkList.GetMarkCount(), "No object selected." );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwFlyFrm *pFly = ::GetFlyFromMarked( &rMrkList, this );
|
|
|
|
if ( pFly && pFly->IsFlyInCntFrm() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
StartAllAction();
|
|
|
|
if ( bBottom )
|
|
|
|
Imp()->GetDrawView()->PutMarkedToBtm();
|
|
|
|
else
|
|
|
|
Imp()->GetDrawView()->MovMarkedToBtm();
|
|
|
|
::lcl_NotifyNeighbours( &rMrkList );
|
|
|
|
GetDoc()->SetModified();
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// Object above/below the document? 2 Controls, 1 Heaven, 0 Hell,
|
|
|
|
// -1 Ambiguous
|
2000-09-18 23:08:29 +00:00
|
|
|
short SwFEShell::GetLayerId() const
|
|
|
|
{
|
|
|
|
short nRet = SHRT_MAX;
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
const SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2010-06-13 15:22:56 +02:00
|
|
|
if( !pObj )
|
|
|
|
continue;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( nRet == SHRT_MAX )
|
|
|
|
nRet = pObj->GetLayer();
|
|
|
|
else if ( nRet != pObj->GetLayer() )
|
|
|
|
{
|
|
|
|
nRet = -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( nRet == SHRT_MAX )
|
|
|
|
nRet = -1;
|
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// Object above/below the document
|
2003-07-04 12:20:40 +00:00
|
|
|
// Note: only visible objects can be marked. Thus, objects with invisible
|
|
|
|
// layer IDs have not to be considered.
|
|
|
|
// If <SwFEShell> exists, layout exists!!
|
|
|
|
void SwFEShell::ChangeOpaque( SdrLayerID nLayerId )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2006-08-14 15:15:42 +00:00
|
|
|
const IDocumentDrawModelAccess* pIDDMA = getIDocumentDrawModelAccess();
|
2011-02-08 08:51:51 +01:00
|
|
|
// correct type of <nControls>
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2010-06-13 15:22:56 +02:00
|
|
|
if( !pObj )
|
|
|
|
continue;
|
2003-08-27 15:30:53 +00:00
|
|
|
// or group objects containing controls.
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> #i113730#
|
2010-09-14 16:34:12 +02:00
|
|
|
// consider that a member of a drawing group has been selected.
|
|
|
|
const SwContact* pContact = ::GetUserCall( pObj );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pContact && pContact->GetMaster(), "<SwFEShell::ChangeOpaque(..)> - missing contact or missing master object at contact!" );
|
2010-09-14 16:34:12 +02:00
|
|
|
const bool bControlObj = ( pContact && pContact->GetMaster() )
|
|
|
|
? ::CheckControlLayer( pContact->GetMaster() )
|
|
|
|
: ::CheckControlLayer( pObj );
|
2003-08-27 15:30:53 +00:00
|
|
|
if ( !bControlObj && pObj->GetLayer() != nLayerId )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
pObj->SetLayer( nLayerId );
|
2003-11-24 15:03:25 +00:00
|
|
|
InvalidateWindows( SwRect( pObj->GetCurrentBoundRect() ) );
|
|
|
|
if ( pObj->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwFmt *pFmt = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm()->GetFmt();
|
|
|
|
SvxOpaqueItem aOpa( pFmt->GetOpaque() );
|
2006-08-14 15:15:42 +00:00
|
|
|
aOpa.SetValue( nLayerId == pIDDMA->GetHellId() );
|
2008-06-13 08:47:50 +00:00
|
|
|
pFmt->SetFmtAttr( aOpa );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
GetDoc()->SetModified();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::SelectionToHeaven()
|
|
|
|
{
|
2006-08-14 15:15:42 +00:00
|
|
|
ChangeOpaque( getIDocumentDrawModelAccess()->GetHeavenId() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::SelectionToHell()
|
|
|
|
{
|
2006-08-14 15:15:42 +00:00
|
|
|
ChangeOpaque( getIDocumentDrawModelAccess()->GetHellId() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 SwFEShell::IsObjSelected() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( IsFrmSelected() || !Imp()->HasDrawView() )
|
|
|
|
return 0;
|
|
|
|
else
|
2011-01-17 15:06:54 +01:00
|
|
|
return sal_uInt16( Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::IsFrmSelected() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( !Imp()->HasDrawView() )
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2004-07-12 14:47:48 +00:00
|
|
|
return 0 != ::GetFlyFromMarked( &Imp()->GetDrawView()->GetMarkedObjectList(),
|
2013-10-26 19:50:13 +02:00
|
|
|
(SwViewShell*)this );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::IsObjSelected( const SdrObject& rObj ) const
|
2002-05-15 12:22:47 +00:00
|
|
|
{
|
|
|
|
if ( IsFrmSelected() || !Imp()->HasDrawView() )
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2002-05-15 12:22:47 +00:00
|
|
|
else
|
|
|
|
return Imp()->GetDrawView()
|
|
|
|
->IsObjMarked( const_cast< SdrObject * >( &rObj ) );
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::IsObjSameLevelWithMarked(const SdrObject* pObj) const
|
2013-11-29 13:03:27 +00:00
|
|
|
{
|
|
|
|
if (pObj)
|
|
|
|
{
|
|
|
|
const SdrMarkList& aMarkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
|
|
|
if (aMarkList.GetMarkCount() == 0)
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2013-11-29 13:03:27 +00:00
|
|
|
}
|
|
|
|
SdrMark* pM=aMarkList.GetMark(0);
|
|
|
|
if (pM)
|
|
|
|
{
|
|
|
|
SdrObject* pMarkObj = pM->GetMarkedSdrObj();
|
|
|
|
if (pMarkObj && pMarkObj->GetUpGroup() == pObj->GetUpGroup())
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2013-11-29 13:03:27 +00:00
|
|
|
}
|
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2013-11-29 13:03:27 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwFEShell::EndTextEdit()
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// Terminate the TextEditMode. If required (default if the object
|
|
|
|
// does not contain any more text and does not carry attributes) the object
|
|
|
|
// is deleted. All other objects marked are preserved.
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView() && Imp()->GetDrawView()->IsTextEdit(),
|
2000-09-18 23:08:29 +00:00
|
|
|
"EndTextEdit an no Object" );
|
|
|
|
|
|
|
|
StartAllAction();
|
|
|
|
SdrView *pView = Imp()->GetDrawView();
|
|
|
|
SdrObject *pObj = pView->GetTextEditObject();
|
|
|
|
SdrObjUserCall* pUserCall;
|
|
|
|
if( 0 != ( pUserCall = GetUserCall(pObj) ) )
|
|
|
|
{
|
2002-01-31 08:41:44 +00:00
|
|
|
SdrObject *pTmp = ((SwContact*)pUserCall)->GetMaster();
|
|
|
|
if( !pTmp )
|
|
|
|
pTmp = pObj;
|
2003-11-24 15:03:25 +00:00
|
|
|
pUserCall->Changed( *pTmp, SDRUSERCALL_RESIZE, pTmp->GetLastBoundRect() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if ( !pObj->GetUpGroup() )
|
|
|
|
{
|
2014-03-10 11:09:59 +02:00
|
|
|
if ( SDRENDTEXTEDIT_SHOULDBEDELETED == pView->SdrEndTextEdit(true) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
if ( pView->GetMarkedObjectList().GetMarkCount() > 1 )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
SdrMarkList aSave( pView->GetMarkedObjectList() );
|
2000-09-18 23:08:29 +00:00
|
|
|
aSave.DeleteMark( aSave.FindObject( pObj ) );
|
|
|
|
if ( aSave.GetMarkCount() )
|
|
|
|
{
|
|
|
|
pView->UnmarkAll();
|
|
|
|
pView->MarkObj( pObj, Imp()->GetPageView() );
|
|
|
|
}
|
|
|
|
DelSelectedObj();
|
|
|
|
if ( aSave.GetMarkCount() )
|
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < aSave.GetMarkCount(); ++i )
|
2006-07-25 11:33:25 +00:00
|
|
|
pView->MarkObj( aSave.GetMark( i )->GetMarkedSdrObj(),
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetPageView() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DelSelectedObj();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2006-11-14 14:09:49 +00:00
|
|
|
pView->SdrEndTextEdit();
|
2000-09-18 23:08:29 +00:00
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
|
|
|
|
int SwFEShell::IsInsideSelectedObj( const Point &rPt )
|
|
|
|
{
|
|
|
|
if( Imp()->HasDrawView() )
|
|
|
|
{
|
|
|
|
SwDrawView *pDView = Imp()->GetDrawView();
|
|
|
|
|
2004-07-12 14:47:48 +00:00
|
|
|
if( pDView->GetMarkedObjectList().GetMarkCount() &&
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->IsMarkedObjHit( rPt ) )
|
|
|
|
{
|
|
|
|
return SDRHIT_OBJECT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return SDRHIT_NONE;
|
|
|
|
}
|
|
|
|
|
2007-09-27 07:51:28 +00:00
|
|
|
bool SwFEShell::IsObjSelectable( const Point& rPt )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SET_CURR_SHELL(this);
|
|
|
|
SwDrawView *pDView = Imp()->GetDrawView();
|
2007-09-27 07:51:28 +00:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pDView )
|
|
|
|
{
|
|
|
|
SdrObject* pObj;
|
|
|
|
SdrPageView* pPV;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nOld = pDView->GetHitTolerancePixel();
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 );
|
|
|
|
|
2014-03-10 11:09:59 +02:00
|
|
|
bRet = pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMARKABLE );
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->SetHitTolerancePixel( nOld );
|
|
|
|
}
|
2007-09-27 07:51:28 +00:00
|
|
|
return bRet;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-08-30 16:44:56 +02:00
|
|
|
SdrObject* SwFEShell::GetObjAt( const Point& rPt )
|
|
|
|
{
|
|
|
|
SdrObject* pRet = 0;
|
|
|
|
SET_CURR_SHELL(this);
|
|
|
|
SwDrawView *pDView = Imp()->GetDrawView();
|
|
|
|
if( pDView )
|
|
|
|
{
|
|
|
|
SdrPageView* pPV;
|
|
|
|
sal_uInt16 nOld = pDView->GetHitTolerancePixel();
|
|
|
|
pDView->SetHitTolerancePixel( pDView->GetMarkHdlSizePixel()/2 );
|
|
|
|
|
|
|
|
pDView->PickObj( rPt, pDView->getHitTolLog(), pRet, pPV, SDRSEARCH_PICKMARKABLE );
|
|
|
|
pDView->SetHitTolerancePixel( nOld );
|
|
|
|
}
|
|
|
|
return pRet;
|
|
|
|
}
|
|
|
|
|
2009-12-30 15:04:27 +01:00
|
|
|
// Test if there is a object at that position and if it should be selected.
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::ShouldObjectBeSelected(const Point& rPt)
|
2003-03-27 14:45:43 +00:00
|
|
|
{
|
|
|
|
SET_CURR_SHELL(this);
|
|
|
|
SwDrawView *pDrawView = Imp()->GetDrawView();
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet(false);
|
2003-03-27 14:45:43 +00:00
|
|
|
|
|
|
|
if(pDrawView)
|
|
|
|
{
|
|
|
|
SdrObject* pObj;
|
|
|
|
SdrPageView* pPV;
|
|
|
|
sal_uInt16 nOld(pDrawView->GetHitTolerancePixel());
|
|
|
|
|
|
|
|
pDrawView->SetHitTolerancePixel(pDrawView->GetMarkHdlSizePixel()/2);
|
CWS-TOOLING: integrate CWS aw065
2009-06-17 13:48:12 +0200 aw r273068 : #99385# corrected small error in SCs selection visualisation
2009-06-16 15:45:28 +0200 wg r273021 : i102838
2009-06-16 12:46:07 +0200 wg r273016 : i102833
2009-06-11 17:40:29 +0200 aw r272895 : #i98870# added implementation for getPageCount helper
2009-06-11 16:39:54 +0200 aw r272885 : #i102663#, #i102667#, #i98870# incluide file typo corrected
2009-06-11 16:24:07 +0200 aw r272881 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-11 16:23:52 +0200 aw r272880 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-09 13:50:29 +0200 aw r272769 : #i98917# added support for the OverlayHatchRectanglePrimitive to follow rotation with it's hatch; simplified OverlayHatchRect
2009-06-09 13:04:06 +0200 aw r272766 : #i98870# re-added PageNumber identification in SdrTextPrimitive2D::get2DDecomposition
2009-06-08 18:56:05 +0200 aw r272744 : #i99385# added some last corrections to OverlayObjects in SD (had to do some merges on resync, needed to optically check and correct)
2009-06-08 11:17:57 +0200 aw r272725 : cws aw065: corrections after resync
2009-06-08 11:02:25 +0200 aw r272723 : cws aw065: corrections after resync
2009-06-08 10:36:22 +0200 aw r272722 : cws aw065: corrections after resync
2009-06-05 18:57:06 +0200 aw r272712 : CWS-TOOLING: rebase CWS aw065 to trunk@272291 (milestone: DEV300:m49)
2009-06-05 14:56:34 +0200 aw r272690 : #i89784# stripped old stuff no longer needed due to text-to-polygon conversion using primitives
2009-06-05 14:50:07 +0200 aw r272688 : #102091# removed on-model-lock suppression for SdrObject::ActionChanged()
2009-06-05 14:47:29 +0200 aw r272687 : #102091# corrected local value buffering in ScenePrimitive2D::get2DDecomposition
2009-06-03 17:53:32 +0200 aw r272599 : #i89784# version before stripping
2009-06-03 17:52:18 +0200 aw r272598 : #i89784# version before stripping
2009-05-28 17:15:47 +0200 aw r272420 : #i101872# old stuff removed/stripped
2009-05-28 17:15:32 +0200 aw r272419 : #i101872# old stuff removed/stripped
2009-05-28 17:15:15 +0200 aw r272418 : #i101872# old stuff removed/stripped
2009-05-28 17:14:45 +0200 aw r272417 : #i101872# old stuff removed/stripped
2009-05-28 12:13:56 +0200 aw r272396 : #i101872# stable hybrid state
2009-05-28 12:13:46 +0200 aw r272395 : #i101872# stable hybrid state
2009-05-28 12:13:35 +0200 aw r272394 : #i101872# stable hybrid state
2009-05-28 12:13:20 +0200 aw r272393 : #i101872# stable hybrid state
2009-05-28 12:13:05 +0200 aw r272392 : #i101872# stable hybrid state
2009-05-28 12:12:51 +0200 aw r272391 : #i101872# stable hybrid state
2009-05-15 16:56:02 +0200 aw r271952 : #i101872# HitTest unifications
2009-05-15 16:55:22 +0200 aw r271951 : #i101872# HitTest unifications
2009-05-15 16:55:12 +0200 aw r271950 : #i101872# HitTest unifications
2009-05-15 16:55:01 +0200 aw r271949 : #i101872# HitTest unifications
2009-05-15 16:54:51 +0200 aw r271948 : #i101872# HitTest unifications
2009-05-15 16:54:35 +0200 aw r271947 : #i101872# HitTest unifications
2009-05-15 16:54:22 +0200 aw r271946 : #i101872# HitTest unifications
2009-05-12 19:08:38 +0200 aw r271834 : #i101684# corrected AutoShape's preparation of text transformation due to different definitions in TextBounds
2009-05-12 15:44:49 +0200 aw r271827 : #i89784# expanded TextLayouterDevice::getTextOutlines() to support DXArray and X-Font scaling
2009-05-11 19:40:40 +0200 aw r271790 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:25 +0200 aw r271789 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:12 +0200 aw r271788 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 13:01:53 +0200 aw r271765 : #i99385# corrections and optimizations
2009-05-08 14:48:40 +0200 aw r271718 : #i1016180# added optimizations in model operations when model is locked
2009-05-08 14:11:45 +0200 aw r271716 : #i101679# added flush() calls to OverlayManager when interaction step is prepared
2009-05-07 17:44:03 +0200 aw r271689 : #i99385# last corrections/changes
2009-05-07 17:43:47 +0200 aw r271688 : #i99385# last corrections/changes
2009-05-07 13:20:09 +0200 aw r271654 : #i99385# added changes from WFH
2009-05-07 13:19:38 +0200 aw r271653 : #i99385# added changes from WFH
2009-05-07 13:19:11 +0200 aw r271652 : #i99385# added changes from WFH
2009-05-07 11:33:17 +0200 aw r271643 : #i99385# corrections after resync
2009-05-07 11:17:31 +0200 aw r271642 : #i99385# corrections after resync
2009-05-06 18:46:53 +0200 aw r271609 : CWS-TOOLING: rebase CWS aw065 to trunk@271427 (milestone: DEV300:m47)
2009-05-05 18:24:03 +0200 aw r271548 : #i101443# force new text decomposition when TextBackgroundColor has changed
2009-05-05 17:44:42 +0200 aw r271542 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:32 +0200 aw r271541 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:20 +0200 aw r271540 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:09 +0200 aw r271539 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 15:48:38 +0200 aw r271527 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:15 +0200 aw r271526 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:03 +0200 aw r271525 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:47:51 +0200 aw r271524 : #i99385# 2nd round, usages checked and corrected
2009-04-27 18:33:10 +0200 aw r271300 : #i99385# state commit after all implementations are done
2009-04-27 15:36:53 +0200 aw r271283 : #i99385# state commit after all implementations are done
2009-04-27 15:27:49 +0200 aw r271280 : #i99385# state commit after all implementations are done
2009-04-27 15:27:33 +0200 aw r271279 : #i99385# state commit after all implementations are done
2009-04-27 15:27:00 +0200 aw r271278 : #i99385# state commit after all implementations are done
2009-04-27 15:26:15 +0200 aw r271277 : #i99385# state commit after all implementations are done
2009-04-27 15:25:40 +0200 aw r271275 : #i99385# state commit after all implementations are done
2009-04-27 15:25:19 +0200 aw r271274 : #i99385# state commit after all implementations are done
2009-04-27 15:24:00 +0200 aw r271272 : #i99385# state commit after all implementations are done
2009-03-19 17:12:00 +0100 aw r269757 : #i100360# corrected bitmap's PefSize calculation for bitmap filled objects when Bitmap is Pixel-based on it's mapping
2009-02-19 17:09:47 +0100 aw r268298 : #i98917# corrected attributes
2009-02-19 17:09:30 +0100 aw r268297 : #i98917# corrected attributes
2009-02-19 17:08:22 +0100 aw r268296 : #i98917# corrected attributes
2009-02-19 11:56:25 +0100 aw r268268 : #i98870# added extra code to react on PageNumber change
2009-02-18 16:57:24 +0100 aw r268243 : #i98917# in OverlayHatchRect::getGeometry the rotation was not applied to the TopLeft of the centered rectangle, but to the already extended one, thus the visualisation was rotating around the wrong edge
2009-07-02 14:28:15 +00:00
|
|
|
bRet = pDrawView->PickObj(rPt, pDrawView->getHitTolLog(), pObj, pPV, SDRSEARCH_PICKMARKABLE);
|
2003-03-27 14:45:43 +00:00
|
|
|
pDrawView->SetHitTolerancePixel(nOld);
|
|
|
|
|
2009-12-30 15:04:27 +01:00
|
|
|
if ( bRet && pObj )
|
2003-03-27 14:45:43 +00:00
|
|
|
{
|
2008-03-18 14:56:59 +00:00
|
|
|
const IDocumentDrawModelAccess* pIDDMA = getIDocumentDrawModelAccess();
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i89920#
|
2009-12-30 15:04:27 +01:00
|
|
|
// Do not select object in background which is overlapping this text
|
|
|
|
// at the given position.
|
|
|
|
bool bObjInBackground( false );
|
2008-03-18 14:56:59 +00:00
|
|
|
{
|
2009-12-30 15:04:27 +01:00
|
|
|
if ( pObj->GetLayer() == pIDDMA->GetHellId() )
|
2008-03-18 14:56:59 +00:00
|
|
|
{
|
2009-12-30 15:04:27 +01:00
|
|
|
const SwAnchoredObject* pAnchoredObj = ::GetUserCall( pObj )->GetAnchoredObj( pObj );
|
|
|
|
const SwFrmFmt& rFmt = pAnchoredObj->GetFrmFmt();
|
|
|
|
const SwFmtSurround& rSurround = rFmt.GetSurround();
|
|
|
|
if ( rSurround.GetSurround() == SURROUND_THROUGHT )
|
|
|
|
{
|
|
|
|
bObjInBackground = true;
|
|
|
|
}
|
2008-03-18 14:56:59 +00:00
|
|
|
}
|
2009-12-30 15:04:27 +01:00
|
|
|
}
|
|
|
|
if ( bObjInBackground )
|
|
|
|
{
|
|
|
|
const SwPageFrm* pPageFrm = GetLayout()->GetPageAtPos( rPt );
|
2008-03-18 14:56:59 +00:00
|
|
|
if( pPageFrm )
|
|
|
|
{
|
2009-12-30 15:04:27 +01:00
|
|
|
const SwCntntFrm* pCntntFrm( pPageFrm->ContainsCntnt() );
|
|
|
|
while ( pCntntFrm )
|
|
|
|
{
|
|
|
|
if ( pCntntFrm->UnionFrm().IsInside( rPt ) )
|
|
|
|
{
|
|
|
|
const SwTxtFrm* pTxtFrm =
|
|
|
|
dynamic_cast<const SwTxtFrm*>(pCntntFrm);
|
|
|
|
if ( pTxtFrm )
|
|
|
|
{
|
2012-03-22 14:52:41 +01:00
|
|
|
SwPosition aPos( *(pTxtFrm->GetTxtNode()) );
|
2009-12-30 15:04:27 +01:00
|
|
|
Point aTmpPt( rPt );
|
2012-03-22 14:52:41 +01:00
|
|
|
if (pTxtFrm->GetKeyCrsrOfst(&aPos, aTmpPt))
|
2009-12-30 15:04:27 +01:00
|
|
|
{
|
2009-12-31 09:33:47 +01:00
|
|
|
SwRect aCursorCharRect;
|
2012-03-22 14:52:41 +01:00
|
|
|
if (pTxtFrm->GetCharRect(aCursorCharRect,
|
|
|
|
aPos))
|
2009-12-30 15:04:27 +01:00
|
|
|
{
|
2009-12-31 09:33:47 +01:00
|
|
|
if ( aCursorCharRect.IsOver( SwRect( pObj->GetLastBoundRect() ) ) )
|
2009-12-30 15:04:27 +01:00
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2009-12-30 15:04:27 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2009-12-30 15:04:27 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
pCntntFrm = pCntntFrm->GetNextCntntFrm();
|
|
|
|
}
|
2008-03-18 14:56:59 +00:00
|
|
|
}
|
|
|
|
}
|
2003-03-27 14:45:43 +00:00
|
|
|
|
2011-06-29 10:31:24 +02:00
|
|
|
// Don't select header / footer objects in body edition and vice-versa
|
|
|
|
SwContact* pContact = static_cast<SwContact*>(pObj->GetUserCall());
|
2014-06-25 21:58:47 +02:00
|
|
|
if (pContact && !pContact->ObjAnchoredAtPage() )
|
2011-06-29 10:31:24 +02:00
|
|
|
{
|
2011-07-04 11:00:37 +02:00
|
|
|
const SwPosition& rPos = pContact->GetCntntAnchor();
|
|
|
|
bool bInHdrFtr = GetDoc()->IsInHeaderFooter( rPos.nNode );
|
|
|
|
if ( ( IsHeaderFooterEdit() && !bInHdrFtr ) ||
|
|
|
|
( !IsHeaderFooterEdit() && bInHdrFtr ) )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2011-07-04 11:00:37 +02:00
|
|
|
}
|
2011-06-29 10:31:24 +02:00
|
|
|
}
|
|
|
|
|
2009-12-30 15:04:27 +01:00
|
|
|
if ( bRet )
|
|
|
|
{
|
|
|
|
const SdrPage* pPage = pIDDMA->GetDrawModel()->GetPage(0);
|
|
|
|
for(sal_uInt32 a(pObj->GetOrdNum() + 1); bRet && a < pPage->GetObjCount(); a++)
|
2003-03-27 14:45:43 +00:00
|
|
|
{
|
2009-12-30 15:04:27 +01:00
|
|
|
SdrObject *pCandidate = pPage->GetObj(a);
|
|
|
|
|
|
|
|
if (pCandidate->ISA(SwVirtFlyDrawObj) &&
|
|
|
|
( (SwVirtFlyDrawObj*)pCandidate)->GetCurrentBoundRect().IsInside(rPt) )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2009-12-30 15:04:27 +01:00
|
|
|
}
|
2003-03-27 14:45:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bRet;
|
|
|
|
}
|
2002-04-09 09:18:06 +00:00
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
/*
|
|
|
|
* If an object was selected, we assume its upper-left corner
|
|
|
|
* otherwise the middle of the current CharRects.
|
2012-01-17 20:39:02 +01:00
|
|
|
* Does the object include a control or groups,
|
|
|
|
* which comprise only controls
|
2014-04-21 19:28:47 -04:00
|
|
|
*/
|
2012-11-24 09:06:58 +09:00
|
|
|
static bool lcl_IsControlGroup( const SdrObject *pObj )
|
2002-04-09 09:18:06 +00:00
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bRet = false;
|
2002-04-09 09:18:06 +00:00
|
|
|
if(pObj->ISA(SdrUnoObj))
|
2014-01-28 19:59:54 +01:00
|
|
|
bRet = true;
|
2002-04-09 09:18:06 +00:00
|
|
|
else if( pObj->ISA( SdrObjGroup ) )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bRet = true;
|
2002-04-09 09:18:06 +00:00
|
|
|
const SdrObjList *pLst = ((SdrObjGroup*)pObj)->GetSubList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < pLst->GetObjCount(); ++i )
|
2002-04-09 09:18:06 +00:00
|
|
|
if( !::lcl_IsControlGroup( pLst->GetObj( i ) ) )
|
2012-11-24 09:06:58 +09:00
|
|
|
return false;
|
2002-04-09 09:18:06 +00:00
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
namespace
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
class MarkableObjectsOnly : public ::svx::ISdrObjectFilter
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
public:
|
|
|
|
MarkableObjectsOnly( SdrPageView* i_pPV )
|
|
|
|
:m_pPV( i_pPV )
|
2002-04-09 09:18:06 +00:00
|
|
|
{
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2014-03-27 18:12:18 +01:00
|
|
|
virtual bool includeObject( const SdrObject& i_rObject ) const SAL_OVERRIDE
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
return m_pPV && m_pPV->GetView().IsObjMarkable( const_cast< SdrObject* >( &i_rObject ), m_pPV );
|
|
|
|
}
|
2002-11-07 06:57:51 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
private:
|
|
|
|
SdrPageView* m_pPV;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
const SdrObject* SwFEShell::GetBestObject( bool bNext, sal_uInt16 /*GOTOOBJ_...*/ eType, bool bFlat, const ::svx::ISdrObjectFilter* pFilter )
|
2010-02-19 22:40:09 +01:00
|
|
|
{
|
|
|
|
if( !Imp()->HasDrawView() )
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
const SdrObject *pBest = 0,
|
|
|
|
*pTop = 0;
|
|
|
|
|
|
|
|
const long nTmp = bNext ? LONG_MAX : 0;
|
|
|
|
Point aBestPos( nTmp, nTmp );
|
|
|
|
Point aTopPos( nTmp, nTmp );
|
|
|
|
Point aCurPos;
|
|
|
|
Point aPos;
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bNoDraw = 0 == (GOTOOBJ_DRAW_ANY & eType);
|
|
|
|
bool bNoFly = 0 == (GOTOOBJ_FLY_ANY & eType);
|
2010-02-19 22:40:09 +01:00
|
|
|
|
|
|
|
if( !bNoFly && bNoDraw )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
SwFlyFrm *pFly = GetCurrFrm( false )->FindFlyFrm();
|
2010-02-19 22:40:09 +01:00
|
|
|
if( pFly )
|
|
|
|
pBest = pFly->GetVirtDrawObj();
|
|
|
|
}
|
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
|
|
|
SdrPageView* pPV = Imp()->GetDrawView()->GetSdrPageView();
|
|
|
|
|
|
|
|
MarkableObjectsOnly aDefaultFilter( pPV );
|
|
|
|
if ( !pFilter )
|
|
|
|
pFilter = &aDefaultFilter;
|
|
|
|
|
|
|
|
if( !pBest || rMrkList.GetMarkCount() == 1 )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// Determine starting point
|
2010-02-19 22:40:09 +01:00
|
|
|
SdrObjList* pList = NULL;
|
|
|
|
if ( rMrkList.GetMarkCount() )
|
|
|
|
{
|
|
|
|
const SdrObject* pStartObj = rMrkList.GetMark(0)->GetMarkedSdrObj();
|
|
|
|
if( pStartObj->ISA(SwVirtFlyDrawObj) )
|
|
|
|
aPos = ((SwVirtFlyDrawObj*)pStartObj)->GetFlyFrm()->Frm().Pos();
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2010-02-19 22:40:09 +01:00
|
|
|
aPos = pStartObj->GetSnapRect().TopLeft();
|
2002-11-07 06:57:51 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
// If an object inside a group is selected, we want to
|
|
|
|
// iterate over the group members.
|
|
|
|
if ( ! pStartObj->GetUserCall() )
|
|
|
|
pList = pStartObj->GetObjList();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// If no object is selected, we check if we just entered a group.
|
|
|
|
// In this case we want to iterate over the group members.
|
|
|
|
aPos = GetCharRect().Center();
|
|
|
|
const SdrObject* pStartObj = pPV ? pPV->GetAktGroup() : 0;
|
|
|
|
if ( pStartObj && pStartObj->ISA( SdrObjGroup ) )
|
|
|
|
pList = pStartObj->GetSubList();
|
|
|
|
}
|
2002-11-07 06:57:51 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
if ( ! pList )
|
|
|
|
{
|
|
|
|
// Here we are if
|
|
|
|
// A No object has been selected and no group has been entered or
|
|
|
|
// B An object has been selected and it is not inside a group
|
|
|
|
pList = getIDocumentDrawModelAccess()->GetDrawModel()->GetPage( 0 );
|
|
|
|
}
|
2002-11-07 06:57:51 +00:00
|
|
|
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pList, "No object list to iterate" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
SdrObjListIter aObjIter( *pList, bFlat ? IM_FLAT : IM_DEEPNOGROUPS );
|
|
|
|
while ( aObjIter.IsMore() )
|
|
|
|
{
|
|
|
|
SdrObject* pObj = aObjIter.Next();
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bFlyFrm = pObj->ISA(SwVirtFlyDrawObj);
|
2010-02-19 22:40:09 +01:00
|
|
|
if( ( bNoFly && bFlyFrm ) ||
|
|
|
|
( bNoDraw && !bFlyFrm ) ||
|
|
|
|
( eType == GOTOOBJ_DRAW_SIMPLE && lcl_IsControlGroup( pObj ) ) ||
|
|
|
|
( eType == GOTOOBJ_DRAW_CONTROL && !lcl_IsControlGroup( pObj ) ) ||
|
|
|
|
( pFilter && !pFilter->includeObject( *pObj ) ) )
|
|
|
|
continue;
|
|
|
|
if( bFlyFrm )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
SwVirtFlyDrawObj *pO = (SwVirtFlyDrawObj*)pObj;
|
|
|
|
SwFlyFrm *pFly = pO->GetFlyFrm();
|
|
|
|
if( GOTOOBJ_FLY_ANY != ( GOTOOBJ_FLY_ANY & eType ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
switch ( eType )
|
2002-04-09 09:18:06 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
case GOTOOBJ_FLY_FRM:
|
|
|
|
if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case GOTOOBJ_FLY_GRF:
|
|
|
|
if ( pFly->Lower() &&
|
|
|
|
(pFly->Lower()->IsLayoutFrm() ||
|
|
|
|
!((SwCntntFrm*)pFly->Lower())->GetNode()->GetGrfNode()))
|
|
|
|
continue;
|
|
|
|
break;
|
|
|
|
case GOTOOBJ_FLY_OLE:
|
|
|
|
if ( pFly->Lower() &&
|
|
|
|
(pFly->Lower()->IsLayoutFrm() ||
|
|
|
|
!((SwCntntFrm*)pFly->Lower())->GetNode()->GetOLENode()))
|
|
|
|
continue;
|
|
|
|
break;
|
2002-04-09 09:18:06 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2010-02-19 22:40:09 +01:00
|
|
|
aCurPos = pFly->Frm().Pos();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
aCurPos = pObj->GetCurrentBoundRect().TopLeft();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Special case if another object is on same Y.
|
|
|
|
if( aCurPos != aPos && // only when it is not me
|
2013-05-17 09:17:02 +02:00
|
|
|
aCurPos.getY() == aPos.getY() && // Y positions equal
|
|
|
|
(bNext? (aCurPos.getX() > aPos.getX()) : // lies next to me
|
|
|
|
(aCurPos.getX() < aPos.getX())) ) // " reverse
|
2010-02-19 22:40:09 +01:00
|
|
|
{
|
|
|
|
aBestPos = Point( nTmp, nTmp );
|
|
|
|
SdrObjListIter aTmpIter( *pList, bFlat ? IM_FLAT : IM_DEEPNOGROUPS );
|
|
|
|
while ( aTmpIter.IsMore() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
SdrObject* pTmpObj = aTmpIter.Next();
|
|
|
|
bFlyFrm = pTmpObj->ISA(SwVirtFlyDrawObj);
|
|
|
|
if( ( bNoFly && bFlyFrm ) || ( bNoDraw && !bFlyFrm ) )
|
|
|
|
continue;
|
|
|
|
if( bFlyFrm )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
SwVirtFlyDrawObj *pO = (SwVirtFlyDrawObj*)pTmpObj;
|
|
|
|
aCurPos = pO->GetFlyFrm()->Frm().Pos();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2010-02-19 22:40:09 +01:00
|
|
|
else
|
|
|
|
aCurPos = pTmpObj->GetCurrentBoundRect().TopLeft();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2010-02-19 22:40:09 +01:00
|
|
|
if( aCurPos != aPos && aCurPos.Y() == aPos.Y() &&
|
2013-05-17 09:17:02 +02:00
|
|
|
(bNext? (aCurPos.getX() > aPos.getX()) : // lies next to me
|
|
|
|
(aCurPos.getX() < aPos.getX())) && // " reverse
|
|
|
|
(bNext? (aCurPos.getX() < aBestPos.getX()) : // better as best
|
|
|
|
(aCurPos.getX() > aBestPos.getX())) ) // " reverse
|
2010-02-19 22:40:09 +01:00
|
|
|
{
|
|
|
|
aBestPos = aCurPos;
|
|
|
|
pBest = pTmpObj;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2010-02-19 22:40:09 +01:00
|
|
|
break;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2010-11-04 13:05:15 +01:00
|
|
|
if( (
|
2013-05-17 09:17:02 +02:00
|
|
|
(bNext? (aPos.getY() < aCurPos.getY()) : // only below me
|
|
|
|
(aPos.getY() > aCurPos.getY())) && // " reverse
|
|
|
|
(bNext? (aBestPos.getY() > aCurPos.getY()) : // closer below
|
|
|
|
(aBestPos.getY() < aCurPos.getY()))
|
2010-11-04 13:05:15 +01:00
|
|
|
) || // " reverse
|
2013-05-17 09:17:02 +02:00
|
|
|
(aBestPos.getY() == aCurPos.getY() &&
|
|
|
|
(bNext? (aBestPos.getX() > aCurPos.getX()) : // further left
|
|
|
|
(aBestPos.getX() < aCurPos.getX())))) // " reverse
|
2010-02-19 22:40:09 +01:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
aBestPos = aCurPos;
|
|
|
|
pBest = pObj;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2010-02-19 22:40:09 +01:00
|
|
|
|
2013-05-17 09:17:02 +02:00
|
|
|
if( (bNext? (aTopPos.getY() > aCurPos.getY()) : // higher as best
|
|
|
|
(aTopPos.getY() < aCurPos.getY())) || // " reverse
|
|
|
|
(aTopPos.getY() == aCurPos.getY() &&
|
|
|
|
(bNext? (aTopPos.getX() > aCurPos.getX()) : // further left
|
|
|
|
(aTopPos.getX() < aCurPos.getX())))) // " reverse
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-02-19 22:40:09 +01:00
|
|
|
aTopPos = aCurPos;
|
|
|
|
pTop = pObj;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2012-01-17 20:39:02 +01:00
|
|
|
// unfortunately nothing found
|
2013-05-17 09:17:02 +02:00
|
|
|
if( (bNext? (aBestPos.getX() == LONG_MAX) : (aBestPos.getX() == 0)) )
|
2010-02-19 22:40:09 +01:00
|
|
|
pBest = pTop;
|
|
|
|
}
|
|
|
|
|
|
|
|
return pBest;
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::GotoObj( bool bNext, sal_uInt16 /*GOTOOBJ_...*/ eType )
|
2010-02-19 22:40:09 +01:00
|
|
|
{
|
|
|
|
const SdrObject* pBest = GetBestObject( bNext, eType );
|
|
|
|
|
|
|
|
if ( !pBest )
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2010-02-19 22:40:09 +01:00
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bFlyFrm = pBest->ISA(SwVirtFlyDrawObj);
|
2010-02-19 22:40:09 +01:00
|
|
|
if( bFlyFrm )
|
|
|
|
{
|
|
|
|
SwVirtFlyDrawObj *pO = (SwVirtFlyDrawObj*)pBest;
|
|
|
|
const SwRect& rFrm = pO->GetFlyFrm()->Frm();
|
|
|
|
SelectObj( rFrm.Pos(), 0, (SdrObject*)pBest );
|
|
|
|
if( !ActionPend() )
|
|
|
|
MakeVisible( rFrm );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SelectObj( Point(), 0, (SdrObject*)pBest );
|
|
|
|
if( !ActionPend() )
|
|
|
|
MakeVisible( pBest->GetCurrentBoundRect() );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2010-02-19 22:40:09 +01:00
|
|
|
CallChgLnk();
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Point &rPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( !Imp()->HasDrawView() )
|
|
|
|
Imp()->MakeDrawView();
|
|
|
|
|
|
|
|
if ( GetPageNumber( rPos ) )
|
|
|
|
{
|
|
|
|
Imp()->GetDrawView()->SetCurrentObj( eSdrObjectKind );
|
|
|
|
if ( eSdrObjectKind == OBJ_CAPTION )
|
|
|
|
bRet = Imp()->GetDrawView()->BegCreateCaptionObj(
|
|
|
|
rPos, Size( lMinBorder - MINFLY, lMinBorder - MINFLY ),
|
|
|
|
GetOut() );
|
|
|
|
else
|
|
|
|
bRet = Imp()->GetDrawView()->BegCreateObj( rPos, GetOut() );
|
|
|
|
}
|
|
|
|
if ( bRet )
|
2002-06-24 13:53:54 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
::FrameNotify( this, FLY_DRAG_START );
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::BeginCreate( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, sal_uInt32 eObjInventor,
|
2000-09-18 23:08:29 +00:00
|
|
|
const Point &rPos )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( !Imp()->HasDrawView() )
|
|
|
|
Imp()->MakeDrawView();
|
|
|
|
|
|
|
|
if ( GetPageNumber( rPos ) )
|
|
|
|
{
|
|
|
|
Imp()->GetDrawView()->SetCurrentObj( eSdrObjectKind, eObjInventor );
|
|
|
|
bRet = Imp()->GetDrawView()->BegCreateObj( rPos, GetOut() );
|
|
|
|
}
|
|
|
|
if ( bRet )
|
|
|
|
::FrameNotify( this, FLY_DRAG_START );
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::MoveCreate( const Point &rPos )
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "MoveCreate without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( GetPageNumber( rPos ) )
|
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
ScrollTo( rPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->MovCreateObj( rPos );
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::EndCreate( sal_uInt16 eSdrCreateCmd )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// To assure undo-object from the DrawEngine is not stored,
|
|
|
|
// (we create our own undo-object!), temporarily switch-off Undo
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "EndCreate without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !Imp()->GetDrawView()->IsGroupEntered() )
|
2010-11-25 14:31:11 +01:00
|
|
|
{
|
|
|
|
GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(false);
|
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bCreate = Imp()->GetDrawView()->EndCreateObj(
|
2000-09-18 23:08:29 +00:00
|
|
|
SdrCreateCmd( eSdrCreateCmd ) );
|
2011-02-08 11:05:35 +01:00
|
|
|
GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(true);
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( !bCreate )
|
|
|
|
{
|
|
|
|
::FrameNotify( this, FLY_DRAG_END );
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( (SdrCreateCmd)eSdrCreateCmd == SDRCREATE_NEXTPOINT )
|
|
|
|
{
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
return ImpEndCreate();
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::ImpEndCreate()
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() == 1,
|
2012-01-17 20:39:02 +01:00
|
|
|
"New object not selected." );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject& rSdrObj = *Imp()->GetDrawView()->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( rSdrObj.GetSnapRect().IsEmpty() )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// preferably we forget the object, only gives problems
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->DeleteMarked();
|
|
|
|
Imp()->GetDrawView()->UnmarkAll();
|
|
|
|
::FrameNotify( this, FLY_DRAG_END );
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( rSdrObj.GetUpGroup() )
|
|
|
|
{
|
2004-06-28 12:34:54 +00:00
|
|
|
Point aTmpPos( rSdrObj.GetSnapRect().TopLeft() );
|
2000-09-18 23:08:29 +00:00
|
|
|
Point aNewAnchor( rSdrObj.GetUpGroup()->GetAnchorPos() );
|
2004-06-28 12:34:54 +00:00
|
|
|
// OD 2004-04-05 #i26791# - direct object positioning for group members
|
2000-09-18 23:08:29 +00:00
|
|
|
rSdrObj.NbcSetRelativePos( aTmpPos - aNewAnchor );
|
|
|
|
rSdrObj.NbcSetAnchorPos( aNewAnchor );
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2008-08-18 09:49:51 +00:00
|
|
|
LockPaint();
|
2000-09-18 23:08:29 +00:00
|
|
|
StartAllAction();
|
|
|
|
|
|
|
|
Imp()->GetDrawView()->UnmarkAll();
|
|
|
|
|
|
|
|
const Rectangle &rBound = rSdrObj.GetSnapRect();
|
2002-09-17 07:14:21 +00:00
|
|
|
Point aPt( rBound.TopRight() );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// alien identifier should end up on defaults
|
|
|
|
// duplications possible!!
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nIdent = SdrInventor == rSdrObj.GetObjInventor()
|
2000-09-18 23:08:29 +00:00
|
|
|
? rSdrObj.GetObjIdentifier()
|
|
|
|
: 0xFFFF;
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// default for controls character bound, otherwise paragraph bound.
|
2000-09-18 23:08:29 +00:00
|
|
|
SwFmtAnchor aAnch;
|
|
|
|
const SwFrm *pAnch = 0;
|
2012-10-19 03:59:48 +09:00
|
|
|
bool bCharBound = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( rSdrObj.ISA( SdrUnoObj ) )
|
|
|
|
{
|
|
|
|
SwPosition aPos( GetDoc()->GetNodes() );
|
|
|
|
SwCrsrMoveState aState( MV_SETONLYTEXT );
|
2013-05-17 09:17:02 +02:00
|
|
|
Point aPoint( aPt.getX(), aPt.getY() + rBound.GetHeight()/2 );
|
2013-10-22 15:14:13 +03:00
|
|
|
GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// characterbinding not allowed in readonly-content
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !aPos.nNode.GetNode().IsProtect() )
|
|
|
|
{
|
2010-06-13 15:22:56 +02:00
|
|
|
pAnch = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aPoint, &aPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwRect aTmp;
|
|
|
|
pAnch->GetCharRect( aTmp, aPos );
|
|
|
|
|
2012-01-17 23:07:43 +01:00
|
|
|
// The crsr should not be too far away
|
2012-10-19 03:59:48 +09:00
|
|
|
bCharBound = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
Rectangle aRect( aTmp.SVRect() );
|
|
|
|
aRect.Left() -= MM50*2;
|
|
|
|
aRect.Top() -= MM50*2;
|
|
|
|
aRect.Right() += MM50*2;
|
|
|
|
aRect.Bottom()+= MM50*2;
|
|
|
|
|
|
|
|
if( !aRect.IsOver( rBound ) && !::GetHtmlMode( GetDoc()->GetDocShell() ))
|
2012-10-19 03:59:48 +09:00
|
|
|
bCharBound = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-17 23:07:43 +01:00
|
|
|
// anchor in header/footer also not allowed.
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bCharBound )
|
|
|
|
bCharBound = !GetDoc()->IsInHeaderFooter( aPos.nNode );
|
|
|
|
|
|
|
|
if( bCharBound )
|
|
|
|
{
|
2010-01-05 16:37:41 +01:00
|
|
|
aAnch.SetType( FLY_AS_CHAR );
|
2000-09-18 23:08:29 +00:00
|
|
|
aAnch.SetAnchor( &aPos );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !bCharBound )
|
|
|
|
{
|
2011-02-08 08:51:51 +01:00
|
|
|
// allow native drawing objects in header/footer.
|
2003-07-04 12:20:40 +00:00
|
|
|
// Thus, set <bBodyOnly> to <false> for these objects using value
|
|
|
|
// of <nIdent> - value <0xFFFF> indicates control objects, which aren't
|
|
|
|
// allowed in header/footer.
|
|
|
|
//bool bBodyOnly = OBJ_NONE != nIdent;
|
|
|
|
bool bBodyOnly = 0xFFFF == nIdent;
|
|
|
|
bool bAtPage = false;
|
|
|
|
const SwFrm* pPage = 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
SwCrsrMoveState aState( MV_SETONLYTEXT );
|
|
|
|
Point aPoint( aPt );
|
|
|
|
SwPosition aPos( GetDoc()->GetNodes() );
|
|
|
|
GetLayout()->GetCrsrOfst( &aPos, aPoint, &aState );
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// do not set in ReadnOnly-content
|
2000-09-18 23:08:29 +00:00
|
|
|
if( aPos.nNode.GetNode().IsProtect() )
|
2012-01-17 20:39:02 +01:00
|
|
|
// then only page bound. Or should we
|
|
|
|
// search the next not-readonly position?
|
2003-07-04 12:20:40 +00:00
|
|
|
bAtPage = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2014-03-12 22:51:01 +01:00
|
|
|
pAnch = aPos.nNode.GetNode().GetCntntNode()->getLayoutFrm( GetLayout(), &aPoint, 0, false );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if( !bAtPage )
|
|
|
|
{
|
|
|
|
const SwFlyFrm *pTmp = pAnch->FindFlyFrm();
|
|
|
|
if( pTmp )
|
|
|
|
{
|
|
|
|
const SwFrm* pTmpFrm = pAnch;
|
|
|
|
SwRect aBound( rBound );
|
|
|
|
while( pTmp )
|
|
|
|
{
|
|
|
|
if( pTmp->Frm().IsInside( aBound ) )
|
|
|
|
{
|
|
|
|
if( !bBodyOnly || !pTmp->FindFooterOrHeader() )
|
|
|
|
pPage = pTmpFrm;
|
|
|
|
break;
|
|
|
|
}
|
2004-06-28 12:34:54 +00:00
|
|
|
pTmp = pTmp->GetAnchorFrm()
|
|
|
|
? pTmp->GetAnchorFrm()->FindFlyFrm()
|
2000-09-18 23:08:29 +00:00
|
|
|
: 0;
|
|
|
|
pTmpFrm = pTmp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( !pPage )
|
|
|
|
pPage = pAnch->FindPageFrm();
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Always via FindAnchor, to assure the frame will be bound
|
|
|
|
// to the previous. With GetCrsOfst we can also reach the next. THIS IS WRONG.
|
2000-09-18 23:08:29 +00:00
|
|
|
pAnch = ::FindAnchor( pPage, aPt, bBodyOnly );
|
|
|
|
aPos.nNode = *((SwCntntFrm*)pAnch)->GetNode();
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// do not set in ReadnOnly-content
|
2000-09-18 23:08:29 +00:00
|
|
|
if( aPos.nNode.GetNode().IsProtect() )
|
2012-01-17 20:39:02 +01:00
|
|
|
// then only page bound. Or should we
|
|
|
|
// search the next not-readonly position?
|
2003-07-04 12:20:40 +00:00
|
|
|
bAtPage = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
{
|
2010-01-05 16:37:41 +01:00
|
|
|
aAnch.SetType( FLY_AT_PARA );
|
2000-09-18 23:08:29 +00:00
|
|
|
aAnch.SetAnchor( &aPos );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bAtPage )
|
|
|
|
{
|
|
|
|
pPage = pAnch->FindPageFrm();
|
|
|
|
|
2010-01-05 16:37:41 +01:00
|
|
|
aAnch.SetType( FLY_AT_PAGE );
|
2000-09-18 23:08:29 +00:00
|
|
|
aAnch.SetPageNum( pPage->GetPhyPageNum() );
|
2012-01-17 20:39:02 +01:00
|
|
|
pAnch = pPage; // page becomes an anchor
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SfxItemSet aSet( GetDoc()->GetAttrPool(), RES_FRM_SIZE, RES_FRM_SIZE,
|
|
|
|
RES_SURROUND, RES_ANCHOR, 0 );
|
|
|
|
aSet.Put( aAnch );
|
|
|
|
|
2004-06-28 12:34:54 +00:00
|
|
|
// OD 2004-03-30 #i26791# - determine relative object position
|
|
|
|
SwTwips nXOffset;
|
|
|
|
SwTwips nYOffset = rBound.Top() - pAnch->Frm().Top();
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
if( pAnch->IsVertical() )
|
2002-09-16 13:35:23 +00:00
|
|
|
{
|
|
|
|
nXOffset = nYOffset;
|
|
|
|
nYOffset = pAnch->Frm().Left()+pAnch->Frm().Width()-rBound.Right();
|
|
|
|
}
|
|
|
|
else if( pAnch->IsRightToLeft() )
|
|
|
|
nXOffset = pAnch->Frm().Left()+pAnch->Frm().Width()-rBound.Right();
|
|
|
|
else
|
|
|
|
nXOffset = rBound.Left() - pAnch->Frm().Left();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pAnch->IsTxtFrm() && ((SwTxtFrm*)pAnch)->IsFollow() )
|
|
|
|
{
|
|
|
|
SwTxtFrm* pTmp = (SwTxtFrm*)pAnch;
|
|
|
|
do {
|
|
|
|
pTmp = pTmp->FindMaster();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pTmp, "Where's my Master?" );
|
2004-06-28 12:34:54 +00:00
|
|
|
// OD 2004-03-30 #i26791# - correction: add frame area height
|
|
|
|
// of master frames.
|
2002-09-16 13:35:23 +00:00
|
|
|
nYOffset += pTmp->IsVertical() ?
|
2004-06-28 12:34:54 +00:00
|
|
|
pTmp->Frm().Width() : pTmp->Frm().Height();
|
2000-09-18 23:08:29 +00:00
|
|
|
} while ( pTmp->IsFollow() );
|
|
|
|
}
|
2004-06-28 12:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if( OBJ_NONE == nIdent )
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// For OBJ_NONE a fly is inserted.
|
2004-06-28 12:34:54 +00:00
|
|
|
const long nWidth = rBound.Right() - rBound.Left();
|
|
|
|
const long nHeight= rBound.Bottom() - rBound.Top();
|
2013-04-11 00:21:40 -03:00
|
|
|
aSet.Put( SwFmtFrmSize( ATT_MIN_SIZE, std::max( nWidth, long(MINFLY) ),
|
|
|
|
std::max( nHeight, long(MINFLY) )));
|
2004-06-28 12:34:54 +00:00
|
|
|
|
2007-09-27 07:51:28 +00:00
|
|
|
SwFmtHoriOrient aHori( nXOffset, text::HoriOrientation::NONE, text::RelOrientation::FRAME );
|
|
|
|
SwFmtVertOrient aVert( nYOffset, text::VertOrientation::NONE, text::RelOrientation::FRAME );
|
2000-09-18 23:08:29 +00:00
|
|
|
aSet.Put( SwFmtSurround( SURROUND_PARALLEL ) );
|
|
|
|
aSet.Put( aHori );
|
|
|
|
aSet.Put( aVert );
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Quickly store the square
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwRect aFlyRect( rBound );
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Throw away generated object, now the fly can nicely
|
|
|
|
// via the available SS be generated.
|
2010-11-25 14:31:11 +01:00
|
|
|
GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(false); // see above
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i52858# - method name changed
|
2006-08-14 15:15:42 +00:00
|
|
|
SdrPage *pPg = getIDocumentDrawModelAccess()->GetOrCreateDrawModel()->GetPage( 0 );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !pPg )
|
|
|
|
{
|
2006-08-14 15:15:42 +00:00
|
|
|
SdrModel* pTmpSdrModel = getIDocumentDrawModelAccess()->GetDrawModel();
|
2014-01-28 19:59:54 +01:00
|
|
|
pPg = pTmpSdrModel->AllocPage( false );
|
2006-08-14 15:15:42 +00:00
|
|
|
pTmpSdrModel->InsertPage( pPg );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
pPg->RecalcObjOrdNums();
|
2007-07-06 08:52:22 +00:00
|
|
|
SdrObject* pRemovedObject = pPg->RemoveObject( rSdrObj.GetOrdNumDirect() );
|
|
|
|
SdrObject::Free( pRemovedObject );
|
2010-11-25 14:31:11 +01:00
|
|
|
GetDoc()->GetIDocumentUndoRedo().DoDrawUndo(true);
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwFlyFrm* pFlyFrm;
|
2014-04-25 14:00:35 +02:00
|
|
|
if( NewFlyFrm( aSet, true ) &&
|
2000-09-18 23:08:29 +00:00
|
|
|
::GetHtmlMode( GetDoc()->GetDocShell() ) &&
|
|
|
|
0 != ( pFlyFrm = FindFlyFrm() ))
|
|
|
|
{
|
|
|
|
SfxItemSet aHtmlSet( GetDoc()->GetAttrPool(), RES_VERT_ORIENT, RES_HORI_ORIENT );
|
2012-01-17 20:39:02 +01:00
|
|
|
// horizontal orientation:
|
2012-11-24 09:06:58 +09:00
|
|
|
const bool bLeftFrm = aFlyRect.Left() <
|
2000-09-18 23:08:29 +00:00
|
|
|
pAnch->Frm().Left() + pAnch->Prt().Left(),
|
|
|
|
bLeftPrt = aFlyRect.Left() + aFlyRect.Width() <
|
|
|
|
pAnch->Frm().Left() + pAnch->Prt().Width()/2;
|
|
|
|
if( bLeftFrm || bLeftPrt )
|
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
aHori.SetHoriOrient( text::HoriOrientation::LEFT );
|
|
|
|
aHori.SetRelationOrient( bLeftFrm ? text::RelOrientation::FRAME : text::RelOrientation::PRINT_AREA );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
const bool bRightFrm = aFlyRect.Left() >
|
2000-09-18 23:08:29 +00:00
|
|
|
pAnch->Frm().Left() + pAnch->Prt().Width();
|
2007-09-27 07:51:28 +00:00
|
|
|
aHori.SetHoriOrient( text::HoriOrientation::RIGHT );
|
|
|
|
aHori.SetRelationOrient( bRightFrm ? text::RelOrientation::FRAME : text::RelOrientation::PRINT_AREA );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
aHtmlSet.Put( aHori );
|
2007-09-27 07:51:28 +00:00
|
|
|
aVert.SetVertOrient( text::VertOrientation::TOP );
|
|
|
|
aVert.SetRelationOrient( text::RelOrientation::PRINT_AREA );
|
2000-09-18 23:08:29 +00:00
|
|
|
aHtmlSet.Put( aVert );
|
|
|
|
|
|
|
|
GetDoc()->SetAttr( aHtmlSet, *pFlyFrm->GetFmt() );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Point aRelNullPt;
|
|
|
|
if( OBJ_CAPTION == nIdent )
|
|
|
|
aRelNullPt = ((SdrCaptionObj&)rSdrObj).GetTailPos();
|
|
|
|
else
|
|
|
|
aRelNullPt = rBound.TopLeft();
|
|
|
|
|
|
|
|
aSet.Put( aAnch );
|
|
|
|
aSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
|
2004-06-28 12:34:54 +00:00
|
|
|
// OD 2004-03-30 #i26791# - set horizontal position
|
2007-09-27 07:51:28 +00:00
|
|
|
SwFmtHoriOrient aHori( nXOffset, text::HoriOrientation::NONE, text::RelOrientation::FRAME );
|
2004-06-28 12:34:54 +00:00
|
|
|
aSet.Put( aHori );
|
|
|
|
// OD 2004-03-30 #i26791# - set vertical position
|
|
|
|
if( pAnch->IsTxtFrm() && ((SwTxtFrm*)pAnch)->IsFollow() )
|
|
|
|
{
|
|
|
|
SwTxtFrm* pTmp = (SwTxtFrm*)pAnch;
|
|
|
|
do {
|
|
|
|
pTmp = pTmp->FindMaster();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pTmp, "Where's my Master?" );
|
2004-06-28 12:34:54 +00:00
|
|
|
nYOffset += pTmp->IsVertical() ?
|
|
|
|
pTmp->Prt().Width() : pTmp->Prt().Height();
|
|
|
|
} while ( pTmp->IsFollow() );
|
|
|
|
}
|
2007-09-27 07:51:28 +00:00
|
|
|
SwFmtVertOrient aVert( nYOffset, text::VertOrientation::NONE, text::RelOrientation::FRAME );
|
2004-06-28 12:34:54 +00:00
|
|
|
aSet.Put( aVert );
|
2006-08-14 15:15:42 +00:00
|
|
|
SwDrawFrmFmt* pFmt = (SwDrawFrmFmt*)getIDocumentLayoutAccess()->MakeLayoutFmt( RND_DRAW_OBJECT, &aSet );
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i36010# - set layout direction of the position
|
2004-10-27 11:31:09 +00:00
|
|
|
pFmt->SetPositionLayoutDir(
|
2007-09-27 07:51:28 +00:00
|
|
|
text::PositionLayoutDir::PositionInLayoutDirOfAnchor );
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i44344#, #i44681# - positioning attributes already set
|
2005-03-23 11:57:11 +00:00
|
|
|
pFmt->PosAttrSet();
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwDrawContact *pContact = new SwDrawContact( pFmt, &rSdrObj );
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i35635#
|
2004-12-23 09:05:11 +00:00
|
|
|
pContact->MoveObjToVisibleLayer( &rSdrObj );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( bCharBound )
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( aAnch.GetAnchorId() == FLY_AS_CHAR, "wrong AnchorType" );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwTxtNode *pNd = aAnch.GetCntntAnchor()->nNode.GetNode().GetTxtNode();
|
CWS-TOOLING: integrate CWS odfmetadata3
2009-09-11 Michael Stahl merge DEV300_m58
2009-09-07 Michael Stahl SwFmtFld::Modify(): do nothing on RES_OBJECTDYING
2009-08-27 Michael Stahl #i91565#, #i91566#: TextPortionEnumerationTest.java: add test document
2009-08-27 Michael Stahl #i91565#, #i91566#: add complex test: TextPortionEnumerationTest.java
2009-08-27 Michael Stahl CLiteral::initialize(): zero-length literals probably not an error
2009-08-27 Michael Stahl #i91565#, #i91566#: offapi: new InContentMetadata and MetadataField services
adapt TextPortion for InContentMetadata
2009-08-27 Michael Stahl #i91564#: xmloff: load/store xml:id and RDFa for text:bookmark(-start).
2009-08-27 Michael Stahl #i91564#: sw core: add support for xml:id at bookmarks:
sw::mark::Bookmark: derive from Metadatable.
SwHistoryBookmark, SaveBookmark: store a MetadatableUndo.
ndcopy.cxx: lcl_CopyBookmarks(): copy the xml:id.
SwXBookmark: derive from MetadatableMixin.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: refactor ruby import so nested meta(-field) works:
remove XMLRubyHint_Impl.
XMLImpRubyContext_Impl::~XMLImpRubyContext_Impl(): insert ruby directly.
2009-08-27 Michael Stahl #i91565#, #i91566#: xmloff: fix text:meta(-field) import/export:
new XMLTextParagraphExport::exportTextField() overload for XTextField.
CreateAndInsertMark(): set xml:id after insertion.
fix meta(-field) service names, bugs etc.
2009-08-27 Michael Stahl #i91565#, #i91566#: sw text formatting: paint background of meta(-field) body:
SwFont: add member m_nMetaCount.
txttypes.hxx: add POR_META.
atrstck.cxx: handle RES_TXTATR_META(FIELD).
itrform2.cxx: SwTxtFormatter::WhichTxtPor(): create new class SwMetaPortion.
2009-08-27 Michael Stahl #i91566#: sw text formatting: display meta-field prefix and suffix:
SwAttrIter::GetAttr(): replace with call to GetTxtAttrForCharAt().
SwTxtFormatter::NewExtraPortion(): handle meta-field prefix.
SwTxtFormatter: new member m_nHintEndIndex.
SwTxtFormatter::WhichFirstPortion(): call TryNewNoLengthPortion().
SwTxtFormatter::TryNewNoLengthPortion(): new; handle suffix of meta-field.
SwTxtFormatter::UnderFlow(): UGLY HACK: decrement m_nHintEndIndex.
SwFldPortion: add flag m_bNoLength: portion has zero length (for suffix).
2009-08-27 Michael Stahl #i91565#, #i91566#: extend text:meta(-field) uno wrapper with XText interface:
unoobj.hxx: new CursorType CURSOR_META.
unoobj2.cxx: refactor SwXText implementation to ensure that when the SwXText
belongs to a SwXMeta, content is always inserted inside the meta(-field).
unoobj.cxx: new SwXTextCursor::ForceIntoMeta(): cursor stays in meta(-field).
unometa.hxx: SwXMeta implements XText, forwarding to a member SwXMetaText.
DocInsertStringSplitCR(), SwX*::attachToRange(), SwX*::DeleteAndInsert():
use FORCEHINTEXPAND hack to ensure insert into the meta(-field) at the end.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) uno wrapper to sw:
fmtmeta.hxx, fmtatr2.cxx: new class sw::MetaField, new sw::MetaFieldManager.
doc.hxx, docnew.cxx: new SwDoc::GetMetaFieldManager().
unocoll.hxx,.cxx: new SW_SERVICE_FIELDTYPE_METAFIELD, SW_SERVICE_TYPE_META.
unomap.hxx,.cxx: new PROPERTY_MAP_METAFIELD.
unoprnms.hxx: new UNO_NAME_META.
unoport.hxx: new PORTION_META; add "InContentMetadata" prop to SwXTextPortion.
new unometa.hxx: new class SwXMeta and SwXMetaField.
unofield.cxx: SwXFieldEnumeration: include meta-fields.
unoportenum.cxx: handle RES_TXTATR_META(FIELD) by using a portion list stack.
unotext.cxx: SwXText::insertTextContent(): handle meta(-field) as attribute.
2009-08-27 Michael Stahl #i91565#, #i91566#: ndhints.cxx: remove sort number from SwTxtAttrNesting
2009-08-27 Michael Stahl #i91565#, #i91566#: add support for hints with end and CH_TXTATR to sw core:
doc.hxx, docedt.cxx: replace SwDoc::Delete(), DeleteAndJoin(), ReplaceRange()
with wrappers that split at left-overlapped end+CH_TXTATR hints.
txatbase.hxx: new member SwTxtAttr::m_bHasDummyChar.
ndtxt.hxx: rename SwTxtNode::GetTxtAttr() to GetTxtAttrForCharAt().
ndtxt.cxx: SwTxtNode::CopyText(): copy end+CH_TXTATR hints iff copy CH_TXTATR.
txtatr2.cxx, thints.cxx: SwTxtMeta gets a CH_TXTATR.
2009-08-27 Michael Stahl #i91565#, #i91566#: add text:meta(-field) to sw core:
txatbase.hxx: new member SwTxtAttr::m_bNesting.
hintids.hxx: new ids RES_TXTATR_META, RES_TXTATR_METAFIELD.
txtatr.hxx: new base class SwTxtAttrNesting.
new hint SwTxtMeta.
SwTxtRuby derives from SwTxtAttrNesting.
txtinet.hxx: SwTxtINetFmt derives from SwTxtAttrNesting.
new header fmtmeta.hxx: new pool item SwFmtMeta. new class sw::Meta.
ndhints.hxx, thints.cxx: new method SwpHints::TryInsertNesting().
thints.cxx: refactoring: BuildPortions() no longer handles Ruby/Hyperlink,
but TryInsertNesting(), which also handles meta(-field).
SwTxtNode::InsertItem(): check if the hint is actually inserted.
ndhints.cxx: sort nesting hints based on sort number.
ndtxt.cxx: lcl_CopyHint(): handle copy of meta/meta-field.
2009-08-27 Michael Stahl enable expanding hints with m_bLockExpandFlag set:
add new InsertFlag: INS_FORCEHINTEXPAND.
add new SetAttrMode: SETATTR_FORCEHINTEXPAND.
rename SwEditShell::Insert() to Insert2() because changed signature fails
to compile when SwWrtShell tries to overwrite these non-virtual members...
SwWrtShell::Insert() sets FOCEHINTEXPAND if range was selected/deleted.
adapt SwUndoInsert to store flags.
2009-08-27 Michael Stahl change formal parameters of item insertion methods to type SetAttrMode
2009-08-27 Michael Stahl fix incorrect resetting of text attributes in SwUndoInsSection, SwUndoInserts
2009-08-27 Michael Stahl clean up SwTxtNode::CutImpl() and lcl_CopyHint()
2009-08-27 Michael Stahl rename SwDoc::Copy() to CopyRange(), and _Copy() to CopyImpl()
2009-08-27 Michael Stahl rename SwNodes::Move() to MoveRange(), and remove unused parameter
2009-08-27 Michael Stahl rename SwDoc::Move() to MoveRange()/MoveNodeRange()
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertString(), and remove sal_Unicode variant
2009-08-27 Michael Stahl rename SwDoc::Insert() to InsertPoolItem()/InsertItemSet()/InsertSwSection()
2009-08-27 Michael Stahl rename SwDoc::Replace() to ReplaceRange()
2009-08-27 Michael Stahl remove SwDoc::Overwrite() sal_Unicode variant
2009-08-27 Michael Stahl split up SwDoc::DeleteAndJoin(): factor out DeleteAndJoinWithRedline()
2009-08-27 Michael Stahl rename overloaded SwDoc::Delete() to DeleteRange()/DeleteTOXMark()
2009-08-27 Michael Stahl rename SwTxtNode::Copy() to CopyText()
2009-08-27 Michael Stahl rename SwTxtNode::Cut() to CutText(), and _Cut() to CutImpl()
2009-08-27 Michael Stahl rename SwTxtNode::Delete() to DeleteAttribute()/DeleteAttributes()
2009-08-27 Michael Stahl rename SwTxtNode::Replace() to ReplaceText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl rename SwTxtNode::Erase() to EraseText()
2009-08-27 Michael Stahl rename SwTxtNode::Insert() to InsertText(), and remove the xub_Unicode variant
2009-08-27 Michael Stahl clean up SwTxtNode::Update()
2009-08-27 Michael Stahl remove SwTxtAttr::RemoveFromPool() and make destructor non-public,
to be invoked by new method SwTxtAttr::Destroy()
2009-08-27 Michael Stahl ensure that SwDoc::Insert() for item (set) returns success indicator:
replace SwRegHistory constructor with method InsertItems(), returning bool.
refactor InsAttr() so that it checks if InsertItems() succeeds.
2009-08-27 Michael Stahl move SwXTextPortionEnumeration from unoobj.hxx to unoport.hxx
2009-08-27 Michael Stahl add missing SolarMutex in SwXTextPortion methods
2009-08-27 Michael Stahl SwXTextPortion: new member m_xTextField (so the TextField property need not
be returned indirectly via SwUnoCursorHelper).
factor out function CreateSwXTextField().
2009-08-27 Michael Stahl SwXTextPortion: remove PORTION_CONTROL_CHAR and implementation of XTextField
2009-08-27 Michael Stahl remove obsolete hint SwTxtHardBlank and formats SwFmtHardBlank/SwFmtSoftHyph
2009-08-27 Michael Stahl clean up SwTxtAttr and friends:
remove many accessor methods for obsolete (due to autofmt) char format items.
remove unused flag SwTxtAttr::m_bDontMergeAttr.
MakeRedlineTxtAttr() now dedicated function, no longer calls MakeTxtAttr().
2009-08-27 Michael Stahl remove obsolete attribute SwTxt2Lines
2009-08-27 Michael Stahl SwXTextPortionEnumeration: finish refactoring CreatePortions
change ExportHints so it always returns a text portion for hint w/ CH_TXTATR.
remove special case for handling end of paragraph.
unfortunately had to refactor the fieldmarks export as well (got in the way).
2009-08-27 Michael Stahl SwXTextPortionEnumeration: refactor CreatePortions: frames export
extract function ExportFrames() from CreatePortions().
remove (un)dead code that calls evil MovePara(fnParaCurr, fnParaEnd)
2009-08-27 Michael Stahl clean up SwXParaFrameEnumeration
2009-08-27 Michael Stahl CollectFrameAtNode: replace SwDependArr with STL based FrameDependList_t
2009-08-27 Michael Stahl SwXTextPortionEnumeration: tweak refmark/toxmark export
so ExportHints returns the portion for point marks
2009-08-27 Michael Stahl clean up SwXTextPortionEnumeration:
prefix members, remove casts, replace SvWeirdArray with STL, etc.
make CreatePortions() method a function, and remove lots of members.
extract fieldmarks function from CreatePortions.
2009-08-27 Michael Stahl remove FOREACHUNOPAM_START/END macros
2009-08-27 Michael Stahl clean up SwXTextPortion:
prefix members, remove casts, etc.
remove SwXRubyPortion: replace it with another SwXTextPortion constructor
2009-08-27 Michael Stahl #i102541# SwXReferenceMark::InsertRefMark(): use flag SETATTR_DONTEXPAND
2009-08-27 Michael Stahl rename SwTxtNode::Insert to SwTxtNode::InsertHint, and
fix constness in SwTxtNode::InsertItem
2009-08-27 Michael Stahl turn SwTxtNode::MakeTxtAttr() methods into global functions in ndhints.hxx
2009-08-27 Michael Stahl remove obsolete sw/inc/bookmrk.hxx
2009-08-27 Michael Stahl pam.cxx: fix ComparePosition functions (returned wrong result in one case)
2009-08-27 Michael Stahl #i103613# only import RDF metadata on normal open of a document
2009-09-11 kz CWS-TOOLING: integrate CWS impress176
2009-09-08 20:18:24 +0200 sj r275957 : fixed warning (shadowed variable)
2009-09-08 18:02:05 +0200 cl r275948 : #i104315# added missing tab pages
2009-09-08 17:35:18 +0200 cl r275947 : #i104866# fixed angle import
2009-09-08 17:32:53 +0200 cl r275946 : #i104841# fixed angle import
2009-09-08 17:01:25 +0200 cl r275943 : #i103935# fixed the SID_EVENTCONFIG mess
2009-09-08 14:32:57 +0200 sj r275928 : #i104685# only comments
2009-09-07 12:37:36 +0200 sj r275886 : #i104683# fixed import of bold/italic attributes for normal text shapes
2009-09-04 15:07:46 +0200 sj r275808 : #104689# fixed bullet color problem
2009-09-03 15:25:07 +0200 sj r275753 : #160200# added vertical alignment of table cells
2009-09-11 kz CWS-TOOLING: integrate CWS dv14
2009-09-10 15:16:32 +0200 sg r276035 : #160513# updated wfs scheme to accept ports
2009-09-10 07:41:47 +0200 dv r276019 : #i104942# Better renaming algorithmen
2009-08-31 13:41:11 +0200 dv r275604 : #160505# Setting APP1PRODUCTNAME must not overwrite APP1PRODUCTDEF
2009-09-11 kz CWS-TOOLING: integrate CWS jl131
2009-09-02 16:42:40 +0200 jl r275720 : #i97896#
2009-08-31 13:01:53 +0200 jl r275599 : CWS-TOOLING: rebase CWS jl131 to trunk@275331 (milestone: DEV300:m56)
2009-07-31 14:35:30 +0200 jl r274531 : CWS-TOOLING: rebase CWS jl131 to trunk@274203 (milestone: DEV300:m53)
2009-07-23 14:20:32 +0200 jl r274272 : #i79839# better error text when trying to modify shared layer without having write permission, eg. unopkg add --shared, unopkg remove --shared, unopkg reinstall --shared
2009-07-22 16:38:02 +0200 jl r274252 : #i97896# localize error message for lock file
2009-07-22 16:37:22 +0200 jl r274251 : #i80462# unprecise wording in updatedialog
2009-07-22 16:36:06 +0200 jl r274250 : #i97896# localize error message for lock file
2009-07-22 16:35:20 +0200 jl r274249 : #i97896# localize error message for lock file
2009-07-22 15:07:30 +0200 jl r274242 : #i98873# minimum java version is 1.5 since OOo 3.0
2009-09-11 kz CWS-TOOLING: integrate CWS changehc
2009-08-31 19:38:50 +0200 pl r275633 : remove dbug printf
2009-08-31 17:41:50 +0200 pl r275623 : CWS-TOOLING: rebase CWS changehc to trunk@275331 (milestone: DEV300:m56)
2009-07-15 19:45:46 +0200 pl r274028 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:40:52 +0200 pl r274020 : #i35482# use HC flag to decide high contrast mode
2009-07-15 17:39:50 +0200 pl r274019 : #i35482# update autohc correctly in MergeSystemSettings
2009-07-15 17:38:57 +0200 pl r274018 : #i35482# update autohc correctly in MergeSystemSettings
2009-09-11 kz CWS-TOOLING: integrate CWS notes10
2009-08-24 07:25:57 +0200 mod r275287 : 2009-07-26 02:38:32 +0200 mod r274343 : #i#i103645#
2009-07-26 02:01:53 +0200 mod r274342 : #i103645#
2009-07-26 01:52:42 +0200 mod r274341 : #i103490#
2009-07-22 08:31:48 +0200 mod r274215 : #i103373#
2009-07-15 00:55:11 +0200 mod r273987 : #i101419#
2009-07-14 07:07:55 +0200 mod r273956 : #i101419#
2009-07-14 07:07:43 +0200 mod r273955 : #i101419#
2009-07-14 07:02:10 +0200 mod r273954 : changes from notes9
2009-07-14 06:14:25 +0200 mod r273953 : #i103476#
2009-09-11 kz CWS-TOOLING: integrate CWS ab70
2009-09-10 15:12:54 +0200 jsk r276034 : #i85434# - mandatory automatic update test
2009-09-10 15:11:06 +0200 jsk r276033 : #i85434# - mandatory automatic update test
2009-09-02 09:49:24 +0200 ab r275698 : #i85434# Dialog Import
2009-09-11 kz CWS-TOOLING: integrate CWS hb32bugs02
2009-09-02 Henning Brinkmann #i102420# revert changes
2009-08-26 Henning Brinkmann merged DEV300_m56
2009-08-19 Henning Brinkmann merged DEV300_m55
2009-08-14 Henning Brinkmann merged changes from wntmsci12
2009-08-12 Henning Brinkmann Implemented NoSpaceEdit constructor and destructor in .cxx to allow compile with debug on wntmsci12.
2009-08-12 Henning Brinkmann Added some SW_DLLPUBLIC to make compilable on wntmsci12.
2009-08-11 Henning Brinkmann #i102420# dbg_out: surround output for SwNodes with <nodes-array>.
2009-08-10 Henning Brinkmann #i102420# rewritten debug output for SwNodes.
2009-08-07 Henning Brinkmann #i102420# debug _MoveNodes: output the destination, too. Break after two iterations.
2009-08-07 Henning Brinkmann #i102420# _MoveNodes: Additionally check if destination index is inside source => false
Check if current range was already handled => loop
Debug output current range
2009-08-06 Henning Brinkmann merged DEV300_m54
2009-08-06 Henning Brinkmann added master fix
2009-08-06 Henning Brinkmann debug output for SwNodeRange
2009-08-04 Henning Brinkmann #i102844# robustness: check for NULL pointer to prevent crash
2009-08-03 Henning Brinkmann #i103475# applied patch and verified
2009-08-03 Henning Brinkmann Removed code preventing build of sw with DEBUG.
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 convert-repo update tags
2009-09-10 kz CWS-TOOLING: integrate CWS os2port06dev300
2009-09-05 22:49:00 +0200 ydario r275858 : #i99588# applied os2port06 diff to DEV300 tree.
2009-09-10 kz CWS-TOOLING: integrate CWS mingwport23
2009-08-29 07:07:53 +0200 tono r275555 : i#104522: mingw port graphite
2009-08-29 07:07:26 +0200 tono r275554 : i#104522: mingw port printf format fix
2009-09-10 kz CWS-TOOLING: integrate CWS mh232
2009-08-26 03:52:57 +0200 mh r275385 : #i102182# FreeBSD patch
2009-08-26 03:43:20 +0200 mh r275384 : #i101333# patch for FreeBSD
2009-08-26 03:11:20 +0200 mh r275383 : #i39230
2009-08-26 03:07:51 +0200 mh r275382 : #i39230# more space for initials field
2009-08-26 02:41:19 +0200 mh r275380 : #i39230# use vos::osecurity for reading the user name
2009-08-18 22:06:00 +0200 mh r275130 : #i104243#, line ending problem with newer perl
2009-08-18 21:53:21 +0200 mh r275129 : #i39230# read initials via getpwnam
2009-08-18 21:34:05 +0200 mh r275128 : enable CAIROCANVAS for Linux and Mac, #i88613#
2009-08-17 18:02:59 +0200 mh r275067 : #i95498# make compile with gcc3
2009-09-10 kz CWS-TOOLING: integrate CWS tkr24
2009-09-07 14:31:06 +0200 is r275898 : #160081# adding NO_LICENSE_INTO_COPYRIGHT
2009-09-10 releng #i10000# change KeyMapping to SingletonRef<framework::KeyMapping>
2009-09-11 14:29:45 +00:00
|
|
|
SwFmtFlyCnt aFmt( pFmt );
|
|
|
|
pNd->InsertItem(aFmt,
|
2000-09-18 23:08:29 +00:00
|
|
|
aAnch.GetCntntAnchor()->nContent.GetIndex(), 0 );
|
2007-09-27 07:51:28 +00:00
|
|
|
SwFmtVertOrient aVertical( pFmt->GetVertOrient() );
|
|
|
|
aVertical.SetVertOrient( text::VertOrientation::LINE_CENTER );
|
2008-06-13 08:47:50 +00:00
|
|
|
pFmt->SetFmtAttr( aVertical );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if( pAnch->IsTxtFrm() && ((SwTxtFrm*)pAnch)->IsFollow() )
|
|
|
|
{
|
|
|
|
SwTxtFrm* pTmp = (SwTxtFrm*)pAnch;
|
|
|
|
do {
|
|
|
|
pTmp = pTmp->FindMaster();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pTmp, "Where's my Master?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
} while( pTmp->IsFollow() );
|
|
|
|
pAnch = pTmp;
|
|
|
|
}
|
2003-05-22 08:44:39 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
pContact->ConnectToLayout();
|
|
|
|
|
2011-02-08 08:51:51 +01:00
|
|
|
// mark object at frame the object is inserted at.
|
2003-07-04 12:20:40 +00:00
|
|
|
{
|
|
|
|
SdrObject* pMarkObj = pContact->GetDrawObjectByAnchorFrm( *pAnch );
|
|
|
|
if ( pMarkObj )
|
|
|
|
{
|
|
|
|
Imp()->GetDrawView()->MarkObj( pMarkObj, Imp()->GetPageView(),
|
2014-03-10 11:09:59 +02:00
|
|
|
false, false );
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Imp()->GetDrawView()->MarkObj( &rSdrObj, Imp()->GetPageView(),
|
2014-03-10 11:09:59 +02:00
|
|
|
false, false );
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
GetDoc()->SetModified();
|
|
|
|
|
|
|
|
KillPams();
|
|
|
|
EndAllActionAndCall();
|
2008-08-18 09:49:51 +00:00
|
|
|
UnlockPaint();
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::BreakCreate()
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "BreakCreate without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->BrkCreateObj();
|
|
|
|
::FrameNotify( this, FLY_DRAG_END );
|
|
|
|
}
|
|
|
|
|
2013-02-05 23:42:42 +09:00
|
|
|
bool SwFEShell::IsDrawCreate() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-05-02 15:42:25 +02:00
|
|
|
return Imp()->HasDrawView() && Imp()->GetDrawView()->IsCreateObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::BeginMark( const Point &rPos )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( !Imp()->HasDrawView() )
|
|
|
|
Imp()->MakeDrawView();
|
|
|
|
|
|
|
|
if ( GetPageNumber( rPos ) )
|
|
|
|
{
|
|
|
|
SwDrawView* pDView = Imp()->GetDrawView();
|
|
|
|
|
|
|
|
if (pDView->HasMarkablePoints())
|
2006-11-14 14:09:49 +00:00
|
|
|
return pDView->BegMarkPoints( rPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
2006-11-14 14:09:49 +00:00
|
|
|
return pDView->BegMarkObj( rPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::MoveMark( const Point &rPos )
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "MoveMark without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if ( GetPageNumber( rPos ) )
|
|
|
|
{
|
2007-09-27 07:51:28 +00:00
|
|
|
ScrollTo( rPos );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDrawView* pDView = Imp()->GetDrawView();
|
|
|
|
|
|
|
|
if (pDView->IsInsObjPoint())
|
|
|
|
pDView->MovInsObjPoint( rPos );
|
|
|
|
else if (pDView->IsMarkPoints())
|
|
|
|
pDView->MovMarkPoints( rPos );
|
|
|
|
else
|
|
|
|
pDView->MovAction( rPos );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::EndMark()
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = false;
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "EndMark without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
if (Imp()->GetDrawView()->IsMarkObj())
|
|
|
|
{
|
|
|
|
bRet = Imp()->GetDrawView()->EndMarkObj();
|
|
|
|
|
|
|
|
if ( bRet )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bShowHdl = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDrawView* pDView = Imp()->GetDrawView();
|
2012-01-17 20:39:02 +01:00
|
|
|
// frames are not selected this way, except when
|
|
|
|
// it is only one frame
|
2004-07-12 14:47:48 +00:00
|
|
|
SdrMarkList &rMrkList = (SdrMarkList&)pDView->GetMarkedObjectList();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwFlyFrm* pOldSelFly = ::GetFlyFromMarked( &rMrkList, this );
|
|
|
|
|
|
|
|
if ( rMrkList.GetMarkCount() > 1 )
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2003-11-24 15:03:25 +00:00
|
|
|
if( pObj->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( !bShowHdl )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bShowHdl = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2004-07-12 14:47:48 +00:00
|
|
|
rMrkList.DeleteMark( i );
|
2012-01-17 20:39:02 +01:00
|
|
|
--i; // no exceptions
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bShowHdl )
|
|
|
|
{
|
|
|
|
pDView->MarkListHasChanged();
|
|
|
|
pDView->AdjustMarkHdl();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( rMrkList.GetMarkCount() )
|
|
|
|
::lcl_GrabCursor(this, pOldSelFly);
|
|
|
|
else
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if ( bRet )
|
|
|
|
::FrameNotify( this, FLY_DRAG_START );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (Imp()->GetDrawView()->IsMarkPoints())
|
|
|
|
bRet = Imp()->GetDrawView()->EndMarkPoints();
|
|
|
|
}
|
|
|
|
|
|
|
|
SetChainMarker();
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::BreakMark()
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "BreakMark without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->BrkMarkObj();
|
|
|
|
}
|
|
|
|
|
|
|
|
short SwFEShell::GetAnchorId() const
|
|
|
|
{
|
|
|
|
short nRet = SHRT_MAX;
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2003-11-24 15:03:25 +00:00
|
|
|
if ( pObj->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
nRet = -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
SwDrawContact *pContact = (SwDrawContact*)GetUserCall(pObj);
|
2007-09-27 07:51:28 +00:00
|
|
|
short nId = static_cast<short>(pContact->GetFmt()->GetAnchor().GetAnchorId());
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( nRet == SHRT_MAX )
|
|
|
|
nRet = nId;
|
|
|
|
else if ( nRet != nId )
|
|
|
|
{
|
|
|
|
nRet = -1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( nRet == SHRT_MAX )
|
|
|
|
nRet = -1;
|
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
|
2012-10-23 18:35:04 +09:00
|
|
|
void SwFEShell::ChgAnchor( int eAnchorId, bool bSameOnly, bool bPosCorr )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "ChgAnchor without DrawView?" );
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( rMrkList.GetMarkCount() &&
|
2006-07-25 11:33:25 +00:00
|
|
|
!rMrkList.GetMark( 0 )->GetMarkedSdrObj()->GetUpGroup() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
|
2004-06-28 12:34:54 +00:00
|
|
|
if( GetDoc()->ChgAnchor( rMrkList, (RndStdIds)eAnchorId, bSameOnly, bPosCorr ))
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->UnmarkAll();
|
|
|
|
|
|
|
|
EndAllAction();
|
|
|
|
|
|
|
|
::FrameNotify( this, FLY_DRAG );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::DelSelectedObj()
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->HasDrawView(), "DelSelectedObj(), no DrawView available" );
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
Imp()->GetDrawView()->DeleteMarked();
|
|
|
|
EndAllAction();
|
|
|
|
::FrameNotify( this, FLY_DRAG_END );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// For the statusline to request the current conditions
|
2000-09-18 23:08:29 +00:00
|
|
|
Size SwFEShell::GetObjSize() const
|
|
|
|
{
|
|
|
|
Rectangle aRect;
|
|
|
|
if ( Imp()->HasDrawView() )
|
|
|
|
{
|
|
|
|
if ( Imp()->GetDrawView()->IsAction() )
|
|
|
|
Imp()->GetDrawView()->TakeActionRect( aRect );
|
|
|
|
else
|
|
|
|
aRect = Imp()->GetDrawView()->GetAllMarkedRect();
|
|
|
|
}
|
|
|
|
return aRect.GetSize();
|
|
|
|
}
|
|
|
|
|
|
|
|
Point SwFEShell::GetAnchorObjDiff() const
|
|
|
|
{
|
|
|
|
const SdrView *pView = Imp()->GetDrawView();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pView, "GetAnchorObjDiff without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
Rectangle aRect;
|
|
|
|
if ( Imp()->GetDrawView()->IsAction() )
|
|
|
|
Imp()->GetDrawView()->TakeActionRect( aRect );
|
|
|
|
else
|
|
|
|
aRect = Imp()->GetDrawView()->GetAllMarkedRect();
|
|
|
|
|
|
|
|
Point aRet( aRect.TopLeft() );
|
|
|
|
|
|
|
|
if ( IsFrmSelected() )
|
|
|
|
{
|
|
|
|
SwFlyFrm *pFly = FindFlyFrm();
|
2004-06-28 12:34:54 +00:00
|
|
|
aRet -= pFly->GetAnchorFrm()->Frm().Pos();
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrObject *pObj = pView->GetMarkedObjectList().GetMarkCount() == 1 ?
|
2006-07-25 11:33:25 +00:00
|
|
|
pView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() : 0;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( pObj )
|
|
|
|
aRet -= pObj->GetAnchorPos();
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
Point SwFEShell::GetObjAbsPos() const
|
|
|
|
{
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->GetDrawView(), "GetObjAbsPos() without DrawView?" );
|
2000-09-18 23:08:29 +00:00
|
|
|
return Imp()->GetDrawView()->GetDragStat().GetActionRect().TopLeft();
|
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::IsGroupSelected()
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( IsObjSelected() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2011-02-08 08:51:51 +01:00
|
|
|
// consider 'virtual' drawing objects.
|
2003-07-04 12:20:40 +00:00
|
|
|
// Thus, use corresponding method instead of checking type.
|
|
|
|
if ( pObj->IsGroupObject() &&
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> #i38505# No ungroup allowed for 3d objects
|
2005-01-05 13:29:51 +00:00
|
|
|
!pObj->Is3DObj() &&
|
2010-01-05 16:37:41 +01:00
|
|
|
FLY_AS_CHAR != ((SwDrawContact*)GetUserCall(pObj))->
|
2003-07-04 12:20:40 +00:00
|
|
|
GetFmt()->GetAnchor().GetAnchorId() )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2011-02-08 08:51:51 +01:00
|
|
|
// Change return type.
|
|
|
|
// Adjustments for drawing objects in header/footer:
|
2003-07-04 12:20:40 +00:00
|
|
|
// allow group, only if all selected objects are in the same header/footer
|
|
|
|
// or not in header/footer.
|
|
|
|
bool SwFEShell::IsGroupAllowed() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2003-07-04 12:20:40 +00:00
|
|
|
bool bIsGroupAllowed = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( IsObjSelected() > 1 )
|
|
|
|
{
|
2003-07-04 12:20:40 +00:00
|
|
|
bIsGroupAllowed = true;
|
|
|
|
const SdrObject* pUpGroup = 0L;
|
|
|
|
const SwFrm* pHeaderFooterFrm = 0L;
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; bIsGroupAllowed && i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
const SdrObject* pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2003-07-04 12:20:40 +00:00
|
|
|
if ( i )
|
|
|
|
bIsGroupAllowed = pObj->GetUpGroup() == pUpGroup;
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
pUpGroup = pObj->GetUpGroup();
|
|
|
|
|
2006-12-01 13:24:45 +00:00
|
|
|
if ( bIsGroupAllowed )
|
2003-07-04 12:20:40 +00:00
|
|
|
{
|
2006-12-01 13:24:45 +00:00
|
|
|
SwFrmFmt* pFrmFmt( ::FindFrmFmt( const_cast<SdrObject*>(pObj) ) );
|
|
|
|
if ( !pFrmFmt )
|
|
|
|
{
|
2011-03-12 11:51:35 +01:00
|
|
|
OSL_FAIL( "<SwFEShell::IsGroupAllowed()> - missing frame format" );
|
2006-12-01 13:24:45 +00:00
|
|
|
bIsGroupAllowed = false;
|
|
|
|
}
|
2010-01-05 16:37:41 +01:00
|
|
|
else if ( FLY_AS_CHAR == pFrmFmt->GetAnchor().GetAnchorId() )
|
2006-12-01 13:24:45 +00:00
|
|
|
{
|
|
|
|
bIsGroupAllowed = false;
|
|
|
|
}
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
|
|
|
|
2011-02-08 08:51:51 +01:00
|
|
|
// check, if all selected objects are in the
|
2003-07-04 12:20:40 +00:00
|
|
|
// same header/footer or not in header/footer.
|
|
|
|
if ( bIsGroupAllowed )
|
|
|
|
{
|
|
|
|
const SwFrm* pAnchorFrm = 0L;
|
2003-11-24 15:03:25 +00:00
|
|
|
if ( pObj->ISA(SwVirtFlyDrawObj) )
|
2003-07-04 12:20:40 +00:00
|
|
|
{
|
|
|
|
const SwFlyFrm* pFlyFrm =
|
|
|
|
static_cast<const SwVirtFlyDrawObj*>(pObj)->GetFlyFrm();
|
|
|
|
if ( pFlyFrm )
|
|
|
|
{
|
2004-06-28 12:34:54 +00:00
|
|
|
pAnchorFrm = pFlyFrm->GetAnchorFrm();
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-06-28 12:34:54 +00:00
|
|
|
SwDrawContact* pDrawContact = static_cast<SwDrawContact*>(GetUserCall( pObj ));
|
|
|
|
if ( pDrawContact )
|
2003-07-04 12:20:40 +00:00
|
|
|
{
|
2004-06-28 12:34:54 +00:00
|
|
|
pAnchorFrm = pDrawContact->GetAnchorFrm( pObj );
|
2003-07-04 12:20:40 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if ( pAnchorFrm )
|
|
|
|
{
|
|
|
|
if ( i )
|
|
|
|
{
|
|
|
|
bIsGroupAllowed =
|
|
|
|
( pAnchorFrm->FindFooterOrHeader() == pHeaderFooterFrm );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pHeaderFooterFrm = pAnchorFrm->FindFooterOrHeader();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2003-07-04 12:20:40 +00:00
|
|
|
|
|
|
|
return bIsGroupAllowed;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// The group gets the anchor and the contactobject of the first in the selection
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwFEShell::GroupSelection()
|
|
|
|
{
|
|
|
|
if ( IsGroupAllowed() )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
StartUndo( UNDO_START );
|
|
|
|
|
|
|
|
GetDoc()->GroupSelection( *Imp()->GetDrawView() );
|
|
|
|
|
|
|
|
EndUndo( UNDO_END );
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-21 19:28:47 -04:00
|
|
|
// The individual objects get a copy of the anchor and the contactobject of the group
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwFEShell::UnGroupSelection()
|
|
|
|
{
|
|
|
|
if ( IsGroupSelected() )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
StartUndo( UNDO_START );
|
|
|
|
|
|
|
|
GetDoc()->UnGroupSelection( *Imp()->GetDrawView() );
|
|
|
|
|
|
|
|
EndUndo( UNDO_END );
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-02-15 00:40:26 +09:00
|
|
|
void SwFEShell::MirrorSelection( bool bHorizontal )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SdrView *pView = Imp()->GetDrawView();
|
|
|
|
if ( IsObjSelected() && pView->IsMirrorAllowed() )
|
|
|
|
{
|
|
|
|
if ( bHorizontal )
|
|
|
|
pView->MirrorAllMarkedHorizontal();
|
|
|
|
else
|
|
|
|
pView->MirrorAllMarkedVertical();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-01-17 23:07:43 +01:00
|
|
|
// jump to named frame (Graphic/OLE)
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::GotoFly( const OUString& rName, FlyCntType eType, bool bSelFrm )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = false;
|
2011-03-14 16:51:14 +00:00
|
|
|
static sal_uInt8 const aChkArr[ 4 ] = {
|
2000-09-18 23:08:29 +00:00
|
|
|
/* FLYCNTTYPE_ALL */ 0,
|
|
|
|
/* FLYCNTTYPE_FRM */ ND_TEXTNODE,
|
|
|
|
/* FLYCNTTYPE_GRF */ ND_GRFNODE,
|
|
|
|
/* FLYCNTTYPE_OLE */ ND_OLENODE
|
|
|
|
};
|
|
|
|
|
2013-02-23 12:33:14 +01:00
|
|
|
const SwFlyFrmFmt* pFlyFmt = mpDoc->FindFlyByName( rName, aChkArr[ eType]);
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pFlyFmt )
|
|
|
|
{
|
|
|
|
SET_CURR_SHELL( this );
|
|
|
|
|
2010-12-17 09:02:23 +01:00
|
|
|
SwFlyFrm* pFrm = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *pFlyFmt );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pFrm )
|
|
|
|
{
|
|
|
|
if( bSelFrm )
|
|
|
|
{
|
2010-12-17 09:02:23 +01:00
|
|
|
SelectObj( pFrm->Frm().Pos(), 0, pFrm->GetVirtDrawObj() );
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !ActionPend() )
|
|
|
|
MakeVisible( pFrm->Frm() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
SwCntntFrm *pCFrm = pFrm->ContainsCntnt();
|
|
|
|
if ( pCFrm )
|
|
|
|
{
|
|
|
|
SwCntntNode *pCNode = pCFrm->GetNode();
|
|
|
|
ClearMark();
|
|
|
|
SwPaM* pCrsr = GetCrsr();
|
|
|
|
|
|
|
|
pCrsr->GetPoint()->nNode = *pCNode;
|
|
|
|
pCrsr->GetPoint()->nContent.Assign( pCNode, 0 );
|
|
|
|
|
|
|
|
SwRect& rChrRect = (SwRect&)GetCharRect();
|
|
|
|
rChrRect = pFrm->Prt();
|
|
|
|
rChrRect.Pos() += pFrm->Frm().Pos();
|
|
|
|
GetCrsrDocPos() = rChrRect.Pos();
|
|
|
|
}
|
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
2014-06-23 11:34:21 +02:00
|
|
|
sal_uInt16 SwFEShell::GetFlyCount( FlyCntType eType, bool bIgnoreTextBoxes ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-06-23 11:34:21 +02:00
|
|
|
return GetDoc()->GetFlyCount(eType, bIgnoreTextBoxes);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-06-23 11:34:21 +02:00
|
|
|
const SwFrmFmt* SwFEShell::GetFlyNum(sal_uInt16 nIdx, FlyCntType eType, bool bIgnoreTextBoxes ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2014-06-23 11:34:21 +02:00
|
|
|
return GetDoc()->GetFlyNum(nIdx, eType, bIgnoreTextBoxes);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// show the current selected object
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwFEShell::MakeSelVisible()
|
|
|
|
{
|
|
|
|
if( Imp()->HasDrawView() &&
|
2004-07-12 14:47:48 +00:00
|
|
|
Imp()->GetDrawView()->GetMarkedObjectList().GetMarkCount() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
MakeVisible( Imp()->GetDrawView()->GetAllMarkedRect() );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
SwCrsrShell::MakeSelVisible();
|
|
|
|
}
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// how is the selected object protected?
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 SwFEShell::IsSelObjProtected( sal_uInt16 eType ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
int nChk = 0;
|
2007-09-27 07:51:28 +00:00
|
|
|
const bool bParent = (eType & FLYPROTECT_PARENT);
|
2000-09-18 23:08:29 +00:00
|
|
|
if( Imp()->HasDrawView() )
|
|
|
|
{
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for( sal_uLong i = rMrkList.GetMarkCount(); i; )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( --i )->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
if( !bParent )
|
|
|
|
{
|
|
|
|
nChk |= ( pObj->IsMoveProtect() ? FLYPROTECT_POS : 0 ) |
|
|
|
|
( pObj->IsResizeProtect()? FLYPROTECT_SIZE : 0 );
|
|
|
|
|
2010-11-03 15:50:00 +01:00
|
|
|
if( pObj->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
|
2010-11-03 15:50:00 +01:00
|
|
|
if ( (FLYPROTECT_CONTENT & eType) && pFly->GetFmt()->GetProtect().IsCntntProtected() )
|
2000-09-18 23:08:29 +00:00
|
|
|
nChk |= FLYPROTECT_CONTENT;
|
|
|
|
|
|
|
|
if ( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() )
|
|
|
|
{
|
|
|
|
SwOLENode *pNd = ((SwCntntFrm*)pFly->Lower())->GetNode()->GetOLENode();
|
2010-11-03 15:50:00 +01:00
|
|
|
uno::Reference < embed::XEmbeddedObject > xObj( pNd ? pNd->GetOLEObj().GetOleRef() : 0 );
|
|
|
|
if ( xObj.is() )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2004-10-04 18:06:57 +00:00
|
|
|
// TODO/LATER: use correct aspect
|
2010-11-03 15:50:00 +01:00
|
|
|
const bool bNeverResize = (embed::EmbedMisc::EMBED_NEVERRESIZE & xObj->getStatus( embed::Aspects::MSOLE_CONTENT ));
|
2013-04-10 08:20:16 +00:00
|
|
|
if ( ( (FLYPROTECT_CONTENT & eType) || (FLYPROTECT_SIZE & eType) ) && bNeverResize )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
nChk |= FLYPROTECT_SIZE;
|
|
|
|
nChk |= FLYPROTECT_FIXED;
|
|
|
|
}
|
2010-11-03 15:50:00 +01:00
|
|
|
|
|
|
|
// set FLYPROTECT_POS if it is a Math object anchored 'as char' and baseline alignment is activated
|
|
|
|
const bool bProtectMathPos = SotExchange::IsMath( xObj->getClassID() )
|
|
|
|
&& FLY_AS_CHAR == pFly->GetFmt()->GetAnchor().GetAnchorId()
|
2014-05-25 14:10:13 +02:00
|
|
|
&& mpDoc->GetDocumentSettingManager().get( IDocumentSettingAccess::MATH_BASELINE_ALIGNMENT );
|
2010-11-03 15:50:00 +01:00
|
|
|
if ((FLYPROTECT_POS & eType) && bProtectMathPos)
|
|
|
|
nChk |= FLYPROTECT_POS;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
nChk &= eType;
|
|
|
|
if( nChk == eType )
|
2011-01-17 15:06:54 +01:00
|
|
|
return static_cast<sal_uInt8>(eType);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2004-06-28 12:34:54 +00:00
|
|
|
const SwFrm* pAnch;
|
2003-11-24 15:03:25 +00:00
|
|
|
if( pObj->ISA(SwVirtFlyDrawObj) )
|
2004-06-28 12:34:54 +00:00
|
|
|
pAnch = ( (SwVirtFlyDrawObj*)pObj )->GetFlyFrm()->GetAnchorFrm();
|
2000-09-18 23:08:29 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
SwDrawContact* pTmp = (SwDrawContact*)GetUserCall(pObj);
|
2004-06-28 12:34:54 +00:00
|
|
|
pAnch = pTmp ? pTmp->GetAnchorFrm( pObj ) : NULL;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if( pAnch && pAnch->IsProtected() )
|
2011-01-17 15:06:54 +01:00
|
|
|
return static_cast<sal_uInt8>(eType);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2011-01-17 15:06:54 +01:00
|
|
|
return static_cast<sal_uInt8>(nChk);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::GetObjAttr( SfxItemSet &rSet ) const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
if ( !IsObjSelected() )
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDrawContact *pContact = (SwDrawContact*)GetUserCall(pObj);
|
2011-02-08 08:51:51 +01:00
|
|
|
// --> make code robust
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pContact, "<SwFEShell::GetObjAttr(..)> - missing <pContact> - please inform OD." );
|
2007-07-31 16:41:19 +00:00
|
|
|
if ( pContact )
|
|
|
|
{
|
|
|
|
if ( i )
|
|
|
|
rSet.MergeValues( pContact->GetFmt()->GetAttrSet() );
|
|
|
|
else
|
|
|
|
rSet.Put( pContact->GetFmt()->GetAttrSet() );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::SetObjAttr( const SfxItemSet& rSet )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SET_CURR_SHELL( this );
|
|
|
|
|
|
|
|
if ( !rSet.Count() )
|
2010-11-25 17:08:45 +01:00
|
|
|
{ OSL_ENSURE( !this, "SetObjAttr, empty set." );
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
StartAllAction();
|
|
|
|
StartUndo( UNDO_INSATTR );
|
|
|
|
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDrawContact *pContact = (SwDrawContact*)GetUserCall(pObj);
|
|
|
|
GetDoc()->SetAttr( rSet, *pContact->GetFmt() );
|
|
|
|
}
|
|
|
|
|
|
|
|
EndUndo( UNDO_INSATTR );
|
|
|
|
EndAllActionAndCall();
|
|
|
|
GetDoc()->SetModified();
|
2014-04-25 14:00:35 +02:00
|
|
|
return true;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool SwFEShell::IsAlignPossible() const
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nCnt;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( 0 < (nCnt = IsObjSelected()) )
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bRet = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( nCnt == 1 )
|
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pO = Imp()->GetDrawView()->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
SwDrawContact *pC = (SwDrawContact*)GetUserCall(pO);
|
2011-06-02 11:39:43 +01:00
|
|
|
OSL_ENSURE( pC, "No SwDrawContact!");
|
2003-03-27 14:45:43 +00:00
|
|
|
//only as character bound drawings can be aligned
|
2011-06-02 11:39:43 +01:00
|
|
|
bRet = pC ? (pC->GetFmt()->GetAnchor().GetAnchorId() == FLY_AS_CHAR) : sal_False;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if ( bRet )
|
|
|
|
return Imp()->GetDrawView()->IsAlignPossible();
|
|
|
|
}
|
2014-04-25 14:00:35 +02:00
|
|
|
return false;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
2012-12-28 22:06:35 +01:00
|
|
|
// temporary fix till SS of JOE is available
|
2000-09-18 23:08:29 +00:00
|
|
|
void SwFEShell::CheckUnboundObjects()
|
|
|
|
{
|
|
|
|
SET_CURR_SHELL( this );
|
|
|
|
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList &rMrkList = Imp()->GetDrawView()->GetMarkedObjectList();
|
2011-01-17 15:06:54 +01:00
|
|
|
for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
2006-07-25 11:33:25 +00:00
|
|
|
SdrObject *pObj = rMrkList.GetMark( i )->GetMarkedSdrObj();
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( !GetUserCall(pObj) )
|
|
|
|
{
|
|
|
|
const Rectangle &rBound = pObj->GetSnapRect();
|
|
|
|
const Point aPt( rBound.TopLeft() );
|
|
|
|
const SwFrm *pPage = GetLayout()->Lower();
|
|
|
|
const SwFrm *pLast = pPage;
|
|
|
|
while ( pPage && !pPage->Frm().IsInside( aPt ) )
|
|
|
|
{
|
|
|
|
if ( aPt.Y() > pPage->Frm().Bottom() )
|
|
|
|
pLast = pPage;
|
|
|
|
pPage = pPage->GetNext();
|
|
|
|
}
|
|
|
|
if ( !pPage )
|
|
|
|
pPage = pLast;
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pPage, "Page not found." );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Alien identifier should roll into the default,
|
|
|
|
// Duplications are possible!!
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nIdent =
|
2000-09-18 23:08:29 +00:00
|
|
|
Imp()->GetDrawView()->GetCurrentObjInventor() == SdrInventor ?
|
|
|
|
Imp()->GetDrawView()->GetCurrentObjIdentifier() : 0xFFFF;
|
|
|
|
|
|
|
|
SwFmtAnchor aAnch;
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
const SwFrm *pAnch = ::FindAnchor( pPage, aPt, true );
|
2000-09-18 23:08:29 +00:00
|
|
|
SwPosition aPos( *((SwCntntFrm*)pAnch)->GetNode() );
|
2010-01-05 16:37:41 +01:00
|
|
|
aAnch.SetType( FLY_AT_PARA );
|
2000-09-18 23:08:29 +00:00
|
|
|
aAnch.SetAnchor( &aPos );
|
|
|
|
((SwRect&)GetCharRect()).Pos() = aPt;
|
|
|
|
}
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// First the action here, to assure GetCharRect delivers current values.
|
2000-09-18 23:08:29 +00:00
|
|
|
StartAllAction();
|
|
|
|
|
|
|
|
SfxItemSet aSet( GetAttrPool(), RES_FRM_SIZE, RES_FRM_SIZE,
|
|
|
|
RES_SURROUND, RES_ANCHOR, 0 );
|
|
|
|
aSet.Put( aAnch );
|
|
|
|
|
|
|
|
Point aRelNullPt;
|
|
|
|
|
|
|
|
if( OBJ_CAPTION == nIdent )
|
|
|
|
aRelNullPt = ((SdrCaptionObj*)pObj)->GetTailPos();
|
|
|
|
else
|
|
|
|
aRelNullPt = rBound.TopLeft();
|
|
|
|
|
|
|
|
aSet.Put( aAnch );
|
|
|
|
aSet.Put( SwFmtSurround( SURROUND_THROUGHT ) );
|
2006-08-14 15:15:42 +00:00
|
|
|
SwFrmFmt* pFmt = getIDocumentLayoutAccess()->MakeLayoutFmt( RND_DRAW_OBJECT, &aSet );
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
SwDrawContact *pContact = new SwDrawContact(
|
|
|
|
(SwDrawFrmFmt*)pFmt, pObj );
|
2002-09-16 07:47:13 +00:00
|
|
|
|
2011-04-16 22:42:13 -03:00
|
|
|
// #i35635#
|
2004-12-23 09:05:11 +00:00
|
|
|
pContact->MoveObjToVisibleLayer( pObj );
|
2000-09-18 23:08:29 +00:00
|
|
|
pContact->ConnectToLayout();
|
|
|
|
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::SetCalcFieldValueHdl(Outliner* pOutliner)
|
|
|
|
{
|
|
|
|
GetDoc()->SetCalcFieldValueHdl(pOutliner);
|
|
|
|
}
|
|
|
|
|
|
|
|
int SwFEShell::Chainable( SwRect &rRect, const SwFrmFmt &rSource,
|
|
|
|
const Point &rPt ) const
|
|
|
|
{
|
|
|
|
rRect.Clear();
|
|
|
|
|
2012-01-17 23:07:43 +01:00
|
|
|
// The source is not allowed to have a follow.
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwFmtChain &rChain = rSource.GetChain();
|
|
|
|
if ( rChain.GetNext() )
|
|
|
|
return SW_CHAIN_SOURCE_CHAINED;
|
|
|
|
|
2014-03-28 13:14:58 +00:00
|
|
|
int nRet = SW_CHAIN_NOT_FOUND;
|
2000-09-18 23:08:29 +00:00
|
|
|
if( Imp()->HasDrawView() )
|
|
|
|
{
|
|
|
|
SdrObject* pObj;
|
|
|
|
SdrPageView* pPView;
|
|
|
|
SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
|
2011-01-17 15:06:54 +01:00
|
|
|
const sal_uInt16 nOld = pDView->GetHitTolerancePixel();
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->SetHitTolerancePixel( 0 );
|
CWS-TOOLING: integrate CWS aw065
2009-06-17 13:48:12 +0200 aw r273068 : #99385# corrected small error in SCs selection visualisation
2009-06-16 15:45:28 +0200 wg r273021 : i102838
2009-06-16 12:46:07 +0200 wg r273016 : i102833
2009-06-11 17:40:29 +0200 aw r272895 : #i98870# added implementation for getPageCount helper
2009-06-11 16:39:54 +0200 aw r272885 : #i102663#, #i102667#, #i98870# incluide file typo corrected
2009-06-11 16:24:07 +0200 aw r272881 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-11 16:23:52 +0200 aw r272880 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-09 13:50:29 +0200 aw r272769 : #i98917# added support for the OverlayHatchRectanglePrimitive to follow rotation with it's hatch; simplified OverlayHatchRect
2009-06-09 13:04:06 +0200 aw r272766 : #i98870# re-added PageNumber identification in SdrTextPrimitive2D::get2DDecomposition
2009-06-08 18:56:05 +0200 aw r272744 : #i99385# added some last corrections to OverlayObjects in SD (had to do some merges on resync, needed to optically check and correct)
2009-06-08 11:17:57 +0200 aw r272725 : cws aw065: corrections after resync
2009-06-08 11:02:25 +0200 aw r272723 : cws aw065: corrections after resync
2009-06-08 10:36:22 +0200 aw r272722 : cws aw065: corrections after resync
2009-06-05 18:57:06 +0200 aw r272712 : CWS-TOOLING: rebase CWS aw065 to trunk@272291 (milestone: DEV300:m49)
2009-06-05 14:56:34 +0200 aw r272690 : #i89784# stripped old stuff no longer needed due to text-to-polygon conversion using primitives
2009-06-05 14:50:07 +0200 aw r272688 : #102091# removed on-model-lock suppression for SdrObject::ActionChanged()
2009-06-05 14:47:29 +0200 aw r272687 : #102091# corrected local value buffering in ScenePrimitive2D::get2DDecomposition
2009-06-03 17:53:32 +0200 aw r272599 : #i89784# version before stripping
2009-06-03 17:52:18 +0200 aw r272598 : #i89784# version before stripping
2009-05-28 17:15:47 +0200 aw r272420 : #i101872# old stuff removed/stripped
2009-05-28 17:15:32 +0200 aw r272419 : #i101872# old stuff removed/stripped
2009-05-28 17:15:15 +0200 aw r272418 : #i101872# old stuff removed/stripped
2009-05-28 17:14:45 +0200 aw r272417 : #i101872# old stuff removed/stripped
2009-05-28 12:13:56 +0200 aw r272396 : #i101872# stable hybrid state
2009-05-28 12:13:46 +0200 aw r272395 : #i101872# stable hybrid state
2009-05-28 12:13:35 +0200 aw r272394 : #i101872# stable hybrid state
2009-05-28 12:13:20 +0200 aw r272393 : #i101872# stable hybrid state
2009-05-28 12:13:05 +0200 aw r272392 : #i101872# stable hybrid state
2009-05-28 12:12:51 +0200 aw r272391 : #i101872# stable hybrid state
2009-05-15 16:56:02 +0200 aw r271952 : #i101872# HitTest unifications
2009-05-15 16:55:22 +0200 aw r271951 : #i101872# HitTest unifications
2009-05-15 16:55:12 +0200 aw r271950 : #i101872# HitTest unifications
2009-05-15 16:55:01 +0200 aw r271949 : #i101872# HitTest unifications
2009-05-15 16:54:51 +0200 aw r271948 : #i101872# HitTest unifications
2009-05-15 16:54:35 +0200 aw r271947 : #i101872# HitTest unifications
2009-05-15 16:54:22 +0200 aw r271946 : #i101872# HitTest unifications
2009-05-12 19:08:38 +0200 aw r271834 : #i101684# corrected AutoShape's preparation of text transformation due to different definitions in TextBounds
2009-05-12 15:44:49 +0200 aw r271827 : #i89784# expanded TextLayouterDevice::getTextOutlines() to support DXArray and X-Font scaling
2009-05-11 19:40:40 +0200 aw r271790 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:25 +0200 aw r271789 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:12 +0200 aw r271788 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 13:01:53 +0200 aw r271765 : #i99385# corrections and optimizations
2009-05-08 14:48:40 +0200 aw r271718 : #i1016180# added optimizations in model operations when model is locked
2009-05-08 14:11:45 +0200 aw r271716 : #i101679# added flush() calls to OverlayManager when interaction step is prepared
2009-05-07 17:44:03 +0200 aw r271689 : #i99385# last corrections/changes
2009-05-07 17:43:47 +0200 aw r271688 : #i99385# last corrections/changes
2009-05-07 13:20:09 +0200 aw r271654 : #i99385# added changes from WFH
2009-05-07 13:19:38 +0200 aw r271653 : #i99385# added changes from WFH
2009-05-07 13:19:11 +0200 aw r271652 : #i99385# added changes from WFH
2009-05-07 11:33:17 +0200 aw r271643 : #i99385# corrections after resync
2009-05-07 11:17:31 +0200 aw r271642 : #i99385# corrections after resync
2009-05-06 18:46:53 +0200 aw r271609 : CWS-TOOLING: rebase CWS aw065 to trunk@271427 (milestone: DEV300:m47)
2009-05-05 18:24:03 +0200 aw r271548 : #i101443# force new text decomposition when TextBackgroundColor has changed
2009-05-05 17:44:42 +0200 aw r271542 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:32 +0200 aw r271541 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:20 +0200 aw r271540 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:09 +0200 aw r271539 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 15:48:38 +0200 aw r271527 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:15 +0200 aw r271526 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:03 +0200 aw r271525 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:47:51 +0200 aw r271524 : #i99385# 2nd round, usages checked and corrected
2009-04-27 18:33:10 +0200 aw r271300 : #i99385# state commit after all implementations are done
2009-04-27 15:36:53 +0200 aw r271283 : #i99385# state commit after all implementations are done
2009-04-27 15:27:49 +0200 aw r271280 : #i99385# state commit after all implementations are done
2009-04-27 15:27:33 +0200 aw r271279 : #i99385# state commit after all implementations are done
2009-04-27 15:27:00 +0200 aw r271278 : #i99385# state commit after all implementations are done
2009-04-27 15:26:15 +0200 aw r271277 : #i99385# state commit after all implementations are done
2009-04-27 15:25:40 +0200 aw r271275 : #i99385# state commit after all implementations are done
2009-04-27 15:25:19 +0200 aw r271274 : #i99385# state commit after all implementations are done
2009-04-27 15:24:00 +0200 aw r271272 : #i99385# state commit after all implementations are done
2009-03-19 17:12:00 +0100 aw r269757 : #i100360# corrected bitmap's PefSize calculation for bitmap filled objects when Bitmap is Pixel-based on it's mapping
2009-02-19 17:09:47 +0100 aw r268298 : #i98917# corrected attributes
2009-02-19 17:09:30 +0100 aw r268297 : #i98917# corrected attributes
2009-02-19 17:08:22 +0100 aw r268296 : #i98917# corrected attributes
2009-02-19 11:56:25 +0100 aw r268268 : #i98870# added extra code to react on PageNumber change
2009-02-18 16:57:24 +0100 aw r268243 : #i98917# in OverlayHatchRect::getGeometry the rotation was not applied to the TopLeft of the centered rectangle, but to the already extended one, thus the visualisation was rotating around the wrong edge
2009-07-02 14:28:15 +00:00
|
|
|
if( pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE ) &&
|
2003-11-24 15:03:25 +00:00
|
|
|
pObj->ISA(SwVirtFlyDrawObj) )
|
2000-09-18 23:08:29 +00:00
|
|
|
{
|
|
|
|
SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
|
|
|
|
rRect = pFly->Frm();
|
|
|
|
|
2012-01-17 20:39:02 +01:00
|
|
|
// Target and source should not be equal and the list
|
|
|
|
// should not be cyclic
|
2000-09-18 23:08:29 +00:00
|
|
|
SwFrmFmt *pFmt = pFly->GetFmt();
|
2014-03-28 13:14:58 +00:00
|
|
|
nRet = GetDoc()->Chainable(rSource, *pFmt);
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
pDView->SetHitTolerancePixel( nOld );
|
|
|
|
}
|
2014-03-28 13:14:58 +00:00
|
|
|
return nRet;
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
2002-08-09 07:54:15 +00:00
|
|
|
|
|
|
|
int SwFEShell::Chain( SwFrmFmt &rSource, const SwFrmFmt &rDest )
|
|
|
|
{
|
|
|
|
return GetDoc()->Chain(rSource, rDest);
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
|
|
|
int SwFEShell::Chain( SwFrmFmt &rSource, const Point &rPt )
|
|
|
|
{
|
|
|
|
SwRect aDummy;
|
|
|
|
int nErr = Chainable( aDummy, rSource, rPt );
|
|
|
|
if ( !nErr )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
SdrObject* pObj;
|
|
|
|
SdrPageView* pPView;
|
|
|
|
SwDrawView *pDView = (SwDrawView*)Imp()->GetDrawView();
|
2011-01-17 15:06:54 +01:00
|
|
|
const sal_uInt16 nOld = pDView->GetHitTolerancePixel();
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->SetHitTolerancePixel( 0 );
|
CWS-TOOLING: integrate CWS aw065
2009-06-17 13:48:12 +0200 aw r273068 : #99385# corrected small error in SCs selection visualisation
2009-06-16 15:45:28 +0200 wg r273021 : i102838
2009-06-16 12:46:07 +0200 wg r273016 : i102833
2009-06-11 17:40:29 +0200 aw r272895 : #i98870# added implementation for getPageCount helper
2009-06-11 16:39:54 +0200 aw r272885 : #i102663#, #i102667#, #i98870# incluide file typo corrected
2009-06-11 16:24:07 +0200 aw r272881 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-11 16:23:52 +0200 aw r272880 : #i102663#, #i102667#, #i98870# changes to SdrText, it's usage in SdrTextPrimitive2D and to OverlayObject base implementation. Also support for PageCountField added
2009-06-09 13:50:29 +0200 aw r272769 : #i98917# added support for the OverlayHatchRectanglePrimitive to follow rotation with it's hatch; simplified OverlayHatchRect
2009-06-09 13:04:06 +0200 aw r272766 : #i98870# re-added PageNumber identification in SdrTextPrimitive2D::get2DDecomposition
2009-06-08 18:56:05 +0200 aw r272744 : #i99385# added some last corrections to OverlayObjects in SD (had to do some merges on resync, needed to optically check and correct)
2009-06-08 11:17:57 +0200 aw r272725 : cws aw065: corrections after resync
2009-06-08 11:02:25 +0200 aw r272723 : cws aw065: corrections after resync
2009-06-08 10:36:22 +0200 aw r272722 : cws aw065: corrections after resync
2009-06-05 18:57:06 +0200 aw r272712 : CWS-TOOLING: rebase CWS aw065 to trunk@272291 (milestone: DEV300:m49)
2009-06-05 14:56:34 +0200 aw r272690 : #i89784# stripped old stuff no longer needed due to text-to-polygon conversion using primitives
2009-06-05 14:50:07 +0200 aw r272688 : #102091# removed on-model-lock suppression for SdrObject::ActionChanged()
2009-06-05 14:47:29 +0200 aw r272687 : #102091# corrected local value buffering in ScenePrimitive2D::get2DDecomposition
2009-06-03 17:53:32 +0200 aw r272599 : #i89784# version before stripping
2009-06-03 17:52:18 +0200 aw r272598 : #i89784# version before stripping
2009-05-28 17:15:47 +0200 aw r272420 : #i101872# old stuff removed/stripped
2009-05-28 17:15:32 +0200 aw r272419 : #i101872# old stuff removed/stripped
2009-05-28 17:15:15 +0200 aw r272418 : #i101872# old stuff removed/stripped
2009-05-28 17:14:45 +0200 aw r272417 : #i101872# old stuff removed/stripped
2009-05-28 12:13:56 +0200 aw r272396 : #i101872# stable hybrid state
2009-05-28 12:13:46 +0200 aw r272395 : #i101872# stable hybrid state
2009-05-28 12:13:35 +0200 aw r272394 : #i101872# stable hybrid state
2009-05-28 12:13:20 +0200 aw r272393 : #i101872# stable hybrid state
2009-05-28 12:13:05 +0200 aw r272392 : #i101872# stable hybrid state
2009-05-28 12:12:51 +0200 aw r272391 : #i101872# stable hybrid state
2009-05-15 16:56:02 +0200 aw r271952 : #i101872# HitTest unifications
2009-05-15 16:55:22 +0200 aw r271951 : #i101872# HitTest unifications
2009-05-15 16:55:12 +0200 aw r271950 : #i101872# HitTest unifications
2009-05-15 16:55:01 +0200 aw r271949 : #i101872# HitTest unifications
2009-05-15 16:54:51 +0200 aw r271948 : #i101872# HitTest unifications
2009-05-15 16:54:35 +0200 aw r271947 : #i101872# HitTest unifications
2009-05-15 16:54:22 +0200 aw r271946 : #i101872# HitTest unifications
2009-05-12 19:08:38 +0200 aw r271834 : #i101684# corrected AutoShape's preparation of text transformation due to different definitions in TextBounds
2009-05-12 15:44:49 +0200 aw r271827 : #i89784# expanded TextLayouterDevice::getTextOutlines() to support DXArray and X-Font scaling
2009-05-11 19:40:40 +0200 aw r271790 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:25 +0200 aw r271789 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 19:40:12 +0200 aw r271788 : #i99385# extended HitTest primitive usage, removed IsHdlHit implementations; prepared further HitTest simplifications
2009-05-11 13:01:53 +0200 aw r271765 : #i99385# corrections and optimizations
2009-05-08 14:48:40 +0200 aw r271718 : #i1016180# added optimizations in model operations when model is locked
2009-05-08 14:11:45 +0200 aw r271716 : #i101679# added flush() calls to OverlayManager when interaction step is prepared
2009-05-07 17:44:03 +0200 aw r271689 : #i99385# last corrections/changes
2009-05-07 17:43:47 +0200 aw r271688 : #i99385# last corrections/changes
2009-05-07 13:20:09 +0200 aw r271654 : #i99385# added changes from WFH
2009-05-07 13:19:38 +0200 aw r271653 : #i99385# added changes from WFH
2009-05-07 13:19:11 +0200 aw r271652 : #i99385# added changes from WFH
2009-05-07 11:33:17 +0200 aw r271643 : #i99385# corrections after resync
2009-05-07 11:17:31 +0200 aw r271642 : #i99385# corrections after resync
2009-05-06 18:46:53 +0200 aw r271609 : CWS-TOOLING: rebase CWS aw065 to trunk@271427 (milestone: DEV300:m47)
2009-05-05 18:24:03 +0200 aw r271548 : #i101443# force new text decomposition when TextBackgroundColor has changed
2009-05-05 17:44:42 +0200 aw r271542 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:32 +0200 aw r271541 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:20 +0200 aw r271540 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 17:44:09 +0200 aw r271539 : #i99385# 3rd round, simplifications and corrections done
2009-05-05 15:48:38 +0200 aw r271527 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:15 +0200 aw r271526 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:48:03 +0200 aw r271525 : #i99385# 2nd round, usages checked and corrected
2009-05-05 15:47:51 +0200 aw r271524 : #i99385# 2nd round, usages checked and corrected
2009-04-27 18:33:10 +0200 aw r271300 : #i99385# state commit after all implementations are done
2009-04-27 15:36:53 +0200 aw r271283 : #i99385# state commit after all implementations are done
2009-04-27 15:27:49 +0200 aw r271280 : #i99385# state commit after all implementations are done
2009-04-27 15:27:33 +0200 aw r271279 : #i99385# state commit after all implementations are done
2009-04-27 15:27:00 +0200 aw r271278 : #i99385# state commit after all implementations are done
2009-04-27 15:26:15 +0200 aw r271277 : #i99385# state commit after all implementations are done
2009-04-27 15:25:40 +0200 aw r271275 : #i99385# state commit after all implementations are done
2009-04-27 15:25:19 +0200 aw r271274 : #i99385# state commit after all implementations are done
2009-04-27 15:24:00 +0200 aw r271272 : #i99385# state commit after all implementations are done
2009-03-19 17:12:00 +0100 aw r269757 : #i100360# corrected bitmap's PefSize calculation for bitmap filled objects when Bitmap is Pixel-based on it's mapping
2009-02-19 17:09:47 +0100 aw r268298 : #i98917# corrected attributes
2009-02-19 17:09:30 +0100 aw r268297 : #i98917# corrected attributes
2009-02-19 17:08:22 +0100 aw r268296 : #i98917# corrected attributes
2009-02-19 11:56:25 +0100 aw r268268 : #i98870# added extra code to react on PageNumber change
2009-02-18 16:57:24 +0100 aw r268243 : #i98917# in OverlayHatchRect::getGeometry the rotation was not applied to the TopLeft of the centered rectangle, but to the already extended one, thus the visualisation was rotating around the wrong edge
2009-07-02 14:28:15 +00:00
|
|
|
pDView->PickObj( rPt, pDView->getHitTolLog(), pObj, pPView, SDRSEARCH_PICKMARKABLE );
|
2000-09-18 23:08:29 +00:00
|
|
|
pDView->SetHitTolerancePixel( nOld );
|
|
|
|
SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
|
|
|
|
|
|
|
|
SwFlyFrmFmt *pFmt = (SwFlyFrmFmt*)pFly->GetFmt();
|
|
|
|
GetDoc()->Chain(rSource, *pFmt);
|
|
|
|
EndAllAction();
|
|
|
|
SetChainMarker();
|
|
|
|
}
|
|
|
|
return nErr;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::Unchain( SwFrmFmt &rFmt )
|
|
|
|
{
|
|
|
|
StartAllAction();
|
|
|
|
GetDoc()->Unchain(rFmt);
|
|
|
|
EndAllAction();
|
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::HideChainMarker()
|
|
|
|
{
|
|
|
|
if ( pChainFrom )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
|
|
|
delete pChainFrom;
|
|
|
|
pChainFrom = 0L;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( pChainTo )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
|
|
|
delete pChainTo;
|
|
|
|
pChainTo = 0L;
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void SwFEShell::SetChainMarker()
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bDelFrom = true,
|
|
|
|
bDelTo = true;
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( IsFrmSelected() )
|
|
|
|
{
|
|
|
|
SwFlyFrm *pFly = FindFlyFrm();
|
|
|
|
|
|
|
|
if ( pFly->GetPrevLink() )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bDelFrom = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwFrm *pPre = pFly->GetPrevLink();
|
2006-11-14 14:09:49 +00:00
|
|
|
|
|
|
|
Point aStart( pPre->Frm().Right(), pPre->Frm().Bottom());
|
|
|
|
Point aEnd(pFly->Frm().Pos());
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( !pChainFrom )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
|
|
|
pChainFrom = new SdrDropMarkerOverlay( *GetDrawView(), aStart, aEnd );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
if ( pFly->GetNextLink() )
|
|
|
|
{
|
2012-11-24 09:06:58 +09:00
|
|
|
bDelTo = false;
|
2000-09-18 23:08:29 +00:00
|
|
|
const SwFlyFrm *pNxt = pFly->GetNextLink();
|
2006-11-14 14:09:49 +00:00
|
|
|
|
|
|
|
Point aStart( pFly->Frm().Right(), pFly->Frm().Bottom());
|
|
|
|
Point aEnd(pNxt->Frm().Pos());
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( !pChainTo )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
|
|
|
pChainTo = new SdrDropMarkerOverlay( *GetDrawView(), aStart, aEnd );
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
}
|
2006-11-14 14:09:49 +00:00
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( bDelFrom )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
delete pChainFrom, pChainFrom = 0;
|
2006-11-14 14:09:49 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 23:08:29 +00:00
|
|
|
if ( bDelTo )
|
2006-11-14 14:09:49 +00:00
|
|
|
{
|
2000-09-18 23:08:29 +00:00
|
|
|
delete pChainTo, pChainTo = 0;
|
2006-11-14 14:09:49 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
long SwFEShell::GetSectionWidth( SwFmt& rFmt ) const
|
|
|
|
{
|
|
|
|
SwFrm *pFrm = GetCurrFrm();
|
2012-01-17 20:39:02 +01:00
|
|
|
// Is the cursor at this moment in a SectionFrm?
|
2000-09-18 23:08:29 +00:00
|
|
|
if( pFrm && pFrm->IsInSct() )
|
|
|
|
{
|
|
|
|
SwSectionFrm* pSect = pFrm->FindSctFrm();
|
|
|
|
do
|
|
|
|
{
|
2012-01-17 20:39:02 +01:00
|
|
|
// Is it the right one?
|
2010-12-17 09:02:23 +01:00
|
|
|
if( pSect->KnowsFormat( rFmt ) )
|
2000-09-18 23:08:29 +00:00
|
|
|
return pSect->Frm().Width();
|
2012-01-17 20:39:02 +01:00
|
|
|
// for nested areas
|
2000-09-18 23:08:29 +00:00
|
|
|
pSect = pSect->GetUpper()->FindSctFrm();
|
|
|
|
}
|
|
|
|
while( pSect );
|
|
|
|
}
|
2010-12-17 09:02:23 +01:00
|
|
|
SwIterator<SwSectionFrm,SwFmt> aIter( rFmt );
|
2011-05-13 16:00:26 +02:00
|
|
|
for ( SwSectionFrm* pSct = aIter.First(); pSct; pSct = aIter.Next() )
|
|
|
|
{
|
|
|
|
if( !pSct->IsFollow() )
|
|
|
|
{
|
|
|
|
return pSct->Frm().Width();
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2002-06-24 13:53:54 +00:00
|
|
|
|
2011-03-14 16:51:14 +00:00
|
|
|
void SwFEShell::CreateDefaultShape( sal_uInt16 /*SdrObjKind ?*/ eSdrObjectKind, const Rectangle& rRect,
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nSlotId)
|
2002-06-24 13:53:54 +00:00
|
|
|
{
|
|
|
|
SdrView* pDrawView = GetDrawView();
|
|
|
|
SdrModel* pDrawModel = pDrawView->GetModel();
|
|
|
|
SdrObject* pObj = SdrObjFactory::MakeNewObject(
|
|
|
|
SdrInventor, eSdrObjectKind,
|
|
|
|
0L, pDrawModel);
|
|
|
|
|
|
|
|
if(pObj)
|
|
|
|
{
|
|
|
|
Rectangle aRect(rRect);
|
|
|
|
if(OBJ_CARC == eSdrObjectKind || OBJ_CCUT == eSdrObjectKind)
|
|
|
|
{
|
|
|
|
// force quadratic
|
|
|
|
if(aRect.GetWidth() > aRect.GetHeight())
|
|
|
|
{
|
|
|
|
aRect = Rectangle(
|
|
|
|
Point(aRect.Left() + ((aRect.GetWidth() - aRect.GetHeight()) / 2), aRect.Top()),
|
|
|
|
Size(aRect.GetHeight(), aRect.GetHeight()));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aRect = Rectangle(
|
|
|
|
Point(aRect.Left(), aRect.Top() + ((aRect.GetHeight() - aRect.GetWidth()) / 2)),
|
|
|
|
Size(aRect.GetWidth(), aRect.GetWidth()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pObj->SetLogicRect(aRect);
|
|
|
|
|
|
|
|
if(pObj->ISA(SdrCircObj))
|
|
|
|
{
|
|
|
|
SfxItemSet aAttr(pDrawModel->GetItemPool());
|
|
|
|
aAttr.Put(SdrCircStartAngleItem(9000));
|
|
|
|
aAttr.Put(SdrCircEndAngleItem(0));
|
2003-11-24 15:03:25 +00:00
|
|
|
pObj->SetMergedItemSet(aAttr);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
else if(pObj->ISA(SdrPathObj))
|
|
|
|
{
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPolyPolygon aPoly;
|
2002-06-24 13:53:54 +00:00
|
|
|
|
|
|
|
switch(eSdrObjectKind)
|
|
|
|
{
|
|
|
|
case OBJ_PATHLINE:
|
|
|
|
{
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPolygon aInnerPoly;
|
|
|
|
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Bottom()));
|
|
|
|
|
2013-05-17 09:17:02 +02:00
|
|
|
const basegfx::B2DPoint aCenterBottom(aRect.Center().getX(), aRect.Bottom());
|
2007-07-18 09:48:48 +00:00
|
|
|
aInnerPoly.appendBezierSegment(
|
|
|
|
aCenterBottom,
|
|
|
|
aCenterBottom,
|
2013-05-17 09:17:02 +02:00
|
|
|
basegfx::B2DPoint(aRect.Center().getX(), aRect.Center().getY()));
|
2007-07-18 09:48:48 +00:00
|
|
|
|
2013-05-17 09:17:02 +02:00
|
|
|
const basegfx::B2DPoint aCenterTop(aRect.Center().getX(), aRect.Top());
|
2007-07-18 09:48:48 +00:00
|
|
|
aInnerPoly.appendBezierSegment(
|
|
|
|
aCenterTop,
|
|
|
|
aCenterTop,
|
|
|
|
basegfx::B2DPoint(aRect.Right(), aRect.Top()));
|
|
|
|
|
2006-11-14 14:09:49 +00:00
|
|
|
aInnerPoly.setClosed(true);
|
|
|
|
aPoly.append(aInnerPoly);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJ_FREELINE:
|
|
|
|
{
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPolygon aInnerPoly;
|
|
|
|
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Bottom()));
|
|
|
|
|
|
|
|
aInnerPoly.appendBezierSegment(
|
|
|
|
basegfx::B2DPoint(aRect.Left(), aRect.Top()),
|
2013-05-17 09:17:02 +02:00
|
|
|
basegfx::B2DPoint(aRect.Center().getX(), aRect.Top()),
|
|
|
|
basegfx::B2DPoint(aRect.Center().getX(), aRect.Center().getY()));
|
2007-07-18 09:48:48 +00:00
|
|
|
|
|
|
|
aInnerPoly.appendBezierSegment(
|
2013-05-17 09:17:02 +02:00
|
|
|
basegfx::B2DPoint(aRect.Center().getX(), aRect.Bottom()),
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPoint(aRect.Right(), aRect.Bottom()),
|
|
|
|
basegfx::B2DPoint(aRect.Right(), aRect.Top()));
|
|
|
|
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Right(), aRect.Bottom()));
|
2006-11-14 14:09:49 +00:00
|
|
|
aInnerPoly.setClosed(true);
|
|
|
|
aPoly.append(aInnerPoly);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJ_POLY:
|
|
|
|
case OBJ_PLIN:
|
|
|
|
{
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPolygon aInnerPoly;
|
2002-06-24 13:53:54 +00:00
|
|
|
sal_Int32 nWdt(aRect.GetWidth());
|
|
|
|
sal_Int32 nHgt(aRect.GetHeight());
|
|
|
|
|
2007-07-18 09:48:48 +00:00
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Bottom()));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left() + (nWdt * 30) / 100, aRect.Top() + (nHgt * 70) / 100));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left(), aRect.Top() + (nHgt * 15) / 100));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left() + (nWdt * 65) / 100, aRect.Top()));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left() + nWdt, aRect.Top() + (nHgt * 30) / 100));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left() + (nWdt * 80) / 100, aRect.Top() + (nHgt * 50) / 100));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Left() + (nWdt * 80) / 100, aRect.Top() + (nHgt * 75) / 100));
|
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Bottom(), aRect.Right()));
|
2002-06-24 13:53:54 +00:00
|
|
|
|
|
|
|
if(OBJ_PLIN == eSdrObjectKind)
|
|
|
|
{
|
2013-05-17 09:17:02 +02:00
|
|
|
aInnerPoly.append(basegfx::B2DPoint(aRect.Center().getX(), aRect.Bottom()));
|
2006-11-14 14:09:49 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aInnerPoly.setClosed(true);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2006-11-14 14:09:49 +00:00
|
|
|
aPoly.append(aInnerPoly);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJ_LINE :
|
|
|
|
{
|
|
|
|
sal_Int32 nYMiddle((aRect.Top() + aRect.Bottom()) / 2);
|
2007-07-18 09:48:48 +00:00
|
|
|
basegfx::B2DPolygon aTempPoly;
|
2013-05-17 09:17:02 +02:00
|
|
|
aTempPoly.append(basegfx::B2DPoint(aRect.TopLeft().getX(), nYMiddle));
|
|
|
|
aTempPoly.append(basegfx::B2DPoint(aRect.BottomRight().getX(), nYMiddle));
|
2006-11-14 14:09:49 +00:00
|
|
|
aPoly.append(aTempPoly);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
((SdrPathObj*)pObj)->SetPathPoly(aPoly);
|
|
|
|
}
|
|
|
|
else if(pObj->ISA(SdrCaptionObj))
|
|
|
|
{
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bVerticalText = ( SID_DRAW_TEXT_VERTICAL == nSlotId ||
|
2002-06-24 13:53:54 +00:00
|
|
|
SID_DRAW_CAPTION_VERTICAL == nSlotId );
|
|
|
|
((SdrTextObj*)pObj)->SetVerticalWriting(bVerticalText);
|
|
|
|
if(bVerticalText)
|
|
|
|
{
|
2003-11-24 15:03:25 +00:00
|
|
|
SfxItemSet aSet(pObj->GetMergedItemSet());
|
2002-06-24 13:53:54 +00:00
|
|
|
aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER));
|
|
|
|
aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
|
2003-11-24 15:03:25 +00:00
|
|
|
pObj->SetMergedItemSet(aSet);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
2000-09-18 23:08:29 +00:00
|
|
|
|
2002-06-24 13:53:54 +00:00
|
|
|
((SdrCaptionObj*)pObj)->SetLogicRect(aRect);
|
|
|
|
((SdrCaptionObj*)pObj)->SetTailPos(
|
|
|
|
aRect.TopLeft() - Point(aRect.GetWidth() / 2, aRect.GetHeight() / 2));
|
|
|
|
}
|
|
|
|
else if(pObj->ISA(SdrTextObj))
|
|
|
|
{
|
|
|
|
SdrTextObj* pText = (SdrTextObj*)pObj;
|
|
|
|
pText->SetLogicRect(aRect);
|
|
|
|
|
2014-04-25 14:00:35 +02:00
|
|
|
bool bVertical = (SID_DRAW_TEXT_VERTICAL == nSlotId);
|
2012-11-24 09:06:58 +09:00
|
|
|
bool bMarquee = (SID_DRAW_TEXT_MARQUEE == nSlotId);
|
2002-06-24 13:53:54 +00:00
|
|
|
|
|
|
|
pText->SetVerticalWriting(bVertical);
|
|
|
|
|
|
|
|
if(bVertical)
|
|
|
|
{
|
|
|
|
SfxItemSet aSet(pDrawModel->GetItemPool());
|
2014-03-06 14:38:36 +02:00
|
|
|
aSet.Put(SdrTextAutoGrowWidthItem(true));
|
|
|
|
aSet.Put(SdrTextAutoGrowHeightItem(false));
|
2002-06-24 13:53:54 +00:00
|
|
|
aSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_TOP));
|
|
|
|
aSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT));
|
2003-11-24 15:03:25 +00:00
|
|
|
pText->SetMergedItemSet(aSet);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(bMarquee)
|
|
|
|
{
|
|
|
|
SfxItemSet aSet(pDrawModel->GetItemPool(), SDRATTR_MISC_FIRST, SDRATTR_MISC_LAST);
|
2014-03-06 14:38:36 +02:00
|
|
|
aSet.Put( SdrTextAutoGrowWidthItem( false ) );
|
|
|
|
aSet.Put( SdrTextAutoGrowHeightItem( false ) );
|
2002-06-24 13:53:54 +00:00
|
|
|
aSet.Put( SdrTextAniKindItem( SDRTEXTANI_SLIDE ) );
|
|
|
|
aSet.Put( SdrTextAniDirectionItem( SDRTEXTANI_LEFT ) );
|
|
|
|
aSet.Put( SdrTextAniCountItem( 1 ) );
|
2011-01-17 15:06:54 +01:00
|
|
|
aSet.Put( SdrTextAniAmountItem( (sal_Int16)GetWin()->PixelToLogic(Size(2,1)).Width()) );
|
2003-11-24 15:03:25 +00:00
|
|
|
pObj->SetMergedItemSetAndBroadcast(aSet);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
}
|
2006-11-14 14:09:49 +00:00
|
|
|
SdrPageView* pPageView = pDrawView->GetSdrPageView();
|
|
|
|
pDrawView->InsertObjectAtView(pObj, *pPageView);
|
2002-06-24 13:53:54 +00:00
|
|
|
}
|
|
|
|
ImpEndCreate();
|
|
|
|
}
|
2002-09-03 07:15:48 +00:00
|
|
|
|
|
|
|
/** SwFEShell::GetShapeBackgrd
|
|
|
|
method determines background color of the page the selected drawing
|
|
|
|
object is on and returns this color.
|
|
|
|
If no color is found, because no drawing object is selected or ...,
|
|
|
|
color COL_BLACK (default color on constructing object of class Color)
|
|
|
|
is returned.
|
|
|
|
|
|
|
|
@returns an object of class Color
|
|
|
|
*/
|
|
|
|
const Color SwFEShell::GetShapeBackgrd() const
|
|
|
|
{
|
|
|
|
Color aRetColor;
|
|
|
|
|
|
|
|
// check, if a draw view exists
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->GetDrawView(), "wrong usage of SwFEShell::GetShapeBackgrd - no draw view!");
|
2002-09-03 07:15:48 +00:00
|
|
|
if( Imp()->GetDrawView() )
|
|
|
|
{
|
|
|
|
// determine list of selected objects
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList* pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
|
2002-09-03 07:15:48 +00:00
|
|
|
// check, if exactly one object is selected.
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pMrkList->GetMarkCount() == 1, "wrong usage of SwFEShell::GetShapeBackgrd - no selected object!");
|
2002-09-03 07:15:48 +00:00
|
|
|
if ( pMrkList->GetMarkCount() == 1)
|
|
|
|
{
|
|
|
|
// get selected object
|
2006-07-25 11:33:25 +00:00
|
|
|
const SdrObject *pSdrObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
|
2002-09-03 07:15:48 +00:00
|
|
|
// check, if selected object is a shape (drawing object)
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( !pSdrObj->ISA(SwVirtFlyDrawObj), "wrong usage of SwFEShell::GetShapeBackgrd - selected object is not a drawing object!");
|
2003-11-24 15:03:25 +00:00
|
|
|
if ( !pSdrObj->ISA(SwVirtFlyDrawObj) )
|
2002-09-03 07:15:48 +00:00
|
|
|
{
|
|
|
|
// determine page frame of the frame the shape is anchored.
|
|
|
|
const SwFrm* pAnchorFrm =
|
2004-06-28 12:34:54 +00:00
|
|
|
static_cast<SwDrawContact*>(GetUserCall(pSdrObj))->GetAnchorFrm( pSdrObj );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pAnchorFrm, "inconsistent modell - no anchor at shape!");
|
2002-09-03 07:15:48 +00:00
|
|
|
if ( pAnchorFrm )
|
|
|
|
{
|
|
|
|
const SwPageFrm* pPageFrm = pAnchorFrm->FindPageFrm();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pPageFrm, "inconsistent modell - no page!");
|
2002-09-03 07:15:48 +00:00
|
|
|
if ( pPageFrm )
|
|
|
|
{
|
|
|
|
aRetColor = pPageFrm->GetDrawBackgrdColor();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRetColor;
|
|
|
|
}
|
2002-12-10 13:12:18 +00:00
|
|
|
|
|
|
|
/** Is default horizontal text direction for selected drawing object right-to-left
|
|
|
|
Because drawing objects only painted for each page only, the default
|
|
|
|
horizontal text direction of a drawing object is given by the corresponding
|
|
|
|
page property.
|
|
|
|
|
|
|
|
@returns boolean, indicating, if the horizontal text direction of the
|
|
|
|
page, the selected drawing object is on, is right-to-left.
|
|
|
|
*/
|
2008-10-10 13:02:43 +00:00
|
|
|
bool SwFEShell::IsShapeDefaultHoriTextDirR2L() const
|
2002-12-10 13:12:18 +00:00
|
|
|
{
|
|
|
|
bool bRet = false;
|
|
|
|
|
|
|
|
// check, if a draw view exists
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( Imp()->GetDrawView(), "wrong usage of SwFEShell::GetShapeBackgrd - no draw view!");
|
2002-12-10 13:12:18 +00:00
|
|
|
if( Imp()->GetDrawView() )
|
|
|
|
{
|
|
|
|
// determine list of selected objects
|
2004-07-12 14:47:48 +00:00
|
|
|
const SdrMarkList* pMrkList = &Imp()->GetDrawView()->GetMarkedObjectList();
|
2002-12-10 13:12:18 +00:00
|
|
|
// check, if exactly one object is selected.
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pMrkList->GetMarkCount() == 1, "wrong usage of SwFEShell::GetShapeBackgrd - no selected object!");
|
2002-12-10 13:12:18 +00:00
|
|
|
if ( pMrkList->GetMarkCount() == 1)
|
|
|
|
{
|
|
|
|
// get selected object
|
2006-07-25 11:33:25 +00:00
|
|
|
const SdrObject *pSdrObj = pMrkList->GetMark( 0 )->GetMarkedSdrObj();
|
2002-12-10 13:12:18 +00:00
|
|
|
// check, if selected object is a shape (drawing object)
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( !pSdrObj->ISA(SwVirtFlyDrawObj), "wrong usage of SwFEShell::GetShapeBackgrd - selected object is not a drawing object!");
|
2003-11-24 15:03:25 +00:00
|
|
|
if ( !pSdrObj->ISA(SwVirtFlyDrawObj) )
|
2002-12-10 13:12:18 +00:00
|
|
|
{
|
|
|
|
// determine page frame of the frame the shape is anchored.
|
|
|
|
const SwFrm* pAnchorFrm =
|
2004-06-28 12:34:54 +00:00
|
|
|
static_cast<SwDrawContact*>(GetUserCall(pSdrObj))->GetAnchorFrm( pSdrObj );
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pAnchorFrm, "inconsistent modell - no anchor at shape!");
|
2002-12-10 13:12:18 +00:00
|
|
|
if ( pAnchorFrm )
|
|
|
|
{
|
|
|
|
const SwPageFrm* pPageFrm = pAnchorFrm->FindPageFrm();
|
2010-11-25 17:08:45 +01:00
|
|
|
OSL_ENSURE( pPageFrm, "inconsistent modell - no page!");
|
2002-12-10 13:12:18 +00:00
|
|
|
if ( pPageFrm )
|
|
|
|
{
|
2014-05-02 15:42:25 +02:00
|
|
|
bRet = pPageFrm->IsRightToLeft();
|
2002-12-10 13:12:18 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return bRet;
|
|
|
|
}
|
2003-04-04 17:11:30 +00:00
|
|
|
|
|
|
|
Point SwFEShell::GetRelativePagePosition(const Point& rDocPos)
|
|
|
|
{
|
|
|
|
Point aRet(-1, -1);
|
|
|
|
const SwFrm *pPage = GetLayout()->Lower();
|
|
|
|
while ( pPage && !pPage->Frm().IsInside( rDocPos ) )
|
|
|
|
{
|
|
|
|
pPage = pPage->GetNext();
|
|
|
|
}
|
|
|
|
if(pPage)
|
|
|
|
{
|
|
|
|
aRet = rDocPos - pPage->Frm().TopLeft();
|
|
|
|
}
|
|
|
|
return aRet;
|
|
|
|
}
|
|
|
|
|
2010-10-14 08:30:41 +02:00
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|