xref: /trunk/main/sc/source/ui/inc/gridwin.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_GRIDWIN_HXX
29 #define SC_GRIDWIN_HXX
30 
31 #include <tools/string.hxx>
32 #include <svtools/transfer.hxx>
33 #include "viewutil.hxx"
34 #include "viewdata.hxx"
35 #include "cbutton.hxx"
36 #include <svx/sdr/overlay/overlayobject.hxx>
37 #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
38 #include <basegfx/matrix/b2dhommatrix.hxx>
39 
40 #include <vector>
41 #include <memory>
42 #include <boost/shared_ptr.hpp>
43 
44 // ---------------------------------------------------------------------------
45 
46 struct ScTableInfo;
47 class ScViewSelectionEngine;
48 class ScDPObject;
49 class ScDPFieldPopupWindow;
50 class ScDPFieldButton;
51 class ScOutputData;
52 class ScFilterListBox;
53 class AutoFilterPopup;
54 class SdrObject;
55 class SdrEditView;
56 class ScNoteMarker;
57 class FloatingWindow;
58 class SdrHdlList;
59 class ScTransferObj;
60 struct SpellCallbackInfo;
61 
62         //  Maus-Status (nMouseStatus)
63 
64 #define SC_GM_NONE          0
65 #define SC_GM_TABDOWN       1
66 #define SC_GM_DBLDOWN       2
67 #define SC_GM_FILTER        3
68 #define SC_GM_IGNORE        4
69 #define SC_GM_WATERUNDO     5
70 #define SC_GM_URLDOWN       6
71 
72         //  Page-Drag-Modus
73 
74 #define SC_PD_NONE          0
75 #define SC_PD_RANGE_L       1
76 #define SC_PD_RANGE_R       2
77 #define SC_PD_RANGE_T       4
78 #define SC_PD_RANGE_B       8
79 #define SC_PD_RANGE_TL      (SC_PD_RANGE_T|SC_PD_RANGE_L)
80 #define SC_PD_RANGE_TR      (SC_PD_RANGE_T|SC_PD_RANGE_R)
81 #define SC_PD_RANGE_BL      (SC_PD_RANGE_B|SC_PD_RANGE_L)
82 #define SC_PD_RANGE_BR      (SC_PD_RANGE_B|SC_PD_RANGE_R)
83 #define SC_PD_BREAK_H       16
84 #define SC_PD_BREAK_V       32
85 
86 
87 class ScHideTextCursor
88 {
89 private:
90     ScViewData* pViewData;
91     ScSplitPos  eWhich;
92 
93 public:
94             ScHideTextCursor( ScViewData* pData, ScSplitPos eW );
95             ~ScHideTextCursor();
96 };
97 
98 // ---------------------------------------------------------------------------
99 // predefines
100 namespace sdr { namespace overlay { class OverlayObjectList; }}
101 
102 class ScGridWindow : public Window, public DropTargetHelper, public DragSourceHelper
103 {
104     //  ScFilterListBox wird immer fuer Auswahlliste benutzt
105     friend class ScFilterListBox;
106 
107 private:
108     // #114409#
109     ::sdr::overlay::OverlayObjectList*              mpOOCursors;
110     ::sdr::overlay::OverlayObjectList*              mpOOSelection;
111     ::sdr::overlay::OverlayObjectList*              mpOOAutoFill;
112     ::sdr::overlay::OverlayObjectList*              mpOODragRect;
113     ::sdr::overlay::OverlayObjectList*              mpOOHeader;
114     ::sdr::overlay::OverlayObjectList*              mpOOShrink;
115 
116     ::boost::shared_ptr<Rectangle> mpAutoFillRect;
117 
118     /**
119      * Stores current visible column and row ranges, used to avoid expensive
120      * operations on objects that are outside visible area.
121      */
122     struct VisibleRange
123     {
124         SCCOL mnCol1;
125         SCCOL mnCol2;
126         SCROW mnRow1;
127         SCROW mnRow2;
128 
129         VisibleRange();
130 
131         bool isInside(SCCOL nCol, SCROW nRow) const;
132     };
133     VisibleRange maVisibleRange;
134 
135 private:
136     ScViewData*             pViewData;
137     ScSplitPos              eWhich;
138     ScHSplitPos             eHWhich;
139     ScVSplitPos             eVWhich;
140 
141     ScNoteMarker*           pNoteMarker;
142 
143     ScFilterListBox*        pFilterBox;
144     FloatingWindow*         pFilterFloat;
145     ::std::auto_ptr<ScDPFieldPopupWindow> mpDPFieldPopup;
146     ::std::auto_ptr<ScDPFieldButton>      mpFilterButton;
147 
148     sal_uInt16                  nCursorHideCount;
149 
150     sal_Bool                    bMarking;
151 
152     sal_uInt16                  nButtonDown;
153     sal_Bool                    bEEMouse;               // Edit-Engine hat Maus
154     sal_uInt8                   nMouseStatus;
155     sal_uInt8                    nNestedButtonState;     // track nested button up/down calls
156 
157     sal_Bool                    bDPMouse;               // DataPilot-D&D (neue Pivottabellen)
158     long                    nDPField;
159     ScDPObject*             pDragDPObj; //! name?
160 
161     sal_Bool                    bRFMouse;               // RangeFinder-Drag
162     sal_Bool                    bRFSize;
163     sal_uInt16                  nRFIndex;
164     SCsCOL                  nRFAddX;
165     SCsROW                  nRFAddY;
166 
167     sal_uInt16                  nPagebreakMouse;        // Pagebreak-Modus Drag
168     SCCOLROW                nPagebreakBreak;
169     SCCOLROW                nPagebreakPrev;
170     ScRange                 aPagebreakSource;
171     ScRange                 aPagebreakDrag;
172     sal_Bool                    bPagebreakDrawn;
173 
174     sal_uInt8                   nPageScript;
175 
176     long                    nLastClickX;
177     long                    nLastClickY;
178 
179     sal_Bool                    bDragRect;
180     SCCOL                   nDragStartX;
181     SCROW                   nDragStartY;
182     SCCOL                   nDragEndX;
183     SCROW                   nDragEndY;
184     InsCellCmd              meDragInsertMode;
185 
186     sal_uInt16                  nCurrentPointer;
187 
188     sal_Bool                    bIsInScroll;
189     sal_Bool                    bIsInPaint;
190 
191     ScDDComboBoxButton      aComboButton;
192 
193     Point                   aCurMousePos;
194 
195     sal_uInt16                  nPaintCount;
196     Rectangle               aRepaintPixel;
197     sal_Bool                    bNeedsRepaint;
198 
199     sal_Bool                    bAutoMarkVisible;
200     ScAddress               aAutoMarkPos;
201 
202     sal_Bool                    bListValButton;
203     ScAddress               aListValPos;
204 
205     Rectangle               aInvertRect;
206 
207     DECL_LINK( PopupModeEndHdl, FloatingWindow* );
208     DECL_LINK( PopupSpellingHdl, SpellCallbackInfo* );
209 
210     sal_Bool            TestMouse( const MouseEvent& rMEvt, sal_Bool bAction );
211 
212     sal_Bool            DoPageFieldSelection( SCCOL nCol, SCROW nRow );
213     bool            DoAutoFilterButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
214     void            DoPushButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
215 
216     void            DPMouseMove( const MouseEvent& rMEvt );
217     void            DPMouseButtonUp( const MouseEvent& rMEvt );
218     void            DPTestMouse( const MouseEvent& rMEvt, sal_Bool bMove );
219 
220     /**
221      * Check if the mouse click is on a field popup button.
222      *
223      * @return bool true if the field popup menu has been launched and no
224      *         further mouse event handling is necessary, false otherwise.
225      */
226     bool            DPTestFieldPopupArrow(const MouseEvent& rMEvt, const ScAddress& rPos, ScDPObject* pDPObj);
227     void            DPLaunchFieldPopupMenu(
228         const Point& rScrPos, const Size& rScrSize, const ScAddress& rPos, ScDPObject* pDPObj);
229 
230     void            RFMouseMove( const MouseEvent& rMEvt, sal_Bool bUp );
231 
232     void            PagebreakMove( const MouseEvent& rMEvt, sal_Bool bUp );
233 
234     void            UpdateDragRect( sal_Bool bShowRange, const Rectangle& rPosRect );
235 
236     sal_Bool            IsAutoFilterActive( SCCOL nCol, SCROW nRow, SCTAB nTab );
237     void            ExecFilter( sal_uLong nSel, SCCOL nCol, SCROW nRow,
238                                 const String& aValue, bool bCheckForDates );
239     void            FilterSelect( sal_uLong nSel );
240 
241     void            ExecDataSelect( SCCOL nCol, SCROW nRow, const String& rStr );
242 
243     void            ExecPageFieldSelect( SCCOL nCol, SCROW nRow, sal_Bool bHasSelection, const String& rStr );
244 
245     sal_Bool            HasScenarioButton( const Point& rPosPixel, ScRange& rScenRange );
246 
247     sal_Bool            DropScroll( const Point& rMousePos );
248 
249     sal_Int8        AcceptPrivateDrop( const AcceptDropEvent& rEvt );
250     sal_Int8        ExecutePrivateDrop( const ExecuteDropEvent& rEvt );
251     sal_Int8        DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPosX, SCROW nDestPosY,
252                                     const Point& rLogicPos, sal_Int8 nDndAction );
253 
254     void            HandleMouseButtonDown( const MouseEvent& rMEvt );
255 
256     sal_Bool            DrawMouseButtonDown(const MouseEvent& rMEvt);
257     sal_Bool            DrawMouseButtonUp(const MouseEvent& rMEvt);
258     sal_Bool            DrawMouseMove(const MouseEvent& rMEvt);
259     sal_Bool            DrawKeyInput(const KeyEvent& rKEvt);
260     sal_Bool            DrawCommand(const CommandEvent& rCEvt);
261     sal_Bool            DrawHasMarkedObj();
262     void            DrawEndAction();
263     void            DrawMarkDropObj( SdrObject* pObj );
264     SdrObject*      GetEditObject();
265     sal_Bool            IsMyModel(SdrEditView* pSdrView);
266     //void          DrawStartTimer();
267 
268     void            DrawRedraw( ScOutputData& rOutputData, ScUpdateMode eMode, sal_uLong nLayer );
269     void            DrawSdrGrid( const Rectangle& rDrawingRect, OutputDevice* pContentDev );
270     //sal_Bool          DrawBeforeScroll();
271     void            DrawAfterScroll(/*sal_Bool bVal*/);
272     //void          DrawMarks();
273     //sal_Bool          NeedDrawMarks();
274     void            DrawComboButton( const Point&   rCellPos,
275                                      long           nCellSizeX,
276                                      long           nCellSizeY,
277                                      sal_Bool           bArrowState,
278                                      sal_Bool           bBtnIn  = sal_False );
279     Rectangle       GetListValButtonRect( const ScAddress& rButtonPos );
280 
281     void            DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, OutputDevice* pContentDev );
282 
283     sal_Bool            GetEditUrl( const Point& rPos,
284                                 String* pName=0, String* pUrl=0, String* pTarget=0 );
285     sal_Bool            GetEditUrlOrError( sal_Bool bSpellErr, const Point& rPos,
286                                 String* pName=0, String* pUrl=0, String* pTarget=0 );
287 
288     sal_Bool            HitRangeFinder( const Point& rMouse, sal_Bool& rCorner, sal_uInt16* pIndex = NULL,
289                                         SCsCOL* pAddX = NULL, SCsROW* pAddY = NULL );
290 
291     sal_uInt16          HitPageBreak( const Point& rMouse, ScRange* pSource = NULL,
292                                     SCCOLROW* pBreak = NULL, SCCOLROW* pPrev = NULL );
293 
294     void            PasteSelection( const Point& rPosPixel );
295 
296     void            SelectForContextMenu( const Point& rPosPixel, SCsCOL nCellX, SCsROW nCellY );
297 
298     void            GetSelectionRects( ::std::vector< Rectangle >& rPixelRects );
299 
300 protected:
301     using Window::Resize;
302     virtual void    Resize( const Size& rSize );
303     virtual void    PrePaint();
304     virtual void    Paint( const Rectangle& rRect );
305     virtual void    KeyInput(const KeyEvent& rKEvt);
306     virtual void    GetFocus();
307     virtual void    LoseFocus();
308 
309     virtual void    RequestHelp( const HelpEvent& rEvt );
310     virtual void    Command( const CommandEvent& rCEvt );
311 
312     virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
313     virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
314     virtual void    StartDrag( sal_Int8 nAction, const Point& rPosPixel );
315 
316 public:
317     ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhichPos );
318     ~ScGridWindow();
319 
320     // #i70788# flush and get overlay
321     ::sdr::overlay::OverlayManager* getOverlayManager();
322     void flushOverlayManager();
323 
324     virtual void    DataChanged( const DataChangedEvent& rDCEvt );
325 
326     virtual void    MouseButtonDown( const MouseEvent& rMEvt );
327     virtual void    MouseButtonUp( const MouseEvent& rMEvt );
328     virtual void    MouseMove( const MouseEvent& rMEvt );
329     virtual long    PreNotify( NotifyEvent& rNEvt );
330     virtual void    Tracking( const TrackingEvent& rTEvt );
331 
332     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
333 
334     void            FakeButtonUp();
335 
336     Point           GetMousePosPixel() const;
337     void            UpdateStatusPosSize();
338 
339     void            ClickExtern();
340 
341     void            SetPointer( const Pointer& rPointer );
342 
343     void            MoveMouseStatus( ScGridWindow &rDestWin );
344 
345     void            ScrollPixel( long nDifX, long nDifY );
346     void            UpdateEditViewPos();
347 
348     void            UpdateFormulas();
349 
350     void            DoAutoFilterMenue( SCCOL nCol, SCROW nRow, sal_Bool bDataSelect );
351     void            DoScenarioMenue( const ScRange& rScenRange );
352 
353     void            LaunchPageFieldMenu( SCCOL nCol, SCROW nRow );
354     void            LaunchDPFieldMenu( SCCOL nCol, SCROW nRow );
355 
356     ::com::sun::star::sheet::DataPilotFieldOrientation GetDPFieldOrientation( SCCOL nCol, SCROW nRow ) const;
357 
358     void            DrawButtons( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
359                                     ScTableInfo& rTabInfo, OutputDevice* pContentDev );
360 
361     using Window::Draw;
362     void            Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
363                         ScUpdateMode eMode = SC_UPDATE_ALL );
364 
365     void            InvertSimple( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
366                                     sal_Bool bTestMerge = sal_False, sal_Bool bRepeat = sal_False );
367 
368 //UNUSED2008-05  void           DrawDragRect( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 );
369 
370     void            CreateAnchorHandle(SdrHdlList& rHdl, const ScAddress& rAddress);
371 
372     void            HideCursor();
373     void            ShowCursor();
374     void            DrawCursor();
375     void            DrawAutoFillMark();
376     void            UpdateAutoFillMark(sal_Bool bMarked, const ScRange& rMarkRange);
377 
378     void            UpdateListValPos( sal_Bool bVisible, const ScAddress& rPos );
379 
380     sal_Bool            ShowNoteMarker( SCsCOL nPosX, SCsROW nPosY, sal_Bool bKeyboard );
381     void            HideNoteMarker();
382 
383     MapMode         GetDrawMapMode( sal_Bool bForce = sal_False );
384 
385     void            ContinueDrag();
386 
387     void            StopMarking();
388     void            UpdateInputContext();
389 
390     void            CheckInverted()     { if (nPaintCount) bNeedsRepaint = sal_True; }
391 
392     void            DoInvertRect( const Rectangle& rPixel );
393 
394     void            CheckNeedsRepaint();
395 
396     void            UpdateDPFromFieldPopupMenu();
397 
398     void            UpdateVisibleRange();
399 
400     // #114409#
401     void CursorChanged();
402     void DrawLayerCreated();
403 
404     void            DeleteCursorOverlay();
405     void            UpdateCursorOverlay();
406     void            DeleteSelectionOverlay();
407     void            UpdateSelectionOverlay();
408     void            DeleteAutoFillOverlay();
409     void            UpdateAutoFillOverlay();
410     void            DeleteDragRectOverlay();
411     void            UpdateDragRectOverlay();
412     void            DeleteHeaderOverlay();
413     void            UpdateHeaderOverlay();
414     void            DeleteShrinkOverlay();
415     void            UpdateShrinkOverlay();
416     void            UpdateAllOverlays();
417 
418 protected:
419     // #114409#
420     void ImpCreateOverlayObjects();
421     void ImpDestroyOverlayObjects();
422 
423 };
424 
425 
426 
427 #endif
428 
429