/**************************************************************
 *
 * 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_sd.hxx"

#include <editeng/fontitem.hxx>
#include <editeng/eeitem.hxx>
#include <editeng/fhgtitem.hxx>
#include <editeng/bulitem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/shdditem.hxx>
#include <editeng/flditem.hxx>
#include <editeng/frmdir.hxx>
#include <editeng/frmdiritem.hxx>
#include <editeng/langitem.hxx>
#include <editeng/adjitem.hxx>
#include <editeng/editview.hxx>
#include <svx/svdview.hxx>
#include <svx/sdrpaintwindow.hxx>
#include <svx/sdr/overlay/overlaymanager.hxx>
#include <editeng/editstat.hxx> //EditEngine flags
#include <editeng/outliner.hxx>
#include <editeng/editeng.hxx>
#include <editeng/editobj.hxx>
#include <editeng/unolingu.hxx>
#include <editeng/outlobj.hxx>
#include <editeng/postitem.hxx>
#include <editeng/wghtitem.hxx>
#include <editeng/udlnitem.hxx>
#include <editeng/crsditem.hxx>
#include <svx/svxids.hrc>
#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(sal_uInt8 aTransparency, Color &aFront, Color &aBack )
{
	return Color((sal_uInt8)(aFront.GetRed()	* aTransparency/(double)255	+ aBack.GetRed()	* (1-aTransparency/(double)255)),
				 (sal_uInt8)(aFront.GetGreen()	* aTransparency/(double)255	+ aBack.GetGreen()	* (1-aTransparency/(double)255)),
				 (sal_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)
{
	const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
	if ( !bHighContrast )
	{
		DrawGradient(Rectangle(Point(0,0),PixelToLogic(GetSizePixel())),
			Gradient(GRADIENT_LINEAR,mpAnnotationWindow->maColorLight,mpAnnotationWindow->maColor));
 	}

    if( mpOutlinerView )
	{
		Color aBackgroundColor( mpAnnotationWindow->maColor );
		if( bHighContrast )
		{
			aBackgroundColor = GetSettings().GetStyleSettings().GetWindowColor();
		}

		mpOutlinerView->SetBackgroundColor( aBackgroundColor );

	    mpOutlinerView->Paint( rRect );
	}
}

void AnnotationTextWindow::KeyInput( const KeyEvent& rKeyEvt )
{
	const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
	sal_uInt16 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(sal_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( sal_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 ) );

	sal_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( sal_True );

	Engine()->SetModifyHdl( Link() );
	Engine()->EnableUndo( sal_False );

	Engine()->ClearModifyFlag();
	Engine()->GetUndoManager().Clear();
	Engine()->EnableUndo( sal_True );
	Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );

	Invalidate();

	SetLanguage(GetLanguage());

	mpMeta->Show();
	mpVScrollbar->Show();
	mpTextWindow->Show();
}

void AnnotationWindow::StartEdit()
{
    getView()->SetSelection(ESelection(EE_PARA_MAX, EE_INDEX_MAX));
    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::SetLanguage(const SvxLanguageItem aNewItem)
{
	Engine()->SetModifyHdl( Link() );
	ESelection aOld = getView()->GetSelection();

    ESelection aNewSelection( 0, 0, 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() );

	const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
	if( bHighContrast )
	{
		StyleSettings aStyleSettings = GetSettings().GetStyleSettings();

		maColor = aStyleSettings.GetWindowColor();
		maColorDark = maColor;
		maColorLight = aStyleSettings.GetWindowTextColor();
	}
	else
	{
		maColor = mrManager.GetColor( nAuthorIdx );
		maColorDark = mrManager.GetColorDark( nAuthorIdx );
		maColorLight = mrManager.GetColorLight( nAuthorIdx );
	}

    mpOutlinerView->SetBackgroundColor(maColor);
	Engine()->SetBackgroundColor(maColor);

	{
		SvtAccessibilityOptions aOptions;
		Engine()->ForceAutoColor( bHighContrast || aOptions.GetIsAutomaticFontColor() );
	}

	mpMeta->SetControlBackground(maColor);
	AllSettings aSettings = mpMeta->GetSettings();
	StyleSettings aStyleSettings = aSettings.GetStyleSettings();
	aStyleSettings.SetFieldTextColor( bHighContrast ? maColorLight : 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 );

	// 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)
	{
		const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
		//draw left over space
		if ( bHighContrast )
			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 ( bHighContrast )
		{
			//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( bHighContrast )
			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 )
    {
		if( mpMeta->IsVisible() &&(mpMeta->GetPosPixel().Y() < rCEvt.GetMousePosPixel().Y()) )
			return;
	    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( sal_uInt16 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 );
    }
}

}
