/************************************************************** * * 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 _SV_SELENG_HXX #define _SV_SELENG_HXX #include #include #include class Window; class CommandEvent; // Timerticks #define SELENG_DRAGDROP_TIMEOUT 400 #define SELENG_AUTOREPEAT_INTERVAL 50 enum SelectionMode { NO_SELECTION, SINGLE_SELECTION, RANGE_SELECTION, MULTIPLE_SELECTION }; // --------------- // - FunctionSet - // --------------- class VCL_DLLPUBLIC FunctionSet { public: virtual void BeginDrag() = 0; virtual void CreateAnchor() = 0; // Anker-Pos := Cursor-Pos virtual void DestroyAnchor() = 0; // Cursor neu setzen, dabei die beim Anker beginnende // Selektion der neuen Cursor-Position anpassen. sal_True == Ok virtual sal_Bool SetCursorAtPoint( const Point& rPointPixel, sal_Bool bDontSelectAtCursor = sal_False ) = 0; virtual sal_Bool IsSelectionAtPoint( const Point& rPointPixel ) = 0; virtual void DeselectAtPoint( const Point& rPointPixel ) = 0; // Anker loeschen & alles deselektieren virtual void DeselectAll() = 0; }; // ------------------- // - SelectionEngine - // ------------------- #define SELENG_DRG_ENAB 0x0001 #define SELENG_IN_SEL 0x0002 #define SELENG_IN_ADD 0x0004 #define SELENG_ADD_ALW 0x0008 #define SELENG_IN_DRG 0x0010 #define SELENG_HAS_ANCH 0x0020 #define SELENG_CMDEVT 0x0040 #define SELENG_WAIT_UPEVT 0x0080 #define SELENG_EXPANDONMOVE 0x0100 class VCL_DLLPUBLIC SelectionEngine { private: FunctionSet* pFunctionSet; Window* pWin; Rectangle aArea; Timer aWTimer; // erzeugt kuenstliche Mouse-Moves MouseEvent aLastMove; SelectionMode eSelMode; // Stufigkeit fuer Mausbewegungen waehrend einer Selektion sal_uInt16 nMouseSensitivity; sal_uInt16 nLockedMods; sal_uInt16 nFlags; //#if 0 // _SOLAR__PRIVATE DECL_DLLPRIVATE_LINK( ImpWatchDog, Timer * ); //#endif inline sal_Bool ShouldDeselect( sal_Bool bModifierKey1 ) const; // determines to deselect or not when Ctrl-key is pressed on CursorPosChanging public: SelectionEngine( Window* pWindow, FunctionSet* pFunctions = NULL ); ~SelectionEngine(); // sal_True: Event wurde von Selection-Engine verarbeitet. sal_Bool SelMouseButtonDown( const MouseEvent& rMEvt ); sal_Bool SelMouseButtonUp( const MouseEvent& rMEvt ); sal_Bool SelMouseMove( const MouseEvent& rMEvt ); // Tastatur void CursorPosChanging( sal_Bool bShift, sal_Bool bMod1 ); // wird benoetigt, um bei ausserhalb des Bereichs stehender // Maus ueber einen Timer Move-Events zu erzeugen void SetVisibleArea( const Rectangle rNewArea ) { aArea = rNewArea; } const Rectangle& GetVisibleArea() const { return aArea; } void SetAddMode( sal_Bool); sal_Bool IsAddMode() const; void AddAlways( sal_Bool bOn ); sal_Bool IsAlwaysAdding() const; void EnableDrag( sal_Bool bOn ); sal_Bool IsDragEnabled() const; void ActivateDragMode(); sal_Bool IsInDragMode() const; void SetSelectionMode( SelectionMode eMode ); SelectionMode GetSelectionMode() const { return eSelMode; } void SetFunctionSet( FunctionSet* pFuncs ) { pFunctionSet = pFuncs; } const FunctionSet* GetFunctionSet() const { return pFunctionSet; } void SetMouseSensitivity( sal_uInt16 nSensitivity ) { nMouseSensitivity = nSensitivity; } sal_uInt16 GetMouseSensitivity() const { return nMouseSensitivity; } const Point& GetMousePosPixel() const { return aLastMove.GetPosPixel(); } const MouseEvent& GetMouseEvent() const { return aLastMove; } void SetWindow( Window*); Window* GetWindow() const { return pWin; } void LockModifiers( sal_uInt16 nModifiers ) { nLockedMods = nModifiers; } sal_uInt16 GetLockedModifiers() const { return nLockedMods; } sal_Bool IsInSelection() const; void Reset(); void Command( const CommandEvent& rCEvt ); sal_Bool HasAnchor() const; void SetAnchor( sal_Bool bAnchor ); // wird im Ctor eingeschaltet void ExpandSelectionOnMouseMove( sal_Bool bExpand = sal_True ) { if( bExpand ) nFlags |= SELENG_EXPANDONMOVE; else nFlags &= ~SELENG_EXPANDONMOVE; } }; inline sal_Bool SelectionEngine::IsDragEnabled() const { if ( nFlags & SELENG_DRG_ENAB ) return sal_True; else return sal_False; } inline sal_Bool SelectionEngine::IsAddMode() const { if ( nFlags & (SELENG_IN_ADD | SELENG_ADD_ALW) ) return sal_True; else return sal_False; } inline void SelectionEngine::SetAddMode( sal_Bool bNewMode ) { if ( bNewMode ) nFlags |= SELENG_IN_ADD; else nFlags &= (~SELENG_IN_ADD); } inline void SelectionEngine::EnableDrag( sal_Bool bOn ) { if ( bOn ) nFlags |= SELENG_DRG_ENAB; else nFlags &= (~SELENG_DRG_ENAB); } inline void SelectionEngine::AddAlways( sal_Bool bOn ) { if( bOn ) nFlags |= SELENG_ADD_ALW; else nFlags &= (~SELENG_ADD_ALW); } inline sal_Bool SelectionEngine::IsAlwaysAdding() const { if ( nFlags & SELENG_ADD_ALW ) return sal_True; else return sal_False; } inline sal_Bool SelectionEngine::IsInDragMode() const { if ( nFlags & SELENG_IN_DRG ) return sal_True; else return sal_False; } inline sal_Bool SelectionEngine::IsInSelection() const { if ( nFlags & SELENG_IN_SEL ) return sal_True; else return sal_False; } inline sal_Bool SelectionEngine::HasAnchor() const { if ( nFlags & SELENG_HAS_ANCH ) return sal_True; else return sal_False; } inline void SelectionEngine::SetAnchor( sal_Bool bAnchor ) { if ( bAnchor ) nFlags |= SELENG_HAS_ANCH; else nFlags &= (~SELENG_HAS_ANCH); } #endif // _SV_SELENG_HXX