1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
27*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
28*b1cdbd2cSJim Jagielski #include <editeng/fhgtitem.hxx>
29*b1cdbd2cSJim Jagielski #include <editeng/bulitem.hxx>
30*b1cdbd2cSJim Jagielski #include <editeng/udlnitem.hxx>
31*b1cdbd2cSJim Jagielski #include <editeng/shdditem.hxx>
32*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
33*b1cdbd2cSJim Jagielski #include <editeng/frmdir.hxx>
34*b1cdbd2cSJim Jagielski #include <editeng/frmdiritem.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/langitem.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/adjitem.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
38*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/sdr/overlay/overlaymanager.hxx>
41*b1cdbd2cSJim Jagielski #include <editeng/editstat.hxx> //EditEngine flags
42*b1cdbd2cSJim Jagielski #include <editeng/outliner.hxx>
43*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
44*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
45*b1cdbd2cSJim Jagielski #include <editeng/unolingu.hxx>
46*b1cdbd2cSJim Jagielski #include <editeng/outlobj.hxx>
47*b1cdbd2cSJim Jagielski #include <editeng/postitem.hxx>
48*b1cdbd2cSJim Jagielski #include <editeng/wghtitem.hxx>
49*b1cdbd2cSJim Jagielski #include <editeng/udlnitem.hxx>
50*b1cdbd2cSJim Jagielski #include <editeng/crsditem.hxx>
51*b1cdbd2cSJim Jagielski #include <svx/svxids.hrc>
52*b1cdbd2cSJim Jagielski #include <svtools/langtab.hxx>
53*b1cdbd2cSJim Jagielski #include <svl/slstitm.hxx>
54*b1cdbd2cSJim Jagielski #include <unotools/securityoptions.hxx>
55*b1cdbd2cSJim Jagielski #include <unotools/useroptions.hxx>
56*b1cdbd2cSJim Jagielski #include <svl/languageoptions.hxx>
57*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
58*b1cdbd2cSJim Jagielski #include <svtools/svmedit.hxx>
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #include <linguistic/lngprops.hxx>
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski #include <sfx2/request.hxx>
63*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
64*b1cdbd2cSJim Jagielski #include <sfx2/bindings.hxx>
65*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
66*b1cdbd2cSJim Jagielski #include <sfx2/mnumgr.hxx>
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski #include <vcl/vclenum.hxx>
69*b1cdbd2cSJim Jagielski #include <vcl/edit.hxx>
70*b1cdbd2cSJim Jagielski #include <vcl/help.hxx>
71*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx>
72*b1cdbd2cSJim Jagielski #include <vcl/button.hxx>
73*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
74*b1cdbd2cSJim Jagielski #include <vcl/gradient.hxx>
75*b1cdbd2cSJim Jagielski #include <vcl/salbtype.hxx>	// FRound
76*b1cdbd2cSJim Jagielski #include <vcl/cursor.hxx>
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
79*b1cdbd2cSJim Jagielski #include <basegfx/tuple/b2dtuple.hxx>
80*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski #include "annotations.hrc"
83*b1cdbd2cSJim Jagielski #include "annotationwindow.hxx"
84*b1cdbd2cSJim Jagielski #include "annotationmanagerimpl.hxx"
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski #include "DrawDocShell.hxx"
87*b1cdbd2cSJim Jagielski #include "ViewShell.hxx"
88*b1cdbd2cSJim Jagielski #include "drawdoc.hxx"
89*b1cdbd2cSJim Jagielski #include "View.hxx"
90*b1cdbd2cSJim Jagielski #include "textapi.hxx"
91*b1cdbd2cSJim Jagielski #include "sdresid.hxx"
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski using rtl::OUString;
94*b1cdbd2cSJim Jagielski using namespace ::sd;
95*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
96*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
97*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::office;
98*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski #define METABUTTON_WIDTH		16
101*b1cdbd2cSJim Jagielski #define METABUTTON_HEIGHT		18
102*b1cdbd2cSJim Jagielski #define METABUTTON_AREA_WIDTH	30
103*b1cdbd2cSJim Jagielski #define POSTIT_META_HEIGHT	(sal_Int32)		30
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski #define EMPTYSTRING				rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(""))
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski namespace sd {
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski extern OUString getAnnotationDateTimeString( const Reference< XAnnotation >& xAnnotation );
110*b1cdbd2cSJim Jagielski extern SfxItemPool* GetAnnotationPool();
111*b1cdbd2cSJim Jagielski extern com::sun::star::util::DateTime getCurrentDateTime();
112*b1cdbd2cSJim Jagielski 
ColorFromAlphaColor(sal_uInt8 aTransparency,Color & aFront,Color & aBack)113*b1cdbd2cSJim Jagielski Color ColorFromAlphaColor(sal_uInt8 aTransparency, Color &aFront, Color &aBack )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski 	return Color((sal_uInt8)(aFront.GetRed()	* aTransparency/(double)255	+ aBack.GetRed()	* (1-aTransparency/(double)255)),
116*b1cdbd2cSJim Jagielski 				 (sal_uInt8)(aFront.GetGreen()	* aTransparency/(double)255	+ aBack.GetGreen()	* (1-aTransparency/(double)255)),
117*b1cdbd2cSJim Jagielski 				 (sal_uInt8)(aFront.GetBlue()	* aTransparency/(double)255	+ aBack.GetBlue()	* (1-aTransparency/(double)255)));
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski /************ AnnotationTextWindow **********************************/
121*b1cdbd2cSJim Jagielski 
AnnotationTextWindow(AnnotationWindow * pParent,WinBits nBits)122*b1cdbd2cSJim Jagielski AnnotationTextWindow::AnnotationTextWindow( AnnotationWindow* pParent, WinBits nBits )
123*b1cdbd2cSJim Jagielski : Control(pParent, nBits)
124*b1cdbd2cSJim Jagielski , mpOutlinerView(0)
125*b1cdbd2cSJim Jagielski , mpAnnotationWindow( pParent )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
~AnnotationTextWindow()129*b1cdbd2cSJim Jagielski AnnotationTextWindow::~AnnotationTextWindow()
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)133*b1cdbd2cSJim Jagielski void AnnotationTextWindow::Paint( const Rectangle& rRect)
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski 	const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
136*b1cdbd2cSJim Jagielski 	if ( !bHighContrast )
137*b1cdbd2cSJim Jagielski 	{
138*b1cdbd2cSJim Jagielski 		DrawGradient(Rectangle(Point(0,0),PixelToLogic(GetSizePixel())),
139*b1cdbd2cSJim Jagielski 			Gradient(GRADIENT_LINEAR,mpAnnotationWindow->maColorLight,mpAnnotationWindow->maColor));
140*b1cdbd2cSJim Jagielski  	}
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski     if( mpOutlinerView )
143*b1cdbd2cSJim Jagielski 	{
144*b1cdbd2cSJim Jagielski 		Color aBackgroundColor( mpAnnotationWindow->maColor );
145*b1cdbd2cSJim Jagielski 		if( bHighContrast )
146*b1cdbd2cSJim Jagielski 		{
147*b1cdbd2cSJim Jagielski 			aBackgroundColor = GetSettings().GetStyleSettings().GetWindowColor();
148*b1cdbd2cSJim Jagielski 		}
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 		mpOutlinerView->SetBackgroundColor( aBackgroundColor );
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 	    mpOutlinerView->Paint( rRect );
153*b1cdbd2cSJim Jagielski 	}
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
KeyInput(const KeyEvent & rKeyEvt)156*b1cdbd2cSJim Jagielski void AnnotationTextWindow::KeyInput( const KeyEvent& rKeyEvt )
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski 	const KeyCode& rKeyCode = rKeyEvt.GetKeyCode();
159*b1cdbd2cSJim Jagielski 	sal_uInt16 nKey = rKeyCode.GetCode();
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	if ((rKeyCode.IsMod1() && rKeyCode.IsMod2()) && ((nKey == KEY_PAGEUP) || (nKey == KEY_PAGEDOWN)))
162*b1cdbd2cSJim Jagielski 	{
163*b1cdbd2cSJim Jagielski         SfxDispatcher* pDispatcher = mpAnnotationWindow->DocShell()->GetViewShell()->GetViewFrame()->GetDispatcher();
164*b1cdbd2cSJim Jagielski         if( pDispatcher )
165*b1cdbd2cSJim Jagielski             pDispatcher->Execute( nKey == KEY_PAGEDOWN ? SID_NEXT_POSTIT : SID_PREVIOUS_POSTIT );
166*b1cdbd2cSJim Jagielski     }
167*b1cdbd2cSJim Jagielski 	else if (nKey == KEY_INSERT)
168*b1cdbd2cSJim Jagielski 	{
169*b1cdbd2cSJim Jagielski 		if (!rKeyCode.IsMod1() && !rKeyCode.IsMod2())
170*b1cdbd2cSJim Jagielski 			mpAnnotationWindow->ToggleInsMode();
171*b1cdbd2cSJim Jagielski 	}
172*b1cdbd2cSJim Jagielski 	else
173*b1cdbd2cSJim Jagielski 	{
174*b1cdbd2cSJim Jagielski 		long aOldHeight = mpAnnotationWindow->GetPostItTextHeight();
175*b1cdbd2cSJim Jagielski 		bool bDone = false;
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 		/// HACK: need to switch off processing of Undo/Redo in Outliner
178*b1cdbd2cSJim Jagielski 		if ( !( (nKey == KEY_Z || nKey == KEY_Y) && rKeyCode.IsMod1()) )
179*b1cdbd2cSJim Jagielski 		{
180*b1cdbd2cSJim Jagielski 			bool bIsProtected = mpAnnotationWindow->IsProtected();
181*b1cdbd2cSJim Jagielski 			if (!bIsProtected || (bIsProtected && !mpAnnotationWindow->Engine()->GetEditEngine().DoesKeyChangeText(rKeyEvt)) )
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 			bDone = mpOutlinerView->PostKeyEvent( rKeyEvt );
184*b1cdbd2cSJim Jagielski 		}
185*b1cdbd2cSJim Jagielski 		if (bDone)
186*b1cdbd2cSJim Jagielski 		{
187*b1cdbd2cSJim Jagielski 			mpAnnotationWindow->ResizeIfNeccessary(aOldHeight,mpAnnotationWindow->GetPostItTextHeight());
188*b1cdbd2cSJim Jagielski 	    }
189*b1cdbd2cSJim Jagielski 		else
190*b1cdbd2cSJim Jagielski 		{
191*b1cdbd2cSJim Jagielski 			Control::KeyInput(rKeyEvt);
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rMEvt)196*b1cdbd2cSJim Jagielski void AnnotationTextWindow::MouseMove( const MouseEvent& rMEvt )
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski 	if ( mpOutlinerView )
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		mpOutlinerView->MouseMove( rMEvt );
201*b1cdbd2cSJim Jagielski 		SetPointer( mpOutlinerView->GetPointer( rMEvt.GetPosPixel() ) );
202*b1cdbd2cSJim Jagielski 	}
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)205*b1cdbd2cSJim Jagielski void AnnotationTextWindow::MouseButtonDown( const MouseEvent& rMEvt )
206*b1cdbd2cSJim Jagielski {
207*b1cdbd2cSJim Jagielski 	GrabFocus();
208*b1cdbd2cSJim Jagielski 	if ( mpOutlinerView )
209*b1cdbd2cSJim Jagielski 		mpOutlinerView->MouseButtonDown( rMEvt );
210*b1cdbd2cSJim Jagielski 	// todo mpOutlinerView->DocView()->GetViewFrame()->GetBindings().InvalidateAll(sal_False);
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski 
MouseButtonUp(const MouseEvent & rMEvt)213*b1cdbd2cSJim Jagielski void AnnotationTextWindow::MouseButtonUp( const MouseEvent& rMEvt )
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski 	if ( mpOutlinerView )
216*b1cdbd2cSJim Jagielski 		mpOutlinerView->MouseButtonUp( rMEvt );
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)219*b1cdbd2cSJim Jagielski void AnnotationTextWindow::Command( const CommandEvent& rCEvt )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
222*b1cdbd2cSJim Jagielski     {
223*b1cdbd2cSJim Jagielski    	    mpAnnotationWindow->Command(rCEvt);
224*b1cdbd2cSJim Jagielski     }
225*b1cdbd2cSJim Jagielski     else
226*b1cdbd2cSJim Jagielski     {
227*b1cdbd2cSJim Jagielski 	    if ( mpOutlinerView )
228*b1cdbd2cSJim Jagielski 		    mpOutlinerView->Command( rCEvt );
229*b1cdbd2cSJim Jagielski 	    else
230*b1cdbd2cSJim Jagielski 		    Window::Command(rCEvt);
231*b1cdbd2cSJim Jagielski     }
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
GetFocus()234*b1cdbd2cSJim Jagielski void AnnotationTextWindow::GetFocus()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	Window::GetFocus();
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski 
LoseFocus()239*b1cdbd2cSJim Jagielski void AnnotationTextWindow::LoseFocus()
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski //    if ( mpAnnotationWindow )
242*b1cdbd2cSJim Jagielski //        mpAnnotationWindow->UpdateAnnotation();
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski 	Window::LoseFocus();
245*b1cdbd2cSJim Jagielski }
246*b1cdbd2cSJim Jagielski 
GetSurroundingText() const247*b1cdbd2cSJim Jagielski XubString AnnotationTextWindow::GetSurroundingText() const
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski 	if( mpOutlinerView )
250*b1cdbd2cSJim Jagielski 	{
251*b1cdbd2cSJim Jagielski 		EditEngine *aEditEngine = mpOutlinerView->GetEditView().GetEditEngine();
252*b1cdbd2cSJim Jagielski 		if( mpOutlinerView->HasSelection() )
253*b1cdbd2cSJim Jagielski 			return mpOutlinerView->GetSelected();
254*b1cdbd2cSJim Jagielski 		else
255*b1cdbd2cSJim Jagielski 		{
256*b1cdbd2cSJim Jagielski 		    ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
257*b1cdbd2cSJim Jagielski 		    XubString aStr = aEditEngine->GetText(aSelection.nStartPara);
258*b1cdbd2cSJim Jagielski 		    return aStr;
259*b1cdbd2cSJim Jagielski 		}
260*b1cdbd2cSJim Jagielski 	}
261*b1cdbd2cSJim Jagielski 	else
262*b1cdbd2cSJim Jagielski 		return XubString::EmptyString();
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
GetSurroundingTextSelection() const265*b1cdbd2cSJim Jagielski Selection AnnotationTextWindow::GetSurroundingTextSelection() const
266*b1cdbd2cSJim Jagielski {
267*b1cdbd2cSJim Jagielski 	if( mpOutlinerView )
268*b1cdbd2cSJim Jagielski 	{
269*b1cdbd2cSJim Jagielski 		if( mpOutlinerView->HasSelection() )
270*b1cdbd2cSJim Jagielski 			return Selection( 0, mpOutlinerView->GetSelected().Len() );
271*b1cdbd2cSJim Jagielski 		else
272*b1cdbd2cSJim Jagielski 		{
273*b1cdbd2cSJim Jagielski 			ESelection aSelection = mpOutlinerView->GetEditView().GetSelection();
274*b1cdbd2cSJim Jagielski 			return Selection( aSelection.nStartPos, aSelection.nEndPos );
275*b1cdbd2cSJim Jagielski 		}
276*b1cdbd2cSJim Jagielski 	}
277*b1cdbd2cSJim Jagielski 	else
278*b1cdbd2cSJim Jagielski 		return Selection( 0, 0 );
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski /************** AnnotationWindow***********************************++*/
282*b1cdbd2cSJim Jagielski 
AnnotationWindow(AnnotationManagerImpl & rManager,DrawDocShell * pDocShell,Window * pParent)283*b1cdbd2cSJim Jagielski AnnotationWindow::AnnotationWindow( AnnotationManagerImpl& rManager, DrawDocShell* pDocShell, Window* pParent )
284*b1cdbd2cSJim Jagielski : FloatingWindow(pParent, WB_SYSTEMWINDOW|WB_BORDER|WB_NEEDSFOCUS)
285*b1cdbd2cSJim Jagielski , mrManager( rManager )
286*b1cdbd2cSJim Jagielski , mpDocShell( pDocShell )
287*b1cdbd2cSJim Jagielski , mpView( pDocShell->GetViewShell()->GetView() )
288*b1cdbd2cSJim Jagielski , mpDoc( pDocShell->GetDoc() )
289*b1cdbd2cSJim Jagielski , mpOutlinerView(0)
290*b1cdbd2cSJim Jagielski , mpOutliner(0)
291*b1cdbd2cSJim Jagielski , mpVScrollbar(0)
292*b1cdbd2cSJim Jagielski , mbReadonly(pDocShell->IsReadOnly())
293*b1cdbd2cSJim Jagielski , mbProtected(false)
294*b1cdbd2cSJim Jagielski , mbMouseOverButton(false)
295*b1cdbd2cSJim Jagielski , mpTextWindow(0)
296*b1cdbd2cSJim Jagielski , mpMeta(0)
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski 
~AnnotationWindow()300*b1cdbd2cSJim Jagielski AnnotationWindow::~AnnotationWindow()
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski     delete mpMeta;
303*b1cdbd2cSJim Jagielski 	delete mpOutlinerView;
304*b1cdbd2cSJim Jagielski 	delete mpOutliner;
305*b1cdbd2cSJim Jagielski 	delete mpVScrollbar;
306*b1cdbd2cSJim Jagielski     delete mpTextWindow;
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
InitControls()309*b1cdbd2cSJim Jagielski void AnnotationWindow::InitControls()
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski 	// actual window which holds the user text
312*b1cdbd2cSJim Jagielski 	mpTextWindow = new AnnotationTextWindow(this, WB_NODIALOGCONTROL);
313*b1cdbd2cSJim Jagielski 	mpTextWindow->SetPointer(Pointer(POINTER_TEXT));
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	// window control for author and date
316*b1cdbd2cSJim Jagielski 	mpMeta = new MultiLineEdit(this,0);
317*b1cdbd2cSJim Jagielski 	mpMeta->SetReadOnly();
318*b1cdbd2cSJim Jagielski 	mpMeta->SetRightToLeft(Application::GetSettings().GetLayoutRTL());
319*b1cdbd2cSJim Jagielski 	mpMeta->AlwaysDisableInput(true);
320*b1cdbd2cSJim Jagielski 	mpMeta->SetCallHandlersOnInputDisabled(true);
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski //	mpMeta->AddEventListener( LINK( mpPostItTxt, PostItTxt, WindowEventListener ) );
323*b1cdbd2cSJim Jagielski //	AddEventListener( LINK( mpTextWindow, PostItTxt, WindowEventListener ) );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 	// we should leave this setting alone, but for this we need a better layout algo
326*b1cdbd2cSJim Jagielski 	// with variable meta size height
327*b1cdbd2cSJim Jagielski 	AllSettings aSettings = mpMeta->GetSettings();
328*b1cdbd2cSJim Jagielski 	StyleSettings aStyleSettings = aSettings.GetStyleSettings();
329*b1cdbd2cSJim Jagielski 	Font aFont = aStyleSettings.GetFieldFont();
330*b1cdbd2cSJim Jagielski 	aFont.SetHeight(8);
331*b1cdbd2cSJim Jagielski 	aStyleSettings.SetFieldFont(aFont);
332*b1cdbd2cSJim Jagielski 	aSettings.SetStyleSettings(aStyleSettings);
333*b1cdbd2cSJim Jagielski 	mpMeta->SetSettings(aSettings);
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	mpOutliner = new ::Outliner(GetAnnotationPool(),OUTLINERMODE_TEXTOBJECT);
336*b1cdbd2cSJim Jagielski 	Doc()->SetCalcFieldValueHdl( mpOutliner );
337*b1cdbd2cSJim Jagielski 	mpOutliner->SetUpdateMode( sal_True );
338*b1cdbd2cSJim Jagielski 	Rescale();
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	OutputDevice* pDev = Doc()->GetRefDevice();
341*b1cdbd2cSJim Jagielski 	if( pDev )
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		mpOutliner->SetRefDevice( pDev );
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	mpOutlinerView = new OutlinerView ( mpOutliner, mpTextWindow );
347*b1cdbd2cSJim Jagielski 	mpOutliner->InsertView(mpOutlinerView );
348*b1cdbd2cSJim Jagielski 	mpTextWindow->SetOutlinerView(mpOutlinerView);
349*b1cdbd2cSJim Jagielski 	mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,1,1) ) );
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski //	SfxItemSet item(DocShell()->GetPool());
352*b1cdbd2cSJim Jagielski //	item.Put(SvxFontHeightItem(352,100,EE_CHAR_FONTHEIGHT));
353*b1cdbd2cSJim Jagielski //	mpOutlinerView->SetAttribs(item);
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 	// TODO: ??
356*b1cdbd2cSJim Jagielski 	EEHorizontalTextDirection aDefHoriTextDir = Application::GetSettings().GetLayoutRTL() ? EE_HTEXTDIR_R2L : EE_HTEXTDIR_L2R;
357*b1cdbd2cSJim Jagielski 	mpOutliner->SetDefaultHorizontalTextDirection( aDefHoriTextDir );
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	//create Scrollbars
360*b1cdbd2cSJim Jagielski 	mpVScrollbar = new ScrollBar(this, WB_3DLOOK |WB_VSCROLL|WB_DRAG);
361*b1cdbd2cSJim Jagielski 	mpVScrollbar->EnableNativeWidget(false);
362*b1cdbd2cSJim Jagielski 	mpVScrollbar->EnableRTL( false );
363*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetScrollHdl(LINK(this, AnnotationWindow, ScrollHdl));
364*b1cdbd2cSJim Jagielski 	mpVScrollbar->EnableDrag();
365*b1cdbd2cSJim Jagielski //	mpVScrollbar->AddEventListener( LINK( this, AnnotationWindow, WindowEventListener ) );
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	sal_uLong nCntrl = mpOutliner->GetControlWord();
368*b1cdbd2cSJim Jagielski 	nCntrl |= EE_CNTRL_PASTESPECIAL | EE_CNTRL_AUTOCORRECT  | EV_CNTRL_AUTOSCROLL | EE_CNTRL_NOCOLORS;
369*b1cdbd2cSJim Jagielski /*
370*b1cdbd2cSJim Jagielski 	if (pVOpt->IsFieldShadings())
371*b1cdbd2cSJim Jagielski 		nCntrl |= EE_CNTRL_MARKFIELDS;
372*b1cdbd2cSJim Jagielski 	else
373*b1cdbd2cSJim Jagielski 		nCntrl &= ~EE_CNTRL_MARKFIELDS;
374*b1cdbd2cSJim Jagielski 	if (pVOpt->IsOnlineSpell())
375*b1cdbd2cSJim Jagielski 		nCntrl |= EE_CNTRL_ONLINESPELLING;
376*b1cdbd2cSJim Jagielski 	else
377*b1cdbd2cSJim Jagielski 		nCntrl &= ~EE_CNTRL_ONLINESPELLING;
378*b1cdbd2cSJim Jagielski */
379*b1cdbd2cSJim Jagielski 	mpOutliner->SetControlWord(nCntrl);
380*b1cdbd2cSJim Jagielski //	mpOutliner->SetFlatMode( sal_True );
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski 	Engine()->SetModifyHdl( Link() );
383*b1cdbd2cSJim Jagielski 	Engine()->EnableUndo( sal_False );
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 	Engine()->ClearModifyFlag();
386*b1cdbd2cSJim Jagielski 	Engine()->GetUndoManager().Clear();
387*b1cdbd2cSJim Jagielski 	Engine()->EnableUndo( sal_True );
388*b1cdbd2cSJim Jagielski 	Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski 	Invalidate();
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 	SetLanguage(GetLanguage());
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski 	mpMeta->Show();
395*b1cdbd2cSJim Jagielski 	mpVScrollbar->Show();
396*b1cdbd2cSJim Jagielski 	mpTextWindow->Show();
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski 
StartEdit()399*b1cdbd2cSJim Jagielski void AnnotationWindow::StartEdit()
400*b1cdbd2cSJim Jagielski {
401*b1cdbd2cSJim Jagielski     getView()->SetSelection(ESelection(0xFFFF,0xFFFF,0xFFFF,0xFFFF));
402*b1cdbd2cSJim Jagielski     getView()->ShowCursor();
403*b1cdbd2cSJim Jagielski }
404*b1cdbd2cSJim Jagielski 
Rescale()405*b1cdbd2cSJim Jagielski void AnnotationWindow::Rescale()
406*b1cdbd2cSJim Jagielski {
407*b1cdbd2cSJim Jagielski 	MapMode aMode(MAP_100TH_MM);
408*b1cdbd2cSJim Jagielski 	aMode.SetOrigin( Point() );
409*b1cdbd2cSJim Jagielski 	//aMode.SetScaleX( aMode.GetScaleX() * Fraction( 8, 10 ) );
410*b1cdbd2cSJim Jagielski 	//aMode.SetScaleY( aMode.GetScaleY() * Fraction( 8, 10 ) );
411*b1cdbd2cSJim Jagielski 	mpOutliner->SetRefMapMode( aMode );
412*b1cdbd2cSJim Jagielski 	SetMapMode( aMode );
413*b1cdbd2cSJim Jagielski 	mpTextWindow->SetMapMode( aMode );
414*b1cdbd2cSJim Jagielski 	if ( mpMeta )
415*b1cdbd2cSJim Jagielski 	{
416*b1cdbd2cSJim Jagielski 		Font aFont( mpMeta->GetSettings().GetStyleSettings().GetFieldFont() );
417*b1cdbd2cSJim Jagielski 		sal_Int32 nHeight = aFont.GetHeight();
418*b1cdbd2cSJim Jagielski 		nHeight = nHeight * aMode.GetScaleY().GetNumerator() / aMode.GetScaleY().GetDenominator();
419*b1cdbd2cSJim Jagielski 		aFont.SetHeight( nHeight );
420*b1cdbd2cSJim Jagielski 		mpMeta->SetControlFont( aFont );
421*b1cdbd2cSJim Jagielski 	}
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
DoResize()424*b1cdbd2cSJim Jagielski void AnnotationWindow::DoResize()
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski 	unsigned long aWidth	=	GetSizePixel().Width();
427*b1cdbd2cSJim Jagielski 	long aHeight			=	GetSizePixel().Height() - POSTIT_META_HEIGHT;
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski 	mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
430*b1cdbd2cSJim Jagielski 	long aTextHeight		=   LogicToPixel( mpOutliner->CalcTextSize()).Height();
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 	if( aTextHeight > aHeight )
433*b1cdbd2cSJim Jagielski 	{	// we need vertical scrollbars and have to reduce the width
434*b1cdbd2cSJim Jagielski 		aWidth -= GetScrollbarWidth();
435*b1cdbd2cSJim Jagielski 		mpVScrollbar->Show();
436*b1cdbd2cSJim Jagielski 	}
437*b1cdbd2cSJim Jagielski 	else
438*b1cdbd2cSJim Jagielski 	{
439*b1cdbd2cSJim Jagielski 		mpVScrollbar->Hide();
440*b1cdbd2cSJim Jagielski 	}
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski 	mpTextWindow->SetPosSizePixel(0,0,aWidth, aHeight);
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski     if( mbReadonly )
445*b1cdbd2cSJim Jagielski         mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width(),POSTIT_META_HEIGHT);
446*b1cdbd2cSJim Jagielski     else
447*b1cdbd2cSJim Jagielski 	    mpMeta->SetPosSizePixel(0,aHeight,GetSizePixel().Width()-METABUTTON_AREA_WIDTH,POSTIT_META_HEIGHT);
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 	mpOutliner->SetPaperSize( PixelToLogic( Size(aWidth,aHeight) ) ) ;
450*b1cdbd2cSJim Jagielski 	mpOutlinerView->SetOutputArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
451*b1cdbd2cSJim Jagielski 	if (!mpVScrollbar->IsVisible())
452*b1cdbd2cSJim Jagielski 	{	// if we do not have a scrollbar anymore, we want to see the complete text
453*b1cdbd2cSJim Jagielski 		mpOutlinerView->SetVisArea( PixelToLogic( Rectangle(0,0,aWidth,aHeight) ) );
454*b1cdbd2cSJim Jagielski 	}
455*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetPosSizePixel( 0 + aWidth, 0, GetScrollbarWidth(), aHeight );
456*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetVisibleSize( PixelToLogic(Size(0,aHeight)).Height() );
457*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetPageSize( PixelToLogic(Size(0,aHeight)).Height() * 8 / 10 );
458*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetLineSize( mpOutliner->GetTextHeight() / 10 );
459*b1cdbd2cSJim Jagielski 	SetScrollbar();
460*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetRange( Range(0, mpOutliner->GetTextHeight()));
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 	Point aPos( mpMeta->GetPosPixel());
463*b1cdbd2cSJim Jagielski 	Point aBase( aPos.X() + aPos.X() + GetSizePixel().Width(), aPos.Y() );
464*b1cdbd2cSJim Jagielski 	Point aLeft = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+5), aBase.Y()+17 ) );
465*b1cdbd2cSJim Jagielski 	Point aRight = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH-1), aBase.Y()+17 ) );
466*b1cdbd2cSJim Jagielski 	Point aBottom = PixelToLogic( Point( aBase.X() - (METABUTTON_WIDTH+2), aBase.Y()+20 ) );
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 	maPopupTriangle.clear();
469*b1cdbd2cSJim Jagielski 	maPopupTriangle.append(basegfx::B2DPoint(aLeft.X(),aLeft.Y()));
470*b1cdbd2cSJim Jagielski 	maPopupTriangle.append(basegfx::B2DPoint(aRight.X(),aRight.Y()));
471*b1cdbd2cSJim Jagielski 	maPopupTriangle.append(basegfx::B2DPoint(aBottom.X(),aBottom.Y()));
472*b1cdbd2cSJim Jagielski 	maPopupTriangle.setClosed(true);
473*b1cdbd2cSJim Jagielski 	maRectMetaButton = PixelToLogic( Rectangle( Point(
474*b1cdbd2cSJim Jagielski 			aPos.X()+GetSizePixel().Width()-(METABUTTON_WIDTH+10),
475*b1cdbd2cSJim Jagielski 			aPos.Y()+5 ),
476*b1cdbd2cSJim Jagielski 			Size( METABUTTON_WIDTH, METABUTTON_HEIGHT ) ) );
477*b1cdbd2cSJim Jagielski 
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski 
SetSizePixel(const Size & rNewSize)480*b1cdbd2cSJim Jagielski void AnnotationWindow::SetSizePixel( const Size& rNewSize )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski 	Window::SetSizePixel(rNewSize);
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski 
SetScrollbar()485*b1cdbd2cSJim Jagielski void AnnotationWindow::SetScrollbar()
486*b1cdbd2cSJim Jagielski {
487*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetThumbPos( mpOutlinerView->GetVisArea().Top()+ mpOutlinerView->GetEditView().GetCursor()->GetOffsetY());
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
ResizeIfNeccessary(long aOldHeight,long aNewHeight)490*b1cdbd2cSJim Jagielski void AnnotationWindow::ResizeIfNeccessary(long aOldHeight, long aNewHeight)
491*b1cdbd2cSJim Jagielski {
492*b1cdbd2cSJim Jagielski 	if (aOldHeight != aNewHeight)
493*b1cdbd2cSJim Jagielski 	{
494*b1cdbd2cSJim Jagielski 		DoResize();
495*b1cdbd2cSJim Jagielski 		Invalidate();
496*b1cdbd2cSJim Jagielski 	}
497*b1cdbd2cSJim Jagielski 	else
498*b1cdbd2cSJim Jagielski 	{
499*b1cdbd2cSJim Jagielski 		SetScrollbar();
500*b1cdbd2cSJim Jagielski 	}
501*b1cdbd2cSJim Jagielski }
502*b1cdbd2cSJim Jagielski 
SetLanguage(const SvxLanguageItem aNewItem)503*b1cdbd2cSJim Jagielski void AnnotationWindow::SetLanguage(const SvxLanguageItem aNewItem)
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski 	Engine()->SetModifyHdl( Link() );
506*b1cdbd2cSJim Jagielski 	ESelection aOld = getView()->GetSelection();
507*b1cdbd2cSJim Jagielski 
508*b1cdbd2cSJim Jagielski     ESelection aNewSelection( 0, 0, (sal_uInt16)Engine()->GetParagraphCount()-1, USHRT_MAX );
509*b1cdbd2cSJim Jagielski 	getView()->SetSelection( aNewSelection );
510*b1cdbd2cSJim Jagielski 	SfxItemSet aEditAttr(getView()->GetAttribs());
511*b1cdbd2cSJim Jagielski 	aEditAttr.Put(aNewItem);
512*b1cdbd2cSJim Jagielski 	getView()->SetAttribs( aEditAttr );
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 	getView()->SetSelection(aOld);
515*b1cdbd2cSJim Jagielski 	Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski 	Invalidate();
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski 
ToggleInsMode()520*b1cdbd2cSJim Jagielski void AnnotationWindow::ToggleInsMode()
521*b1cdbd2cSJim Jagielski {
522*b1cdbd2cSJim Jagielski     if( mpOutlinerView )
523*b1cdbd2cSJim Jagielski     {
524*b1cdbd2cSJim Jagielski 		SfxBindings &rBnd = mpDocShell->GetViewShell()->GetViewFrame()->GetBindings();
525*b1cdbd2cSJim Jagielski 		rBnd.Invalidate(SID_ATTR_INSERT);
526*b1cdbd2cSJim Jagielski 		rBnd.Update(SID_ATTR_INSERT);
527*b1cdbd2cSJim Jagielski 	}
528*b1cdbd2cSJim Jagielski }
529*b1cdbd2cSJim Jagielski 
GetPostItTextHeight()530*b1cdbd2cSJim Jagielski long AnnotationWindow::GetPostItTextHeight()
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski 	return mpOutliner ? LogicToPixel(mpOutliner->CalcTextSize()).Height() : 0;
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski 
IMPL_LINK(AnnotationWindow,ScrollHdl,ScrollBar *,pScroll)535*b1cdbd2cSJim Jagielski IMPL_LINK(AnnotationWindow, ScrollHdl, ScrollBar*, pScroll)
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski 	long nDiff = getView()->GetEditView().GetVisArea().Top() - pScroll->GetThumbPos();
538*b1cdbd2cSJim Jagielski 	getView()->Scroll( 0, nDiff );
539*b1cdbd2cSJim Jagielski 	return 0;
540*b1cdbd2cSJim Jagielski }
541*b1cdbd2cSJim Jagielski 
IMPL_LINK(AnnotationWindow,ModifyHdl,void *,EMPTYARG)542*b1cdbd2cSJim Jagielski IMPL_LINK(AnnotationWindow, ModifyHdl, void*, EMPTYARG)
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski 	return 0;
545*b1cdbd2cSJim Jagielski }
546*b1cdbd2cSJim Jagielski 
GetScrollbarWidth()547*b1cdbd2cSJim Jagielski sal_Int32 AnnotationWindow::GetScrollbarWidth()
548*b1cdbd2cSJim Jagielski {
549*b1cdbd2cSJim Jagielski 	return 16;
550*b1cdbd2cSJim Jagielski //	return mpView->GetWrtShell().GetViewOptions()->GetZoom() / 10;
551*b1cdbd2cSJim Jagielski }
552*b1cdbd2cSJim Jagielski 
GetLanguage(void)553*b1cdbd2cSJim Jagielski SvxLanguageItem AnnotationWindow::GetLanguage(void)
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski 	return SvxLanguageItem( Doc()->GetLanguage( EE_CHAR_LANGUAGE ), SID_ATTR_LANGUAGE );
556*b1cdbd2cSJim Jagielski }
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
559*b1cdbd2cSJim Jagielski 
getTextApiObject(const Reference<XAnnotation> & xAnnotation)560*b1cdbd2cSJim Jagielski TextApiObject* getTextApiObject( const Reference< XAnnotation >& xAnnotation )
561*b1cdbd2cSJim Jagielski {
562*b1cdbd2cSJim Jagielski 	if( xAnnotation.is() )
563*b1cdbd2cSJim Jagielski 	{
564*b1cdbd2cSJim Jagielski 		Reference< XText > xText( xAnnotation->getTextRange() );
565*b1cdbd2cSJim Jagielski 		return TextApiObject::getImplementation( xText );
566*b1cdbd2cSJim Jagielski 	}
567*b1cdbd2cSJim Jagielski 	return 0;
568*b1cdbd2cSJim Jagielski }
569*b1cdbd2cSJim Jagielski 
570*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------
571*b1cdbd2cSJim Jagielski 
setAnnotation(const Reference<XAnnotation> & xAnnotation,bool bGrabFocus)572*b1cdbd2cSJim Jagielski void AnnotationWindow::setAnnotation( const Reference< XAnnotation >& xAnnotation, bool bGrabFocus )
573*b1cdbd2cSJim Jagielski {
574*b1cdbd2cSJim Jagielski 	if( (xAnnotation != mxAnnotation) && xAnnotation.is() )
575*b1cdbd2cSJim Jagielski 	{
576*b1cdbd2cSJim Jagielski 		mxAnnotation = xAnnotation;
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski         SetColor();
579*b1cdbd2cSJim Jagielski 
580*b1cdbd2cSJim Jagielski         SvtUserOptions aUserOptions;
581*b1cdbd2cSJim Jagielski         mbProtected = aUserOptions.GetFullName() != xAnnotation->getAuthor();
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 		Engine()->Clear();
584*b1cdbd2cSJim Jagielski 		TextApiObject* pTextApi = getTextApiObject( mxAnnotation );
585*b1cdbd2cSJim Jagielski 
586*b1cdbd2cSJim Jagielski 		if( pTextApi )
587*b1cdbd2cSJim Jagielski 		{
588*b1cdbd2cSJim Jagielski 			std::auto_ptr< OutlinerParaObject > pOPO( pTextApi->CreateText() );
589*b1cdbd2cSJim Jagielski 			Engine()->SetText( *pOPO.get() );
590*b1cdbd2cSJim Jagielski 		}
591*b1cdbd2cSJim Jagielski 
592*b1cdbd2cSJim Jagielski 		Engine()->SetModifyHdl( LINK( this, AnnotationWindow, ModifyHdl ) );
593*b1cdbd2cSJim Jagielski 		Engine()->ClearModifyFlag();
594*b1cdbd2cSJim Jagielski 		Engine()->GetUndoManager().Clear();
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 		Invalidate();
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski         OUString sMeta( xAnnotation->getAuthor() );
599*b1cdbd2cSJim Jagielski         OUString sDateTime( getAnnotationDateTimeString(xAnnotation) );
600*b1cdbd2cSJim Jagielski 
601*b1cdbd2cSJim Jagielski         if( sDateTime.getLength() != 0 )
602*b1cdbd2cSJim Jagielski         {
603*b1cdbd2cSJim Jagielski             if( sMeta.getLength() != 0 )
604*b1cdbd2cSJim Jagielski                 sMeta += OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" ) );
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski            sMeta += sDateTime;
607*b1cdbd2cSJim Jagielski         }
608*b1cdbd2cSJim Jagielski 	    mpMeta->SetText(sMeta);
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski 		if( bGrabFocus )
611*b1cdbd2cSJim Jagielski 		    GrabFocus();
612*b1cdbd2cSJim Jagielski 	}
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski 
SetColor()615*b1cdbd2cSJim Jagielski void AnnotationWindow::SetColor()
616*b1cdbd2cSJim Jagielski {
617*b1cdbd2cSJim Jagielski     sal_uInt16 nAuthorIdx = mpDoc->GetAnnotationAuthorIndex( mxAnnotation->getAuthor() );
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 	const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
620*b1cdbd2cSJim Jagielski 	if( bHighContrast )
621*b1cdbd2cSJim Jagielski 	{
622*b1cdbd2cSJim Jagielski 		StyleSettings aStyleSettings = GetSettings().GetStyleSettings();
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski 		maColor = aStyleSettings.GetWindowColor();
625*b1cdbd2cSJim Jagielski 		maColorDark = maColor;
626*b1cdbd2cSJim Jagielski 		maColorLight = aStyleSettings.GetWindowTextColor();
627*b1cdbd2cSJim Jagielski 	}
628*b1cdbd2cSJim Jagielski 	else
629*b1cdbd2cSJim Jagielski 	{
630*b1cdbd2cSJim Jagielski 		maColor = mrManager.GetColor( nAuthorIdx );
631*b1cdbd2cSJim Jagielski 		maColorDark = mrManager.GetColorDark( nAuthorIdx );
632*b1cdbd2cSJim Jagielski 		maColorLight = mrManager.GetColorLight( nAuthorIdx );
633*b1cdbd2cSJim Jagielski 	}
634*b1cdbd2cSJim Jagielski 
635*b1cdbd2cSJim Jagielski     mpOutlinerView->SetBackgroundColor(maColor);
636*b1cdbd2cSJim Jagielski 	Engine()->SetBackgroundColor(maColor);
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 	{
639*b1cdbd2cSJim Jagielski 		SvtAccessibilityOptions aOptions;
640*b1cdbd2cSJim Jagielski 		Engine()->ForceAutoColor( bHighContrast || aOptions.GetIsAutomaticFontColor() );
641*b1cdbd2cSJim Jagielski 	}
642*b1cdbd2cSJim Jagielski 
643*b1cdbd2cSJim Jagielski 	mpMeta->SetControlBackground(maColor);
644*b1cdbd2cSJim Jagielski 	AllSettings aSettings = mpMeta->GetSettings();
645*b1cdbd2cSJim Jagielski 	StyleSettings aStyleSettings = aSettings.GetStyleSettings();
646*b1cdbd2cSJim Jagielski 	aStyleSettings.SetFieldTextColor( bHighContrast ? maColorLight : maColorDark);
647*b1cdbd2cSJim Jagielski 	aSettings.SetStyleSettings(aStyleSettings);
648*b1cdbd2cSJim Jagielski 	mpMeta->SetSettings(aSettings);
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski 	AllSettings aSettings2 = mpVScrollbar->GetSettings();
651*b1cdbd2cSJim Jagielski 	StyleSettings aStyleSettings2 = aSettings2.GetStyleSettings();
652*b1cdbd2cSJim Jagielski 	aStyleSettings2.SetButtonTextColor(Color(0,0,0));
653*b1cdbd2cSJim Jagielski 	aStyleSettings2.SetCheckedColor(maColorLight); //hintergund
654*b1cdbd2cSJim Jagielski 	aStyleSettings2.SetShadowColor(maColorDark);
655*b1cdbd2cSJim Jagielski 	aStyleSettings2.SetFaceColor(maColor);
656*b1cdbd2cSJim Jagielski 	aSettings2.SetStyleSettings(aStyleSettings2);
657*b1cdbd2cSJim Jagielski 	mpVScrollbar->SetSettings(aSettings2);
658*b1cdbd2cSJim Jagielski }
659*b1cdbd2cSJim Jagielski 
Deactivate()660*b1cdbd2cSJim Jagielski void AnnotationWindow::Deactivate()
661*b1cdbd2cSJim Jagielski {
662*b1cdbd2cSJim Jagielski     Reference< XAnnotation > xAnnotation( mxAnnotation );
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski 	// write changed text back to annotation
665*b1cdbd2cSJim Jagielski     if ( Engine()->IsModified() )
666*b1cdbd2cSJim Jagielski     {
667*b1cdbd2cSJim Jagielski 	    TextApiObject* pTextApi = getTextApiObject( xAnnotation );
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 	    if( pTextApi )
670*b1cdbd2cSJim Jagielski 	    {
671*b1cdbd2cSJim Jagielski 		    OutlinerParaObject* pOPO = Engine()->CreateParaObject();
672*b1cdbd2cSJim Jagielski 		    if( pOPO )
673*b1cdbd2cSJim Jagielski 		    {
674*b1cdbd2cSJim Jagielski                 if( mpDoc->IsUndoEnabled() )
675*b1cdbd2cSJim Jagielski                     mpDoc->BegUndo( String( SdResId( STR_ANNOTATION_UNDO_EDIT ) ) );
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski 			    pTextApi->SetText( *pOPO );
678*b1cdbd2cSJim Jagielski 			    delete pOPO;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski                 // set current time to changed annotation
681*b1cdbd2cSJim Jagielski                 xAnnotation->setDateTime( getCurrentDateTime() );
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 	            if( mpDoc->IsUndoEnabled() )
684*b1cdbd2cSJim Jagielski                     mpDoc->EndUndo();
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski             	DocView()->GetDocSh()->SetModified(sal_True);
687*b1cdbd2cSJim Jagielski 		    }
688*b1cdbd2cSJim Jagielski 
689*b1cdbd2cSJim Jagielski 	    }
690*b1cdbd2cSJim Jagielski     }
691*b1cdbd2cSJim Jagielski 	Engine()->ClearModifyFlag();
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski 	Engine()->GetUndoManager().Clear();
694*b1cdbd2cSJim Jagielski }
695*b1cdbd2cSJim Jagielski 
Paint(const Rectangle & rRect)696*b1cdbd2cSJim Jagielski void AnnotationWindow::Paint( const Rectangle& rRect)
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski     FloatingWindow::Paint( rRect );
699*b1cdbd2cSJim Jagielski 
700*b1cdbd2cSJim Jagielski 	if(mpMeta->IsVisible() && !mbReadonly)
701*b1cdbd2cSJim Jagielski 	{
702*b1cdbd2cSJim Jagielski 		const bool bHighContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
703*b1cdbd2cSJim Jagielski 		//draw left over space
704*b1cdbd2cSJim Jagielski 		if ( bHighContrast )
705*b1cdbd2cSJim Jagielski 			SetFillColor(COL_BLACK);
706*b1cdbd2cSJim Jagielski 		else
707*b1cdbd2cSJim Jagielski 			SetFillColor(maColor);
708*b1cdbd2cSJim Jagielski 		SetLineColor();
709*b1cdbd2cSJim Jagielski 		DrawRect(PixelToLogic(Rectangle(Point(mpMeta->GetPosPixel().X()+mpMeta->GetSizePixel().Width(),mpMeta->GetPosPixel().Y()),Size(METABUTTON_AREA_WIDTH,mpMeta->GetSizePixel().Height()))));
710*b1cdbd2cSJim Jagielski 
711*b1cdbd2cSJim Jagielski 		if ( bHighContrast )
712*b1cdbd2cSJim Jagielski 		{
713*b1cdbd2cSJim Jagielski 			//draw rect around button
714*b1cdbd2cSJim Jagielski 			SetFillColor(COL_BLACK);
715*b1cdbd2cSJim Jagielski 			SetLineColor(COL_WHITE);
716*b1cdbd2cSJim Jagielski 		}
717*b1cdbd2cSJim Jagielski 		else
718*b1cdbd2cSJim Jagielski 		{
719*b1cdbd2cSJim Jagielski 			//draw button
720*b1cdbd2cSJim Jagielski 			Gradient aGradient;
721*b1cdbd2cSJim Jagielski 			if (mbMouseOverButton)
722*b1cdbd2cSJim Jagielski 				aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(80,maColorDark,maColor),ColorFromAlphaColor(15,maColorDark,maColor));
723*b1cdbd2cSJim Jagielski 			else
724*b1cdbd2cSJim Jagielski 				aGradient = Gradient(GRADIENT_LINEAR,ColorFromAlphaColor(15,maColorDark,maColor),ColorFromAlphaColor(80,maColorDark,maColor));
725*b1cdbd2cSJim Jagielski 			DrawGradient(maRectMetaButton,aGradient);
726*b1cdbd2cSJim Jagielski 			//draw rect around button
727*b1cdbd2cSJim Jagielski 			SetFillColor();
728*b1cdbd2cSJim Jagielski 			SetLineColor(ColorFromAlphaColor(90,maColorDark,maColor));
729*b1cdbd2cSJim Jagielski 		}
730*b1cdbd2cSJim Jagielski 		DrawRect(maRectMetaButton);
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski 		//draw arrow
733*b1cdbd2cSJim Jagielski 		if( bHighContrast )
734*b1cdbd2cSJim Jagielski 			SetFillColor(COL_WHITE);
735*b1cdbd2cSJim Jagielski 		else
736*b1cdbd2cSJim Jagielski 			SetFillColor(COL_BLACK);
737*b1cdbd2cSJim Jagielski 		SetLineColor();
738*b1cdbd2cSJim Jagielski 		DrawPolygon(Polygon(maPopupTriangle));
739*b1cdbd2cSJim Jagielski 	}
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rMEvt)742*b1cdbd2cSJim Jagielski void AnnotationWindow::MouseMove( const MouseEvent& rMEvt )
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski     if( !mbReadonly )
745*b1cdbd2cSJim Jagielski     {
746*b1cdbd2cSJim Jagielski 	    if (maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())))
747*b1cdbd2cSJim Jagielski 	    {
748*b1cdbd2cSJim Jagielski 		    if (!mbMouseOverButton)
749*b1cdbd2cSJim Jagielski 		    {
750*b1cdbd2cSJim Jagielski 			    Invalidate(maRectMetaButton);
751*b1cdbd2cSJim Jagielski 			    mbMouseOverButton = true;
752*b1cdbd2cSJim Jagielski 		    }
753*b1cdbd2cSJim Jagielski 	    }
754*b1cdbd2cSJim Jagielski 	    else
755*b1cdbd2cSJim Jagielski 	    {
756*b1cdbd2cSJim Jagielski 		    if (mbMouseOverButton)
757*b1cdbd2cSJim Jagielski 		    {
758*b1cdbd2cSJim Jagielski 			    Invalidate(maRectMetaButton);
759*b1cdbd2cSJim Jagielski 			    mbMouseOverButton = false;
760*b1cdbd2cSJim Jagielski 		    }
761*b1cdbd2cSJim Jagielski 	    }
762*b1cdbd2cSJim Jagielski 	}
763*b1cdbd2cSJim Jagielski }
764*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent & rMEvt)765*b1cdbd2cSJim Jagielski void AnnotationWindow::MouseButtonDown( const MouseEvent& rMEvt )
766*b1cdbd2cSJim Jagielski {
767*b1cdbd2cSJim Jagielski 	if (!mbReadonly && maRectMetaButton.IsInside(PixelToLogic(rMEvt.GetPosPixel())) && rMEvt.IsLeft())
768*b1cdbd2cSJim Jagielski 	{
769*b1cdbd2cSJim Jagielski 	    // context menu
770*b1cdbd2cSJim Jagielski 	    Rectangle aRect(LogicToPixel(maRectMetaButton.BottomLeft()),LogicToPixel(maRectMetaButton.BottomLeft()));
771*b1cdbd2cSJim Jagielski 	    mrManager.ExecuteAnnotationContextMenu( mxAnnotation, (::Window*)this, aRect, true );
772*b1cdbd2cSJim Jagielski 	}
773*b1cdbd2cSJim Jagielski }
774*b1cdbd2cSJim Jagielski 
Command(const CommandEvent & rCEvt)775*b1cdbd2cSJim Jagielski void AnnotationWindow::Command( const CommandEvent& rCEvt )
776*b1cdbd2cSJim Jagielski {
777*b1cdbd2cSJim Jagielski     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
778*b1cdbd2cSJim Jagielski     {
779*b1cdbd2cSJim Jagielski 		if( mpMeta->IsVisible() &&(mpMeta->GetPosPixel().Y() < rCEvt.GetMousePosPixel().Y()) )
780*b1cdbd2cSJim Jagielski 			return;
781*b1cdbd2cSJim Jagielski 	    mrManager.ExecuteAnnotationContextMenu( mxAnnotation, this, Rectangle(rCEvt.GetMousePosPixel(),Size(1,1)) );
782*b1cdbd2cSJim Jagielski     }
783*b1cdbd2cSJim Jagielski     else
784*b1cdbd2cSJim Jagielski     {
785*b1cdbd2cSJim Jagielski 	    FloatingWindow::Command(rCEvt);
786*b1cdbd2cSJim Jagielski     }
787*b1cdbd2cSJim Jagielski }
788*b1cdbd2cSJim Jagielski 
GetFocus()789*b1cdbd2cSJim Jagielski void AnnotationWindow::GetFocus()
790*b1cdbd2cSJim Jagielski {
791*b1cdbd2cSJim Jagielski     if( mpTextWindow )
792*b1cdbd2cSJim Jagielski         mpTextWindow->GrabFocus();
793*b1cdbd2cSJim Jagielski     else
794*b1cdbd2cSJim Jagielski         FloatingWindow::GetFocus();
795*b1cdbd2cSJim Jagielski }
796*b1cdbd2cSJim Jagielski 
ExecuteSlot(sal_uInt16 nSID)797*b1cdbd2cSJim Jagielski void AnnotationWindow::ExecuteSlot( sal_uInt16 nSID )
798*b1cdbd2cSJim Jagielski {
799*b1cdbd2cSJim Jagielski     if( nSID == SID_COPY )
800*b1cdbd2cSJim Jagielski     {
801*b1cdbd2cSJim Jagielski         getView()->Copy();
802*b1cdbd2cSJim Jagielski     }
803*b1cdbd2cSJim Jagielski     else if( nSID == SID_PASTE )
804*b1cdbd2cSJim Jagielski     {
805*b1cdbd2cSJim Jagielski         getView()->PasteSpecial();
806*b1cdbd2cSJim Jagielski         DoResize();
807*b1cdbd2cSJim Jagielski     }
808*b1cdbd2cSJim Jagielski     else
809*b1cdbd2cSJim Jagielski     {
810*b1cdbd2cSJim Jagielski         SfxItemSet aEditAttr(getView()->GetAttribs());
811*b1cdbd2cSJim Jagielski         SfxItemSet aNewAttr(mpOutliner->GetEmptyItemSet());
812*b1cdbd2cSJim Jagielski 
813*b1cdbd2cSJim Jagielski         switch( nSID )
814*b1cdbd2cSJim Jagielski         {
815*b1cdbd2cSJim Jagielski         case SID_ATTR_CHAR_WEIGHT:
816*b1cdbd2cSJim Jagielski         {
817*b1cdbd2cSJim Jagielski 			FontWeight eFW = ( (const SvxWeightItem&) aEditAttr.Get( EE_CHAR_WEIGHT ) ).GetWeight();
818*b1cdbd2cSJim Jagielski 			aNewAttr.Put( SvxWeightItem( eFW == WEIGHT_NORMAL ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
819*b1cdbd2cSJim Jagielski         }
820*b1cdbd2cSJim Jagielski         break;
821*b1cdbd2cSJim Jagielski 		case SID_ATTR_CHAR_POSTURE:
822*b1cdbd2cSJim Jagielski 		{
823*b1cdbd2cSJim Jagielski 			FontItalic eFI = ( (const SvxPostureItem&) aEditAttr.Get( EE_CHAR_ITALIC ) ).GetPosture();
824*b1cdbd2cSJim Jagielski 			aNewAttr.Put( SvxPostureItem( eFI == ITALIC_NORMAL ? ITALIC_NONE : ITALIC_NORMAL, EE_CHAR_ITALIC ) );
825*b1cdbd2cSJim Jagielski 		}
826*b1cdbd2cSJim Jagielski 		break;
827*b1cdbd2cSJim Jagielski 		case SID_ATTR_CHAR_UNDERLINE:
828*b1cdbd2cSJim Jagielski 		{
829*b1cdbd2cSJim Jagielski 			FontUnderline eFU = ( (const SvxUnderlineItem&) aEditAttr. Get( EE_CHAR_UNDERLINE ) ).GetLineStyle();
830*b1cdbd2cSJim Jagielski 			aNewAttr.Put( SvxUnderlineItem( eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE ) );
831*b1cdbd2cSJim Jagielski 		}
832*b1cdbd2cSJim Jagielski 		break;
833*b1cdbd2cSJim Jagielski 		case SID_ATTR_CHAR_STRIKEOUT:
834*b1cdbd2cSJim Jagielski 		{
835*b1cdbd2cSJim Jagielski 			FontStrikeout eFSO = ( ( (const SvxCrossedOutItem&) aEditAttr.Get( EE_CHAR_STRIKEOUT ) ).GetStrikeout() );
836*b1cdbd2cSJim Jagielski 			aNewAttr.Put( SvxCrossedOutItem( eFSO == STRIKEOUT_SINGLE ? STRIKEOUT_NONE : STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT ) );
837*b1cdbd2cSJim Jagielski 		}
838*b1cdbd2cSJim Jagielski 		break;
839*b1cdbd2cSJim Jagielski 		}
840*b1cdbd2cSJim Jagielski         getView()->SetAttribs( aNewAttr );
841*b1cdbd2cSJim Jagielski     }
842*b1cdbd2cSJim Jagielski }
843*b1cdbd2cSJim Jagielski 
844*b1cdbd2cSJim Jagielski }
845