blob: 5ef61a78b03010b41b52dfb400a190938ce72f82 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef SC_GRIDWIN_HXX
#define SC_GRIDWIN_HXX
#include <tools/string.hxx>
#include <svtools/transfer.hxx>
#include "viewutil.hxx"
#include "viewdata.hxx"
#include "cbutton.hxx"
#include <svx/sdr/overlay/overlayobject.hxx>
#include <com/sun/star/sheet/DataPilotFieldOrientation.hpp>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <vector>
#include <memory>
#include <boost/shared_ptr.hpp>
// ---------------------------------------------------------------------------
struct ScTableInfo;
class ScViewSelectionEngine;
class ScDPObject;
class ScDPFieldPopupWindow;
class ScDPFieldButton;
class ScOutputData;
class ScFilterListBox;
class AutoFilterPopup;
class SdrObject;
class SdrEditView;
class ScNoteMarker;
class FloatingWindow;
class SdrHdlList;
class ScTransferObj;
struct SpellCallbackInfo;
// Maus-Status (nMouseStatus)
#define SC_GM_NONE 0
#define SC_GM_TABDOWN 1
#define SC_GM_DBLDOWN 2
#define SC_GM_FILTER 3
#define SC_GM_IGNORE 4
#define SC_GM_WATERUNDO 5
#define SC_GM_URLDOWN 6
// Page-Drag-Modus
#define SC_PD_NONE 0
#define SC_PD_RANGE_L 1
#define SC_PD_RANGE_R 2
#define SC_PD_RANGE_T 4
#define SC_PD_RANGE_B 8
#define SC_PD_RANGE_TL (SC_PD_RANGE_T|SC_PD_RANGE_L)
#define SC_PD_RANGE_TR (SC_PD_RANGE_T|SC_PD_RANGE_R)
#define SC_PD_RANGE_BL (SC_PD_RANGE_B|SC_PD_RANGE_L)
#define SC_PD_RANGE_BR (SC_PD_RANGE_B|SC_PD_RANGE_R)
#define SC_PD_BREAK_H 16
#define SC_PD_BREAK_V 32
class ScHideTextCursor
{
private:
ScViewData* pViewData;
ScSplitPos eWhich;
public:
ScHideTextCursor( ScViewData* pData, ScSplitPos eW );
~ScHideTextCursor();
};
// ---------------------------------------------------------------------------
// predefines
namespace sdr { namespace overlay { class OverlayObjectList; }}
class ScGridWindow : public Window, public DropTargetHelper, public DragSourceHelper
{
// ScFilterListBox wird immer fuer Auswahlliste benutzt
friend class ScFilterListBox;
private:
// #114409#
::sdr::overlay::OverlayObjectList* mpOOCursors;
::sdr::overlay::OverlayObjectList* mpOOSelection;
::sdr::overlay::OverlayObjectList* mpOOAutoFill;
::sdr::overlay::OverlayObjectList* mpOODragRect;
::sdr::overlay::OverlayObjectList* mpOOHeader;
::sdr::overlay::OverlayObjectList* mpOOShrink;
::boost::shared_ptr<Rectangle> mpAutoFillRect;
/**
* Stores current visible column and row ranges, used to avoid expensive
* operations on objects that are outside visible area.
*/
struct VisibleRange
{
SCCOL mnCol1;
SCCOL mnCol2;
SCROW mnRow1;
SCROW mnRow2;
VisibleRange();
bool isInside(SCCOL nCol, SCROW nRow) const;
};
VisibleRange maVisibleRange;
private:
ScViewData* pViewData;
ScSplitPos eWhich;
ScHSplitPos eHWhich;
ScVSplitPos eVWhich;
ScNoteMarker* pNoteMarker;
ScFilterListBox* pFilterBox;
FloatingWindow* pFilterFloat;
::std::auto_ptr<ScDPFieldPopupWindow> mpDPFieldPopup;
::std::auto_ptr<ScDPFieldButton> mpFilterButton;
sal_uInt16 nCursorHideCount;
sal_Bool bMarking;
sal_uInt16 nButtonDown;
sal_Bool bEEMouse; // Edit-Engine hat Maus
sal_uInt8 nMouseStatus;
sal_uInt8 nNestedButtonState; // track nested button up/down calls
sal_Bool bDPMouse; // DataPilot-D&D (neue Pivottabellen)
long nDPField;
ScDPObject* pDragDPObj; //! name?
sal_Bool bRFMouse; // RangeFinder-Drag
sal_Bool bRFSize;
sal_uInt16 nRFIndex;
SCsCOL nRFAddX;
SCsROW nRFAddY;
sal_uInt16 nPagebreakMouse; // Pagebreak-Modus Drag
SCCOLROW nPagebreakBreak;
SCCOLROW nPagebreakPrev;
ScRange aPagebreakSource;
ScRange aPagebreakDrag;
sal_Bool bPagebreakDrawn;
sal_uInt8 nPageScript;
long nLastClickX;
long nLastClickY;
sal_Bool bDragRect;
SCCOL nDragStartX;
SCROW nDragStartY;
SCCOL nDragEndX;
SCROW nDragEndY;
InsCellCmd meDragInsertMode;
sal_uInt16 nCurrentPointer;
sal_Bool bIsInScroll;
sal_Bool bIsInPaint;
ScDDComboBoxButton aComboButton;
Point aCurMousePos;
sal_uInt16 nPaintCount;
Rectangle aRepaintPixel;
sal_Bool bNeedsRepaint;
sal_Bool bAutoMarkVisible;
ScAddress aAutoMarkPos;
sal_Bool bListValButton;
ScAddress aListValPos;
Rectangle aInvertRect;
DECL_LINK( PopupModeEndHdl, FloatingWindow* );
DECL_LINK( PopupSpellingHdl, SpellCallbackInfo* );
sal_Bool TestMouse( const MouseEvent& rMEvt, sal_Bool bAction );
sal_Bool DoPageFieldSelection( SCCOL nCol, SCROW nRow );
bool DoAutoFilterButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
void DoPushButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
void DPMouseMove( const MouseEvent& rMEvt );
void DPMouseButtonUp( const MouseEvent& rMEvt );
void DPTestMouse( const MouseEvent& rMEvt, sal_Bool bMove );
/**
* Check if the mouse click is on a field popup button.
*
* @return bool true if the field popup menu has been launched and no
* further mouse event handling is necessary, false otherwise.
*/
bool DPTestFieldPopupArrow(const MouseEvent& rMEvt, const ScAddress& rPos, ScDPObject* pDPObj);
void DPLaunchFieldPopupMenu(
const Point& rScrPos, const Size& rScrSize, const ScAddress& rPos, ScDPObject* pDPObj);
void RFMouseMove( const MouseEvent& rMEvt, sal_Bool bUp );
void PagebreakMove( const MouseEvent& rMEvt, sal_Bool bUp );
void UpdateDragRect( sal_Bool bShowRange, const Rectangle& rPosRect );
sal_Bool IsAutoFilterActive( SCCOL nCol, SCROW nRow, SCTAB nTab );
void ExecFilter( sal_uLong nSel, SCCOL nCol, SCROW nRow,
const String& aValue, bool bCheckForDates );
void FilterSelect( sal_uLong nSel );
void ExecDataSelect( SCCOL nCol, SCROW nRow, const String& rStr );
void ExecPageFieldSelect( SCCOL nCol, SCROW nRow, sal_Bool bHasSelection, const String& rStr );
sal_Bool HasScenarioButton( const Point& rPosPixel, ScRange& rScenRange );
sal_Bool HasScenarioRange( sal_uInt16 nCol, sal_Int32 nRow, ScRange& rScenRange );
sal_Bool DropScroll( const Point& rMousePos );
sal_Int8 AcceptPrivateDrop( const AcceptDropEvent& rEvt );
sal_Int8 ExecutePrivateDrop( const ExecuteDropEvent& rEvt );
sal_Int8 DropTransferObj( ScTransferObj* pTransObj, SCCOL nDestPosX, SCROW nDestPosY,
const Point& rLogicPos, sal_Int8 nDndAction );
void HandleMouseButtonDown( const MouseEvent& rMEvt );
sal_Bool DrawMouseButtonDown(const MouseEvent& rMEvt);
sal_Bool DrawMouseButtonUp(const MouseEvent& rMEvt);
sal_Bool DrawMouseMove(const MouseEvent& rMEvt);
sal_Bool DrawKeyInput(const KeyEvent& rKEvt);
sal_Bool DrawCommand(const CommandEvent& rCEvt);
sal_Bool DrawHasMarkedObj();
void DrawEndAction();
void DrawMarkDropObj( SdrObject* pObj );
SdrObject* GetEditObject();
sal_Bool IsMyModel(SdrEditView* pSdrView);
//void DrawStartTimer();
void DrawRedraw( ScOutputData& rOutputData, ScUpdateMode eMode, sal_uLong nLayer );
void DrawSdrGrid( const Rectangle& rDrawingRect, OutputDevice* pContentDev );
//sal_Bool DrawBeforeScroll();
void DrawAfterScroll(/*sal_Bool bVal*/);
//void DrawMarks();
//sal_Bool NeedDrawMarks();
void DrawComboButton( const Point& rCellPos,
long nCellSizeX,
long nCellSizeY,
sal_Bool bArrowState,
sal_Bool bBtnIn = sal_False );
Rectangle GetListValButtonRect( const ScAddress& rButtonPos );
void DrawPagePreview( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, OutputDevice* pContentDev );
sal_Bool GetEditUrl( const Point& rPos,
String* pName=0, String* pUrl=0, String* pTarget=0 );
sal_Bool GetEditUrlOrError( sal_Bool bSpellErr, const Point& rPos,
String* pName=0, String* pUrl=0, String* pTarget=0 );
sal_Bool HitRangeFinder( const Point& rMouse, sal_Bool& rCorner, sal_uInt16* pIndex = NULL,
SCsCOL* pAddX = NULL, SCsROW* pAddY = NULL );
sal_uInt16 HitPageBreak( const Point& rMouse, ScRange* pSource = NULL,
SCCOLROW* pBreak = NULL, SCCOLROW* pPrev = NULL );
void PasteSelection( const Point& rPosPixel );
void SelectForContextMenu( const Point& rPosPixel, SCsCOL nCellX, SCsROW nCellY );
void GetSelectionRects( ::std::vector< Rectangle >& rPixelRects );
protected:
using Window::Resize;
virtual void Resize( const Size& rSize );
virtual void PrePaint();
virtual void Paint( const Rectangle& rRect );
virtual void KeyInput(const KeyEvent& rKEvt);
virtual void GetFocus();
virtual void LoseFocus();
virtual void RequestHelp( const HelpEvent& rEvt );
virtual void Command( const CommandEvent& rCEvt );
virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt );
virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt );
virtual void StartDrag( sal_Int8 nAction, const Point& rPosPixel );
public:
ScGridWindow( Window* pParent, ScViewData* pData, ScSplitPos eWhichPos );
~ScGridWindow();
// #i70788# flush and get overlay
::sdr::overlay::OverlayManager* getOverlayManager();
void flushOverlayManager();
virtual void DataChanged( const DataChangedEvent& rDCEvt );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void MouseButtonUp( const MouseEvent& rMEvt );
virtual void MouseMove( const MouseEvent& rMEvt );
virtual long PreNotify( NotifyEvent& rNEvt );
virtual void Tracking( const TrackingEvent& rTEvt );
virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
void FakeButtonUp();
Point GetMousePosPixel() const;
void UpdateStatusPosSize();
void ClickExtern();
void SetPointer( const Pointer& rPointer );
void MoveMouseStatus( ScGridWindow &rDestWin );
void ScrollPixel( long nDifX, long nDifY );
void UpdateEditViewPos();
void UpdateFormulas();
void DoAutoFilterMenue( SCCOL nCol, SCROW nRow, sal_Bool bDataSelect );
void DoScenarioMenue( const ScRange& rScenRange );
void LaunchPageFieldMenu( SCCOL nCol, SCROW nRow );
void LaunchDPFieldMenu( SCCOL nCol, SCROW nRow );
::com::sun::star::sheet::DataPilotFieldOrientation GetDPFieldOrientation( SCCOL nCol, SCROW nRow ) const;
void DrawButtons( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
ScTableInfo& rTabInfo, OutputDevice* pContentDev );
using Window::Draw;
void Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
ScUpdateMode eMode = SC_UPDATE_ALL );
void InvertSimple( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
sal_Bool bTestMerge = sal_False, sal_Bool bRepeat = sal_False );
//UNUSED2008-05 void DrawDragRect( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 );
void CreateAnchorHandle(SdrHdlList& rHdl, const ScAddress& rAddress);
void HideCursor();
void ShowCursor();
void DrawCursor();
void DrawAutoFillMark();
void UpdateAutoFillMark(sal_Bool bMarked, const ScRange& rMarkRange);
void UpdateListValPos( sal_Bool bVisible, const ScAddress& rPos );
sal_Bool ShowNoteMarker( SCsCOL nPosX, SCsROW nPosY, sal_Bool bKeyboard );
void HideNoteMarker();
MapMode GetDrawMapMode( sal_Bool bForce = sal_False );
void ContinueDrag();
void StopMarking();
void UpdateInputContext();
void CheckInverted() { if (nPaintCount) bNeedsRepaint = sal_True; }
void DoInvertRect( const Rectangle& rPixel );
void CheckNeedsRepaint();
virtual void SwitchView();
void UpdateDPFromFieldPopupMenu();
void UpdateVisibleRange();
// #114409#
void CursorChanged();
void DrawLayerCreated();
void DeleteCursorOverlay();
void UpdateCursorOverlay();
void DeleteSelectionOverlay();
void UpdateSelectionOverlay();
void DeleteAutoFillOverlay();
void UpdateAutoFillOverlay();
void DeleteDragRectOverlay();
void UpdateDragRectOverlay();
void DeleteHeaderOverlay();
void UpdateHeaderOverlay();
void DeleteShrinkOverlay();
void UpdateShrinkOverlay();
void UpdateAllOverlays();
protected:
// #114409#
void ImpCreateOverlayObjects();
void ImpDestroyOverlayObjects();
};
#endif