849 lines
26 KiB
C++
849 lines
26 KiB
C++
/************************************************************************* *
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: postit.cxx,v $
|
|
* $Revision: 1.8.42.11 $
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include "precompiled_sd.hxx"
|
|
|
|
#include <svx/fontitem.hxx>
|
|
#include <svx/eeitem.hxx>
|
|
#include <svx/fhgtitem.hxx>
|
|
#include <svx/bulitem.hxx>
|
|
#include <svx/udlnitem.hxx>
|
|
#include <svx/shdditem.hxx>
|
|
#include <svx/flditem.hxx>
|
|
#include <svx/frmdir.hxx>
|
|
#include <svx/frmdiritem.hxx>
|
|
#include <svx/langitem.hxx>
|
|
#include <svx/adjitem.hxx>
|
|
#include <svx/editview.hxx>
|
|
#include <svx/svdview.hxx>
|
|
#include <svx/sdrpaintwindow.hxx>
|
|
#include <svx/sdr/overlay/overlaymanager.hxx>
|
|
#include <svx/editstat.hxx> //EditEngine flags
|
|
#include <svx/outliner.hxx>
|
|
#include <svx/editeng.hxx>
|
|
#include <svx/editobj.hxx>
|
|
#include <svx/unolingu.hxx>
|
|
#include <svx/outlobj.hxx>
|
|
#include <svx/postitem.hxx>
|
|
#include <svx/wghtitem.hxx>
|
|
#include <svx/udlnitem.hxx>
|
|
#include <svx/crsditem.hxx>
|
|
|
|
#include <svtools/langtab.hxx>
|
|
#include <svl/slstitm.hxx>
|
|
#include <unotools/securityoptions.hxx>
|
|
#include <unotools/useroptions.hxx>
|
|
#include <svl/languageoptions.hxx>
|
|
#include <svl/zforlist.hxx>
|
|
#include <svtools/svmedit.hxx>
|
|
|
|
#include <linguistic/lngprops.hxx>
|
|
|
|
#include <sfx2/request.hxx>
|
|
#include <sfx2/viewfrm.hxx>
|
|
#include <sfx2/bindings.hxx>
|
|
#include <sfx2/dispatch.hxx>
|
|
#include <sfx2/mnumgr.hxx>
|
|
|
|
#include <vcl/vclenum.hxx>
|
|
#include <vcl/edit.hxx>
|
|
#include <vcl/help.hxx>
|
|
#include <vcl/scrbar.hxx>
|
|
#include <vcl/button.hxx>
|
|
#include <vcl/svapp.hxx>
|
|
#include <vcl/gradient.hxx>
|
|
#include <vcl/salbtype.hxx> // FRound
|
|
#include <vcl/cursor.hxx>
|
|
|
|
#include <basegfx/matrix/b2dhommatrix.hxx>
|
|
#include <basegfx/tuple/b2dtuple.hxx>
|
|
#include <basegfx/polygon/b2dpolygontools.hxx>
|
|
|
|
#include "annotations.hrc"
|
|
#include "annotationwindow.hxx"
|
|
#include "annotationmanagerimpl.hxx"
|
|
|
|
#include "DrawDocShell.hxx"
|
|
#include "ViewShell.hxx"
|
|
#include "drawdoc.hxx"
|
|
#include "View.hxx"
|
|
#include "textapi.hxx"
|
|
#include "sdresid.hxx"
|
|
|
|
using rtl::OUString;
|
|
using namespace ::sd;
|
|
using namespace ::com::sun::star;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::office;
|
|
using namespace ::com::sun::star::text;
|
|
|
|
#define METABUTTON_WIDTH 16
|
|
#define METABUTTON_HEIGHT 18
|
|
#define METABUTTON_AREA_WIDTH 30
|
|
#define POSTIT_META_HEIGHT (sal_Int32) 30
|
|
|
|
#define EMPTYSTRING rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(""))
|
|
|
|
namespace sd {
|
|
|
|
extern OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation );
|
|
extern SfxItemPool* GetAnnotationPool();
|
|
extern com::sun::star::util::DateTime getCurrentDateTime();
|
|
|
|
Color ColorFromAlphaColor(UINT8 aTransparency, Color &aFront, Color &aBack )
|
|
{
|
|
return Color((UINT8)(aFront.GetRed() * aTransparency/(double)255 + aBack.GetRed() * (1-aTransparency/(double)255)),
|
|
(UINT8)(aFront.GetGreen() * aTransparency/(double)255 + aBack.GetGreen() * (1-aTransparency/(double)255)),
|
|
(UINT8)(aFront.GetBlue() * aTransparency/(double)255 + aBack.GetBlue() * (1-aTransparency/(double)255)));
|
|
}
|
|
|
|
/************ AnnotationTextWindow **********************************/
|
|
|
|
AnnotationTextWindow::AnnotationTextWindow( AnnotationWindow* pParent, WinBits nBits )
|
|
: Control(pParent, nBits)
|
|
, mpOutlinerView(0)
|
|
, mpAnnotationWindow( pParent )
|
|
{
|
|
}
|
|
|
|
AnnotationTextWindow::~AnnotationTextWindow()
|
|
{
|
|
}
|
|
|
|
void AnnotationTextWindow::Paint( const Rectangle& rRect)
|
|
{
|
|
if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
|
|
{
|
|
DrawGradient(Rectangle(Point(0,0),PixelToLogic(GetSizePixel())),
|
|
Gradient(GRADIENT_LINEAR,mpAnnotationWindow->maColorLight,mpAnnotationWindow->maColor));
|
|
}
|
|
|
|
if( mpOutlinerView )
|
|
mpOutlinerView->Paint( rRect );
|
|
}
|
|
|
|
void AnnotationTextWindow::KeyInput( const KeyEvent& rKeyEvt )
|
|
{
|
|
const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
|
|
USHORT nKey = rKeyCode.GetCode();
|
|
|
|
if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN)))
|
|
{
|
|
SfxDispatcher* pDispatcher = mpAnnotationWindow->DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher();
|
|
if( pDispatcher )
|
|
pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
|
|
}
|
|
else if (nKey == KEY_INSERT)
|
|
{
|
|
if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2())
|
|
mpAnnotationWindow->ToggleInsMode();
|
|
}
|
|
else
|
|
{
|
|
long aOldHeight = mpAnnotationWindow->GetPostItTextHeight();
|
|
bool bDone = false;
|
|
|
|
/// HACK: need to switch off processing of Undo/Redo in Outliner
|
|
if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) )
|
|
{
|
|
bool bIsProtected = mpAnnotationWindow->IsProtected();
|
|
if (!bIsProtected || (bIsProtected && !mpAnnotationWindow->Engine()->GetEditEngine().DoesKeyChangeText(rKeyEvt)) )
|
|
|
|
bDone = mpOutlinerView->PostKeyEvent( rKeyEvt );
|
|
}
|
|
if (bDone)
|
|
{
|
|
mpAnnotationWindow->ResizeIfNeccessary(aOldHeight,mpAnnotationWindow->GetPostItTextHeight());
|
|
}
|
|
else
|
|
{
|
|
Control::KeyInput(rKeyEvt);
|
|
}
|
|
}
|
|
}
|
|
|
|
void AnnotationTextWindow::MouseMove( const MouseEvent& rMEvt )
|
|
{
|
|
if ( mpOutlinerView )
|
|
{
|
|
mpOutlinerView->MouseMove( rMEvt );
|
|
SetPointer( mpOutlinerView->GetPointer( rMEvt.GetPosPixel() ) );
|
|
}
|
|
}
|
|
|
|
void AnnotationTextWindow::MouseButtonDown( const MouseEvent& rMEvt )
|
|
{
|
|
GrabFocus();
|
|
if ( mpOutlinerView )
|
|
mpOutlinerView->MouseButtonDown( rMEvt );
|
|
// todo mpOutlinerView->DocView()->GetViewFrame()->GetBindings().InvalidateAll(FALSE);
|
|
}
|
|
|
|
void AnnotationTextWindow::MouseButtonUp( const MouseEvent& rMEvt )
|
|
{
|
|
if ( mpOutlinerView )
|
|
mpOutlinerView->MouseButtonUp( rMEvt );
|
|
}
|
|
|
|
void AnnotationTextWindow::Command( const CommandEvent& rCEvt )
|
|
{
|
|
if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
|
|
{
|
|
mpAnnotationWindow->Command(rCEvt);
|
|
}
|
|
else
|
|
{
|
|
if ( mpOutlinerView )
|
|
mpOutlinerView->Command( rCEvt );
|
|
else
|
|
Window::Command(rCEvt);
|
|
}
|
|
}
|
|
|
|
void AnnotationTextWindow::GetFocus()
|
|
{
|
|
Window::GetFocus();
|
|
}
|
|
|
|
void AnnotationTextWindow::LoseFocus()
|
|
{
|
|
// if ( mpAnnotationWindow )
|
|
// mpAnnotationWindow->UpdateAnnotation();
|
|
|
|
Window::LoseFocus();
|
|
}
|
|
|
|
XubString AnnotationTextWindow::GetSurroundingText() const
|
|
{
|
|
if( mpOutlinerView )
|
|
{
|
|
EditEngine *aEditEngine = mpOutlinerView->GetEditView().GetEditEngine();
|
|
if( mpOutlinerView->HasSelection() )
|
|
return mpOutlinerView->GetSelected();
|
|
else
|
|
{
|
|
ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
|
|
XubString aStr = aEditEngine->GetText(aSelection.nStartPara);
|
|
return aStr;
|
|
}
|
|
}
|
|
else
|
|
return XubString::EmptyString();
|
|
}
|
|
|
|
Selection AnnotationTextWindow::GetSurroundingTextSelection() const
|
|
{
|
|
if( mpOutlinerView )
|
|
{
|
|
if( mpOutlinerView->HasSelection() )
|
|
return Selection( 0, mpOutlinerView->GetSelected().Len() );
|
|
else
|
|
{
|
|
ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
|
|
return Selection( aSelection.nStartPos, aSelection.nEndPos );
|
|
}
|
|
}
|
|
else
|
|
return Selection( 0, 0 );
|
|
}
|
|
|
|
/************** AnnotationWindow***********************************++*/
|
|
|
|
AnnotationWindow::AnnotationWindow( AnnotationManagerImpl& rManager, DrawDocShell* pDocShell, Window* pParent )
|
|
: FloatingWindow(pParent, WB_SYSTEMWINDOW|WB_BORDER|WB_NEEDSFOCUS)
|
|
, mrManager( rManager )
|
|
, mpDocShell( pDocShell )
|
|
, mpView( pDocShell->GetViewShell()->GetView() )
|
|
, mpDoc( pDocShell->GetDoc() )
|
|
, mpOutlinerView(0)
|
|
, mpOutliner(0)
|
|
, mpVScrollbar(0)
|
|
, mbReadonly(pDocShell->IsReadOnly())
|
|
, mbProtected(false)
|
|
, mbMouseOverButton(false)
|
|
, mpTextWindow(0)
|
|
, mpMeta(0)
|
|
{
|
|
}
|
|
|
|
AnnotationWindow::~AnnotationWindow()
|
|
{
|
|
delete mpMeta;
|
|
delete mpOutlinerView;
|
|
delete mpOutliner;
|
|
delete mpVScrollbar;
|
|
delete mpTextWindow;
|
|
}
|
|
|
|
void AnnotationWindow::InitControls()
|
|
{
|
|
// actual window which holds the user text
|
|
mpTextWindow = new AnnotationTextWindow(this, WB_NODIALOGCONTROL);
|
|
mpTextWindow->SetPointer(Pointer(POINTER_TEXT));
|
|
|
|
// window control for author and date
|
|
mpMeta = new MultiLineEdit(this,0);
|
|
mpMeta->SetReadOnly();
|
|
mpMeta->SetRightToLeft(Application::GetSettings().GetLayoutRTL());
|
|
mpMeta->AlwaysDisableInput(true);
|
|
mpMeta->SetCallHandlersOnInputDisabled(true);
|
|
|
|
// mpMeta->AddEventListener( LINK( mpPostItTxt, PostItTxt, WindowEventListener ) );
|
|
// AddEventListener( LINK( mpTextWindow, PostItTxt, WindowEventListener ) );
|
|
|
|
// we should leave this setting alone, but for this we need a better layout algo
|
|
// with variable meta size height
|
|
AllSettings aSettings = mpMeta->GetSettings();
|
|
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
|
|
Font aFont = aStyleSettings.GetFieldFont();
|
|
aFont.SetHeight(8);
|
|
aStyleSettings.SetFieldFont(aFont);
|
|
aSettings.SetStyleSettings(aStyleSettings);
|
|
mpMeta->SetSettings(aSettings);
|
|
|
|
mpOutliner = new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT);
|
|
Doc()->SetCalcFieldValueHdl( mpOutliner );
|
|
mpOutliner->SetUpdateMode( TRUE );
|
|
Rescale();
|
|
|
|
OutputDevice* pDev = Doc()->GetRefDevice();
|
|
if( pDev )
|
|
{
|
|
mpOutliner->SetRefDevice( pDev );
|
|
}
|
|
|
|
mpOutlinerView = new OutlinerView ( mpOutliner, mpTextWindow );
|
|
mpOutliner->InsertView(mpOutlinerView );
|
|
mpTextWindow->SetOutlinerView(mpOutlinerView);
|
|
mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) );
|
|
|
|
// SfxItemSet item(DocShell()->GetPool());
|
|
// item.Put(SvxFontHeightItem(352,100,EE_CHAR_FONTHEIGHT));
|
|
// mpOutlinerView->SetAttribs(item);
|
|
|
|
// 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, AnnotationWindow, ScrollHdl));
|
|
mpVScrollbar->EnableDrag();
|
|
// mpVScrollbar->AddEventListener( LINK( this, AnnotationWindow, WindowEventListener ) );
|
|
|
|
ULONG nCntrl = mpOutliner->GetControlWord();
|
|
nCntrl |= EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT | EV_CNTRL_AUTOSCROLL | EE_CNTRL_NOCOLORS;
|
|
/*
|
|
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);
|
|
// mpOutliner->SetFlatMode( TRUE );
|
|
|
|
Engine()->SetModifyHdl( Link() );
|
|
Engine()->EnableUndo( FALSE );
|
|
|
|
Engine()->ClearModifyFlag();
|
|
Engine()->GetUndoManager().Clear();
|
|
Engine()->EnableUndo( TRUE );
|
|
Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
|
|
|
|
Invalidate();
|
|
|
|
SetLanguage(GetLanguage());
|
|
|
|
mpMeta->Show();
|
|
mpVScrollbar->Show();
|
|
mpTextWindow->Show();
|
|
}
|
|
|
|
void AnnotationWindow::StartEdit()
|
|
{
|
|
getView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF));
|
|
getView()->ShowCursor();
|
|
}
|
|
|
|
void AnnotationWindow::Rescale()
|
|
{
|
|
MapMode aMode(MAP_100TH_MM);
|
|
aMode.SetOrigin( Point() );
|
|
//aMode.SetScaleX( aMode.GetScaleX() * Fraction( 8, 10 ) );
|
|
//aMode.SetScaleY( aMode.GetScaleY() * Fraction( 8, 10 ) );
|
|
mpOutliner->SetRefMapMode( aMode );
|
|
SetMapMode( aMode );
|
|
mpTextWindow->SetMapMode( aMode );
|
|
if ( mpMeta )
|
|
{
|
|
Font aFont( mpMeta->GetSettings().GetStyleSettings().GetFieldFont() );
|
|
sal_Int32 nHeight = aFont.GetHeight();
|
|
nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
|
|
aFont.SetHeight( nHeight );
|
|
mpMeta->SetControlFont( aFont );
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::DoResize()
|
|
{
|
|
unsigned long aWidth = GetSizePixel().Width();
|
|
long aHeight = GetSizePixel().Height() - POSTIT_META_HEIGHT;
|
|
|
|
mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
|
|
long aTextHeight = LogicToPixel( mpOutliner->CalcTextSize()).Height();
|
|
|
|
if( aTextHeight > aHeight )
|
|
{ // we need vertical scrollbars and have to reduce the width
|
|
aWidth -= GetScrollbarWidth();
|
|
mpVScrollbar->Show();
|
|
}
|
|
else
|
|
{
|
|
mpVScrollbar->Hide();
|
|
}
|
|
|
|
mpTextWindow->SetPosSizePixel(0,0,aWidth, aHeight);
|
|
|
|
if( mbReadonly )
|
|
mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width(),POSTIT_META_HEIGHT);
|
|
else
|
|
mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width()-METABUTTON_AREA_WIDTH,POSTIT_META_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) ) );
|
|
}
|
|
mpVScrollbar->SetPosSizePixel( 0 + aWidth, 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()));
|
|
|
|
Point aPos( mpMeta->GetPosPixel());
|
|
Point aBase( aPos.X() + aPos.X() + GetSizePixel().Width(), aPos.Y() );
|
|
Point aLeft = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+5), aBase.Y()+17 ) );
|
|
Point aRight = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH-1), aBase.Y()+17 ) );
|
|
Point aBottom = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+2), aBase.Y()+20 ) );
|
|
|
|
maPopupTriangle.clear();
|
|
maPopupTriangle.append(basegfx::B2DPoint(aLeft.X(),aLeft.Y()));
|
|
maPopupTriangle.append(basegfx::B2DPoint(aRight.X(),aRight.Y()));
|
|
maPopupTriangle.append(basegfx::B2DPoint(aBottom.X(),aBottom.Y()));
|
|
maPopupTriangle.setClosed(true);
|
|
maRectMetaButton = PixelToLogic( Rectangle( Point(
|
|
aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10),
|
|
aPos.Y()+5 ),
|
|
Size( METABUTTON_WIDTH, METABUTTON_HEIGHT ) ) );
|
|
|
|
}
|
|
|
|
void AnnotationWindow::SetSizePixel( const Size& rNewSize )
|
|
{
|
|
Window::SetSizePixel(rNewSize);
|
|
}
|
|
|
|
void AnnotationWindow::SetScrollbar()
|
|
{
|
|
mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY());
|
|
}
|
|
|
|
void AnnotationWindow::ResizeIfNeccessary(long aOldHeight, long aNewHeight)
|
|
{
|
|
if (aOldHeight != aNewHeight)
|
|
{
|
|
DoResize();
|
|
Invalidate();
|
|
}
|
|
else
|
|
{
|
|
SetScrollbar();
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::SetReadonly(bool bSet)
|
|
{
|
|
mbReadonly = bSet;
|
|
getView()->SetReadOnly(bSet);
|
|
}
|
|
|
|
void AnnotationWindow::SetLanguage(const SvxLanguageItem aNewItem)
|
|
{
|
|
Engine()->SetModifyHdl( Link() );
|
|
ESelection aOld = getView()->GetSelection();
|
|
|
|
ESelection aNewSelection( 0, 0, (USHORT)Engine()->GetParagraphCount()-1, USHRT_MAX );
|
|
getView()->SetSelection( aNewSelection );
|
|
SfxItemSet aEditAttr(getView()->GetAttribs());
|
|
aEditAttr.Put(aNewItem);
|
|
getView()->SetAttribs( aEditAttr );
|
|
|
|
getView()->SetSelection(aOld);
|
|
Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
|
|
|
|
Invalidate();
|
|
}
|
|
|
|
void AnnotationWindow::ToggleInsMode()
|
|
{
|
|
if( mpOutlinerView )
|
|
{
|
|
SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings();
|
|
rBnd.Invalidate(SID_ATTR_INSERT);
|
|
rBnd.Update(SID_ATTR_INSERT);
|
|
}
|
|
}
|
|
|
|
long AnnotationWindow::GetPostItTextHeight()
|
|
{
|
|
return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
|
|
}
|
|
|
|
IMPL_LINK(AnnotationWindow, ScrollHdl, ScrollBar*, pScroll)
|
|
{
|
|
long nDiff = getView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos();
|
|
getView()->Scroll( 0, nDiff );
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK(AnnotationWindow, ModifyHdl, void*, EMPTYARG)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
sal_Int32 AnnotationWindow::GetScrollbarWidth()
|
|
{
|
|
return 16;
|
|
// return mpView->GetWrtShell().GetViewOptions()->GetZoom() / 10;
|
|
}
|
|
|
|
SvxLanguageItem AnnotationWindow::GetLanguage(void)
|
|
{
|
|
return SvxLanguageItem( Doc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE );
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation )
|
|
{
|
|
if( xAnnotation.is() )
|
|
{
|
|
Reference< XText > xText( xAnnotation->getTextRange() );
|
|
return TextApiObject::getImplementation( xText );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// --------------------------------------------------------------------
|
|
|
|
void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation, bool bGrabFocus )
|
|
{
|
|
if( (xAnnotation != mxAnnotation) && xAnnotation.is() )
|
|
{
|
|
mxAnnotation = xAnnotation;
|
|
|
|
SetColor();
|
|
|
|
SvtUserOptions aUserOptions;
|
|
mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor();
|
|
|
|
Engine()->Clear();
|
|
TextApiObject* pTextApi = getTextApiObject( mxAnnotation );
|
|
|
|
if( pTextApi )
|
|
{
|
|
std::auto_ptr< OutlinerParaObject > pOPO( pTextApi->CreateText() );
|
|
Engine()->SetText( *pOPO.get() );
|
|
}
|
|
|
|
Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
|
|
Engine()->ClearModifyFlag();
|
|
Engine()->GetUndoManager().Clear();
|
|
|
|
Invalidate();
|
|
|
|
OUString sMeta( xAnnotation->getAuthor() );
|
|
OUString sDateTime( getAnnotationDateTimeString(xAnnotation) );
|
|
|
|
if( sDateTime.getLength() != 0 )
|
|
{
|
|
if( sMeta.getLength() != 0 )
|
|
sMeta += OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" ) );
|
|
|
|
sMeta += sDateTime;
|
|
}
|
|
mpMeta->SetText(sMeta);
|
|
|
|
if( bGrabFocus )
|
|
GrabFocus();
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::SetColor()
|
|
{
|
|
sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() );
|
|
|
|
maColor = mrManager.GetColor( nAuthorIdx );
|
|
maColorDark = mrManager.GetColorDark( nAuthorIdx );
|
|
maColorLight = mrManager.GetColorLight( nAuthorIdx );
|
|
|
|
mpOutlinerView->SetBackgroundColor(maColor);
|
|
|
|
mpMeta->SetControlBackground(maColor);
|
|
AllSettings aSettings = mpMeta->GetSettings();
|
|
StyleSettings aStyleSettings = aSettings.GetStyleSettings();
|
|
aStyleSettings.SetFieldTextColor(maColorDark);
|
|
aSettings.SetStyleSettings(aStyleSettings);
|
|
mpMeta->SetSettings(aSettings);
|
|
|
|
AllSettings aSettings2 = mpVScrollbar->GetSettings();
|
|
StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings();
|
|
aStyleSettings2.SetButtonTextColor(Color(0,0,0));
|
|
aStyleSettings2.SetCheckedColor(maColorLight); //hintergund
|
|
aStyleSettings2.SetShadowColor(maColorDark);
|
|
aStyleSettings2.SetFaceColor(maColor);
|
|
aSettings2.SetStyleSettings(aStyleSettings2);
|
|
mpVScrollbar->SetSettings(aSettings2);
|
|
}
|
|
|
|
void AnnotationWindow::Deactivate()
|
|
{
|
|
Reference< XAnnotation > xAnnotation( mxAnnotation );
|
|
/*
|
|
// check if text is empty
|
|
Paragraph* p1stPara=Engine()->GetParagraph( 0 );
|
|
ULONG nParaAnz=Engine()->GetParagraphCount();
|
|
if(p1stPara==NULL)
|
|
nParaAnz=0;
|
|
|
|
if(nParaAnz==1)
|
|
{
|
|
// if it is only one paragraph, check if that paragraph is empty
|
|
XubString aStr(Engine()->GetText(p1stPara));
|
|
|
|
if(!aStr.Len())
|
|
nParaAnz = 0;
|
|
}
|
|
|
|
if( nParaAnz == 0 )
|
|
{
|
|
// text is empty, delete postit
|
|
DeleteAnnotation( xAnnotation );
|
|
}
|
|
else
|
|
*/
|
|
{
|
|
// write changed text back to annotation
|
|
if ( Engine()->IsModified() )
|
|
{
|
|
TextApiObject* pTextApi = getTextApiObject( xAnnotation );
|
|
|
|
if( pTextApi )
|
|
{
|
|
OutlinerParaObject* pOPO = Engine()->CreateParaObject();
|
|
if( pOPO )
|
|
{
|
|
if( mpDoc->IsUndoEnabled() )
|
|
mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_EDIT ) ) );
|
|
|
|
pTextApi->SetText( *pOPO );
|
|
delete pOPO;
|
|
|
|
// set current time to changed annotation
|
|
xAnnotation->setDateTime( getCurrentDateTime() );
|
|
|
|
if( mpDoc->IsUndoEnabled() )
|
|
mpDoc->EndUndo();
|
|
|
|
DocView()->GetDocSh()->SetModified(sal_True);
|
|
}
|
|
|
|
}
|
|
}
|
|
Engine()->ClearModifyFlag();
|
|
}
|
|
|
|
Engine()->GetUndoManager().Clear();
|
|
}
|
|
|
|
void AnnotationWindow::Paint( const Rectangle& rRect)
|
|
{
|
|
FloatingWindow::Paint( rRect );
|
|
|
|
if(mpMeta->IsVisible() && !mbReadonly)
|
|
{
|
|
//draw left over space
|
|
if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
|
|
SetFillColor(COL_BLACK);
|
|
else
|
|
SetFillColor(maColor);
|
|
SetLineColor();
|
|
DrawRect(PixelToLogic(Rectangle(Point(mpMeta->GetPosPixel().X()+mpMeta->GetSizePixel().Width(),mpMeta->GetPosPixel().Y()),Size(METABUTTON_AREA_WIDTH,mpMeta->GetSizePixel().Height()))));
|
|
|
|
if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode())
|
|
{
|
|
//draw rect around button
|
|
SetFillColor(COL_BLACK);
|
|
SetLineColor(COL_WHITE);
|
|
}
|
|
else
|
|
{
|
|
//draw button
|
|
Gradient aGradient;
|
|
if (mbMouseOverButton)
|
|
aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(80,maColorDark,maColor),ColorFromAlphaColor(15,maColorDark,maColor));
|
|
else
|
|
aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(15,maColorDark,maColor),ColorFromAlphaColor(80,maColorDark,maColor));
|
|
DrawGradient(maRectMetaButton,aGradient);
|
|
//draw rect around button
|
|
SetFillColor();
|
|
SetLineColor(ColorFromAlphaColor(90,maColorDark,maColor));
|
|
}
|
|
DrawRect(maRectMetaButton);
|
|
|
|
//draw arrow
|
|
if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
|
|
SetFillColor(COL_WHITE);
|
|
else
|
|
SetFillColor(COL_BLACK);
|
|
SetLineColor();
|
|
DrawPolygon(Polygon(maPopupTriangle));
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::MouseMove( const MouseEvent& rMEvt )
|
|
{
|
|
if( !mbReadonly )
|
|
{
|
|
if (maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())))
|
|
{
|
|
if (!mbMouseOverButton)
|
|
{
|
|
Invalidate(maRectMetaButton);
|
|
mbMouseOverButton = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (mbMouseOverButton)
|
|
{
|
|
Invalidate(maRectMetaButton);
|
|
mbMouseOverButton = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::MouseButtonDown( const MouseEvent& rMEvt )
|
|
{
|
|
if (!mbReadonly && maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft())
|
|
{
|
|
// context menu
|
|
Rectangle aRect(LogicToPixel(maRectMetaButton.BottomLeft()),LogicToPixel(maRectMetaButton.BottomLeft()));
|
|
mrManager.ExecuteAnnotationContextMenu( mxAnnotation, (::Window*)this, aRect, true );
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::Command( const CommandEvent& rCEvt )
|
|
{
|
|
if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
|
|
{
|
|
mrManager.ExecuteAnnotationContextMenu( mxAnnotation, this, Rectangle(rCEvt.GetMousePosPixel(),Size(1,1)) );
|
|
}
|
|
else
|
|
{
|
|
FloatingWindow::Command(rCEvt);
|
|
}
|
|
}
|
|
|
|
void AnnotationWindow::GetFocus()
|
|
{
|
|
if( mpTextWindow )
|
|
mpTextWindow->GrabFocus();
|
|
else
|
|
FloatingWindow::GetFocus();
|
|
}
|
|
|
|
void AnnotationWindow::ExecuteSlot( USHORT nSID )
|
|
{
|
|
if( nSID == SID_COPY )
|
|
{
|
|
getView()->Copy();
|
|
}
|
|
else if( nSID == SID_PASTE )
|
|
{
|
|
getView()->PasteSpecial();
|
|
DoResize();
|
|
}
|
|
else
|
|
{
|
|
SfxItemSet aEditAttr(getView()->GetAttribs());
|
|
SfxItemSet aNewAttr(mpOutliner->GetEmptyItemSet());
|
|
|
|
switch( nSID )
|
|
{
|
|
case SID_ATTR_CHAR_WEIGHT:
|
|
{
|
|
FontWeight eFW = ( (const SvxWeightItem&) aEditAttr.Get( EE_CHAR_WEIGHT ) ).GetWeight();
|
|
aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
|
|
}
|
|
break;
|
|
case SID_ATTR_CHAR_POSTURE:
|
|
{
|
|
FontItalic eFI = ( (const SvxPostureItem&) aEditAttr.Get( EE_CHAR_ITALIC ) ).GetPosture();
|
|
aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
|
|
}
|
|
break;
|
|
case SID_ATTR_CHAR_UNDERLINE:
|
|
{
|
|
FontUnderline eFU = ( (const SvxUnderlineItem&) aEditAttr. Get( EE_CHAR_UNDERLINE ) ).GetLineStyle();
|
|
aNewAttr.Put( SvxUnderlineItem( eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE ) );
|
|
}
|
|
break;
|
|
case SID_ATTR_CHAR_STRIKEOUT:
|
|
{
|
|
FontStrikeout eFSO = ( ( (const SvxCrossedOutItem&) aEditAttr.Get( EE_CHAR_STRIKEOUT ) ).GetStrikeout() );
|
|
aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
|
|
}
|
|
break;
|
|
}
|
|
getView()->SetAttribs( aNewAttr );
|
|
}
|
|
}
|
|
|
|
}
|