/*
Copyright ( c ) 2003 , 2004 , 2005 Clarence Dang < dang @ kde . org >
All rights reserved .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
documentation and / or other materials provided with the distribution .
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef __kpviewmanager_h__
# define __kpviewmanager_h__
# include <tqcursor.h>
# include <tqobject.h>
# include <tqptrlist.h>
# include <tqrect.h>
class TQPixmap ;
class TQRect ;
class TQTimer ;
class kpDocument ;
class kpView ;
class kpMainWindow ;
class kpTempPixmap ;
class kpViewManager : public TQObject
{
Q_OBJECT
public :
kpViewManager ( kpMainWindow * mainWindow ) ;
~ kpViewManager ( ) ;
//
// Registering views
//
void registerView ( kpView * view ) ;
void unregisterView ( kpView * view ) ;
void unregisterAllViews ( ) ;
//
// Temp Pixmap
//
const kpTempPixmap * tempPixmap ( ) const ;
void setTempPixmap ( const kpTempPixmap & tempPixmap ) ;
void invalidateTempPixmap ( ) ;
//
// Selections
//
bool selectionBorderVisible ( ) const ;
void setSelectionBorderVisible ( bool yes = true ) ;
bool selectionBorderFinished ( ) const ;
void setSelectionBorderFinished ( bool yes = true ) ;
//
// Text Cursor
//
bool textCursorEnabled ( ) const ;
void setTextCursorEnabled ( bool yes = true ) ;
int textCursorRow ( ) const ;
int textCursorCol ( ) const ;
void setTextCursorPosition ( int row , int col , bool isUpdateMicroFocusHint = false ) ;
bool textCursorBlinkState ( ) const ;
void setTextCursorBlinkState ( bool on = true ) ;
protected :
void updateTextCursor ( ) ;
TQTimer * m_textCursorBlinkTimer ;
int m_textCursorRow , m_textCursorCol ;
bool m_textCursorBlinkState ;
protected slots :
void slotTextCursorBlink ( ) ;
public :
//
// Cursors
//
void setCursor ( const TQCursor & cursor ) ;
void unsetCursor ( ) ;
//
// View
//
kpView * viewUnderCursor ( bool usingTQt = false ) const ;
//
// TQWidget::hasMouse() is unreliable:
//
// "bool TQWidget::hasMouse () const
// ... See the "underMouse" property for details.
// .
// .
// .
// bool underMouse
// ... This value is not updated properly during drag and drop operations."
//
// i.e. it's possible that hasMouse() returns false in a mousePressEvent()!
//
// This hack needs to be called from kpView so that viewUnderCursor() works
// as a reasonable replacement (although there is at least one case where
// it still won't work - just after a fake drag onto the view).
//
void setViewUnderCursor ( kpView * view ) ;
// Returns a pointer to the view that has keyboard focus or else, 0
// TODO: rename to "anActiveView()" or "aViewIsActive()" as more than
// 1 view can be active at the same time?
kpView * activeView ( ) const ;
// Specifies whether KolourPaint will queue _all_ paint events
// (generated by you or the window system), until the
// corresponding call to restoreQueueUpdates(). Use this
// before multiple, big, non-interactive changes to the
// document to eliminate virtually all flicker.
//
// This is better than TQWidget::setUpdatesEnabled() because
// restoreQueueUpdates() automatically restores only the regions
// of the views that need to be repainted, per view.
bool queueUpdates ( ) const ;
void setQueueUpdates ( ) ;
void restoreQueueUpdates ( ) ;
// Controls behaviour of updateViews():
//
// Slow: Let TQt buffer paint events via TQWidget::update().
// Results in less flicker. Paint events are probably merged
// so long-term efficiency is increased at the expense of
// reduced responsiveness (default).
// Fast: Force TQt to redraw immediately. No paint events
// are merged so there is great potential for flicker,
// if used inappropriately. Use this when the redraw
// area is small and KolourPaint's responsiveness is
// critical. Continual use of this mode can result in
// unnecessary redraws and incredibly slugish performance.
bool fastUpdates ( ) const ;
void setFastUpdates ( ) ;
void restoreFastUpdates ( ) ;
private :
int m_queueUpdatesCounter , m_fastUpdatesCounter ;
public slots :
// updating views
void updateView ( kpView * v ) ;
void updateView ( kpView * v , const TQRect & viewRect ) ;
void updateView ( kpView * v , int x , int y , int w , int h ) ;
void updateView ( kpView * v , const TQRegion & viewRegion ) ;
void updateViewRectangleEdges ( kpView * v , const TQRect & viewRect ) ;
void updateViews ( ) ;
void updateViews ( const TQRect & docRect ) ;
void updateViews ( int x , int y , int w , int h ) ;
void adjustViewsToEnvironment ( ) ;
private :
// don't use
kpViewManager ( const kpViewManager & ) ;
bool operator = ( const kpViewManager & ) ;
kpDocument * document ( ) const ;
kpMainWindow * m_mainWindow ;
TQPtrList < kpView > m_views ;
TQCursor m_cursor ;
kpTempPixmap * m_tempPixmap ;
kpView * m_viewUnderCursor ;
bool m_selectionBorderVisible ;
bool m_selectionBorderFinished ;
// There is no need to maintain binary compatibility at this stage.
// The d-pointer is just so that you can experiment without recompiling
// the kitchen sink.
class kpViewManagerPrivate * d ;
} ;
# endif // __kpviewmanager_h__