xref: /trunk/main/starmath/source/edit.cxx (revision d107581f)
1*d107581fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*d107581fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*d107581fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*d107581fSAndrew Rist  * distributed with this work for additional information
6*d107581fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*d107581fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*d107581fSAndrew Rist  * "License"); you may not use this file except in compliance
9*d107581fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*d107581fSAndrew Rist  *
11*d107581fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*d107581fSAndrew Rist  *
13*d107581fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*d107581fSAndrew Rist  * software distributed under the License is distributed on an
15*d107581fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*d107581fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*d107581fSAndrew Rist  * specific language governing permissions and limitations
18*d107581fSAndrew Rist  * under the License.
19*d107581fSAndrew Rist  *
20*d107581fSAndrew Rist  *************************************************************/
21*d107581fSAndrew Rist 
22*d107581fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_starmath.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessible.hpp>
29cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventObject.hpp>
30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32cdf0e10cSrcweir #include <toolkit/helper/vclunohelper.hxx>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include "starmath.hrc"
36cdf0e10cSrcweir #define ITEMID_FONT 		1
37cdf0e10cSrcweir #define ITEMID_FONTHEIGHT	2
38cdf0e10cSrcweir #define ITEMID_LRSPACE		3
39cdf0e10cSrcweir #define ITEMID_WEIGHT		4
40cdf0e10cSrcweir 
41cdf0e10cSrcweir 
42cdf0e10cSrcweir #include <vcl/menu.hxx>
43cdf0e10cSrcweir #include <editeng/editview.hxx>
44cdf0e10cSrcweir #include <editeng/editeng.hxx>
45cdf0e10cSrcweir #include <editeng/editstat.hxx>
46cdf0e10cSrcweir #include <editeng/eeitem.hxx>
47cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
48cdf0e10cSrcweir #include <svl/intitem.hxx>
49cdf0e10cSrcweir #include <svl/itempool.hxx>
50cdf0e10cSrcweir #include <svl/stritem.hxx>
51cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
52cdf0e10cSrcweir #include <editeng/wghtitem.hxx>
53cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
54cdf0e10cSrcweir #include <svl/itemset.hxx>
55cdf0e10cSrcweir #include <editeng/fontitem.hxx>
56cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #include "edit.hxx"
59cdf0e10cSrcweir #include "view.hxx"
60cdf0e10cSrcweir #include "document.hxx"
61cdf0e10cSrcweir #include "config.hxx"
62cdf0e10cSrcweir 
63cdf0e10cSrcweir #define SCROLL_LINE 		24
64cdf0e10cSrcweir 
65cdf0e10cSrcweir #define MINWIDTH		200
66cdf0e10cSrcweir #define MINHEIGHT		200
67cdf0e10cSrcweir #define MINSPLIT		40
68cdf0e10cSrcweir #define SPLITTERWIDTH	2
69cdf0e10cSrcweir 
70cdf0e10cSrcweir 
71cdf0e10cSrcweir using namespace com::sun::star::accessibility;
72cdf0e10cSrcweir using namespace com::sun::star;
73cdf0e10cSrcweir using namespace com::sun::star::uno;
74cdf0e10cSrcweir 
75cdf0e10cSrcweir ////////////////////////////////////////
76cdf0e10cSrcweir 
77cdf0e10cSrcweir 
78cdf0e10cSrcweir void SmGetLeftSelectionPart(const ESelection aSel,
79cdf0e10cSrcweir 							sal_uInt16 &nPara, sal_uInt16 &nPos)
80cdf0e10cSrcweir 	// returns paragraph number and position of the selections left part
81cdf0e10cSrcweir {
82cdf0e10cSrcweir 	// compare start and end of selection and use the one that comes first
83cdf0e10cSrcweir 	if (	aSel.nStartPara <  aSel.nEndPara
84cdf0e10cSrcweir 		||	(aSel.nStartPara == aSel.nEndPara  &&  aSel.nStartPos < aSel.nEndPos) )
85cdf0e10cSrcweir 	{	nPara = aSel.nStartPara;
86cdf0e10cSrcweir 		nPos  = aSel.nStartPos;
87cdf0e10cSrcweir 	}
88cdf0e10cSrcweir 	else
89cdf0e10cSrcweir 	{	nPara = aSel.nEndPara;
90cdf0e10cSrcweir 		nPos  = aSel.nEndPos;
91cdf0e10cSrcweir 	}
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir ////////////////////////////////////////
95cdf0e10cSrcweir 
96cdf0e10cSrcweir SmEditWindow::SmEditWindow( SmCmdBoxWindow &rMyCmdBoxWin ) :
97cdf0e10cSrcweir     Window              (&rMyCmdBoxWin),
98cdf0e10cSrcweir     DropTargetHelper    ( this ),
99cdf0e10cSrcweir     pAccessible         (0),
100cdf0e10cSrcweir     rCmdBox             (rMyCmdBoxWin),
101cdf0e10cSrcweir     pEditView           (0),
102cdf0e10cSrcweir     pHScrollBar         (0),
103cdf0e10cSrcweir     pVScrollBar         (0),
104cdf0e10cSrcweir     pScrollBox          (0)
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	SetHelpId(HID_SMA_COMMAND_WIN_EDIT);
107cdf0e10cSrcweir 	SetMapMode(MAP_PIXEL);
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     // Even RTL languages don't use RTL for math
110cdf0e10cSrcweir     rCmdBox.GetEditWindow()->EnableRTL( sal_False );
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     ApplyColorConfigValues( SM_MOD()->GetColorConfig() );
113cdf0e10cSrcweir 
114cdf0e10cSrcweir     // compare DataChanged
115cdf0e10cSrcweir 	SetBackground( GetSettings().GetStyleSettings().GetWindowColor() );
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	aModifyTimer.SetTimeoutHdl(LINK(this, SmEditWindow, ModifyTimerHdl));
118cdf0e10cSrcweir 	aModifyTimer.SetTimeout(500);
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	aCursorMoveTimer.SetTimeoutHdl(LINK(this, SmEditWindow, CursorMoveTimerHdl));
121cdf0e10cSrcweir 	aCursorMoveTimer.SetTimeout(500);
122cdf0e10cSrcweir 
123cdf0e10cSrcweir 	// if not called explicitly the this edit window within the
124cdf0e10cSrcweir 	// command window will just show an empty gray panel.
125cdf0e10cSrcweir     Show();
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 
129cdf0e10cSrcweir SmEditWindow::~SmEditWindow()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	aCursorMoveTimer.Stop();
132cdf0e10cSrcweir 	aModifyTimer.Stop();
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     // #112565# clean up of classes used for accessibility
136cdf0e10cSrcweir     // must be done before EditView (and thus EditEngine) is no longer
137cdf0e10cSrcweir     // available for those classes.
138cdf0e10cSrcweir     if (pAccessible)
139cdf0e10cSrcweir         pAccessible->ClearWin();    // make Accessible defunctional
140cdf0e10cSrcweir     // Note: memory for pAccessible will be freed when the reference
141cdf0e10cSrcweir     // xAccessible is released.
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     if (pEditView)
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         EditEngine *pEditEngine = pEditView->GetEditEngine();
146cdf0e10cSrcweir         if (pEditEngine)
147cdf0e10cSrcweir         {
148cdf0e10cSrcweir             pEditEngine->SetStatusEventHdl( Link() );
149cdf0e10cSrcweir             pEditEngine->RemoveView( pEditView );
150cdf0e10cSrcweir         }
151cdf0e10cSrcweir     }
152cdf0e10cSrcweir 	delete pEditView;
153cdf0e10cSrcweir 	delete pHScrollBar;
154cdf0e10cSrcweir 	delete pVScrollBar;
155cdf0e10cSrcweir 	delete pScrollBox;
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir void SmEditWindow::InvalidateSlots()
159cdf0e10cSrcweir {
160cdf0e10cSrcweir 	SfxBindings& rBind = GetView()->GetViewFrame()->GetBindings();
161cdf0e10cSrcweir 	rBind.Invalidate(SID_COPY);
162cdf0e10cSrcweir 	rBind.Invalidate(SID_CUT);
163cdf0e10cSrcweir 	rBind.Invalidate(SID_DELETE);
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir SmViewShell * SmEditWindow::GetView()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     return rCmdBox.GetView();
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir 
172cdf0e10cSrcweir SmDocShell * SmEditWindow::GetDoc()
173cdf0e10cSrcweir {
174cdf0e10cSrcweir     SmViewShell *pView = rCmdBox.GetView();
175cdf0e10cSrcweir     return pView ? pView->GetDoc() : 0;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 
179cdf0e10cSrcweir EditEngine * SmEditWindow::GetEditEngine()
180cdf0e10cSrcweir {
181cdf0e10cSrcweir     EditEngine *pEditEng = 0;
182cdf0e10cSrcweir     if (pEditView)
183cdf0e10cSrcweir         pEditEng = pEditView->GetEditEngine();
184cdf0e10cSrcweir     else
185cdf0e10cSrcweir     {
186cdf0e10cSrcweir         SmDocShell *pDoc = GetDoc();
187cdf0e10cSrcweir         if (pDoc)
188cdf0e10cSrcweir             pEditEng = &pDoc->GetEditEngine();
189cdf0e10cSrcweir     }
190cdf0e10cSrcweir     return pEditEng;
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 
194cdf0e10cSrcweir SfxItemPool * SmEditWindow::GetEditEngineItemPool()
195cdf0e10cSrcweir {
196cdf0e10cSrcweir     SmDocShell *pDoc = GetDoc();
197cdf0e10cSrcweir     return pDoc ? &pDoc->GetEditEngineItemPool() : 0;
198cdf0e10cSrcweir }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir void SmEditWindow::ApplyColorConfigValues( const svtools::ColorConfig &rColorCfg )
201cdf0e10cSrcweir {
202cdf0e10cSrcweir     // Note: SetBackground still done in SmEditWindow::DataChanged
203cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
204cdf0e10cSrcweir //   ColorData nVal = rColorCfg.GetColorValue(svtools::FONTCOLOR).nColor;
205cdf0e10cSrcweir #endif
206cdf0e10cSrcweir     SetTextColor( rColorCfg.GetColorValue(svtools::FONTCOLOR).nColor );
207cdf0e10cSrcweir     Invalidate();
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir void SmEditWindow::DataChanged( const DataChangedEvent& )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     const StyleSettings aSettings( GetSettings().GetStyleSettings() );
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     ApplyColorConfigValues( SM_MOD()->GetColorConfig() );
215cdf0e10cSrcweir     SetBackground( aSettings.GetWindowColor() );
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     // edit fields in other Applications use this font instead of
218cdf0e10cSrcweir     // the application font thus we use this one too
219cdf0e10cSrcweir     SetPointFont( aSettings.GetFieldFont() /*aSettings.GetAppFont()*/ );
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     EditEngine  *pEditEngine = GetEditEngine();
222cdf0e10cSrcweir     SfxItemPool *pEditEngineItemPool = GetEditEngineItemPool();
223cdf0e10cSrcweir 
224cdf0e10cSrcweir 	if (pEditEngine && pEditEngineItemPool)
225cdf0e10cSrcweir 	{
226cdf0e10cSrcweir         //!
227cdf0e10cSrcweir         //! see also SmDocShell::GetEditEngine() !
228cdf0e10cSrcweir         //!
229cdf0e10cSrcweir 
230cdf0e10cSrcweir 		pEditEngine->SetDefTab( sal_uInt16( GetTextWidth( C2S("XXXX") ) ) );
231cdf0e10cSrcweir 
232cdf0e10cSrcweir         SetEditEngineDefaultFonts( *pEditEngine, *pEditEngineItemPool );
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 		// forces new settings to be used
235cdf0e10cSrcweir         // unfortunately this resets the whole edit engine
236cdf0e10cSrcweir         // thus we need to save at least the text
237cdf0e10cSrcweir         String aTxt( pEditEngine->GetText( LINEEND_LF ) );
238cdf0e10cSrcweir 		pEditEngine->Clear();	//#77957 incorrect font size
239cdf0e10cSrcweir         pEditEngine->SetText( aTxt );
240cdf0e10cSrcweir 	}
241cdf0e10cSrcweir 
242cdf0e10cSrcweir 	AdjustScrollBars();
243cdf0e10cSrcweir 	Resize();
244cdf0e10cSrcweir }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir IMPL_LINK( SmEditWindow, ModifyTimerHdl, Timer *, EMPTYARG /*pTimer*/ )
247cdf0e10cSrcweir {
248cdf0e10cSrcweir     SmModule *pp = SM_MOD();
249cdf0e10cSrcweir 	if (pp->GetConfig()->IsAutoRedraw())
250cdf0e10cSrcweir 		Flush();
251cdf0e10cSrcweir     aModifyTimer.Stop();
252cdf0e10cSrcweir 	return 0;
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir 
256cdf0e10cSrcweir IMPL_LINK(SmEditWindow, CursorMoveTimerHdl, Timer *, EMPTYARG /*pTimer*/)
257cdf0e10cSrcweir 	// every once in a while check cursor position (selection) of edit
258cdf0e10cSrcweir 	// window and if it has changed (try to) set the formula-cursor
259cdf0e10cSrcweir 	// according to that.
260cdf0e10cSrcweir {
261cdf0e10cSrcweir 	ESelection	aNewSelection   (GetSelection());
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	if (!aNewSelection.IsEqual(aOldSelection))
264cdf0e10cSrcweir     {   SmViewShell *pView = rCmdBox.GetView();
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 		if (pView)
267cdf0e10cSrcweir 		{
268cdf0e10cSrcweir 			// get row and column to look for
269cdf0e10cSrcweir 			sal_uInt16	nRow, nCol;
270cdf0e10cSrcweir 			SmGetLeftSelectionPart(aNewSelection, nRow, nCol);
271cdf0e10cSrcweir 			nRow++;
272cdf0e10cSrcweir 			nCol++;
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 			pView->GetGraphicWindow().SetCursorPos(nRow, nCol);
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 			aOldSelection = aNewSelection;
277cdf0e10cSrcweir 		}
278cdf0e10cSrcweir 	}
279cdf0e10cSrcweir     aCursorMoveTimer.Stop();
280cdf0e10cSrcweir 
281cdf0e10cSrcweir 	return 0;
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
284cdf0e10cSrcweir 
285cdf0e10cSrcweir void SmEditWindow::Resize()
286cdf0e10cSrcweir {
287cdf0e10cSrcweir 	if (!pEditView)
288cdf0e10cSrcweir 		CreateEditView();
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	if (pEditView)
291cdf0e10cSrcweir 	{
292cdf0e10cSrcweir 		pEditView->SetOutputArea(AdjustScrollBars());
293cdf0e10cSrcweir 		pEditView->ShowCursor();
294cdf0e10cSrcweir 
295cdf0e10cSrcweir         DBG_ASSERT( pEditView->GetEditEngine(), "EditEngine missing" );
296cdf0e10cSrcweir 		const long nMaxVisAreaStart = pEditView->GetEditEngine()->GetTextHeight() -
297cdf0e10cSrcweir 									  pEditView->GetOutputArea().GetHeight();
298cdf0e10cSrcweir 		if (pEditView->GetVisArea().Top() > nMaxVisAreaStart)
299cdf0e10cSrcweir 		{
300cdf0e10cSrcweir 			Rectangle aVisArea(pEditView->GetVisArea() );
301cdf0e10cSrcweir 			aVisArea.Top() = (nMaxVisAreaStart > 0 ) ? nMaxVisAreaStart : 0;
302cdf0e10cSrcweir 			aVisArea.SetSize(pEditView->GetOutputArea().GetSize());
303cdf0e10cSrcweir 			pEditView->SetVisArea(aVisArea);
304cdf0e10cSrcweir 			pEditView->ShowCursor();
305cdf0e10cSrcweir 		}
306cdf0e10cSrcweir 		InitScrollBars();
307cdf0e10cSrcweir 	}
308cdf0e10cSrcweir 	Invalidate();
309cdf0e10cSrcweir }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir void SmEditWindow::MouseButtonUp(const MouseEvent &rEvt)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	if (pEditView)
314cdf0e10cSrcweir 		pEditView->MouseButtonUp(rEvt);
315cdf0e10cSrcweir 	else
316cdf0e10cSrcweir 		Window::MouseButtonUp (rEvt);
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 	// ggf FormulaCursor neu positionieren
319cdf0e10cSrcweir 	CursorMoveTimerHdl(&aCursorMoveTimer);
320cdf0e10cSrcweir 	InvalidateSlots();
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
323cdf0e10cSrcweir void SmEditWindow::MouseButtonDown(const MouseEvent &rEvt)
324cdf0e10cSrcweir {
325cdf0e10cSrcweir 	if (pEditView)
326cdf0e10cSrcweir 		pEditView->MouseButtonDown(rEvt);
327cdf0e10cSrcweir 	else
328cdf0e10cSrcweir 		Window::MouseButtonDown (rEvt);
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 	GrabFocus();
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir void SmEditWindow::Command(const CommandEvent& rCEvt)
334cdf0e10cSrcweir {
335cdf0e10cSrcweir     sal_Bool bForwardEvt = sal_True;
336cdf0e10cSrcweir 	if (rCEvt.GetCommand() == COMMAND_CONTEXTMENU)
337cdf0e10cSrcweir 	{
338cdf0e10cSrcweir 		GetParent()->ToTop();
339cdf0e10cSrcweir 
340cdf0e10cSrcweir         Point aPoint = rCEvt.GetMousePosPixel();
341cdf0e10cSrcweir 		PopupMenu* pPopupMenu = new PopupMenu(SmResId(RID_COMMANDMENU));
342cdf0e10cSrcweir 
343cdf0e10cSrcweir         // added for replaceability of context menus #96085, #93782
344cdf0e10cSrcweir         Menu* pMenu = NULL;
345cdf0e10cSrcweir         ::com::sun::star::ui::ContextMenuExecuteEvent aEvent;
346cdf0e10cSrcweir         aEvent.SourceWindow = VCLUnoHelper::GetInterface( this );
347cdf0e10cSrcweir         aEvent.ExecutePosition.X = aPoint.X();
348cdf0e10cSrcweir         aEvent.ExecutePosition.Y = aPoint.Y();
349cdf0e10cSrcweir         ::rtl::OUString sDummy;
350cdf0e10cSrcweir         if ( GetView()->TryContextMenuInterception( *pPopupMenu, sDummy, pMenu, aEvent ) )
351cdf0e10cSrcweir         {
352cdf0e10cSrcweir             if ( pMenu )
353cdf0e10cSrcweir             {
354cdf0e10cSrcweir                 delete pPopupMenu;
355cdf0e10cSrcweir                 pPopupMenu = (PopupMenu*) pMenu;
356cdf0e10cSrcweir             }
357cdf0e10cSrcweir         }
358cdf0e10cSrcweir 
359cdf0e10cSrcweir         pPopupMenu->SetSelectHdl(LINK(this, SmEditWindow, MenuSelectHdl));
360cdf0e10cSrcweir 
361cdf0e10cSrcweir         pPopupMenu->Execute( this, aPoint );
362cdf0e10cSrcweir 		delete pPopupMenu;
363cdf0e10cSrcweir         bForwardEvt = sal_False;
364cdf0e10cSrcweir 	}
365cdf0e10cSrcweir     else if (rCEvt.GetCommand() == COMMAND_WHEEL)
366cdf0e10cSrcweir         bForwardEvt = !HandleWheelCommands( rCEvt );
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     if (bForwardEvt)
369cdf0e10cSrcweir     {
370cdf0e10cSrcweir         if (pEditView)
371cdf0e10cSrcweir             pEditView->Command( rCEvt );
372cdf0e10cSrcweir         else
373cdf0e10cSrcweir             Window::Command (rCEvt);
374cdf0e10cSrcweir     }
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 
378cdf0e10cSrcweir sal_Bool SmEditWindow::HandleWheelCommands( const CommandEvent &rCEvt )
379cdf0e10cSrcweir {
380cdf0e10cSrcweir     sal_Bool bCommandHandled = sal_False;    // true if the CommandEvent needs not
381cdf0e10cSrcweir                                     // to be passed on (because it has fully
382cdf0e10cSrcweir                                     // been taken care of).
383cdf0e10cSrcweir 
384cdf0e10cSrcweir     const CommandWheelData* pWData = rCEvt.GetWheelData();
385cdf0e10cSrcweir     if (pWData)
386cdf0e10cSrcweir     {
387cdf0e10cSrcweir         if (COMMAND_WHEEL_ZOOM == pWData->GetMode())
388cdf0e10cSrcweir             bCommandHandled = sal_True;     // no zooming in Command window
389cdf0e10cSrcweir         else
390cdf0e10cSrcweir             bCommandHandled = HandleScrollCommand( rCEvt, pHScrollBar, pVScrollBar);
391cdf0e10cSrcweir     }
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     return bCommandHandled;
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir 
397cdf0e10cSrcweir IMPL_LINK_INLINE_START( SmEditWindow, MenuSelectHdl, Menu *, pMenu )
398cdf0e10cSrcweir {
399cdf0e10cSrcweir     SmViewShell *pViewSh = rCmdBox.GetView();
400cdf0e10cSrcweir 	if (pViewSh)
401cdf0e10cSrcweir 		pViewSh->GetViewFrame()->GetDispatcher()->Execute(
402cdf0e10cSrcweir 				SID_INSERTCOMMAND, SFX_CALLMODE_STANDARD,
403cdf0e10cSrcweir 				new SfxInt16Item(SID_INSERTCOMMAND, pMenu->GetCurItemId()), 0L);
404cdf0e10cSrcweir 	return 0;
405cdf0e10cSrcweir }
406cdf0e10cSrcweir IMPL_LINK_INLINE_END( SmEditWindow, MenuSelectHdl, Menu *, pMenu )
407cdf0e10cSrcweir 
408cdf0e10cSrcweir void SmEditWindow::KeyInput(const KeyEvent& rKEvt)
409cdf0e10cSrcweir {
410cdf0e10cSrcweir 	if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
411cdf0e10cSrcweir 	{
412cdf0e10cSrcweir 		sal_Bool bCallBase = sal_True;
413cdf0e10cSrcweir 		SfxViewShell* pViewShell = GetView();
414cdf0e10cSrcweir 		if ( pViewShell && pViewShell->ISA(SmViewShell) )
415cdf0e10cSrcweir 		{
416cdf0e10cSrcweir             // Terminate possible InPlace mode
417cdf0e10cSrcweir             bCallBase = !pViewShell->Escape();
418cdf0e10cSrcweir 		}
419cdf0e10cSrcweir 		if ( bCallBase )
420cdf0e10cSrcweir 			Window::KeyInput( rKEvt );
421cdf0e10cSrcweir 	}
422cdf0e10cSrcweir 	else
423cdf0e10cSrcweir 	{
424cdf0e10cSrcweir         // Timer neu starten, um den Handler (auch bei laengeren Eingaben)
425cdf0e10cSrcweir         // moeglichst nur einmal am Ende aufzurufen.
426cdf0e10cSrcweir 		aCursorMoveTimer.Start();
427cdf0e10cSrcweir 
428cdf0e10cSrcweir         DBG_ASSERT( pEditView, "EditView missing (NULL pointer)" );
429cdf0e10cSrcweir         if (!pEditView)
430cdf0e10cSrcweir             CreateEditView();
431cdf0e10cSrcweir 		if ( !pEditView->PostKeyEvent(rKEvt) )
432cdf0e10cSrcweir 		{
433cdf0e10cSrcweir             SmViewShell *pView = GetView();
434cdf0e10cSrcweir             if ( pView && !pView->KeyInput(rKEvt) )
435cdf0e10cSrcweir 			{
436cdf0e10cSrcweir 				/* fuert bei F1 (Hilfe) zum Zerstoeren von this! */
437cdf0e10cSrcweir 				Flush();
438cdf0e10cSrcweir 				if ( aModifyTimer.IsActive() )
439cdf0e10cSrcweir 					aModifyTimer.Stop();
440cdf0e10cSrcweir 				Window::KeyInput(rKEvt);
441cdf0e10cSrcweir 			}
442cdf0e10cSrcweir 			else
443cdf0e10cSrcweir 			{
444cdf0e10cSrcweir 				//SFX hat evtl. Slot an der View gecallt und dabei (wg. Hack
445cdf0e10cSrcweir 				//im SFX) den Focus auf die View gesetzt
446cdf0e10cSrcweir 				SfxViewShell* pVShell = GetView();
447cdf0e10cSrcweir 				if ( pVShell && pVShell->ISA(SmViewShell) &&
448cdf0e10cSrcweir 					 ((SmViewShell*)pVShell)->GetGraphicWindow().HasFocus() )
449cdf0e10cSrcweir 				{
450cdf0e10cSrcweir 					GrabFocus();
451cdf0e10cSrcweir 				}
452cdf0e10cSrcweir 			}
453cdf0e10cSrcweir 		}
454cdf0e10cSrcweir 		else
455cdf0e10cSrcweir         {
456cdf0e10cSrcweir             // have doc-shell modified only for formula input/change and not
457cdf0e10cSrcweir             // cursor travelling and such things...
458cdf0e10cSrcweir             SmDocShell *pDocShell = GetDoc();
459cdf0e10cSrcweir             if (pDocShell)
460cdf0e10cSrcweir                 pDocShell->SetModified( GetEditEngine()->IsModified() );
461cdf0e10cSrcweir 
462cdf0e10cSrcweir             aModifyTimer.Start();
463cdf0e10cSrcweir         }
464cdf0e10cSrcweir 
465cdf0e10cSrcweir 		InvalidateSlots();
466cdf0e10cSrcweir 	}
467cdf0e10cSrcweir }
468cdf0e10cSrcweir 
469cdf0e10cSrcweir void SmEditWindow::Paint(const Rectangle& rRect)
470cdf0e10cSrcweir {
471cdf0e10cSrcweir 	if (!pEditView)
472cdf0e10cSrcweir 		CreateEditView();
473cdf0e10cSrcweir 	pEditView->Paint(rRect);
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir void SmEditWindow::CreateEditView()
477cdf0e10cSrcweir {
478cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
479cdf0e10cSrcweir 
480cdf0e10cSrcweir     //! pEditEngine and pEditView may be 0.
481cdf0e10cSrcweir     //! For example when the program is used by the document-converter
482cdf0e10cSrcweir 	if (!pEditView && pEditEngine)
483cdf0e10cSrcweir 	{
484cdf0e10cSrcweir 		pEditView = new EditView( pEditEngine, this );
485cdf0e10cSrcweir 		pEditEngine->InsertView( pEditView );
486cdf0e10cSrcweir 
487cdf0e10cSrcweir         if (!pVScrollBar)
488cdf0e10cSrcweir             pVScrollBar = new ScrollBar(this, WinBits(WB_VSCROLL));
489cdf0e10cSrcweir         if (!pHScrollBar)
490cdf0e10cSrcweir             pHScrollBar = new ScrollBar(this, WinBits(WB_HSCROLL));
491cdf0e10cSrcweir         if (!pScrollBox)
492cdf0e10cSrcweir             pScrollBox  = new ScrollBarBox(this);
493cdf0e10cSrcweir 		pVScrollBar->SetScrollHdl(LINK(this, SmEditWindow, ScrollHdl));
494cdf0e10cSrcweir 		pHScrollBar->SetScrollHdl(LINK(this, SmEditWindow, ScrollHdl));
495cdf0e10cSrcweir         pVScrollBar->EnableDrag( sal_True );
496cdf0e10cSrcweir         pHScrollBar->EnableDrag( sal_True );
497cdf0e10cSrcweir 
498cdf0e10cSrcweir 		pEditView->SetOutputArea(AdjustScrollBars());
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 		ESelection eSelection;
501cdf0e10cSrcweir 
502cdf0e10cSrcweir 		pEditView->SetSelection(eSelection);
503cdf0e10cSrcweir 		Update();
504cdf0e10cSrcweir 		pEditView->ShowCursor(sal_True, sal_True);
505cdf0e10cSrcweir 
506cdf0e10cSrcweir 		pEditEngine->SetStatusEventHdl( LINK(this, SmEditWindow, EditStatusHdl) );
507cdf0e10cSrcweir 		SetPointer(pEditView->GetPointer());
508cdf0e10cSrcweir 
509cdf0e10cSrcweir 		SetScrollBarRanges();
510cdf0e10cSrcweir 	}
511cdf0e10cSrcweir }
512cdf0e10cSrcweir 
513cdf0e10cSrcweir 
514cdf0e10cSrcweir IMPL_LINK( SmEditWindow, EditStatusHdl, EditStatus *, EMPTYARG /*pStat*/ )
515cdf0e10cSrcweir {
516cdf0e10cSrcweir     if (!pEditView)
517cdf0e10cSrcweir 		return 1;
518cdf0e10cSrcweir 	else
519cdf0e10cSrcweir 	{
520cdf0e10cSrcweir 		Resize();
521cdf0e10cSrcweir 		return 0;
522cdf0e10cSrcweir 	}
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
525cdf0e10cSrcweir IMPL_LINK_INLINE_START( SmEditWindow, ScrollHdl, ScrollBar *, EMPTYARG /*pScrollBar*/ )
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     DBG_ASSERT(pEditView, "EditView missing");
528cdf0e10cSrcweir     if (pEditView)
529cdf0e10cSrcweir     {
530cdf0e10cSrcweir         pEditView->SetVisArea(Rectangle(Point(pHScrollBar->GetThumbPos(),
531cdf0e10cSrcweir                                             pVScrollBar->GetThumbPos()),
532cdf0e10cSrcweir                                         pEditView->GetVisArea().GetSize()));
533cdf0e10cSrcweir         pEditView->Invalidate();
534cdf0e10cSrcweir     }
535cdf0e10cSrcweir 	return 0;
536cdf0e10cSrcweir }
537cdf0e10cSrcweir IMPL_LINK_INLINE_END( SmEditWindow, ScrollHdl, ScrollBar *, pScrollBar )
538cdf0e10cSrcweir 
539cdf0e10cSrcweir Rectangle SmEditWindow::AdjustScrollBars()
540cdf0e10cSrcweir {
541cdf0e10cSrcweir 	const Size aOut( GetOutputSizePixel() );
542cdf0e10cSrcweir 	Point aPoint;
543cdf0e10cSrcweir 	Rectangle aRect( aPoint, aOut );
544cdf0e10cSrcweir 
545cdf0e10cSrcweir 	if (pVScrollBar && pHScrollBar && pScrollBox)
546cdf0e10cSrcweir 	{
547cdf0e10cSrcweir 		const long nTmp = GetSettings().GetStyleSettings().GetScrollBarSize();
548cdf0e10cSrcweir 		Point aPt( aRect.TopRight() ); aPt.X() -= nTmp -1L;
549cdf0e10cSrcweir 		pVScrollBar->SetPosSizePixel( aPt, Size(nTmp, aOut.Height() - nTmp));
550cdf0e10cSrcweir 
551cdf0e10cSrcweir 		aPt = aRect.BottomLeft(); aPt.Y() -= nTmp - 1L;
552cdf0e10cSrcweir 		pHScrollBar->SetPosSizePixel( aPt, Size(aOut.Width() - nTmp, nTmp));
553cdf0e10cSrcweir 
554cdf0e10cSrcweir 		aPt.X() = pHScrollBar->GetSizePixel().Width();
555cdf0e10cSrcweir 		aPt.Y() = pVScrollBar->GetSizePixel().Height();
556cdf0e10cSrcweir 		pScrollBox->SetPosSizePixel(aPt, Size(nTmp, nTmp ));
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 		aRect.Right()  = aPt.X() - 2;
559cdf0e10cSrcweir 		aRect.Bottom() = aPt.Y() - 2;
560cdf0e10cSrcweir 	}
561cdf0e10cSrcweir 	return aRect;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir 
564cdf0e10cSrcweir void SmEditWindow::SetScrollBarRanges()
565cdf0e10cSrcweir {
566cdf0e10cSrcweir 	// Extra-Methode, nicht InitScrollBars, da auch fuer EditEngine-Events.
567cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
568cdf0e10cSrcweir 	if (pVScrollBar && pHScrollBar && pEditEngine && pEditView)
569cdf0e10cSrcweir 	{
570cdf0e10cSrcweir 		long nTmp = pEditEngine->GetTextHeight();
571cdf0e10cSrcweir 		pVScrollBar->SetRange(Range(0, nTmp));
572cdf0e10cSrcweir 		pVScrollBar->SetThumbPos(pEditView->GetVisArea().Top());
573cdf0e10cSrcweir 
574cdf0e10cSrcweir 		nTmp = pEditEngine->GetPaperSize().Width();
575cdf0e10cSrcweir 		pHScrollBar->SetRange(Range(0,nTmp));
576cdf0e10cSrcweir 		pHScrollBar->SetThumbPos(pEditView->GetVisArea().Left());
577cdf0e10cSrcweir 	}
578cdf0e10cSrcweir }
579cdf0e10cSrcweir 
580cdf0e10cSrcweir void SmEditWindow::InitScrollBars()
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     if (pVScrollBar && pHScrollBar && pScrollBox && pEditView)
583cdf0e10cSrcweir 	{
584cdf0e10cSrcweir 		const Size aOut( pEditView->GetOutputArea().GetSize() );
585cdf0e10cSrcweir 		pVScrollBar->SetVisibleSize(aOut.Height());
586cdf0e10cSrcweir 		pVScrollBar->SetPageSize(aOut.Height() * 8 / 10);
587cdf0e10cSrcweir 		pVScrollBar->SetLineSize(aOut.Height() * 2 / 10);
588cdf0e10cSrcweir 
589cdf0e10cSrcweir 		pHScrollBar->SetVisibleSize(aOut.Width());
590cdf0e10cSrcweir 		pHScrollBar->SetPageSize(aOut.Width() * 8 / 10);
591cdf0e10cSrcweir 		pHScrollBar->SetLineSize(SCROLL_LINE );
592cdf0e10cSrcweir 
593cdf0e10cSrcweir 		SetScrollBarRanges();
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 		pVScrollBar->Show();
596cdf0e10cSrcweir 		pHScrollBar->Show();
597cdf0e10cSrcweir 		pScrollBox->Show();
598cdf0e10cSrcweir 	}
599cdf0e10cSrcweir }
600cdf0e10cSrcweir 
601cdf0e10cSrcweir 
602cdf0e10cSrcweir String SmEditWindow::GetText() const
603cdf0e10cSrcweir {
604cdf0e10cSrcweir 	String aText;
605cdf0e10cSrcweir     EditEngine *pEditEngine = const_cast< SmEditWindow* >(this)->GetEditEngine();
606cdf0e10cSrcweir 	DBG_ASSERT( pEditEngine, "EditEngine missing" );
607cdf0e10cSrcweir 	if (pEditEngine)
608cdf0e10cSrcweir 		aText = pEditEngine->GetText( LINEEND_LF );
609cdf0e10cSrcweir 	return aText;
610cdf0e10cSrcweir }
611cdf0e10cSrcweir 
612cdf0e10cSrcweir 
613cdf0e10cSrcweir void SmEditWindow::SetText(const XubString& rText)
614cdf0e10cSrcweir {
615cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
616cdf0e10cSrcweir 	DBG_ASSERT( pEditEngine, "EditEngine missing" );
617cdf0e10cSrcweir 	if (pEditEngine  &&  !pEditEngine->IsModified())
618cdf0e10cSrcweir 	{
619cdf0e10cSrcweir 		if (!pEditView)
620cdf0e10cSrcweir 			CreateEditView();
621cdf0e10cSrcweir 
622cdf0e10cSrcweir 		ESelection eSelection = pEditView->GetSelection();
623cdf0e10cSrcweir 
624cdf0e10cSrcweir 		pEditEngine->SetText(rText);
625cdf0e10cSrcweir 		pEditEngine->ClearModifyFlag();
626cdf0e10cSrcweir 
627cdf0e10cSrcweir         //! Hier die Timer neu zu starten verhindert, dass die Handler fuer andere
628cdf0e10cSrcweir 		//! (im Augenblick nicht mehr aktive) Math Tasks aufgerufen werden.
629cdf0e10cSrcweir 		aModifyTimer.Start();
630cdf0e10cSrcweir 		aCursorMoveTimer.Start();
631cdf0e10cSrcweir 
632cdf0e10cSrcweir 		pEditView->SetSelection(eSelection);
633cdf0e10cSrcweir 	}
634cdf0e10cSrcweir }
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 
637cdf0e10cSrcweir void SmEditWindow::GetFocus()
638cdf0e10cSrcweir {
639cdf0e10cSrcweir 	Window::GetFocus();
640cdf0e10cSrcweir 
641cdf0e10cSrcweir     if (xAccessible.is())
642cdf0e10cSrcweir     {
643cdf0e10cSrcweir         // Note: will implicitly send the AccessibleStateType::FOCUSED event
644cdf0e10cSrcweir         ::accessibility::AccessibleTextHelper *pHelper = pAccessible->GetTextHelper();
645cdf0e10cSrcweir         if (pHelper)
646cdf0e10cSrcweir             pHelper->SetFocus( sal_True );
647cdf0e10cSrcweir     }
648cdf0e10cSrcweir 
649cdf0e10cSrcweir     if (!pEditView)
650cdf0e10cSrcweir          CreateEditView();
651cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
652cdf0e10cSrcweir 	if (pEditEngine)
653cdf0e10cSrcweir 		pEditEngine->SetStatusEventHdl( LINK(this, SmEditWindow, EditStatusHdl) );
654cdf0e10cSrcweir }
655cdf0e10cSrcweir 
656cdf0e10cSrcweir 
657cdf0e10cSrcweir void SmEditWindow::LoseFocus()
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
660cdf0e10cSrcweir 	if (pEditEngine)
661cdf0e10cSrcweir 		pEditEngine->SetStatusEventHdl( Link() );
662cdf0e10cSrcweir 
663cdf0e10cSrcweir 	Window::LoseFocus();
664cdf0e10cSrcweir 
665cdf0e10cSrcweir     if (xAccessible.is())
666cdf0e10cSrcweir     {
667cdf0e10cSrcweir         // Note: will implicitly send the AccessibleStateType::FOCUSED event
668cdf0e10cSrcweir         ::accessibility::AccessibleTextHelper *pHelper = pAccessible->GetTextHelper();
669cdf0e10cSrcweir         if (pHelper)
670cdf0e10cSrcweir             pHelper->SetFocus( sal_False );
671cdf0e10cSrcweir     }
672cdf0e10cSrcweir }
673cdf0e10cSrcweir 
674cdf0e10cSrcweir 
675cdf0e10cSrcweir sal_Bool SmEditWindow::IsAllSelected() const
676cdf0e10cSrcweir {
677cdf0e10cSrcweir     sal_Bool bRes = sal_False;
678cdf0e10cSrcweir     EditEngine *pEditEngine = ((SmEditWindow *) this)->GetEditEngine();
679cdf0e10cSrcweir 	DBG_ASSERT( pEditView, "NULL pointer" );
680cdf0e10cSrcweir     DBG_ASSERT( pEditEngine, "NULL pointer" );
681cdf0e10cSrcweir     if (pEditEngine  &&  pEditView)
682cdf0e10cSrcweir     {
683cdf0e10cSrcweir         ESelection eSelection( pEditView->GetSelection() );
684cdf0e10cSrcweir         sal_Int32 nParaCnt = pEditEngine->GetParagraphCount();
685cdf0e10cSrcweir         if (!(nParaCnt - 1))
686cdf0e10cSrcweir         {
687cdf0e10cSrcweir             String Text( pEditEngine->GetText( LINEEND_LF ) );
688cdf0e10cSrcweir             bRes = !eSelection.nStartPos && (eSelection.nEndPos == Text.Len () - 1);
689cdf0e10cSrcweir         }
690cdf0e10cSrcweir         else
691cdf0e10cSrcweir         {
692cdf0e10cSrcweir             bRes = !eSelection.nStartPara && (eSelection.nEndPara == nParaCnt - 1);
693cdf0e10cSrcweir         }
694cdf0e10cSrcweir     }
695cdf0e10cSrcweir     return bRes;
696cdf0e10cSrcweir }
697cdf0e10cSrcweir 
698cdf0e10cSrcweir void SmEditWindow::SelectAll()
699cdf0e10cSrcweir {
700cdf0e10cSrcweir 	DBG_ASSERT( pEditView, "NULL pointer" );
701cdf0e10cSrcweir 	if (pEditView)
702cdf0e10cSrcweir 	{
703cdf0e10cSrcweir 		// 0xFFFF as last two parameters refers to the end of the text
704cdf0e10cSrcweir 		pEditView->SetSelection( ESelection( 0, 0, 0xFFFF, 0xFFFF ) );
705cdf0e10cSrcweir 	}
706cdf0e10cSrcweir }
707cdf0e10cSrcweir 
708cdf0e10cSrcweir void SmEditWindow::InsertCommand(sal_uInt16 nCommand)
709cdf0e10cSrcweir {
710cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
711cdf0e10cSrcweir     if (pEditView)
712cdf0e10cSrcweir     {
713cdf0e10cSrcweir         //Anfang der Selektion merken und hinterher den Cursor daraufsetzen. Nur so
714cdf0e10cSrcweir         //macht das SelNextMark() Sinn.
715cdf0e10cSrcweir         ESelection aSelection = pEditView->GetSelection();
716cdf0e10cSrcweir         aSelection.nEndPos  = aSelection.nStartPos;
717cdf0e10cSrcweir         aSelection.nEndPara = aSelection.nStartPara;
718cdf0e10cSrcweir 
719cdf0e10cSrcweir         DBG_ASSERT( pEditView, "NULL pointer" );
720cdf0e10cSrcweir         String  aText = String(SmResId(nCommand));
721cdf0e10cSrcweir         pEditView->InsertText(aText);
722cdf0e10cSrcweir 
723cdf0e10cSrcweir         if (HasMark(aText))
724cdf0e10cSrcweir         {   // set selection to next mark
725cdf0e10cSrcweir             pEditView->SetSelection(aSelection);
726cdf0e10cSrcweir             SelNextMark();
727cdf0e10cSrcweir         }
728cdf0e10cSrcweir         else
729cdf0e10cSrcweir         {   // set selection after inserted text
730cdf0e10cSrcweir             aSelection.nEndPos    = aSelection.nEndPos + sal::static_int_cast< xub_StrLen >(aText.Len());
731cdf0e10cSrcweir             aSelection.nStartPos  = aSelection.nEndPos;
732cdf0e10cSrcweir             pEditView->SetSelection(aSelection);
733cdf0e10cSrcweir         }
734cdf0e10cSrcweir 
735cdf0e10cSrcweir         aModifyTimer.Start();
736cdf0e10cSrcweir 		aCursorMoveTimer.Start();
737cdf0e10cSrcweir 
738cdf0e10cSrcweir         GrabFocus();
739cdf0e10cSrcweir     }
740cdf0e10cSrcweir }
741cdf0e10cSrcweir 
742cdf0e10cSrcweir void SmEditWindow::MarkError(const Point &rPos)
743cdf0e10cSrcweir {
744cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
745cdf0e10cSrcweir     if (pEditView)
746cdf0e10cSrcweir     {
747cdf0e10cSrcweir         const xub_StrLen    nCol = sal::static_int_cast< xub_StrLen >(rPos.X());
748cdf0e10cSrcweir         const sal_uInt16        nRow = sal::static_int_cast< sal_uInt16 >(rPos.Y() - 1);
749cdf0e10cSrcweir 
750cdf0e10cSrcweir         pEditView->SetSelection(ESelection(nRow, nCol - 1, nRow, nCol));
751cdf0e10cSrcweir         GrabFocus();
752cdf0e10cSrcweir     }
753cdf0e10cSrcweir }
754cdf0e10cSrcweir 
755cdf0e10cSrcweir void SmEditWindow::SelNextMark()
756cdf0e10cSrcweir {
757cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
758cdf0e10cSrcweir 	DBG_ASSERT( pEditView, "NULL pointer" );
759cdf0e10cSrcweir 	DBG_ASSERT( pEditEngine, "NULL pointer" );
760cdf0e10cSrcweir     if (pEditEngine  &&  pEditView)
761cdf0e10cSrcweir     {
762cdf0e10cSrcweir         ESelection eSelection = pEditView->GetSelection();
763cdf0e10cSrcweir         sal_uInt16     Pos        = eSelection.nEndPos;
764cdf0e10cSrcweir         String     aMark (C2S("<?>"));
765cdf0e10cSrcweir         String     aText;
766cdf0e10cSrcweir         sal_uInt16     nCounts    = pEditEngine->GetParagraphCount();
767cdf0e10cSrcweir 
768cdf0e10cSrcweir         while (eSelection.nEndPara < nCounts)
769cdf0e10cSrcweir         {
770cdf0e10cSrcweir             aText = pEditEngine->GetText( eSelection.nEndPara );
771cdf0e10cSrcweir             Pos   = aText.Search(aMark, Pos);
772cdf0e10cSrcweir 
773cdf0e10cSrcweir             if (Pos != STRING_NOTFOUND)
774cdf0e10cSrcweir             {
775cdf0e10cSrcweir                 pEditView->SetSelection(ESelection (eSelection.nEndPara, Pos, eSelection.nEndPara, Pos + 3));
776cdf0e10cSrcweir                 break;
777cdf0e10cSrcweir             }
778cdf0e10cSrcweir 
779cdf0e10cSrcweir             Pos = 0;
780cdf0e10cSrcweir             eSelection.nEndPara++;
781cdf0e10cSrcweir         }
782cdf0e10cSrcweir     }
783cdf0e10cSrcweir }
784cdf0e10cSrcweir 
785cdf0e10cSrcweir void SmEditWindow::SelPrevMark()
786cdf0e10cSrcweir {
787cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
788cdf0e10cSrcweir 	DBG_ASSERT( pEditEngine, "NULL pointer" );
789cdf0e10cSrcweir 	DBG_ASSERT( pEditView, "NULL pointer" );
790cdf0e10cSrcweir     if (pEditEngine  &&  pEditView)
791cdf0e10cSrcweir     {
792cdf0e10cSrcweir         ESelection eSelection = pEditView->GetSelection();
793cdf0e10cSrcweir         sal_uInt16     Pos        = STRING_NOTFOUND;
794cdf0e10cSrcweir         xub_StrLen Max        = eSelection.nStartPos;
795cdf0e10cSrcweir         String     Text( pEditEngine->GetText( eSelection.nStartPara ) );
796cdf0e10cSrcweir         String     aMark (C2S("<?>"));
797cdf0e10cSrcweir         sal_uInt16     nCounts    = pEditEngine->GetParagraphCount();
798cdf0e10cSrcweir 
799cdf0e10cSrcweir         do
800cdf0e10cSrcweir         {
801cdf0e10cSrcweir             sal_uInt16 Fnd = Text.Search(aMark, 0);
802cdf0e10cSrcweir 
803cdf0e10cSrcweir             while ((Fnd < Max) && (Fnd != STRING_NOTFOUND))
804cdf0e10cSrcweir             {
805cdf0e10cSrcweir                 Pos = Fnd;
806cdf0e10cSrcweir                 Fnd = Text.Search(aMark, Fnd + 1);
807cdf0e10cSrcweir             }
808cdf0e10cSrcweir 
809cdf0e10cSrcweir             if (Pos == STRING_NOTFOUND)
810cdf0e10cSrcweir             {
811cdf0e10cSrcweir                 eSelection.nStartPara--;
812cdf0e10cSrcweir                 Text = pEditEngine->GetText( eSelection.nStartPara );
813cdf0e10cSrcweir                 Max = Text.Len();
814cdf0e10cSrcweir             }
815cdf0e10cSrcweir         }
816cdf0e10cSrcweir         while ((eSelection.nStartPara < nCounts) &&
817cdf0e10cSrcweir             (Pos == STRING_NOTFOUND));
818cdf0e10cSrcweir 
819cdf0e10cSrcweir         if (Pos != STRING_NOTFOUND)
820cdf0e10cSrcweir         {
821cdf0e10cSrcweir             pEditView->SetSelection(ESelection (eSelection.nStartPara, Pos, eSelection.nStartPara, Pos + 3));
822cdf0e10cSrcweir         }
823cdf0e10cSrcweir     }
824cdf0e10cSrcweir }
825cdf0e10cSrcweir 
826cdf0e10cSrcweir sal_Bool SmEditWindow::HasMark(const String& rText) const
827cdf0e10cSrcweir 	// returns true iff 'rText' contains a mark
828cdf0e10cSrcweir {
829cdf0e10cSrcweir 	return rText.SearchAscii("<?>", 0) != STRING_NOTFOUND;
830cdf0e10cSrcweir }
831cdf0e10cSrcweir 
832cdf0e10cSrcweir void SmEditWindow::MouseMove(const MouseEvent &rEvt)
833cdf0e10cSrcweir {
834cdf0e10cSrcweir 	if (pEditView)
835cdf0e10cSrcweir 		pEditView->MouseMove(rEvt);
836cdf0e10cSrcweir }
837cdf0e10cSrcweir 
838cdf0e10cSrcweir sal_Int8 SmEditWindow::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
839cdf0e10cSrcweir {
840cdf0e10cSrcweir 	return pEditView ? /*pEditView->QueryDrop( rEvt )*/DND_ACTION_NONE: DND_ACTION_NONE;
841cdf0e10cSrcweir }
842cdf0e10cSrcweir 
843cdf0e10cSrcweir sal_Int8 SmEditWindow::ExecuteDrop( const ExecuteDropEvent& /*rEvt*/ )
844cdf0e10cSrcweir {
845cdf0e10cSrcweir 	return pEditView ? /*pEditView->Drop( rEvt )*/DND_ACTION_NONE : DND_ACTION_NONE;
846cdf0e10cSrcweir }
847cdf0e10cSrcweir 
848cdf0e10cSrcweir ESelection SmEditWindow::GetSelection() const
849cdf0e10cSrcweir {
850cdf0e10cSrcweir     // pointer may be 0 when reloading a document and the old view
851cdf0e10cSrcweir     // was already destroyed
852cdf0e10cSrcweir     //(DBG_ASSERT( pEditView, "NULL pointer" );
853cdf0e10cSrcweir 	ESelection eSel;
854cdf0e10cSrcweir 	if (pEditView)
855cdf0e10cSrcweir 		eSel = pEditView->GetSelection();
856cdf0e10cSrcweir 	return eSel;
857cdf0e10cSrcweir }
858cdf0e10cSrcweir 
859cdf0e10cSrcweir void SmEditWindow::SetSelection(const ESelection &rSel)
860cdf0e10cSrcweir {
861cdf0e10cSrcweir 	DBG_ASSERT( pEditView, "NULL pointer" );
862cdf0e10cSrcweir     if (pEditView)
863cdf0e10cSrcweir         pEditView->SetSelection(rSel);
864cdf0e10cSrcweir 	InvalidateSlots();
865cdf0e10cSrcweir }
866cdf0e10cSrcweir 
867cdf0e10cSrcweir sal_Bool SmEditWindow::IsEmpty() const
868cdf0e10cSrcweir {
869cdf0e10cSrcweir     EditEngine *pEditEngine = ((SmEditWindow *) this)->GetEditEngine();
870cdf0e10cSrcweir     sal_Bool bEmpty = sal::static_int_cast< sal_Bool >(
871cdf0e10cSrcweir                     pEditEngine ? pEditEngine->GetTextLen() == 0 : sal_False);
872cdf0e10cSrcweir     return bEmpty;
873cdf0e10cSrcweir }
874cdf0e10cSrcweir 
875cdf0e10cSrcweir sal_Bool SmEditWindow::IsSelected() const
876cdf0e10cSrcweir {
877cdf0e10cSrcweir     return pEditView ? pEditView->HasSelection() : sal_False;
878cdf0e10cSrcweir }
879cdf0e10cSrcweir 
880cdf0e10cSrcweir void SmEditWindow::Cut()
881cdf0e10cSrcweir {
882cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
883cdf0e10cSrcweir     if (pEditView)
884cdf0e10cSrcweir     {
885cdf0e10cSrcweir         pEditView->Cut();
886cdf0e10cSrcweir         GetDoc()->SetModified( sal_True );
887cdf0e10cSrcweir     }
888cdf0e10cSrcweir }
889cdf0e10cSrcweir 
890cdf0e10cSrcweir void SmEditWindow::Copy()
891cdf0e10cSrcweir {
892cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
893cdf0e10cSrcweir     if (pEditView)
894cdf0e10cSrcweir         pEditView->Copy();
895cdf0e10cSrcweir }
896cdf0e10cSrcweir 
897cdf0e10cSrcweir void SmEditWindow::Paste()
898cdf0e10cSrcweir {
899cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
900cdf0e10cSrcweir     if (pEditView)
901cdf0e10cSrcweir     {
902cdf0e10cSrcweir         pEditView->Paste();
903cdf0e10cSrcweir         GetDoc()->SetModified( sal_True );
904cdf0e10cSrcweir     }
905cdf0e10cSrcweir }
906cdf0e10cSrcweir 
907cdf0e10cSrcweir void SmEditWindow::Delete()
908cdf0e10cSrcweir {
909cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
910cdf0e10cSrcweir     if (pEditView)
911cdf0e10cSrcweir     {
912cdf0e10cSrcweir         pEditView->DeleteSelected();
913cdf0e10cSrcweir         GetDoc()->SetModified( sal_True );
914cdf0e10cSrcweir     }
915cdf0e10cSrcweir }
916cdf0e10cSrcweir 
917cdf0e10cSrcweir void SmEditWindow::InsertText(const String& Text)
918cdf0e10cSrcweir {
919cdf0e10cSrcweir     DBG_ASSERT( pEditView, "EditView missing" );
920cdf0e10cSrcweir     if (pEditView)
921cdf0e10cSrcweir     {
922cdf0e10cSrcweir         pEditView->InsertText(Text);
923cdf0e10cSrcweir         aModifyTimer.Start();
924cdf0e10cSrcweir 		aCursorMoveTimer.Start();
925cdf0e10cSrcweir     }
926cdf0e10cSrcweir }
927cdf0e10cSrcweir 
928cdf0e10cSrcweir void SmEditWindow::Flush()
929cdf0e10cSrcweir {
930cdf0e10cSrcweir     EditEngine *pEditEngine = GetEditEngine();
931cdf0e10cSrcweir 	if (pEditEngine  &&  pEditEngine->IsModified())
932cdf0e10cSrcweir 	{
933cdf0e10cSrcweir 		pEditEngine->ClearModifyFlag();
934cdf0e10cSrcweir         SmViewShell *pViewSh = rCmdBox.GetView();
935cdf0e10cSrcweir 		if (pViewSh)
936cdf0e10cSrcweir         {
937cdf0e10cSrcweir 			pViewSh->GetViewFrame()->GetDispatcher()->Execute(
938cdf0e10cSrcweir 					SID_TEXT, SFX_CALLMODE_STANDARD,
939cdf0e10cSrcweir 					new SfxStringItem(SID_TEXT, GetText()), 0L);
940cdf0e10cSrcweir         }
941cdf0e10cSrcweir 	}
942cdf0e10cSrcweir 
943cdf0e10cSrcweir 	if (aCursorMoveTimer.IsActive())
944cdf0e10cSrcweir 	{
945cdf0e10cSrcweir 		aCursorMoveTimer.Stop();
946cdf0e10cSrcweir 		// ggf noch die (neue) FormulaCursor Position setzen
947cdf0e10cSrcweir 		CursorMoveTimerHdl(&aCursorMoveTimer);
948cdf0e10cSrcweir 	}
949cdf0e10cSrcweir }
950cdf0e10cSrcweir 
951cdf0e10cSrcweir 
952cdf0e10cSrcweir void SmEditWindow::DeleteEditView( SmViewShell & /*rView*/ )
953cdf0e10cSrcweir {
954cdf0e10cSrcweir     if (pEditView)
955cdf0e10cSrcweir     {
956cdf0e10cSrcweir         EditEngine *pEditEngine = pEditView->GetEditEngine();
957cdf0e10cSrcweir         if (pEditEngine)
958cdf0e10cSrcweir         {
959cdf0e10cSrcweir             pEditEngine->SetStatusEventHdl( Link() );
960cdf0e10cSrcweir             pEditEngine->RemoveView( pEditView );
961cdf0e10cSrcweir         }
962cdf0e10cSrcweir         delete pEditView;
963cdf0e10cSrcweir         pEditView = 0;
964cdf0e10cSrcweir     }
965cdf0e10cSrcweir }
966cdf0e10cSrcweir 
967cdf0e10cSrcweir 
968cdf0e10cSrcweir uno::Reference< XAccessible > SmEditWindow::CreateAccessible()
969cdf0e10cSrcweir {
970cdf0e10cSrcweir     if (!pAccessible)
971cdf0e10cSrcweir     {
972cdf0e10cSrcweir         pAccessible = new SmEditAccessible( this );
973cdf0e10cSrcweir         xAccessible = pAccessible;
974cdf0e10cSrcweir         pAccessible->Init();
975cdf0e10cSrcweir     }
976cdf0e10cSrcweir     return xAccessible;
977cdf0e10cSrcweir }
978cdf0e10cSrcweir 
979