xref: /aoo4110/main/sc/source/ui/view/gridwin5.cxx (revision b1cdbd2c)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <editeng/editview.hxx>
34*b1cdbd2cSJim Jagielski #include <svx/svdobj.hxx>
35*b1cdbd2cSJim Jagielski #include <svx/svdpagv.hxx>
36*b1cdbd2cSJim Jagielski #include <svtools/imapobj.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/cursor.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/help.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
40*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <unotools/localedatawrapper.hxx>
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski #include "viewuno.hxx"
45*b1cdbd2cSJim Jagielski #include "AccessibleDocument.hxx"
46*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/XAccessible.hpp>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include "gridwin.hxx"
49*b1cdbd2cSJim Jagielski #include "viewdata.hxx"
50*b1cdbd2cSJim Jagielski #include "drawview.hxx"
51*b1cdbd2cSJim Jagielski #include "drwlayer.hxx"
52*b1cdbd2cSJim Jagielski #include "drawpage.hxx"
53*b1cdbd2cSJim Jagielski #include "document.hxx"
54*b1cdbd2cSJim Jagielski #include "notemark.hxx"
55*b1cdbd2cSJim Jagielski #include "chgtrack.hxx"
56*b1cdbd2cSJim Jagielski #include "chgviset.hxx"
57*b1cdbd2cSJim Jagielski #include "dbfunc.hxx"
58*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
59*b1cdbd2cSJim Jagielski #include "userdat.hxx"
60*b1cdbd2cSJim Jagielski #include "postit.hxx"
61*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
64*b1cdbd2cSJim Jagielski 
ScHideTextCursor(ScViewData * pData,ScSplitPos eW)65*b1cdbd2cSJim Jagielski ScHideTextCursor::ScHideTextCursor( ScViewData* pData, ScSplitPos eW ) :
66*b1cdbd2cSJim Jagielski 	pViewData(pData),
67*b1cdbd2cSJim Jagielski 	eWhich(eW)
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	Window* pWin = pViewData->GetView()->GetWindowByPos( eWhich );
70*b1cdbd2cSJim Jagielski 	if (pWin)
71*b1cdbd2cSJim Jagielski 	{
72*b1cdbd2cSJim Jagielski 		Cursor* pCur = pWin->GetCursor();
73*b1cdbd2cSJim Jagielski 		if ( pCur && pCur->IsVisible() )
74*b1cdbd2cSJim Jagielski 			pCur->Hide();
75*b1cdbd2cSJim Jagielski 	}
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
~ScHideTextCursor()78*b1cdbd2cSJim Jagielski ScHideTextCursor::~ScHideTextCursor()
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski 	Window* pWin = pViewData->GetView()->GetWindowByPos( eWhich );
81*b1cdbd2cSJim Jagielski 	if (pWin)
82*b1cdbd2cSJim Jagielski 	{
83*b1cdbd2cSJim Jagielski 		//	restore text cursor
84*b1cdbd2cSJim Jagielski 		if ( pViewData->HasEditView(eWhich) && pWin->HasFocus() )
85*b1cdbd2cSJim Jagielski 			pViewData->GetEditView(eWhich)->ShowCursor( sal_False, sal_True );
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
90*b1cdbd2cSJim Jagielski 
ShowNoteMarker(SCsCOL nPosX,SCsROW nPosY,sal_Bool bKeyboard)91*b1cdbd2cSJim Jagielski sal_Bool ScGridWindow::ShowNoteMarker( SCsCOL nPosX, SCsROW nPosY, sal_Bool bKeyboard )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pViewData->GetDocument();
96*b1cdbd2cSJim Jagielski 	SCTAB		nTab = pViewData->GetTabNo();
97*b1cdbd2cSJim Jagielski 	ScAddress	aCellPos( nPosX, nPosY, nTab );
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski 	String aTrackText;
100*b1cdbd2cSJim Jagielski 	sal_Bool bLeftEdge = sal_False;
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski 	//	Change-Tracking
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 	ScChangeTrack* pTrack = pDoc->GetChangeTrack();
105*b1cdbd2cSJim Jagielski 	ScChangeViewSettings* pSettings = pDoc->GetChangeViewSettings();
106*b1cdbd2cSJim Jagielski 	if ( pTrack && pTrack->GetFirst() && pSettings && pSettings->ShowChanges())
107*b1cdbd2cSJim Jagielski 	{
108*b1cdbd2cSJim Jagielski 		const ScChangeAction* pFound = NULL;
109*b1cdbd2cSJim Jagielski 		const ScChangeAction* pFoundContent = NULL;
110*b1cdbd2cSJim Jagielski 		const ScChangeAction* pFoundMove = NULL;
111*b1cdbd2cSJim Jagielski 		long nModified = 0;
112*b1cdbd2cSJim Jagielski 		const ScChangeAction* pAction = pTrack->GetFirst();
113*b1cdbd2cSJim Jagielski 		while (pAction)
114*b1cdbd2cSJim Jagielski 		{
115*b1cdbd2cSJim Jagielski 			if ( pAction->IsVisible() &&
116*b1cdbd2cSJim Jagielski 				 ScViewUtil::IsActionShown( *pAction, *pSettings, *pDoc ) )
117*b1cdbd2cSJim Jagielski 			{
118*b1cdbd2cSJim Jagielski 				ScChangeActionType eType = pAction->GetType();
119*b1cdbd2cSJim Jagielski 				const ScBigRange& rBig = pAction->GetBigRange();
120*b1cdbd2cSJim Jagielski 				if ( rBig.aStart.Tab() == nTab )
121*b1cdbd2cSJim Jagielski 				{
122*b1cdbd2cSJim Jagielski 					ScRange aRange = rBig.MakeRange();
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 					if ( eType == SC_CAT_DELETE_ROWS )
125*b1cdbd2cSJim Jagielski 						aRange.aEnd.SetRow( aRange.aStart.Row() );
126*b1cdbd2cSJim Jagielski 					else if ( eType == SC_CAT_DELETE_COLS )
127*b1cdbd2cSJim Jagielski 						aRange.aEnd.SetCol( aRange.aStart.Col() );
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 					if ( aRange.In( aCellPos ) )
130*b1cdbd2cSJim Jagielski 					{
131*b1cdbd2cSJim Jagielski 						pFound = pAction;		// der letzte gewinnt
132*b1cdbd2cSJim Jagielski 						switch ( eType )
133*b1cdbd2cSJim Jagielski 						{
134*b1cdbd2cSJim Jagielski 							case SC_CAT_CONTENT :
135*b1cdbd2cSJim Jagielski 								pFoundContent = pAction;
136*b1cdbd2cSJim Jagielski 							break;
137*b1cdbd2cSJim Jagielski 							case SC_CAT_MOVE :
138*b1cdbd2cSJim Jagielski 								pFoundMove = pAction;
139*b1cdbd2cSJim Jagielski 							break;
140*b1cdbd2cSJim Jagielski                             default:
141*b1cdbd2cSJim Jagielski                             {
142*b1cdbd2cSJim Jagielski                                 // added to avoid warnings
143*b1cdbd2cSJim Jagielski                             }
144*b1cdbd2cSJim Jagielski 						}
145*b1cdbd2cSJim Jagielski 						++nModified;
146*b1cdbd2cSJim Jagielski 					}
147*b1cdbd2cSJim Jagielski 				}
148*b1cdbd2cSJim Jagielski 				if ( eType == SC_CAT_MOVE )
149*b1cdbd2cSJim Jagielski 				{
150*b1cdbd2cSJim Jagielski 					ScRange aRange =
151*b1cdbd2cSJim Jagielski 						((const ScChangeActionMove*)pAction)->
152*b1cdbd2cSJim Jagielski 						GetFromRange().MakeRange();
153*b1cdbd2cSJim Jagielski 					if ( aRange.In( aCellPos ) )
154*b1cdbd2cSJim Jagielski 					{
155*b1cdbd2cSJim Jagielski 						pFound = pAction;
156*b1cdbd2cSJim Jagielski 						++nModified;
157*b1cdbd2cSJim Jagielski 					}
158*b1cdbd2cSJim Jagielski 				}
159*b1cdbd2cSJim Jagielski 			}
160*b1cdbd2cSJim Jagielski 			pAction = pAction->GetNext();
161*b1cdbd2cSJim Jagielski 		}
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 		if ( pFound )
164*b1cdbd2cSJim Jagielski 		{
165*b1cdbd2cSJim Jagielski 			if ( pFoundContent && pFound->GetType() != SC_CAT_CONTENT )
166*b1cdbd2cSJim Jagielski 				pFound = pFoundContent;		// Content gewinnt
167*b1cdbd2cSJim Jagielski 			if ( pFoundMove && pFound->GetType() != SC_CAT_MOVE &&
168*b1cdbd2cSJim Jagielski 					pFoundMove->GetActionNumber() >
169*b1cdbd2cSJim Jagielski 					pFound->GetActionNumber() )
170*b1cdbd2cSJim Jagielski 				pFound = pFoundMove;		// Move gewinnt
171*b1cdbd2cSJim Jagielski 
172*b1cdbd2cSJim Jagielski 			//	bei geloeschten Spalten: Pfeil auf die linke Seite der Zelle
173*b1cdbd2cSJim Jagielski 			if ( pFound->GetType() == SC_CAT_DELETE_COLS )
174*b1cdbd2cSJim Jagielski 				bLeftEdge = sal_True;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 			DateTime aDT = pFound->GetDateTime();
177*b1cdbd2cSJim Jagielski 			aTrackText  = pFound->GetUser();
178*b1cdbd2cSJim Jagielski 			aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
179*b1cdbd2cSJim Jagielski             aTrackText += ScGlobal::pLocaleData->getDate(aDT);
180*b1cdbd2cSJim Jagielski 			aTrackText += ' ';
181*b1cdbd2cSJim Jagielski             aTrackText += ScGlobal::pLocaleData->getTime(aDT);
182*b1cdbd2cSJim Jagielski 			aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n" ));
183*b1cdbd2cSJim Jagielski 			String aComStr=pFound->GetComment();
184*b1cdbd2cSJim Jagielski 			if(aComStr.Len()>0)
185*b1cdbd2cSJim Jagielski 			{
186*b1cdbd2cSJim Jagielski 				aTrackText += aComStr;
187*b1cdbd2cSJim Jagielski 				aTrackText.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n( " ));
188*b1cdbd2cSJim Jagielski 			}
189*b1cdbd2cSJim Jagielski 			pFound->GetDescription( aTrackText, pDoc );
190*b1cdbd2cSJim Jagielski 			if(aComStr.Len()>0)
191*b1cdbd2cSJim Jagielski 			{
192*b1cdbd2cSJim Jagielski 				aTrackText +=')';
193*b1cdbd2cSJim Jagielski 			}
194*b1cdbd2cSJim Jagielski 		}
195*b1cdbd2cSJim Jagielski 	}
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 	//	Notiz nur, wenn sie nicht schon auf dem Drawing-Layer angezeigt wird:
198*b1cdbd2cSJim Jagielski 	const ScPostIt* pNote = pDoc->GetNote( aCellPos );
199*b1cdbd2cSJim Jagielski 	if ( (aTrackText.Len() > 0) || (pNote && !pNote->IsCaptionShown()) )
200*b1cdbd2cSJim Jagielski 	{
201*b1cdbd2cSJim Jagielski 		sal_Bool bNew = sal_True;
202*b1cdbd2cSJim Jagielski 		sal_Bool bFast = sal_False;
203*b1cdbd2cSJim Jagielski 		if ( pNoteMarker )			// schon eine Notiz angezeigt
204*b1cdbd2cSJim Jagielski 		{
205*b1cdbd2cSJim Jagielski 			if ( pNoteMarker->GetDocPos() == aCellPos )	// dieselbe
206*b1cdbd2cSJim Jagielski 				bNew = sal_False;							// dann stehenlassen
207*b1cdbd2cSJim Jagielski 			else
208*b1cdbd2cSJim Jagielski 				bFast = sal_True;							// sonst sofort
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 			//	marker which was shown for ctrl-F1 isn't removed by mouse events
211*b1cdbd2cSJim Jagielski 			if ( pNoteMarker->IsByKeyboard() && !bKeyboard )
212*b1cdbd2cSJim Jagielski 				bNew = sal_False;
213*b1cdbd2cSJim Jagielski 		}
214*b1cdbd2cSJim Jagielski 		if ( bNew )
215*b1cdbd2cSJim Jagielski 		{
216*b1cdbd2cSJim Jagielski 			if ( bKeyboard )
217*b1cdbd2cSJim Jagielski 				bFast = sal_True;			// keyboard also shows the marker immediately
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski 			delete pNoteMarker;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski             bool bHSplit = pViewData->GetHSplitMode() != SC_SPLIT_NONE;
222*b1cdbd2cSJim Jagielski             bool bVSplit = pViewData->GetVSplitMode() != SC_SPLIT_NONE;
223*b1cdbd2cSJim Jagielski 
224*b1cdbd2cSJim Jagielski 			Window* pLeft = pViewData->GetView()->GetWindowByPos( bVSplit ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT );
225*b1cdbd2cSJim Jagielski 			Window* pRight = bHSplit ? pViewData->GetView()->GetWindowByPos( bVSplit ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT ) : 0;
226*b1cdbd2cSJim Jagielski 			Window* pBottom = bVSplit ? pViewData->GetView()->GetWindowByPos( SC_SPLIT_BOTTOMLEFT ) : 0;
227*b1cdbd2cSJim Jagielski 			Window* pDiagonal = (bHSplit && bVSplit) ? pViewData->GetView()->GetWindowByPos( SC_SPLIT_BOTTOMRIGHT ) : 0;
228*b1cdbd2cSJim Jagielski             DBG_ASSERT( pLeft, "ScGridWindow::ShowNoteMarker - missing top-left grid window" );
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski             /*  If caption is shown from right or bottom windows, adjust
231*b1cdbd2cSJim Jagielski                 mapmode to include size of top-left window. */
232*b1cdbd2cSJim Jagielski             MapMode aMapMode = GetDrawMapMode( sal_True );
233*b1cdbd2cSJim Jagielski             Size aLeftSize = pLeft->PixelToLogic( pLeft->GetOutputSizePixel(), aMapMode );
234*b1cdbd2cSJim Jagielski             Point aOrigin = aMapMode.GetOrigin();
235*b1cdbd2cSJim Jagielski             if( (this == pRight) || (this == pDiagonal) )
236*b1cdbd2cSJim Jagielski                 aOrigin.X() += aLeftSize.Width();
237*b1cdbd2cSJim Jagielski             if( (this == pBottom) || (this == pDiagonal) )
238*b1cdbd2cSJim Jagielski                 aOrigin.Y() += aLeftSize.Height();
239*b1cdbd2cSJim Jagielski             aMapMode.SetOrigin( aOrigin );
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 			pNoteMarker = new ScNoteMarker( pLeft, pRight, pBottom, pDiagonal,
242*b1cdbd2cSJim Jagielski 											pDoc, aCellPos, aTrackText,
243*b1cdbd2cSJim Jagielski 											aMapMode, bLeftEdge, bFast, bKeyboard );
244*b1cdbd2cSJim Jagielski 		}
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski 		bDone = sal_True;		// something is shown (old or new)
247*b1cdbd2cSJim Jagielski 	}
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	return bDone;
250*b1cdbd2cSJim Jagielski }
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
253*b1cdbd2cSJim Jagielski 
RequestHelp(const HelpEvent & rHEvt)254*b1cdbd2cSJim Jagielski void ScGridWindow::RequestHelp(const HelpEvent& rHEvt)
255*b1cdbd2cSJim Jagielski {
256*b1cdbd2cSJim Jagielski 	sal_Bool bDone = sal_False;
257*b1cdbd2cSJim Jagielski 	sal_Bool bHelpEnabled = ( rHEvt.GetMode() & ( HELPMODE_BALLOON | HELPMODE_QUICK ) ) != 0;
258*b1cdbd2cSJim Jagielski 	SdrView* pDrView = pViewData->GetScDrawView();
259*b1cdbd2cSJim Jagielski 
260*b1cdbd2cSJim Jagielski 	sal_Bool bDrawTextEdit = sal_False;
261*b1cdbd2cSJim Jagielski 	if (pDrView)
262*b1cdbd2cSJim Jagielski 		bDrawTextEdit = pDrView->IsTextEdit();
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 	//	notes or change tracking
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	if ( bHelpEnabled && !bDrawTextEdit )
267*b1cdbd2cSJim Jagielski 	{
268*b1cdbd2cSJim Jagielski 		Point		aPosPixel = ScreenToOutputPixel( rHEvt.GetMousePosPixel() );
269*b1cdbd2cSJim Jagielski         SCsCOL nPosX;
270*b1cdbd2cSJim Jagielski         SCsROW nPosY;
271*b1cdbd2cSJim Jagielski         pViewData->GetPosFromPixel( aPosPixel.X(), aPosPixel.Y(), eWhich, nPosX, nPosY );
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 		if ( ShowNoteMarker( nPosX, nPosY, sal_False ) )
274*b1cdbd2cSJim Jagielski 		{
275*b1cdbd2cSJim Jagielski 			Window::RequestHelp( rHEvt );	// alte Tip/Balloon ausschalten
276*b1cdbd2cSJim Jagielski 			bDone = sal_True;
277*b1cdbd2cSJim Jagielski 		}
278*b1cdbd2cSJim Jagielski 	}
279*b1cdbd2cSJim Jagielski 
280*b1cdbd2cSJim Jagielski 	if ( !bDone && pNoteMarker )
281*b1cdbd2cSJim Jagielski 	{
282*b1cdbd2cSJim Jagielski 		if ( pNoteMarker->IsByKeyboard() )
283*b1cdbd2cSJim Jagielski 		{
284*b1cdbd2cSJim Jagielski 			//	marker which was shown for ctrl-F1 isn't removed by mouse events
285*b1cdbd2cSJim Jagielski 		}
286*b1cdbd2cSJim Jagielski 		else
287*b1cdbd2cSJim Jagielski 			DELETEZ(pNoteMarker);
288*b1cdbd2cSJim Jagielski 	}
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 	//	Image-Map / Text-URL
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	if ( bHelpEnabled && !bDone && !nButtonDown )		// nur ohne gedrueckten Button
293*b1cdbd2cSJim Jagielski 	{
294*b1cdbd2cSJim Jagielski 		String aHelpText;
295*b1cdbd2cSJim Jagielski 		Rectangle aPixRect;
296*b1cdbd2cSJim Jagielski 		Point aPosPixel = ScreenToOutputPixel( rHEvt.GetMousePosPixel() );
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski 		if ( pDrView )										// URL / Image-Map
299*b1cdbd2cSJim Jagielski 		{
300*b1cdbd2cSJim Jagielski 			SdrViewEvent aVEvt;
301*b1cdbd2cSJim Jagielski 			MouseEvent aMEvt( aPosPixel, 1, 0, MOUSE_LEFT );
302*b1cdbd2cSJim Jagielski 			SdrHitKind eHit = pDrView->PickAnything( aMEvt, SDRMOUSEBUTTONDOWN, aVEvt );
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 			if ( eHit != SDRHIT_NONE && aVEvt.pObj != NULL )
305*b1cdbd2cSJim Jagielski 			{
306*b1cdbd2cSJim Jagielski 				// URL fuer IMapObject unter Pointer ist Hilfetext
307*b1cdbd2cSJim Jagielski 				if ( ScDrawLayer::GetIMapInfo( aVEvt.pObj ) )
308*b1cdbd2cSJim Jagielski 				{
309*b1cdbd2cSJim Jagielski 					Point aLogicPos = PixelToLogic( aPosPixel );
310*b1cdbd2cSJim Jagielski 					IMapObject* pIMapObj = ScDrawLayer::GetHitIMapObject(
311*b1cdbd2cSJim Jagielski 													aVEvt.pObj, aLogicPos, *this );
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski 					if ( pIMapObj )
314*b1cdbd2cSJim Jagielski 					{
315*b1cdbd2cSJim Jagielski 						//	#44990# Bei ImageMaps die Description anzeigen, wenn vorhanden
316*b1cdbd2cSJim Jagielski 						aHelpText = pIMapObj->GetAltText();
317*b1cdbd2cSJim Jagielski 						if (!aHelpText.Len())
318*b1cdbd2cSJim Jagielski 							aHelpText = pIMapObj->GetURL();
319*b1cdbd2cSJim Jagielski 						aPixRect = LogicToPixel(aVEvt.pObj->GetLogicRect());
320*b1cdbd2cSJim Jagielski 					}
321*b1cdbd2cSJim Jagielski 				}
322*b1cdbd2cSJim Jagielski                 // URL in shape text or at shape itself (URL in text overrides object URL)
323*b1cdbd2cSJim Jagielski                 if ( aHelpText.Len() == 0 )
324*b1cdbd2cSJim Jagielski                 {
325*b1cdbd2cSJim Jagielski                     if( aVEvt.eEvent == SDREVENT_EXECUTEURL )
326*b1cdbd2cSJim Jagielski                     {
327*b1cdbd2cSJim Jagielski                         aHelpText = aVEvt.pURLField->GetURL();
328*b1cdbd2cSJim Jagielski                         aPixRect = LogicToPixel(aVEvt.pObj->GetLogicRect());
329*b1cdbd2cSJim Jagielski                     }
330*b1cdbd2cSJim Jagielski                     else
331*b1cdbd2cSJim Jagielski                     {
332*b1cdbd2cSJim Jagielski                         SdrObject* pObj = 0;
333*b1cdbd2cSJim Jagielski                         SdrPageView* pPV = 0;
334*b1cdbd2cSJim Jagielski                         Point aMDPos = PixelToLogic( aPosPixel );
335*b1cdbd2cSJim Jagielski                         if ( pDrView->PickObj(aMDPos, pDrView->getHitTolLog(), pObj, pPV, SDRSEARCH_ALSOONMASTER) )
336*b1cdbd2cSJim Jagielski                         {
337*b1cdbd2cSJim Jagielski                             if ( pObj->IsGroupObject() )
338*b1cdbd2cSJim Jagielski                             {
339*b1cdbd2cSJim Jagielski                                     SdrObject* pHit = 0;
340*b1cdbd2cSJim Jagielski                                     if ( pDrView->PickObj(aMDPos, pDrView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) )
341*b1cdbd2cSJim Jagielski                                         pObj = pHit;
342*b1cdbd2cSJim Jagielski                             }
343*b1cdbd2cSJim Jagielski #ifdef ISSUE66550_HLINK_FOR_SHAPES
344*b1cdbd2cSJim Jagielski                             ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj );
345*b1cdbd2cSJim Jagielski                             if ( pInfo && (pInfo->GetHlink().getLength() > 0) )
346*b1cdbd2cSJim Jagielski                             {
347*b1cdbd2cSJim Jagielski                                 aPixRect = LogicToPixel(aVEvt.pObj->GetLogicRect());
348*b1cdbd2cSJim Jagielski                                 aHelpText = pInfo->GetHlink();
349*b1cdbd2cSJim Jagielski                             }
350*b1cdbd2cSJim Jagielski #endif
351*b1cdbd2cSJim Jagielski                         }
352*b1cdbd2cSJim Jagielski                     }
353*b1cdbd2cSJim Jagielski                 }
354*b1cdbd2cSJim Jagielski 			}
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 		if ( !aHelpText.Len() )									// Text-URL
358*b1cdbd2cSJim Jagielski 		{
359*b1cdbd2cSJim Jagielski 			String aUrl;
360*b1cdbd2cSJim Jagielski 			if ( GetEditUrl( aPosPixel, NULL, &aUrl, NULL ) )
361*b1cdbd2cSJim Jagielski 			{
362*b1cdbd2cSJim Jagielski 				aHelpText = INetURLObject::decode( aUrl, INET_HEX_ESCAPE,
363*b1cdbd2cSJim Jagielski 					INetURLObject::DECODE_UNAMBIGUOUS );
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 				ScDocument* pDoc = pViewData->GetDocument();
366*b1cdbd2cSJim Jagielski                 SCsCOL nPosX;
367*b1cdbd2cSJim Jagielski                 SCsROW nPosY;
368*b1cdbd2cSJim Jagielski                 SCTAB		nTab = pViewData->GetTabNo();
369*b1cdbd2cSJim Jagielski 				pViewData->GetPosFromPixel( aPosPixel.X(), aPosPixel.Y(), eWhich, nPosX, nPosY );
370*b1cdbd2cSJim Jagielski 				const ScPatternAttr* pPattern = pDoc->GetPattern( nPosX, nPosY, nTab );
371*b1cdbd2cSJim Jagielski 
372*b1cdbd2cSJim Jagielski 				ScHideTextCursor aHideCursor( pViewData, eWhich );		// MapMode is changed in GetEditArea
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 				// bForceToTop = sal_False, use the cell's real position
375*b1cdbd2cSJim Jagielski 				aPixRect = pViewData->GetEditArea( eWhich, nPosX, nPosY, this, pPattern, sal_False );
376*b1cdbd2cSJim Jagielski 			}
377*b1cdbd2cSJim Jagielski 		}
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski 		if ( aHelpText.Len() )
380*b1cdbd2cSJim Jagielski 		{
381*b1cdbd2cSJim Jagielski 			Rectangle aScreenRect(OutputToScreenPixel(aPixRect.TopLeft()),
382*b1cdbd2cSJim Jagielski 									OutputToScreenPixel(aPixRect.BottomRight()));
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 			if ( rHEvt.GetMode() & HELPMODE_BALLOON )
385*b1cdbd2cSJim Jagielski 				Help::ShowBalloon(this,rHEvt.GetMousePosPixel(), aScreenRect, aHelpText);
386*b1cdbd2cSJim Jagielski 			else if ( rHEvt.GetMode() & HELPMODE_QUICK )
387*b1cdbd2cSJim Jagielski 				Help::ShowQuickHelp(this,aScreenRect, aHelpText);
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 			bDone = sal_True;
390*b1cdbd2cSJim Jagielski 		}
391*b1cdbd2cSJim Jagielski 	}
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 	//	Basic-Controls
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	if ( pDrView && bHelpEnabled && !bDone )
396*b1cdbd2cSJim Jagielski 	{
397*b1cdbd2cSJim Jagielski 		SdrPageView* pPV = pDrView->GetSdrPageView();
398*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pPV, "SdrPageView* ist NULL" );
399*b1cdbd2cSJim Jagielski 		if (pPV)
400*b1cdbd2cSJim Jagielski 			bDone = ((ScDrawPage*)pPV->GetPage())->RequestHelp( this, pDrView, rHEvt );
401*b1cdbd2cSJim Jagielski 	}
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	//	Wenn QuickHelp fuer AutoFill angezeigt wird, nicht wieder wegnehmen lassen
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	if ( nMouseStatus == SC_GM_TABDOWN && pViewData->GetRefType() == SC_REFTYPE_FILL &&
406*b1cdbd2cSJim Jagielski 			Help::IsQuickHelpEnabled() )
407*b1cdbd2cSJim Jagielski 		bDone = sal_True;
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 	if (!bDone)
410*b1cdbd2cSJim Jagielski 		Window::RequestHelp( rHEvt );
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski 
IsMyModel(SdrEditView * pSdrView)413*b1cdbd2cSJim Jagielski sal_Bool ScGridWindow::IsMyModel(SdrEditView* pSdrView)
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	return pSdrView &&
416*b1cdbd2cSJim Jagielski 			pSdrView->GetModel() == pViewData->GetDocument()->GetDrawLayer();
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski 
HideNoteMarker()419*b1cdbd2cSJim Jagielski void ScGridWindow::HideNoteMarker()
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski 	DELETEZ(pNoteMarker);
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
CreateAccessible()425*b1cdbd2cSJim Jagielski 	ScGridWindow::CreateAccessible()
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski 	com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc= GetAccessible(sal_False);
428*b1cdbd2cSJim Jagielski 	if (xAcc.is())
429*b1cdbd2cSJim Jagielski 	{
430*b1cdbd2cSJim Jagielski 		return xAcc;
431*b1cdbd2cSJim Jagielski 	}
432*b1cdbd2cSJim Jagielski 	ScAccessibleDocument* pAccessibleDocument =
433*b1cdbd2cSJim Jagielski 		new ScAccessibleDocument(GetAccessibleParentWindow()->GetAccessible(),
434*b1cdbd2cSJim Jagielski 			pViewData->GetViewShell(), eWhich);
435*b1cdbd2cSJim Jagielski 	xAcc = pAccessibleDocument;
436*b1cdbd2cSJim Jagielski 	SetAccessible(xAcc);
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 	pAccessibleDocument->Init();
439*b1cdbd2cSJim Jagielski 	return xAcc;
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski // MT: Removed Windows::SwitchView() introduced with IA2 CWS.
442*b1cdbd2cSJim Jagielski // There are other notifications for this when the active view has chnaged, so please update the code to use that event mechanism
SwitchView()443*b1cdbd2cSJim Jagielski void ScGridWindow::SwitchView()
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski 	if (!Application::IsAccessibilityEnabled())
446*b1cdbd2cSJim Jagielski 	{
447*b1cdbd2cSJim Jagielski 		return ;
448*b1cdbd2cSJim Jagielski 	}
449*b1cdbd2cSJim Jagielski 	ScAccessibleDocumentBase* pAccDoc = static_cast<ScAccessibleDocumentBase*>(GetAccessible(sal_False).get());
450*b1cdbd2cSJim Jagielski 	if (pAccDoc)
451*b1cdbd2cSJim Jagielski 	{
452*b1cdbd2cSJim Jagielski 		pAccDoc->SwitchViewFireFocus();
453*b1cdbd2cSJim Jagielski 	}
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
456