2002-07-05 14:47:42 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: csvcontrol.cxx,v $
|
|
|
|
*
|
2002-08-01 11:48:33 +00:00
|
|
|
* $Revision: 1.3 $
|
2002-07-05 14:47:42 +00:00
|
|
|
*
|
2002-08-01 11:48:33 +00:00
|
|
|
* last change: $Author: dr $ $Date: 2002-08-01 12:48:30 $
|
2002-07-05 14:47:42 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (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.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifdef PCH
|
|
|
|
#include "ui_pch.hxx"
|
|
|
|
#endif
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
#ifndef _SC_CSVCONTROL_HXX
|
|
|
|
#include "csvcontrol.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _TOOLS_DEBUG_HXX
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
ScCsvLayoutData::ScCsvLayoutData() :
|
|
|
|
mnPosCount( 1 ),
|
|
|
|
mnPosOffset( 0 ),
|
|
|
|
mnWinWidth( 1 ),
|
|
|
|
mnOffsetX( 0 ),
|
|
|
|
mnCharWidth( 1 ),
|
|
|
|
mnLineCount( 1 ),
|
|
|
|
mnLineOffset( 0 ),
|
|
|
|
mnWinHeight( 1 ),
|
|
|
|
mnOffsetY( 0 ),
|
|
|
|
mnLineHeight( 1 ),
|
|
|
|
mnPosCursor( POS_INVALID ),
|
|
|
|
mnColCursor( 0 ),
|
|
|
|
mnNoRepaint( 0 )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2002-08-01 11:48:33 +00:00
|
|
|
ScCsvDiff ScCsvLayoutData::GetDiff( const ScCsvLayoutData& rData ) const
|
2002-07-05 14:47:42 +00:00
|
|
|
{
|
2002-08-01 11:48:33 +00:00
|
|
|
ScCsvDiff nRet = CSV_DIFF_EQUAL;
|
2002-07-11 14:39:48 +00:00
|
|
|
if( mnPosCount != rData.mnPosCount ) nRet |= CSV_DIFF_POSCOUNT;
|
|
|
|
if( mnPosOffset != rData.mnPosOffset ) nRet |= CSV_DIFF_POSOFFSET;
|
|
|
|
if( mnOffsetX != rData.mnOffsetX ) nRet |= CSV_DIFF_OFFSETX;
|
|
|
|
if( mnCharWidth != rData.mnCharWidth ) nRet |= CSV_DIFF_CHARWIDTH;
|
|
|
|
if( mnLineCount != rData.mnLineCount ) nRet |= CSV_DIFF_LINECOUNT;
|
|
|
|
if( mnLineOffset != rData.mnLineOffset ) nRet |= CSV_DIFF_LINEOFFSET;
|
|
|
|
if( mnOffsetY != rData.mnOffsetY ) nRet |= CSV_DIFF_OFFSETY;
|
|
|
|
if( mnLineHeight != rData.mnLineHeight ) nRet |= CSV_DIFF_LINEHEIGHT;
|
|
|
|
if( mnPosCursor != rData.mnPosCursor ) nRet |= CSV_DIFF_RULERCURSOR;
|
|
|
|
if( mnColCursor != rData.mnColCursor ) nRet |= CSV_DIFF_GRIDCURSOR;
|
|
|
|
return nRet;
|
2002-07-05 14:47:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
|
|
|
ScCsvControl::ScCsvControl( ScCsvControl& rParent ) :
|
|
|
|
Control( &rParent, WB_TABSTOP | WB_NODIALOGCONTROL ),
|
|
|
|
mrData( rParent.GetLayoutData() ),
|
|
|
|
mbValidGfx( false )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ScCsvControl::ScCsvControl( Window* pParent, const ScCsvLayoutData& rData, WinBits nStyle ) :
|
|
|
|
Control( pParent, nStyle ),
|
|
|
|
mrData( rData ),
|
|
|
|
mbValidGfx( false )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
ScCsvControl::ScCsvControl( Window* pParent, const ScCsvLayoutData& rData, const ResId& rResId ) :
|
|
|
|
Control( pParent, rResId ),
|
|
|
|
mrData( rData ),
|
|
|
|
mbValidGfx( false )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-08-01 11:48:33 +00:00
|
|
|
// repaint helpers ------------------------------------------------------------
|
2002-07-05 14:47:42 +00:00
|
|
|
|
|
|
|
void ScCsvControl::Repaint( bool bInvalidate )
|
|
|
|
{
|
|
|
|
if( bInvalidate )
|
|
|
|
InvalidateGfx();
|
|
|
|
if( !IsNoRepaint() )
|
2002-08-01 11:48:33 +00:00
|
|
|
Execute( CSVCMD_REPAINT );
|
2002-07-05 14:47:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ScCsvControl::DisableRepaint()
|
|
|
|
{
|
|
|
|
++mrData.mnNoRepaint;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ScCsvControl::EnableRepaint( bool bInvalidate )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( IsNoRepaint(), "ScCsvControl::EnableRepaint - invalid call" );
|
|
|
|
--mrData.mnNoRepaint;
|
|
|
|
Repaint( bInvalidate );
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-08-01 11:48:33 +00:00
|
|
|
// command handling -----------------------------------------------------------
|
2002-07-05 14:47:42 +00:00
|
|
|
|
2002-08-01 11:48:33 +00:00
|
|
|
void ScCsvControl::Execute( ScCsvCmdType eType, sal_Int32 nParam1, sal_Int32 nParam2 )
|
2002-07-05 14:47:42 +00:00
|
|
|
{
|
2002-08-01 11:48:33 +00:00
|
|
|
maCmd.Set( eType, nParam1, nParam2 );
|
|
|
|
maCmdHdl.Call( this );
|
2002-07-05 14:47:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// layout helpers -------------------------------------------------------------
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetVisPosCount() const
|
|
|
|
{
|
|
|
|
return (mrData.mnWinWidth - GetOffsetX()) / GetCharWidth() + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetMaxPosOffset() const
|
|
|
|
{
|
|
|
|
return Max( GetPosCount() - GetVisPosCount() + 2L, 0L );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScCsvControl::IsValidSplitPos( sal_Int32 nPos ) const
|
|
|
|
{
|
|
|
|
return (0 < nPos) && (nPos < GetPosCount() );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScCsvControl::IsVisibleSplitPos( sal_Int32 nPos ) const
|
|
|
|
{
|
|
|
|
return IsValidSplitPos( nPos ) && (GetFirstVisPos() <= nPos) && (nPos <= GetLastVisPos());
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetX( sal_Int32 nPos ) const
|
|
|
|
{
|
|
|
|
return GetOffsetX() + (nPos - GetFirstVisPos()) * GetCharWidth();
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetPosFromX( sal_Int32 nX ) const
|
|
|
|
{
|
|
|
|
return (nX - GetOffsetX() + GetCharWidth() / 2) / GetCharWidth() + GetFirstVisPos();
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetVisLineCount() const
|
|
|
|
{
|
|
|
|
return (mrData.mnWinHeight - GetOffsetY() - 2) / GetLineHeight() + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetLastVisLine() const
|
|
|
|
{
|
|
|
|
return Min( GetFirstVisLine() + GetVisLineCount(), GetLineCount() ) - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetMaxLineOffset() const
|
|
|
|
{
|
|
|
|
return Max( GetLineCount() - GetVisLineCount() + 1L, 0L );
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScCsvControl::IsValidLine( sal_Int32 nLine ) const
|
|
|
|
{
|
|
|
|
return (0 <= nLine) && (nLine < GetLineCount());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ScCsvControl::IsVisibleLine( sal_Int32 nLine ) const
|
|
|
|
{
|
|
|
|
return IsValidLine( nLine ) && (GetFirstVisLine() <= nLine) && (nLine <= GetLastVisLine());
|
|
|
|
}
|
|
|
|
|
|
|
|
sal_Int32 ScCsvControl::GetY( sal_Int32 nLine ) const
|
|
|
|
{
|
|
|
|
return GetOffsetY() + (nLine - GetFirstVisLine()) * GetLineHeight();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-08-01 11:48:33 +00:00
|
|
|
// static helpers -------------------------------------------------------------
|
|
|
|
|
|
|
|
void ScCsvControl::ImplInvertRect( OutputDevice& rOutDev, const Rectangle& rRect )
|
|
|
|
{
|
|
|
|
RasterOp eOldOp = rOutDev.GetRasterOp();
|
|
|
|
rOutDev.SetRasterOp( ROP_INVERT );
|
|
|
|
rOutDev.DrawRect( rRect );
|
|
|
|
rOutDev.SetRasterOp( eOldOp );
|
|
|
|
}
|
2002-07-05 14:47:42 +00:00
|
|
|
|
|
|
|
ScMoveMode ScCsvControl::GetHorzDirection( sal_uInt16 nCode, bool bHomeEnd )
|
|
|
|
{
|
|
|
|
switch( nCode )
|
|
|
|
{
|
|
|
|
case KEY_LEFT: return MOVE_PREV;
|
|
|
|
case KEY_RIGHT: return MOVE_NEXT;
|
|
|
|
}
|
|
|
|
if( bHomeEnd ) switch( nCode )
|
|
|
|
{
|
|
|
|
case KEY_HOME: return MOVE_FIRST;
|
|
|
|
case KEY_END: return MOVE_LAST;
|
|
|
|
}
|
|
|
|
return MOVE_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
ScMoveMode ScCsvControl::GetVertDirection( sal_uInt16 nCode, bool bHomeEnd )
|
|
|
|
{
|
|
|
|
switch( nCode )
|
|
|
|
{
|
|
|
|
case KEY_UP: return MOVE_PREV;
|
|
|
|
case KEY_DOWN: return MOVE_NEXT;
|
|
|
|
case KEY_PAGEUP: return MOVE_PREVPAGE;
|
|
|
|
case KEY_PAGEDOWN: return MOVE_NEXTPAGE;
|
|
|
|
}
|
|
|
|
if( bHomeEnd ) switch( nCode )
|
|
|
|
{
|
|
|
|
case KEY_HOME: return MOVE_FIRST;
|
|
|
|
case KEY_END: return MOVE_LAST;
|
|
|
|
}
|
|
|
|
return MOVE_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|