1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: gridwin5.cxx,v $
10 * $Revision: 1.23.128.2 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
34 // INCLUDE ---------------------------------------------------------------
36 #include <svx/eeitem.hxx>
38 #include <svx/flditem.hxx>
40 #include <svx/editview.hxx>
41 #include <svx/svdobj.hxx>
42 #include <svx/svdpagv.hxx>
43 #include <svtools/imapobj.hxx>
44 #include <vcl/cursor.hxx>
45 #include <vcl/help.hxx>
46 #include <tools/urlobj.hxx>
47 #include <sfx2/viewfrm.hxx>
49 #include <unotools/localedatawrapper.hxx>
51 #include "viewuno.hxx"
52 #include "AccessibleDocument.hxx"
53 #include <com/sun/star/accessibility/XAccessible.hpp>
55 #include "gridwin.hxx"
56 #include "viewdata.hxx"
57 #include "drawview.hxx"
58 #include "drwlayer.hxx"
59 #include "drawpage.hxx"
60 #include "document.hxx"
61 #include "notemark.hxx"
62 #include "chgtrack.hxx"
63 #include "chgviset.hxx"
65 #include "tabvwsh.hxx"
66 #include "userdat.hxx"
69 // -----------------------------------------------------------------------
71 ScHideTextCursor::ScHideTextCursor( ScViewData
* pData
, ScSplitPos eW
) :
75 Window
* pWin
= pViewData
->GetView()->GetWindowByPos( eWhich
);
78 Cursor
* pCur
= pWin
->GetCursor();
79 if ( pCur
&& pCur
->IsVisible() )
84 ScHideTextCursor::~ScHideTextCursor()
86 Window
* pWin
= pViewData
->GetView()->GetWindowByPos( eWhich
);
89 // restore text cursor
90 if ( pViewData
->HasEditView(eWhich
) && pWin
->HasFocus() )
91 pViewData
->GetEditView(eWhich
)->ShowCursor( FALSE
, TRUE
);
95 // -----------------------------------------------------------------------
97 BOOL
ScGridWindow::ShowNoteMarker( SCsCOL nPosX
, SCsROW nPosY
, BOOL bKeyboard
)
101 ScDocument
* pDoc
= pViewData
->GetDocument();
102 SCTAB nTab
= pViewData
->GetTabNo();
103 ScAddress
aCellPos( nPosX
, nPosY
, nTab
);
106 BOOL bLeftEdge
= FALSE
;
110 ScChangeTrack
* pTrack
= pDoc
->GetChangeTrack();
111 ScChangeViewSettings
* pSettings
= pDoc
->GetChangeViewSettings();
112 if ( pTrack
&& pTrack
->GetFirst() && pSettings
&& pSettings
->ShowChanges())
114 const ScChangeAction
* pFound
= NULL
;
115 const ScChangeAction
* pFoundContent
= NULL
;
116 const ScChangeAction
* pFoundMove
= NULL
;
118 const ScChangeAction
* pAction
= pTrack
->GetFirst();
121 if ( pAction
->IsVisible() &&
122 ScViewUtil::IsActionShown( *pAction
, *pSettings
, *pDoc
) )
124 ScChangeActionType eType
= pAction
->GetType();
125 const ScBigRange
& rBig
= pAction
->GetBigRange();
126 if ( rBig
.aStart
.Tab() == nTab
)
128 ScRange aRange
= rBig
.MakeRange();
130 if ( eType
== SC_CAT_DELETE_ROWS
)
131 aRange
.aEnd
.SetRow( aRange
.aStart
.Row() );
132 else if ( eType
== SC_CAT_DELETE_COLS
)
133 aRange
.aEnd
.SetCol( aRange
.aStart
.Col() );
135 if ( aRange
.In( aCellPos
) )
137 pFound
= pAction
; // der letzte gewinnt
140 case SC_CAT_CONTENT
:
141 pFoundContent
= pAction
;
144 pFoundMove
= pAction
;
148 // added to avoid warnings
154 if ( eType
== SC_CAT_MOVE
)
157 ((const ScChangeActionMove
*)pAction
)->
158 GetFromRange().MakeRange();
159 if ( aRange
.In( aCellPos
) )
166 pAction
= pAction
->GetNext();
171 if ( pFoundContent
&& pFound
->GetType() != SC_CAT_CONTENT
)
172 pFound
= pFoundContent
; // Content gewinnt
173 if ( pFoundMove
&& pFound
->GetType() != SC_CAT_MOVE
&&
174 pFoundMove
->GetActionNumber() >
175 pFound
->GetActionNumber() )
176 pFound
= pFoundMove
; // Move gewinnt
178 // bei geloeschten Spalten: Pfeil auf die linke Seite der Zelle
179 if ( pFound
->GetType() == SC_CAT_DELETE_COLS
)
182 DateTime aDT
= pFound
->GetDateTime();
183 aTrackText
= pFound
->GetUser();
184 aTrackText
.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ", " ));
185 aTrackText
+= ScGlobal::pLocaleData
->getDate(aDT
);
187 aTrackText
+= ScGlobal::pLocaleData
->getTime(aDT
);
188 aTrackText
.AppendAscii(RTL_CONSTASCII_STRINGPARAM( ":\n" ));
189 String aComStr
=pFound
->GetComment();
192 aTrackText
+= aComStr
;
193 aTrackText
.AppendAscii(RTL_CONSTASCII_STRINGPARAM( "\n( " ));
195 pFound
->GetDescription( aTrackText
, pDoc
);
203 // Notiz nur, wenn sie nicht schon auf dem Drawing-Layer angezeigt wird:
204 const ScPostIt
* pNote
= pDoc
->GetNote( aCellPos
);
205 if ( (aTrackText
.Len() > 0) || (pNote
&& !pNote
->IsCaptionShown()) )
209 if ( pNoteMarker
) // schon eine Notiz angezeigt
211 if ( pNoteMarker
->GetDocPos() == aCellPos
) // dieselbe
212 bNew
= FALSE
; // dann stehenlassen
214 bFast
= TRUE
; // sonst sofort
216 // marker which was shown for ctrl-F1 isn't removed by mouse events
217 if ( pNoteMarker
->IsByKeyboard() && !bKeyboard
)
223 bFast
= TRUE
; // keyboard also shows the marker immediately
227 bool bHSplit
= pViewData
->GetHSplitMode() != SC_SPLIT_NONE
;
228 bool bVSplit
= pViewData
->GetVSplitMode() != SC_SPLIT_NONE
;
230 Window
* pLeft
= pViewData
->GetView()->GetWindowByPos( bVSplit
? SC_SPLIT_TOPLEFT
: SC_SPLIT_BOTTOMLEFT
);
231 Window
* pRight
= bHSplit
? pViewData
->GetView()->GetWindowByPos( bVSplit
? SC_SPLIT_TOPRIGHT
: SC_SPLIT_BOTTOMRIGHT
) : 0;
232 Window
* pBottom
= bVSplit
? pViewData
->GetView()->GetWindowByPos( SC_SPLIT_BOTTOMLEFT
) : 0;
233 Window
* pDiagonal
= (bHSplit
&& bVSplit
) ? pViewData
->GetView()->GetWindowByPos( SC_SPLIT_BOTTOMRIGHT
) : 0;
234 DBG_ASSERT( pLeft
, "ScGridWindow::ShowNoteMarker - missing top-left grid window" );
236 /* If caption is shown from right or bottom windows, adjust
237 mapmode to include size of top-left window. */
238 MapMode aMapMode
= GetDrawMapMode( TRUE
);
239 Size aLeftSize
= pLeft
->PixelToLogic( pLeft
->GetOutputSizePixel(), aMapMode
);
240 Point aOrigin
= aMapMode
.GetOrigin();
241 if( (this == pRight
) || (this == pDiagonal
) )
242 aOrigin
.X() += aLeftSize
.Width();
243 if( (this == pBottom
) || (this == pDiagonal
) )
244 aOrigin
.Y() += aLeftSize
.Height();
245 aMapMode
.SetOrigin( aOrigin
);
247 pNoteMarker
= new ScNoteMarker( pLeft
, pRight
, pBottom
, pDiagonal
,
248 pDoc
, aCellPos
, aTrackText
,
249 aMapMode
, bLeftEdge
, bFast
, bKeyboard
);
252 bDone
= TRUE
; // something is shown (old or new)
258 // -----------------------------------------------------------------------
260 void ScGridWindow::RequestHelp(const HelpEvent
& rHEvt
)
263 BOOL bHelpEnabled
= ( rHEvt
.GetMode() & ( HELPMODE_BALLOON
| HELPMODE_QUICK
) ) != 0;
264 SdrView
* pDrView
= pViewData
->GetScDrawView();
266 BOOL bDrawTextEdit
= FALSE
;
268 bDrawTextEdit
= pDrView
->IsTextEdit();
270 // notes or change tracking
272 if ( bHelpEnabled
&& !bDrawTextEdit
)
274 Point aPosPixel
= ScreenToOutputPixel( rHEvt
.GetMousePosPixel() );
277 pViewData
->GetPosFromPixel( aPosPixel
.X(), aPosPixel
.Y(), eWhich
, nPosX
, nPosY
);
279 if ( ShowNoteMarker( nPosX
, nPosY
, FALSE
) )
281 Window::RequestHelp( rHEvt
); // alte Tip/Balloon ausschalten
286 if ( !bDone
&& pNoteMarker
)
288 if ( pNoteMarker
->IsByKeyboard() )
290 // marker which was shown for ctrl-F1 isn't removed by mouse events
293 DELETEZ(pNoteMarker
);
296 // Image-Map / Text-URL
298 if ( bHelpEnabled
&& !bDone
&& !nButtonDown
) // nur ohne gedrueckten Button
302 Point aPosPixel
= ScreenToOutputPixel( rHEvt
.GetMousePosPixel() );
304 if ( pDrView
) // URL / Image-Map
307 MouseEvent
aMEvt( aPosPixel
, 1, 0, MOUSE_LEFT
);
308 SdrHitKind eHit
= pDrView
->PickAnything( aMEvt
, SDRMOUSEBUTTONDOWN
, aVEvt
);
310 if ( eHit
!= SDRHIT_NONE
&& aVEvt
.pObj
!= NULL
)
312 // URL fuer IMapObject unter Pointer ist Hilfetext
313 if ( ScDrawLayer::GetIMapInfo( aVEvt
.pObj
) )
315 Point aLogicPos
= PixelToLogic( aPosPixel
);
316 IMapObject
* pIMapObj
= ScDrawLayer::GetHitIMapObject(
317 aVEvt
.pObj
, aLogicPos
, *this );
321 // #44990# Bei ImageMaps die Description anzeigen, wenn vorhanden
322 aHelpText
= pIMapObj
->GetAltText();
323 if (!aHelpText
.Len())
324 aHelpText
= pIMapObj
->GetURL();
325 aPixRect
= LogicToPixel(aVEvt
.pObj
->GetLogicRect());
328 // URL in shape text or at shape itself (URL in text overrides object URL)
329 if ( aHelpText
.Len() == 0 )
331 if( aVEvt
.eEvent
== SDREVENT_EXECUTEURL
)
333 aHelpText
= aVEvt
.pURLField
->GetURL();
334 aPixRect
= LogicToPixel(aVEvt
.pObj
->GetLogicRect());
339 SdrPageView
* pPV
= 0;
340 Point aMDPos
= PixelToLogic( aPosPixel
);
341 if ( pDrView
->PickObj(aMDPos
, pDrView
->getHitTolLog(), pObj
, pPV
, SDRSEARCH_ALSOONMASTER
) )
343 if ( pObj
->IsGroupObject() )
346 if ( pDrView
->PickObj(aMDPos
, pDrView
->getHitTolLog(), pHit
, pPV
, SDRSEARCH_DEEP
) )
349 ScMacroInfo
* pInfo
= ScDrawLayer::GetMacroInfo( pObj
);
350 if ( pInfo
&& (pInfo
->GetHlink().getLength() > 0) )
352 aPixRect
= LogicToPixel(aVEvt
.pObj
->GetLogicRect());
353 aHelpText
= pInfo
->GetHlink();
361 if ( !aHelpText
.Len() ) // Text-URL
364 if ( GetEditUrl( aPosPixel
, NULL
, &aUrl
, NULL
) )
366 aHelpText
= INetURLObject::decode( aUrl
, INET_HEX_ESCAPE
,
367 INetURLObject::DECODE_UNAMBIGUOUS
);
369 ScDocument
* pDoc
= pViewData
->GetDocument();
372 SCTAB nTab
= pViewData
->GetTabNo();
373 pViewData
->GetPosFromPixel( aPosPixel
.X(), aPosPixel
.Y(), eWhich
, nPosX
, nPosY
);
374 const ScPatternAttr
* pPattern
= pDoc
->GetPattern( nPosX
, nPosY
, nTab
);
376 ScHideTextCursor
aHideCursor( pViewData
, eWhich
); // MapMode is changed in GetEditArea
378 // bForceToTop = FALSE, use the cell's real position
379 aPixRect
= pViewData
->GetEditArea( eWhich
, nPosX
, nPosY
, this, pPattern
, FALSE
);
383 if ( aHelpText
.Len() )
385 Rectangle
aScreenRect(OutputToScreenPixel(aPixRect
.TopLeft()),
386 OutputToScreenPixel(aPixRect
.BottomRight()));
388 if ( rHEvt
.GetMode() & HELPMODE_BALLOON
)
389 Help::ShowBalloon(this,rHEvt
.GetMousePosPixel(), aScreenRect
, aHelpText
);
390 else if ( rHEvt
.GetMode() & HELPMODE_QUICK
)
391 Help::ShowQuickHelp(this,aScreenRect
, aHelpText
);
399 if ( pDrView
&& bHelpEnabled
&& !bDone
)
401 SdrPageView
* pPV
= pDrView
->GetSdrPageView();
402 DBG_ASSERT( pPV
, "SdrPageView* ist NULL" );
404 bDone
= ((ScDrawPage
*)pPV
->GetPage())->RequestHelp( this, pDrView
, rHEvt
);
407 // Wenn QuickHelp fuer AutoFill angezeigt wird, nicht wieder wegnehmen lassen
409 if ( nMouseStatus
== SC_GM_TABDOWN
&& pViewData
->GetRefType() == SC_REFTYPE_FILL
&&
410 Help::IsQuickHelpEnabled() )
414 Window::RequestHelp( rHEvt
);
417 BOOL
ScGridWindow::IsMyModel(SdrEditView
* pSdrView
)
420 pSdrView
->GetModel() == pViewData
->GetDocument()->GetDrawLayer();
423 void ScGridWindow::HideNoteMarker()
425 DELETEZ(pNoteMarker
);
428 com::sun::star::uno::Reference
< ::com::sun::star::accessibility::XAccessible
>
429 ScGridWindow::CreateAccessible()
431 ScAccessibleDocument
* pAccessibleDocument
=
432 new ScAccessibleDocument(GetAccessibleParentWindow()->GetAccessible(),
433 pViewData
->GetViewShell(), eWhich
);
435 com::sun::star::uno::Reference
< ::com::sun::star::accessibility::XAccessible
> xAccessible
= pAccessibleDocument
;
437 pAccessibleDocument
->Init();