blob: a8fe59cd7450c0b9614e8b45c5e7ebd7ed786f42 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "precompiled_sw.hxx"
#include <SidebarWin.hxx>
#include <SidebarWinAcc.hxx>
#include <PostItMgr.hxx>
#include <SidebarTxtControl.hxx>
#include <AnchorOverlayObject.hxx>
#include <ShadowOverlayObject.hxx>
#include <OverlayRanges.hxx>
#include <annotation.hrc>
#include <popup.hrc>
#include <docvw.hrc>
#include <app.hrc>
#include <access.hrc>
#include <viewopt.hxx>
#include <cmdid.h>
#include <editeng/fontitem.hxx>
#include <editeng/fhgtitem.hxx>
#include <editeng/langitem.hxx>
#include <editeng/editview.hxx>
#include <editeng/outliner.hxx>
#include <editeng/editeng.hxx>
#include <editeng/eeitem.hxx>
#include <svl/zforlist.hxx>
#include <svl/undo.hxx>
#include <svl/stritem.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/scrbar.hxx>
#include <vcl/svapp.hxx>
#include <vcl/menubtn.hxx>
#include <edtwin.hxx>
#include <view.hxx>
#include <docsh.hxx>
#include <wrtsh.hxx>
#include <doc.hxx>
#include <swmodule.hxx>
#include <langhelper.hxx>
#include <txtannotationfld.hxx>
#include <ndtxt.hxx>
#include <sw_primitivetypes2d.hxx>
#include <drawinglayer/primitive2d/primitivetools2d.hxx>
#include <drawinglayer/primitive2d/fillgradientprimitive2d.hxx>
#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
#include <drawinglayer/primitive2d/polygonprimitive2d.hxx>
#include <drawinglayer/primitive2d/shadowprimitive2d.hxx>
namespace css = ::com::sun::star;
namespace sw { namespace sidebarwindows {
#define METABUTTON_WIDTH 16
#define METABUTTON_HEIGHT 18
#define METABUTTON_AREA_WIDTH 30
#define POSTIT_META_HEIGHT (sal_Int32) 30
#define POSTIT_MINIMUMSIZE_WITHOUT_META 50
#define POSTIT_SHADOW_BRIGHT Color(180,180,180)
#define POSTIT_SHADOW_DARK Color(83,83,83)
#define EMPTYSTRING rtl::OUString::createFromAscii("")
/************** SwSidebarWin************************************/
SwSidebarWin::SwSidebarWin( SwEditWin& rEditWin,
WinBits nBits,
SwPostItMgr& aMgr,
SwPostItBits aBits,
SwSidebarItem& rSidebarItem )
: Window(&rEditWin, nBits)
, mrMgr(aMgr)
, mrView( rEditWin.GetView() )
, nFlags(aBits)
, mnEventId(0)
, mpOutlinerView(0)
, mpOutliner(0)
, mpSidebarTxtControl(0)
, mpVScrollbar(0)
, mpMetadataAuthor(0)
, mpMetadataDate(0)
, mpMenuButton(0)
, mpAnchor( NULL )
, mpShadow( NULL )
, mpTextRangeOverlay( NULL )
, mColorAnchor()
, mColorDark()
, mColorLight()
, mChangeColor()
, meSidebarPosition( sw::sidebarwindows::SIDEBAR_NONE )
, mPosSize()
, mAnchorRect()
, mPageBorder( 0 )
, mbMouseOver( false )
, mLayoutStatus( SwPostItHelper::INVISIBLE )
, mbReadonly( false )
, mbIsFollow( false )
, mrSidebarItem( rSidebarItem )
, mpAnchorFrm( rSidebarItem.maLayoutInfo.mpAnchorFrm )
{
mpShadow = ShadowOverlayObject::CreateShadowOverlayObject( mrView );
if ( mpShadow )
{
mpShadow->setVisible(false);
}
mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
mrSidebarItem.GetFmtFld(),
*this );
}
SwSidebarWin::~SwSidebarWin()
{
mrMgr.DisconnectSidebarWinFromFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
*this );
Disable();
if ( mpSidebarTxtControl )
{
if ( mpOutlinerView )
{
mpOutlinerView->SetWindow( 0 );
}
delete mpSidebarTxtControl;
mpSidebarTxtControl = 0;
}
if ( mpOutlinerView )
{
delete mpOutlinerView;
mpOutlinerView = 0;
}
if (mpOutliner)
{
delete mpOutliner;
mpOutliner = 0;
}
if (mpMetadataAuthor)
{
mpMetadataAuthor->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
delete mpMetadataAuthor;
mpMetadataAuthor = 0;
}
if (mpMetadataDate)
{
mpMetadataDate->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
delete mpMetadataDate;
mpMetadataDate = 0;
}
if (mpVScrollbar)
{
mpVScrollbar->RemoveEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
delete mpVScrollbar;
mpVScrollbar = 0;
}
AnchorOverlayObject::DestroyAnchorOverlayObject( mpAnchor );
mpAnchor = NULL;
ShadowOverlayObject::DestroyShadowOverlayObject( mpShadow );
mpShadow = NULL;
delete mpTextRangeOverlay;
mpTextRangeOverlay = NULL;
delete mpMenuButton;
mpMenuButton = 0;
if (mnEventId)
Application::RemoveUserEvent( mnEventId );
}
void SwSidebarWin::Paint( const Rectangle& rRect)
{
Window::Paint(rRect);
if (mpMetadataAuthor->IsVisible() )
{
//draw left over space
if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
{
SetFillColor(COL_BLACK);
}
else
{
SetFillColor(mColorDark);
}
SetLineColor();
DrawRect( PixelToLogic(
Rectangle( Point( mpMetadataAuthor->GetPosPixel().X() +
mpMetadataAuthor->GetSizePixel().Width(),
mpMetadataAuthor->GetPosPixel().Y() ),
Size( GetMetaButtonAreaWidth(),
mpMetadataAuthor->GetSizePixel().Height() +
mpMetadataDate->GetSizePixel().Height() ) ) ) );
}
}
void SwSidebarWin::SetPosSizePixelRect( long nX,
long nY,
long nWidth,
long nHeight,
const SwRect& aAnchorRect,
const long aPageBorder)
{
mPosSize = Rectangle(Point(nX,nY),Size(nWidth,nHeight));
mAnchorRect = aAnchorRect;
mPageBorder = aPageBorder;
}
void SwSidebarWin::SetSize( const Size& rNewSize )
{
mPosSize.SetSize(rNewSize);
}
void SwSidebarWin::SetVirtualPosSize( const Point& aPoint, const Size& aSize)
{
mPosSize = Rectangle(aPoint,aSize);
}
void SwSidebarWin::TranslateTopPosition(const long aAmount)
{
mPosSize.Move(0,aAmount);
}
void SwSidebarWin::ShowAnchorOnly(const Point &aPoint)
{
HideNote();
SetPosAndSize();
if (mpAnchor)
{
mpAnchor->SetSixthPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y()));
mpAnchor->SetSeventhPosition(basegfx::B2DPoint(aPoint.X(),aPoint.Y()));
mpAnchor->SetAnchorState(AS_ALL);
mpAnchor->setVisible(true);
}
if (mpShadow)
mpShadow->setVisible(false);
}
SfxItemSet SwSidebarWin::DefaultItem()
{
SfxItemSet aItem( mrView.GetDocShell()->GetPool() );
aItem.Put(SvxFontHeightItem(200,100,EE_CHAR_FONTHEIGHT));
aItem.Put(SvxFontItem(FAMILY_SWISS,GetSettings().GetStyleSettings().GetFieldFont().GetName(),
EMPTYSTRING,PITCH_DONTKNOW,RTL_TEXTENCODING_DONTKNOW,EE_CHAR_FONTINFO));
return aItem;
}
void SwSidebarWin::InitControls()
{
AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
// actual window which holds the user text
mpSidebarTxtControl = new SidebarTxtControl( *this,
WB_NODIALOGCONTROL,
mrView, mrMgr );
mpSidebarTxtControl->SetPointer(Pointer(POINTER_TEXT));
// window controls for author and date
mpMetadataAuthor = new Edit( this, 0 );
mpMetadataAuthor->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_AUTHOR_NAME ) );
mpMetadataAuthor->SetReadOnly();
mpMetadataAuthor->AlwaysDisableInput(true);
mpMetadataAuthor->SetCallHandlersOnInputDisabled(true);
mpMetadataAuthor->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
// we should leave this setting alone, but for this we need a better layout algo
// with variable meta size height
{
AllSettings aSettings = mpMetadataAuthor->GetSettings();
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
Font aFont = aStyleSettings.GetFieldFont();
aFont.SetHeight(8);
aStyleSettings.SetFieldFont(aFont);
aSettings.SetStyleSettings(aStyleSettings);
mpMetadataAuthor->SetSettings(aSettings);
}
mpMetadataDate = new Edit( this, 0 );
mpMetadataDate->SetAccessibleName( SW_RES( STR_ACCESS_ANNOTATION_DATE_NAME ) );
mpMetadataDate->SetReadOnly();
mpMetadataDate->AlwaysDisableInput(true);
mpMetadataDate->SetCallHandlersOnInputDisabled(true);
mpMetadataDate->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
// we should leave this setting alone, but for this we need a better layout algo
// with variable meta size height
{
AllSettings aSettings = mpMetadataDate->GetSettings();
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
Font aFont = aStyleSettings.GetFieldFont();
aFont.SetHeight(8);
aStyleSettings.SetFieldFont(aFont);
aSettings.SetStyleSettings(aStyleSettings);
mpMetadataDate->SetSettings(aSettings);
}
SwDocShell* aShell = mrView.GetDocShell();
mpOutliner = new Outliner(&aShell->GetPool(),OUTLINERMODE_TEXTOBJECT);
aShell->GetDoc()->SetCalcFieldValueHdl( mpOutliner );
mpOutliner->SetUpdateMode( sal_True );
Rescale();
mpOutlinerView = new OutlinerView ( mpOutliner, mpSidebarTxtControl );
mpOutlinerView->SetBackgroundColor(COL_TRANSPARENT);
mpOutliner->InsertView(mpOutlinerView );
mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) );
mpOutlinerView->SetAttribs(DefaultItem());
// TODO: ??
EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R;
mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir );
//create Scrollbars
mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
mpVScrollbar->EnableNativeWidget(false);
mpVScrollbar->EnableRTL( false );
mpVScrollbar->SetScrollHdl(LINK(this, SwSidebarWin, ScrollHdl));
mpVScrollbar->EnableDrag();
mpVScrollbar->AddEventListener( LINK( this, SwSidebarWin, WindowEventListener ) );
const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
sal_uLong nCntrl = mpOutliner->GetControlWord();
// TODO: crash when AUTOCOMPLETE enabled
nCntrl |= EE_CNTRL_MARKFIELDS | EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT | EV_CNTRL_AUTOSCROLL | EE_CNTRL_URLSFXEXECUTE; // | EE_CNTRL_AUTOCOMPLETE;
if (pVOpt->IsFieldShadings())
nCntrl |= EE_CNTRL_MARKFIELDS;
else
nCntrl &= ~EE_CNTRL_MARKFIELDS;
if (pVOpt->IsOnlineSpell())
nCntrl |= EE_CNTRL_ONLINESPELLING;
else
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
mpOutliner->SetControlWord(nCntrl);
sal_uInt16 aIndex = SW_MOD()->InsertRedlineAuthor(GetAuthor());
SetColor( mrMgr.GetColorDark(aIndex),
mrMgr.GetColorLight(aIndex),
mrMgr.GetColorAnchor(aIndex));
CheckMetaText();
mpMenuButton = CreateMenuButton();
SetLanguage(GetLanguage());
GetOutlinerView()->StartSpeller();
SetPostItText();
Engine()->CompleteOnlineSpelling();
mpSidebarTxtControl->Show();
mpMetadataAuthor->Show();
mpMetadataDate->Show();
mpVScrollbar->Show();
}
void SwSidebarWin::CheckMetaText()
{
const SvtSysLocale aSysLocale;
const LocaleDataWrapper& rLocalData = aSysLocale.GetLocaleData();
String sMeta = GetAuthor();
if (sMeta.Len() == 0)
{
sMeta = String(SW_RES(STR_NOAUTHOR));
}
else if (sMeta.Len() > 22)
{
sMeta.Erase(20);
sMeta = sMeta + rtl::OUString::createFromAscii("...");
}
if ( mpMetadataAuthor->GetText() != sMeta )
{
mpMetadataAuthor->SetText(sMeta);
}
Date aDate = GetDate();
if (aDate==Date())
{
sMeta = String(SW_RES(STR_POSTIT_TODAY));
}
else if (aDate == Date(Date()-1))
{
sMeta = String(SW_RES(STR_POSTIT_YESTERDAY));
}
else if (aDate.IsValid() )
{
sMeta = rLocalData.getDate(aDate);
}
else
{
sMeta = String(SW_RES(STR_NODATE));
}
if (GetTime()!=0)
{
sMeta = sMeta + rtl::OUString::createFromAscii(" ") + rLocalData.getTime( GetTime(),false );
}
if ( mpMetadataDate->GetText() != sMeta )
{
mpMetadataDate->SetText(sMeta);
}
}
void SwSidebarWin::Rescale()
{
MapMode aMode = GetParent()->GetMapMode();
aMode.SetOrigin( Point() );
mpOutliner->SetRefMapMode( aMode );
SetMapMode( aMode );
mpSidebarTxtControl->SetMapMode( aMode );
if ( mpMetadataAuthor )
{
Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() );
sal_Int32 nHeight = aFont.GetHeight();
nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
aFont.SetHeight( nHeight );
mpMetadataAuthor->SetControlFont( aFont );
}
if ( mpMetadataDate )
{
Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() );
sal_Int32 nHeight = aFont.GetHeight();
nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
aFont.SetHeight( nHeight );
mpMetadataDate->SetControlFont( aFont );
}
}
void SwSidebarWin::SetPosAndSize()
{
bool bChange = false;
if (GetSizePixel() != mPosSize.GetSize())
{
bChange = true;
SetSizePixel(mPosSize.GetSize());
DoResize();
}
if (GetPosPixel().X() != mPosSize.TopLeft().X() || (abs(GetPosPixel().Y() - mPosSize.TopLeft().Y()) > 5) )
{
bChange = true;
SetPosPixel(mPosSize.TopLeft());
Point aLineStart;
Point aLineEnd ;
switch ( meSidebarPosition )
{
case sw::sidebarwindows::SIDEBAR_LEFT:
{
aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) );
aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) );
}
break;
case sw::sidebarwindows::SIDEBAR_RIGHT:
{
aLineStart = EditWin()->PixelToLogic( Point(GetPosPixel().X(),GetPosPixel().Y()-1) );
aLineEnd = EditWin()->PixelToLogic( Point(GetPosPixel().X()+GetSizePixel().Width(),GetPosPixel().Y()-1) );
}
break;
default:
ASSERT( false,
"<SwSidebarWin::SetPosAndSize()> - unexpected position of sidebar" );
break;
}
if (!IsPreview())
{
if (mpAnchor)
{
mpAnchor->SetAllPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15),
basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15),
basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15),
basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15),
basegfx::B2DPoint( mPageBorder ,mAnchorRect.Bottom()+2*15),
basegfx::B2DPoint( aLineStart.X(),aLineStart.Y()),
basegfx::B2DPoint( aLineEnd.X(),aLineEnd.Y()));
mpAnchor->SetHeight(mAnchorRect.Height());
}
else
{
mpAnchor = AnchorOverlayObject::CreateAnchorOverlayObject( mrView,
mAnchorRect,
mPageBorder,
aLineStart,
aLineEnd,
mColorAnchor );
if ( mpAnchor )
{
mpAnchor->SetHeight(mAnchorRect.Height());
mpAnchor->setVisible(true);
mpAnchor->SetAnchorState(AS_TRI);
if (HasChildPathFocus())
{
mpAnchor->setLineSolid(true);
}
}
}
}
}
else
{
if ( mpAnchor &&
( mpAnchor->getBasePosition() != basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom()-5*15) ) )
{
mpAnchor->SetTriPosition( basegfx::B2DPoint( mAnchorRect.Left() , mAnchorRect.Bottom() - 5* 15),
basegfx::B2DPoint( mAnchorRect.Left()-5*15 , mAnchorRect.Bottom()+5*15),
basegfx::B2DPoint( mAnchorRect.Left()+5*15 , mAnchorRect.Bottom()+5*15),
basegfx::B2DPoint( mAnchorRect.Left(), mAnchorRect.Bottom()+2*15),
basegfx::B2DPoint( mPageBorder , mAnchorRect.Bottom()+2*15));
}
}
if (bChange)
{
Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height()));
Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height()));
mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y()));
}
if (mrMgr.ShowNotes())
{
if (IsFollow() && !HasChildPathFocus())
{
if ( mpAnchor )
{
mpAnchor->SetAnchorState(AS_END);
}
}
else
{
if ( mpAnchor )
{
mpAnchor->SetAnchorState(AS_ALL);
}
SwSidebarWin* pWin = GetTopReplyNote();
if ( pWin && pWin->Anchor() )
{
pWin->Anchor()->SetAnchorState(AS_END);
}
}
}
// text range overlay
if ( mrMgr.ShowNotes()
&& mrSidebarItem.maLayoutInfo.mnStartNodeIdx != 0
&& mrSidebarItem.maLayoutInfo.mnStartContent != STRING_NOTFOUND )
{
std::vector< basegfx::B2DRange > aAnnotationTextRanges;
{
const SwTxtAnnotationFld* pTxtAnnotationFld =
dynamic_cast< const SwTxtAnnotationFld* >( mrSidebarItem.GetFmtFld().GetTxtFld() );
if ( pTxtAnnotationFld != NULL
&& pTxtAnnotationFld->GetpTxtNode() != NULL )
{
SwTxtNode* pTxtNode = pTxtAnnotationFld->GetpTxtNode();
SwNodes& rNds = pTxtNode->GetDoc()->GetNodes();
SwCntntNode* const pCntntNd = rNds[mrSidebarItem.maLayoutInfo.mnStartNodeIdx]->GetCntntNode();
SwPosition aStartPos( *pCntntNd, mrSidebarItem.maLayoutInfo.mnStartContent );
SwShellCrsr* pTmpCrsr = NULL;
const bool bTableCrsrNeeded = pTxtNode->FindTableBoxStartNode() != pCntntNd->FindTableBoxStartNode();
if ( bTableCrsrNeeded )
{
SwShellTableCrsr* pTableCrsr = new SwShellTableCrsr( DocView().GetWrtShell(), aStartPos );
pTableCrsr->SetMark();
pTableCrsr->GetMark()->nNode = *pTxtNode;
pTableCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 );
pTableCrsr->NewTableSelection();
pTmpCrsr = pTableCrsr;
}
else
{
SwShellCrsr* pCrsr = new SwShellCrsr( DocView().GetWrtShell(), aStartPos );
pCrsr->SetMark();
pCrsr->GetMark()->nNode = *pTxtNode;
pCrsr->GetMark()->nContent.Assign( pTxtNode, *(pTxtAnnotationFld->GetStart())+1 );
pTmpCrsr = pCrsr;
}
::boost::scoped_ptr<SwShellCrsr> pTmpCrsrForAnnotationTextRange( pTmpCrsr );
pTmpCrsrForAnnotationTextRange->FillRects();
for( sal_uInt16 a(0); a < pTmpCrsrForAnnotationTextRange->Count(); ++a )
{
const SwRect aNextRect((*pTmpCrsrForAnnotationTextRange)[a]);
const Rectangle aPntRect(aNextRect.SVRect());
aAnnotationTextRanges.push_back(basegfx::B2DRange(
aPntRect.Left(), aPntRect.Top(),
aPntRect.Right() + 1, aPntRect.Bottom() + 1));
}
}
}
if ( mpTextRangeOverlay != NULL )
{
mpTextRangeOverlay->setRanges( aAnnotationTextRanges );
if ( mpAnchor != NULL && mpAnchor->getLineSolid() )
{
mpTextRangeOverlay->ShowSolidBorder();
}
else
{
mpTextRangeOverlay->HideSolidBorder();
}
}
else
{
mpTextRangeOverlay =
sw::overlay::OverlayRanges::CreateOverlayRange(
DocView(),
mColorAnchor,
aAnnotationTextRanges,
mpAnchor != NULL ? mpAnchor->getLineSolid() : false );
}
}
else
{
delete mpTextRangeOverlay;
mpTextRangeOverlay = NULL;
}
}
void SwSidebarWin::DoResize()
{
long aTextHeight = LogicToPixel( mpOutliner->CalcTextSize()).Height();
long aHeight = GetSizePixel().Height();
unsigned long aWidth = GetSizePixel().Width();
aHeight -= GetMetaHeight();
mpMetadataAuthor->Show();
mpMetadataDate->Show();
mpSidebarTxtControl->SetQuickHelpText(EMPTYSTRING);
if ((aTextHeight > aHeight) && !IsPreview())
{ // we need vertical scrollbars and have to reduce the width
aWidth -= GetScrollbarWidth();
mpVScrollbar->Show();
}
else
{
mpVScrollbar->Hide();
}
{
const Size aSizeOfMetadataControls( GetSizePixel().Width() - GetMetaButtonAreaWidth(),
GetMetaHeight()/2 );
mpMetadataAuthor->SetPosSizePixel( 0,
aHeight,
aSizeOfMetadataControls.Width(),
aSizeOfMetadataControls.Height() );
mpMetadataDate->SetPosSizePixel( 0,
aHeight + aSizeOfMetadataControls.Height(),
aSizeOfMetadataControls.Width(),
aSizeOfMetadataControls.Height() );
}
mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
if (!mpVScrollbar->IsVisible())
{ // if we do not have a scrollbar anymore, we want to see the complete text
mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
}
if (!Application::GetSettings().GetLayoutRTL())
{
mpSidebarTxtControl->SetPosSizePixel(0, 0, aWidth, aHeight);
mpVScrollbar->SetPosSizePixel( aWidth, 0, GetScrollbarWidth(), aHeight);
}
else
{
mpSidebarTxtControl->SetPosSizePixel( ( (aTextHeight > aHeight) && !IsPreview()
? GetScrollbarWidth() : 0 ) , 0,
aWidth, aHeight);
mpVScrollbar->SetPosSizePixel( 0, 0, GetScrollbarWidth(), aHeight);
}
mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() );
mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 );
mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 );
SetScrollbar();
mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight()));
//calculate rects for meta- button
const Fraction& fx( GetMapMode().GetScaleX() );
const Fraction& fy( GetMapMode().GetScaleY() );
const Point aPos( mpMetadataAuthor->GetPosPixel());
Rectangle aRectMetaButton;
if (IsPreview())
{
aRectMetaButton = PixelToLogic(
Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH*4+10)*fx.GetNumerator()/fx.GetDenominator(),
aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ),
Size( METABUTTON_WIDTH*4*fx.GetNumerator()/fx.GetDenominator(),
METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) );
}
else
{
aRectMetaButton = PixelToLogic(
Rectangle( Point( aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10)*fx.GetNumerator()/fx.GetDenominator(),
aPos.Y()+5*fy.GetNumerator()/fy.GetDenominator() ),
Size( METABUTTON_WIDTH*fx.GetNumerator()/fx.GetDenominator(),
METABUTTON_HEIGHT*fy.GetNumerator()/fy.GetDenominator() ) ) );
}
{
const Rectangle aRectMetaButtonPixel( LogicToPixel( aRectMetaButton ) );
mpMenuButton->SetPosSizePixel( aRectMetaButtonPixel.Left(),
aRectMetaButtonPixel.Top(),
aRectMetaButtonPixel.GetWidth(),
aRectMetaButtonPixel.GetHeight() );
}
}
void SwSidebarWin::SetSizePixel( const Size& rNewSize )
{
Window::SetSizePixel(rNewSize);
if (mpShadow)
{
Point aStart = EditWin()->PixelToLogic(GetPosPixel()+Point(0,GetSizePixel().Height()));
Point aEnd = EditWin()->PixelToLogic(GetPosPixel()+Point(GetSizePixel().Width()-1,GetSizePixel().Height()));
mpShadow->SetPosition(basegfx::B2DPoint(aStart.X(),aStart.Y()), basegfx::B2DPoint(aEnd.X(),aEnd.Y()));
}
}
void SwSidebarWin::SetScrollbar()
{
mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY());
}
void SwSidebarWin::ResizeIfNeccessary(long aOldHeight, long aNewHeight)
{
if (aOldHeight != aNewHeight)
{
//check for lower border or next note
long aBorder = mrMgr.GetNextBorder();
if (aBorder != -1)
{
if (aNewHeight > GetMinimumSizeWithoutMeta())
{
long aNewLowerValue = GetPosPixel().Y() + aNewHeight + GetMetaHeight();
if (aNewLowerValue < aBorder)
SetSizePixel(Size(GetSizePixel().Width(),aNewHeight+GetMetaHeight()));
else
SetSizePixel(Size(GetSizePixel().Width(),aBorder - GetPosPixel().Y()));
DoResize();
Invalidate();
}
else
{
if (GetSizePixel().Height() != GetMinimumSizeWithoutMeta() + GetMetaHeight())
SetSizePixel(Size(GetSizePixel().Width(),GetMinimumSizeWithoutMeta() + GetMetaHeight()));
DoResize();
Invalidate();
}
}
else
{
DoResize();
Invalidate();
}
}
else
{
SetScrollbar();
}
}
void SwSidebarWin::SetColor(Color aColorDark,Color aColorLight, Color aColorAnchor)
{
mColorDark = aColorDark;
mColorLight = aColorLight;
mColorAnchor = aColorAnchor;
if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
{
{
mpMetadataAuthor->SetControlBackground(mColorDark);
AllSettings aSettings = mpMetadataAuthor->GetSettings();
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
aStyleSettings.SetFieldTextColor(aColorAnchor);
aSettings.SetStyleSettings(aStyleSettings);
mpMetadataAuthor->SetSettings(aSettings);
}
{
mpMetadataDate->SetControlBackground(mColorDark);
AllSettings aSettings = mpMetadataDate->GetSettings();
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
aStyleSettings.SetFieldTextColor(aColorAnchor);
aSettings.SetStyleSettings(aStyleSettings);
mpMetadataDate->SetSettings(aSettings);
}
AllSettings aSettings2 = mpVScrollbar->GetSettings();
StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings();
aStyleSettings2.SetButtonTextColor(Color(0,0,0));
aStyleSettings2.SetCheckedColor(mColorLight); //hintergund
aStyleSettings2.SetShadowColor(mColorAnchor);
aStyleSettings2.SetFaceColor(mColorDark);
aSettings2.SetStyleSettings(aStyleSettings2);
mpVScrollbar->SetSettings(aSettings2);
}
}
void SwSidebarWin::SetSidebarPosition(sw::sidebarwindows::SidebarPosition eSidebarPosition)
{
meSidebarPosition = eSidebarPosition;
}
void SwSidebarWin::SetReadonly(sal_Bool bSet)
{
mbReadonly = bSet;
GetOutlinerView()->SetReadOnly(bSet);
}
void SwSidebarWin::SetLanguage(const SvxLanguageItem aNewItem)
{
Link pLink = Engine()->GetModifyHdl();
Engine()->SetModifyHdl( Link() );
ESelection aOld = GetOutlinerView()->GetSelection();
ESelection aNewSelection( 0, 0, (sal_uInt16)Engine()->GetParagraphCount()-1, USHRT_MAX );
GetOutlinerView()->SetSelection( aNewSelection );
SfxItemSet aEditAttr(GetOutlinerView()->GetAttribs());
aEditAttr.Put(aNewItem);
GetOutlinerView()->SetAttribs( aEditAttr );
GetOutlinerView()->SetSelection(aOld);
Engine()->SetModifyHdl( pLink );
const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
sal_uLong nCntrl = Engine()->GetControlWord();
// turn off
if (!pVOpt->IsOnlineSpell())
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
else
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
Engine()->SetControlWord(nCntrl);
//turn back on
if (pVOpt->IsOnlineSpell())
nCntrl |= EE_CNTRL_ONLINESPELLING;
else
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
Engine()->SetControlWord(nCntrl);
Engine()->CompleteOnlineSpelling();
Invalidate();
}
void SwSidebarWin::DataChanged( const DataChangedEvent& aEvent)
{
Window::DataChanged( aEvent );
}
void SwSidebarWin::GetFocus()
{
if (mpSidebarTxtControl)
mpSidebarTxtControl->GrabFocus();
}
void SwSidebarWin::LoseFocus()
{
}
void SwSidebarWin::ShowNote()
{
SetPosAndSize();
if (!IsVisible())
Window::Show();
if (mpShadow && !mpShadow->isVisible())
mpShadow->setVisible(true);
if (mpAnchor && !mpAnchor->isVisible())
mpAnchor->setVisible(true);
}
void SwSidebarWin::HideNote()
{
if (IsVisible())
Window::Hide();
if (mpAnchor)
{
if (mrMgr.IsShowAnchor())
mpAnchor->SetAnchorState(AS_TRI);
else
mpAnchor->setVisible(false);
}
if (mpShadow && mpShadow->isVisible())
mpShadow->setVisible(false);
}
void SwSidebarWin::ActivatePostIt()
{
mrMgr.AssureStdModeAtShell();
mpOutliner->ClearModifyFlag();
mpOutliner->GetUndoManager().Clear();
CheckMetaText();
SetViewState(VS_EDIT);
GetOutlinerView()->ShowCursor();
mpOutlinerView->GetEditView().SetInsertMode(mrView.GetWrtShellPtr()->IsInsMode());
if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
GetOutlinerView()->SetBackgroundColor(mColorDark);
}
void SwSidebarWin::DeactivatePostIt()
{
// remove selection, #i87073#
if (GetOutlinerView()->GetEditView().HasSelection())
{
ESelection aSelection = GetOutlinerView()->GetEditView().GetSelection();
aSelection.nEndPara = aSelection.nStartPara;
aSelection.nEndPos = aSelection.nStartPos;
GetOutlinerView()->GetEditView().SetSelection(aSelection);
}
mpOutliner->CompleteOnlineSpelling();
SetViewState(VS_NORMAL);
// write the visible text back into the SwField
UpdateData();
if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
GetOutlinerView()->SetBackgroundColor(COL_TRANSPARENT);
if ( !IsProtected() &&
Engine()->GetEditEngine().GetText()==String(EMPTYSTRING) )
{
mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 );
}
}
void SwSidebarWin::ToggleInsMode()
{
if (!mrView.GetWrtShell().IsRedlineOn())
{
//change outliner
mpOutlinerView->GetEditView().SetInsertMode(!mpOutlinerView->GetEditView().IsInsertMode());
//change documnet
mrView.GetWrtShell().ToggleInsMode();
//update statusbar
SfxBindings &rBnd = mrView.GetViewFrame()->GetBindings();
rBnd.Invalidate(SID_ATTR_INSERT);
rBnd.Update(SID_ATTR_INSERT);
}
}
void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot)
{
mrMgr.AssureStdModeAtShell();
switch (nSlot)
{
case FN_POSTIT:
case FN_REPLY:
{
// if this note is empty, it will be deleted once losing the focus, so no reply, but only a new note
// will be created
if (Engine()->GetEditEngine().GetText() != String(EMPTYSTRING))
{
OutlinerParaObject* pPara = new OutlinerParaObject(*GetOutlinerView()->GetEditView().CreateTextObject());
mrMgr.RegisterAnswer(pPara);
}
if (mrMgr.HasActiveSidebarWin())
mrMgr.SetActiveSidebarWin(0);
SwitchToFieldPos();
mrView.GetViewFrame()->GetDispatcher()->Execute(FN_POSTIT);
break;
}
case FN_DELETE_COMMENT:
//Delete(); // do not kill the parent of our open popup menu
mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 );
break;
case FN_DELETE_ALL_NOTES:
case FN_HIDE_ALL_NOTES:
// not possible as slot as this would require that "this" is the active postit
mrView.GetViewFrame()->GetBindings().Execute( nSlot, 0, 0, SFX_CALLMODE_ASYNCHRON );
break;
case FN_DELETE_NOTE_AUTHOR:
case FN_HIDE_NOTE_AUTHOR:
{
// not possible as slot as this would require that "this" is the active postit
SfxStringItem aItem( nSlot, GetAuthor() );
const SfxPoolItem* aItems[2];
aItems[0] = &aItem;
aItems[1] = 0;
mrView.GetViewFrame()->GetBindings().Execute( nSlot, aItems, 0, SFX_CALLMODE_ASYNCHRON );
}
default:
mrView.GetViewFrame()->GetBindings().Execute( nSlot );
break;
}
}
SwEditWin* SwSidebarWin::EditWin()
{
return &mrView.GetEditWin();
}
long SwSidebarWin::GetPostItTextHeight()
{
return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
}
void SwSidebarWin::SwitchToPostIt(sal_uInt16 aDirection)
{
SwSidebarWin* pPostIt = mrMgr.GetNextPostIt(aDirection, this);
if (pPostIt)
pPostIt->GrabFocus();
}
IMPL_LINK( SwSidebarWin, WindowEventListener, VclSimpleEvent*, pEvent )
{
VclWindowEvent* pWinEvent = dynamic_cast<VclWindowEvent*>(pEvent);
if ( pWinEvent )
{
if ( pWinEvent->GetId() == VCLEVENT_WINDOW_MOUSEMOVE )
{
MouseEvent* pMouseEvt = (MouseEvent*)pWinEvent->GetData();
if ( pMouseEvt->IsEnterWindow() )
{
mbMouseOver = true;
if ( !HasFocus() )
{
SetViewState(VS_VIEW);
Invalidate();
}
}
else if ( pMouseEvt->IsLeaveWindow())
{
if (IsPreview())
{
//doLazyDelete();
}
else
{
mbMouseOver = false;
if ( !HasFocus() )
{
SetViewState(VS_NORMAL);
Invalidate();
}
}
}
}
else if ( pWinEvent->GetId() == VCLEVENT_WINDOW_ACTIVATE &&
pWinEvent->GetWindow() == mpSidebarTxtControl )
{
const sal_Bool bLockView = mrView.GetWrtShell().IsViewLocked();
mrView.GetWrtShell().LockView( sal_True );
if ( !IsPreview() )
{
mrMgr.SetActiveSidebarWin( this );
}
mrView.GetWrtShell().LockView( bLockView );
mrMgr.MakeVisible( this );
}
else if ( pWinEvent->GetWindow() == mpSidebarTxtControl )
{
int i = 5;
++i;
}
}
return sal_True;
}
void SwSidebarWin::Delete()
{
if ( mrMgr.GetActiveSidebarWin() == this)
{
mrMgr.SetActiveSidebarWin(0);
// if the note is empty, the previous line will send a delete event, but we are already there
if (mnEventId)
{
Application::RemoveUserEvent( mnEventId );
mnEventId = 0;
}
}
}
IMPL_LINK(SwSidebarWin, ScrollHdl, ScrollBar*, pScroll)
{
long nDiff = GetOutlinerView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos();
GetOutlinerView()->Scroll( 0, nDiff );
return 0;
}
IMPL_LINK(SwSidebarWin, ModifyHdl, void*, pVoid)
{
// no warnings, please
pVoid=0;
mrView.GetDocShell()->SetModified(sal_True);
return 0;
}
IMPL_LINK(SwSidebarWin, DeleteHdl, void*, pVoid)
{
// no warnings, please
pVoid=0;
mnEventId = 0;
Delete();
return 0;
}
void SwSidebarWin::ResetAttributes()
{
mpOutlinerView->RemoveAttribsKeepLanguages(sal_True);
mpOutliner->RemoveFields(sal_True);
mpOutlinerView->SetAttribs(DefaultItem());
}
sal_Int32 SwSidebarWin::GetScrollbarWidth()
{
return mrView.GetWrtShell().GetViewOptions()->GetZoom() / 10;
}
sal_Int32 SwSidebarWin::GetMetaButtonAreaWidth()
{
const Fraction& f( GetMapMode().GetScaleX() );
if (IsPreview())
return 3 * METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator();
else
return METABUTTON_AREA_WIDTH * f.GetNumerator() / f.GetDenominator();
}
sal_Int32 SwSidebarWin::GetMetaHeight()
{
const Fraction& f( GetMapMode().GetScaleY() );
return POSTIT_META_HEIGHT * f.GetNumerator() / f.GetDenominator();
}
sal_Int32 SwSidebarWin::GetMinimumSizeWithMeta()
{
return mrMgr.GetMinimumSizeWithMeta();
}
sal_Int32 SwSidebarWin::GetMinimumSizeWithoutMeta()
{
const Fraction& f( GetMapMode().GetScaleY() );
return POSTIT_MINIMUMSIZE_WITHOUT_META * f.GetNumerator() / f.GetDenominator();
}
void SwSidebarWin::SetSpellChecking()
{
const SwViewOption* pVOpt = mrView.GetWrtShellPtr()->GetViewOptions();
sal_uLong nCntrl = mpOutliner->GetControlWord();
if (pVOpt->IsOnlineSpell())
nCntrl |= EE_CNTRL_ONLINESPELLING;
else
nCntrl &= ~EE_CNTRL_ONLINESPELLING;
mpOutliner->SetControlWord(nCntrl);
mpOutliner->CompleteOnlineSpelling();
Invalidate();
}
void SwSidebarWin::SetViewState(ViewState bViewState)
{
switch (bViewState)
{
case VS_EDIT:
{
if (mpAnchor)
{
mpAnchor->SetAnchorState(AS_ALL);
SwSidebarWin* pWin = GetTopReplyNote();
// --> OD 2010-06-03 #i111964#
if ( pWin && pWin->Anchor() )
// <--
{
pWin->Anchor()->SetAnchorState(AS_END);
}
mpAnchor->setLineSolid(true);
if ( mpTextRangeOverlay != NULL )
{
mpTextRangeOverlay->ShowSolidBorder();
}
}
if (mpShadow)
mpShadow->SetShadowState(SS_EDIT);
break;
}
case VS_VIEW:
{
if (mpAnchor)
{
mpAnchor->setLineSolid(true);
if ( mpTextRangeOverlay != NULL )
{
mpTextRangeOverlay->ShowSolidBorder();
}
}
if (mpShadow)
mpShadow->SetShadowState(SS_VIEW);
break;
}
case VS_NORMAL:
{
if (mpAnchor)
{
if (IsFollow())
{
// if there is no visible parent note, we want to see the complete anchor ??
//if (IsAnyStackParentVisible())
mpAnchor->SetAnchorState(AS_END);
SwSidebarWin* pTopWinSelf = GetTopReplyNote();
SwSidebarWin* pTopWinActive = mrMgr.HasActiveSidebarWin()
? mrMgr.GetActiveSidebarWin()->GetTopReplyNote()
: 0;
if ( pTopWinSelf && ( pTopWinSelf != pTopWinActive ) &&
pTopWinSelf->Anchor() )
{
if ( pTopWinSelf != mrMgr.GetActiveSidebarWin() )
{
pTopWinSelf->Anchor()->setLineSolid(false);
if ( pTopWinSelf->TextRange() != NULL )
{
pTopWinSelf->TextRange()->HideSolidBorder();
}
}
pTopWinSelf->Anchor()->SetAnchorState(AS_ALL);
}
}
mpAnchor->setLineSolid(false);
if ( mpTextRangeOverlay != NULL )
{
mpTextRangeOverlay->HideSolidBorder();
}
}
if ( mpShadow )
{
mpShadow->SetShadowState(SS_NORMAL);
}
break;
}
}
}
SwSidebarWin* SwSidebarWin::GetTopReplyNote()
{
SwSidebarWin* pTopNote = 0;
SwSidebarWin* pSidebarWin = IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, this) : 0;
while (pSidebarWin)
{
pTopNote = pSidebarWin;
pSidebarWin = pSidebarWin->IsFollow() ? mrMgr.GetNextPostIt(KEY_PAGEUP, pSidebarWin) : 0;
}
return pTopNote;
}
void SwSidebarWin::SwitchToFieldPos()
{
if ( mrMgr.GetActiveSidebarWin() == this )
mrMgr.SetActiveSidebarWin(0);
GotoPos();
sal_uInt32 aCount = MoveCaret();
if (aCount)
mrView.GetDocShell()->GetWrtShell()->SwCrsrShell::Right(aCount, 0, sal_False);
GrabFocusToDocument();
}
SvxLanguageItem SwSidebarWin::GetLanguage(void)
{
return SvxLanguageItem(SwLangHelper::GetLanguage(mrView.GetWrtShell(),RES_CHRATR_LANGUAGE),RES_CHRATR_LANGUAGE);
}
void SwSidebarWin::SetChangeTracking( const SwPostItHelper::SwLayoutStatus aLayoutStatus,
const Color& aChangeColor )
{
if ( (mLayoutStatus != aLayoutStatus) ||
(mChangeColor != aChangeColor) )
{
mLayoutStatus = aLayoutStatus;
mChangeColor = aChangeColor;
Invalidate();
}
}
bool SwSidebarWin::HasScrollbar() const
{
return mpVScrollbar != 0;
}
bool SwSidebarWin::IsScrollbarVisible() const
{
return HasScrollbar() && mpVScrollbar->IsVisible();
}
void SwSidebarWin::ChangeSidebarItem( SwSidebarItem& rSidebarItem )
{
const bool bAnchorChanged = mpAnchorFrm != rSidebarItem.maLayoutInfo.mpAnchorFrm;
if ( bAnchorChanged )
{
mrMgr.DisconnectSidebarWinFromFrm( *(mpAnchorFrm), *this );
}
mrSidebarItem = rSidebarItem;
mpAnchorFrm = mrSidebarItem.maLayoutInfo.mpAnchorFrm;
if ( GetWindowPeer() )
{
SidebarWinAccessible* pAcc =
static_cast<SidebarWinAccessible*>( GetWindowPeer() );
ASSERT( dynamic_cast<SidebarWinAccessible*>( GetWindowPeer() ),
"<SwSidebarWin::ChangeSidebarItem(..)> - unexpected type of window peer -> crash possible!" );
pAcc->ChangeSidebarItem( mrSidebarItem );
}
if ( bAnchorChanged )
{
mrMgr.ConnectSidebarWinToFrm( *(mrSidebarItem.maLayoutInfo.mpAnchorFrm),
mrSidebarItem.GetFmtFld(),
*this );
}
}
css::uno::Reference< css::accessibility::XAccessible > SwSidebarWin::CreateAccessible()
{
SidebarWinAccessible* pAcc( new SidebarWinAccessible( *this,
mrView.GetWrtShell(),
mrSidebarItem ) );
css::uno::Reference< css::awt::XWindowPeer > xWinPeer( pAcc );
SetWindowPeer( xWinPeer, pAcc );
css::uno::Reference< css::accessibility::XAccessible > xAcc( xWinPeer, css::uno::UNO_QUERY );
return xAcc;
}
} } // eof of namespace sw::sidebarwindows
/********** SwRedComment**************/
/*
SwRedComment::SwRedComment( Window* pParent, WinBits nBits,SwPostItMgr* aMgr,SwPostItBits aBits,SwRedline* pRed)
: SwSidebarWin(pParent,nBits,aMgr,aBits),
pRedline(pRed)
{
}
void SwRedComment::SetPopup()
{
mpButtonPopup = new PopupMenu(SW_RES(MN_REDCOMMENT_BUTTON));
//mpButtonPopup->SetMenuFlags(MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES);
}
void SwRedComment::UpdateData()
{
if ( Engine()->IsModified() )
{
// so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one)
Mgr()->SetLayout();
// SetRedline is calling SetModified already
DocView()->GetWrtShell().SetRedlineComment(Engine()->GetEditEngine().GetText());
}
Engine()->ClearModifyFlag();
Engine()->GetUndoManager().Clear();
}
void SwRedComment::SetPostItText()
{
Engine()->SetModifyHdl( Link() );
Engine()->EnableUndo( sal_False );
Engine()->Clear();
View()->SetAttribs(DefaultItem());
View()->InsertText(pRedline->GetComment(),false);
Engine()->ClearModifyFlag();
Engine()->GetUndoManager().Clear();
Engine()->EnableUndo( sal_True );
Engine()->SetModifyHdl( LINK( this, SwSidebarWin, ModifyHdl ) );
Invalidate();
}
void SwRedComment::DeactivatePostIt()
{
SwSidebarWin::DeactivatePostIt();
// current Redline is still selected
DocView()->GetWrtShellPtr()->ClearMark();
}
void SwRedComment::ActivatePostIt()
{
SwSidebarWin::ActivatePostIt();
// do we want the redline selected?
// otherwise, SwRedComment::ActivatePostIt() as well as SwRedComment::DeactivatePostIt()
// can be thrown out completly
DocView()->GetDocShell()->GetWrtShell()->GotoRedline(
DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData()),true);
}
void SwRedComment::MouseButtonDown( const MouseEvent& rMEvt )
{
if (mRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft())
{
ExecuteCommand( mpButtonPopup->Execute( this,Rectangle(LogicToPixel(mRectMetaButton.BottomLeft()),LogicToPixel(mRectMetaButton.BottomLeft())),POPUPMENU_EXECUTE_DOWN | POPUPMENU_NOMOUSEUPCLOSE) );
}
}
void SwRedComment::Delete()
{
SwSidebarWin::Delete();
// we are not neccessarily on our redline, so let's move there
GotoPos();
DocView()->GetWrtShell().SetRedlineComment(EMPTYSTRING);
DocView()->GetWrtShell().ClearMark();
// so we get a new layout of notes (Anchor position is still the same and we would otherwise not get one)
Mgr()->SetLayout();
Mgr()->RemoveItem(pRedline);
}
void SwRedComment::GotoPos()
{
DocView()->GetDocShell()->GetWrtShell()->GotoRedline(
DocView()->GetDocShell()->GetWrtShell()->FindRedlineOfData(pRedline->GetRedlineData()));
}
String SwRedComment::GetAuthor()
{
return pRedline->GetAuthorString();
}
Date SwRedComment::GetDate()
{
return pRedline->GetTimeStamp().GetDate();
}
Time SwRedComment::GetTime()
{
return pRedline->GetTimeStamp().GetTime();
}
bool SwRedComment::IsProtected()
{
return SwSidebarWin::IsProtected() || pRedline->Start()->nNode.GetNode().GetTxtNode()->IsInProtectSect();
}
*/