blob: 3ad8c84a1dec87a21b354dde61f0c17ee3b72ca0 [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 _SV_SELENG_HXX
#define _SV_SELENG_HXX
#include <vcl/dllapi.h>
#include <vcl/timer.hxx>
#include <vcl/event.hxx>
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