summaryrefslogtreecommitdiff
path: root/sc/source/ui/dbgui/csvgrid.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/dbgui/csvgrid.cxx')
-rw-r--r--sc/source/ui/dbgui/csvgrid.cxx1375
1 files changed, 0 insertions, 1375 deletions
diff --git a/sc/source/ui/dbgui/csvgrid.cxx b/sc/source/ui/dbgui/csvgrid.cxx
deleted file mode 100644
index e765eae97..000000000
--- a/sc/source/ui/dbgui/csvgrid.cxx
+++ /dev/null
@@ -1,1375 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sc.hxx"
-
-
-// ============================================================================
-#include "csvgrid.hxx"
-
-#include <algorithm>
-#include <memory>
-
-#include <svtools/colorcfg.hxx>
-#include <svl/smplhint.hxx>
-#include <sal/macros.h>
-#include <tools/poly.hxx>
-#include "scmod.hxx"
-#include "asciiopt.hxx"
-#include "impex.hxx"
-#include "AccessibleCsvControl.hxx"
-
-// *** edit engine ***
-#include "scitems.hxx"
-#include <editeng/eeitem.hxx>
-
-
-#include <editeng/colritem.hxx>
-#include <editeng/fhgtitem.hxx>
-#include <editeng/fontitem.hxx>
-#include <svl/itemset.hxx>
-#include "editutil.hxx"
-// *** edit engine ***
-
-
-// ============================================================================
-
-struct Func_SetType
-{
- sal_Int32 mnType;
- inline Func_SetType( sal_Int32 nType ) : mnType( nType ) {}
- inline void operator()( ScCsvColState& rState ) const
- { rState.mnType = mnType; }
-};
-
-struct Func_Select
-{
- bool mbSelect;
- inline Func_Select( bool bSelect ) : mbSelect( bSelect ) {}
- inline void operator()( ScCsvColState& rState ) const
- { rState.Select( mbSelect ); }
-};
-
-
-// ============================================================================
-
-ScCsvGrid::ScCsvGrid( ScCsvControl& rParent ) :
- ScCsvControl( rParent ),
- mpColorConfig( 0 ),
- mpEditEngine( new ScEditEngineDefaulter( EditEngine::CreatePool(), true ) ),
- maHeaderFont( GetFont() ),
- maColStates( 1 ),
- maTypeNames( 1 ),
- mnFirstImpLine( 0 ),
- mnRecentSelCol( CSV_COLUMN_INVALID )
-{
- mpEditEngine->SetRefDevice( &maBackgrDev );
- mpEditEngine->SetRefMapMode( MapMode( MAP_PIXEL ) );
- maEdEngSize = mpEditEngine->GetPaperSize();
-
- maPopup.SetMenuFlags( maPopup.GetMenuFlags() | MENU_FLAG_NOAUTOMNEMONICS );
-
- EnableRTL( false ); // RTL
- InitFonts();
- ImplClearSplits();
-}
-
-ScCsvGrid::~ScCsvGrid()
-{
- OSL_ENSURE(mpColorConfig, "the object hasn't been initialized properly");
- if (mpColorConfig)
- mpColorConfig->RemoveListener(this);
-}
-
-void
-ScCsvGrid::Init()
-{
- OSL_PRECOND(!mpColorConfig, "the object has already been initialized");
- mpColorConfig = &SC_MOD()->GetColorConfig();
- InitColors();
- mpColorConfig->AddListener(this);
-}
-
-// common grid handling -------------------------------------------------------
-
-void ScCsvGrid::UpdateLayoutData()
-{
- DisableRepaint();
- SetFont( maMonoFont );
- Execute( CSVCMD_SETCHARWIDTH, GetTextWidth( String( 'X' ) ) );
- Execute( CSVCMD_SETLINEHEIGHT, GetTextHeight() + 1 );
- SetFont( maHeaderFont );
- Execute( CSVCMD_SETHDRHEIGHT, GetTextHeight() + 1 );
- UpdateOffsetX();
- EnableRepaint();
-}
-
-void ScCsvGrid::UpdateOffsetX()
-{
- sal_Int32 nLastLine = GetLastVisLine() + 1;
- sal_Int32 nDigits = 2;
- while( nLastLine /= 10 ) ++nDigits;
- nDigits = Max( nDigits, sal_Int32( 3 ) );
- Execute( CSVCMD_SETHDRWIDTH, GetTextWidth( String( '0' ) ) * nDigits );
-}
-
-void ScCsvGrid::ApplyLayout( const ScCsvLayoutData& rOldData )
-{
- ScCsvDiff nDiff = GetLayoutData().GetDiff( rOldData );
- if( nDiff == CSV_DIFF_EQUAL ) return;
-
- DisableRepaint();
-
- if( nDiff & CSV_DIFF_RULERCURSOR )
- {
- ImplInvertCursor( rOldData.mnPosCursor );
- ImplInvertCursor( GetRulerCursorPos() );
- }
-
- if( nDiff & CSV_DIFF_POSCOUNT )
- {
- if( GetPosCount() < rOldData.mnPosCount )
- {
- SelectAll( false );
- maSplits.RemoveRange( GetPosCount(), rOldData.mnPosCount );
- }
- else
- maSplits.Remove( rOldData.mnPosCount );
- maSplits.Insert( GetPosCount() );
- maColStates.resize( maSplits.Count() - 1 );
- }
-
- if( nDiff & CSV_DIFF_LINEOFFSET )
- {
- Execute( CSVCMD_UPDATECELLTEXTS );
- UpdateOffsetX();
- }
-
- ScCsvDiff nHVDiff = nDiff & (CSV_DIFF_HORIZONTAL | CSV_DIFF_VERTICAL);
- if( nHVDiff == CSV_DIFF_POSOFFSET )
- ImplDrawHorzScrolled( rOldData.mnPosOffset );
- else if( nHVDiff != CSV_DIFF_EQUAL )
- InvalidateGfx();
-
- EnableRepaint();
-
- if( nDiff & (CSV_DIFF_POSOFFSET | CSV_DIFF_LINEOFFSET) )
- AccSendVisibleEvent();
-}
-
-void ScCsvGrid::SetFirstImportedLine( sal_Int32 nLine )
-{
- ImplDrawFirstLineSep( false );
- mnFirstImpLine = nLine;
- ImplDrawFirstLineSep( true );
- ImplDrawGridDev();
- Repaint();
-}
-
-sal_Int32 ScCsvGrid::GetNoScrollCol( sal_Int32 nPos ) const
-{
- sal_Int32 nNewPos = nPos;
- if( nNewPos != CSV_POS_INVALID )
- {
- if( nNewPos < GetFirstVisPos() + CSV_SCROLL_DIST )
- {
- sal_Int32 nScroll = (GetFirstVisPos() > 0) ? CSV_SCROLL_DIST : 0;
- nNewPos = GetFirstVisPos() + nScroll;
- }
- else if( nNewPos > GetLastVisPos() - CSV_SCROLL_DIST - 1L )
- {
- sal_Int32 nScroll = (GetFirstVisPos() < GetMaxPosOffset()) ? CSV_SCROLL_DIST : 0;
- nNewPos = GetLastVisPos() - nScroll - 1;
- }
- }
- return nNewPos;
-}
-
-void ScCsvGrid::InitColors()
-{
- OSL_PRECOND(mpColorConfig, "the object hasn't been initialized properly");
- if ( !mpColorConfig )
- return;
- maBackColor.SetColor( static_cast< sal_uInt32 >( mpColorConfig->GetColorValue( ::svtools::DOCCOLOR ).nColor ) );
- maGridColor.SetColor( static_cast< sal_uInt32 >( mpColorConfig->GetColorValue( ::svtools::CALCGRID ).nColor ) );
- maGridPBColor.SetColor( static_cast< sal_uInt32 >( mpColorConfig->GetColorValue( ::svtools::CALCPAGEBREAK ).nColor ) );
- maAppBackColor.SetColor( static_cast< sal_uInt32 >( mpColorConfig->GetColorValue( ::svtools::APPBACKGROUND ).nColor ) );
- maTextColor.SetColor( static_cast< sal_uInt32 >( mpColorConfig->GetColorValue( ::svtools::FONTCOLOR ).nColor ) );
-
- const StyleSettings& rSett = GetSettings().GetStyleSettings();
- maHeaderBackColor = rSett.GetFaceColor();
- maHeaderGridColor = rSett.GetDarkShadowColor();
- maHeaderTextColor = rSett.GetButtonTextColor();
- maSelectColor = rSett.GetActiveColor();
-
- InvalidateGfx();
-}
-
-void ScCsvGrid::InitFonts()
-{
- maMonoFont = OutputDevice::GetDefaultFont( DEFAULTFONT_FIXED, LANGUAGE_ENGLISH_US, 0 );
- maMonoFont.SetSize( Size( maMonoFont.GetSize().Width(), maHeaderFont.GetSize().Height() ) );
-
- /* *** Set edit engine defaults ***
- maMonoFont for Latin script, smaller default font for Asian and Complex script. */
-
- // get default fonts
- SvxFontItem aLatinItem( EE_CHAR_FONTINFO );
- SvxFontItem aAsianItem( EE_CHAR_FONTINFO_CJK );
- SvxFontItem aComplexItem( EE_CHAR_FONTINFO_CTL );
- ::GetDefaultFonts( aLatinItem, aAsianItem, aComplexItem );
-
- // create item set for defaults
- SfxItemSet aDefSet( mpEditEngine->GetEmptyItemSet() );
- EditEngine::SetFontInfoInItemSet( aDefSet, maMonoFont );
- aDefSet.Put( aAsianItem );
- aDefSet.Put( aComplexItem );
-
- // set Asian/Complex font size to height of character in Latin font
- sal_uLong nFontHt = static_cast< sal_uLong >( maMonoFont.GetSize().Height() );
- aDefSet.Put( SvxFontHeightItem( nFontHt, 100, EE_CHAR_FONTHEIGHT_CJK ) );
- aDefSet.Put( SvxFontHeightItem( nFontHt, 100, EE_CHAR_FONTHEIGHT_CTL ) );
-
- // copy other items from default font
- const SfxPoolItem& rWeightItem = aDefSet.Get( EE_CHAR_WEIGHT );
- aDefSet.Put( rWeightItem, EE_CHAR_WEIGHT_CJK );
- aDefSet.Put( rWeightItem, EE_CHAR_WEIGHT_CTL );
- const SfxPoolItem& rItalicItem = aDefSet.Get( EE_CHAR_ITALIC );
- aDefSet.Put( rItalicItem, EE_CHAR_ITALIC_CJK );
- aDefSet.Put( rItalicItem, EE_CHAR_ITALIC_CTL );
- const SfxPoolItem& rLangItem = aDefSet.Get( EE_CHAR_LANGUAGE );
- aDefSet.Put( rLangItem, EE_CHAR_LANGUAGE_CJK );
- aDefSet.Put( rLangItem, EE_CHAR_LANGUAGE_CTL );
-
- mpEditEngine->SetDefaults( aDefSet );
- InvalidateGfx();
-}
-
-void ScCsvGrid::InitSizeData()
-{
- maWinSize = GetSizePixel();
- maBackgrDev.SetOutputSizePixel( maWinSize );
- maGridDev.SetOutputSizePixel( maWinSize );
- InvalidateGfx();
-}
-
-
-// split handling -------------------------------------------------------------
-
-void ScCsvGrid::InsertSplit( sal_Int32 nPos )
-{
- if( ImplInsertSplit( nPos ) )
- {
- DisableRepaint();
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- Execute( CSVCMD_UPDATECELLTEXTS );
- sal_uInt32 nColIx = GetColumnFromPos( nPos );
- ImplDrawColumn( nColIx - 1 );
- ImplDrawColumn( nColIx );
- ValidateGfx(); // performance: do not redraw all columns
- EnableRepaint();
- }
-}
-
-void ScCsvGrid::RemoveSplit( sal_Int32 nPos )
-{
- if( ImplRemoveSplit( nPos ) )
- {
- DisableRepaint();
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- Execute( CSVCMD_UPDATECELLTEXTS );
- ImplDrawColumn( GetColumnFromPos( nPos ) );
- ValidateGfx(); // performance: do not redraw all columns
- EnableRepaint();
- }
-}
-
-void ScCsvGrid::MoveSplit( sal_Int32 nPos, sal_Int32 nNewPos )
-{
- sal_uInt32 nColIx = GetColumnFromPos( nPos );
- if( nColIx != CSV_COLUMN_INVALID )
- {
- DisableRepaint();
- if( (GetColumnPos( nColIx - 1 ) < nNewPos) && (nNewPos < GetColumnPos( nColIx + 1 )) )
- {
- // move a split in the range between 2 others -> keep selection state of both columns
- maSplits.Remove( nPos );
- maSplits.Insert( nNewPos );
- Execute( CSVCMD_UPDATECELLTEXTS );
- ImplDrawColumn( nColIx - 1 );
- ImplDrawColumn( nColIx );
- ValidateGfx(); // performance: do not redraw all columns
- AccSendTableUpdateEvent( nColIx - 1, nColIx );
- }
- else
- {
- ImplRemoveSplit( nPos );
- ImplInsertSplit( nNewPos );
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- Execute( CSVCMD_UPDATECELLTEXTS );
- }
- EnableRepaint();
- }
-}
-
-void ScCsvGrid::RemoveAllSplits()
-{
- DisableRepaint();
- ImplClearSplits();
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- Execute( CSVCMD_UPDATECELLTEXTS );
- EnableRepaint();
-}
-
-void ScCsvGrid::SetSplits( const ScCsvSplits& rSplits )
-{
- DisableRepaint();
- ImplClearSplits();
- sal_uInt32 nCount = rSplits.Count();
- for( sal_uInt32 nIx = 0; nIx < nCount; ++nIx )
- maSplits.Insert( rSplits[ nIx ] );
- maColStates.clear();
- maColStates.resize( maSplits.Count() - 1 );
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- Execute( CSVCMD_UPDATECELLTEXTS );
- EnableRepaint();
-}
-
-bool ScCsvGrid::ImplInsertSplit( sal_Int32 nPos )
-{
- sal_uInt32 nColIx = GetColumnFromPos( nPos );
- bool bRet = (nColIx < GetColumnCount()) && maSplits.Insert( nPos );
- if( bRet )
- {
- ScCsvColState aState( GetColumnType( nColIx ) );
- aState.Select( IsSelected( nColIx ) && IsSelected( nColIx + 1 ) );
- maColStates.insert( maColStates.begin() + nColIx + 1, aState );
- AccSendInsertColumnEvent( nColIx + 1, nColIx + 1 );
- AccSendTableUpdateEvent( nColIx, nColIx );
- }
- return bRet;
-}
-
-bool ScCsvGrid::ImplRemoveSplit( sal_Int32 nPos )
-{
- bool bRet = maSplits.Remove( nPos );
- if( bRet )
- {
- sal_uInt32 nColIx = GetColumnFromPos( nPos );
- bool bSel = IsSelected( nColIx ) || IsSelected( nColIx + 1 );
- maColStates.erase( maColStates.begin() + nColIx + 1 );
- maColStates[ nColIx ].Select( bSel );
- AccSendRemoveColumnEvent( nColIx + 1, nColIx + 1 );
- AccSendTableUpdateEvent( nColIx, nColIx );
- }
- return bRet;
-}
-
-void ScCsvGrid::ImplClearSplits()
-{
- sal_uInt32 nColumns = GetColumnCount();
- maSplits.Clear();
- maSplits.Insert( 0 );
- maSplits.Insert( GetPosCount() );
- maColStates.resize( 1 );
- InvalidateGfx();
- AccSendRemoveColumnEvent( 1, nColumns - 1 );
-}
-
-// columns/column types -------------------------------------------------------
-
-sal_uInt32 ScCsvGrid::GetFirstVisColumn() const
-{
- return GetColumnFromPos( GetFirstVisPos() );
-}
-
-sal_uInt32 ScCsvGrid::GetLastVisColumn() const
-{
- return GetColumnFromPos( Min( GetLastVisPos(), GetPosCount() ) - 1 );
-}
-
-bool ScCsvGrid::IsValidColumn( sal_uInt32 nColIndex ) const
-{
- return nColIndex < GetColumnCount();
-}
-
-bool ScCsvGrid::IsVisibleColumn( sal_uInt32 nColIndex ) const
-{
- return IsValidColumn( nColIndex ) &&
- (GetColumnPos( nColIndex ) < GetLastVisPos()) &&
- (GetFirstVisPos() < GetColumnPos( nColIndex + 1 ));
-}
-
-sal_Int32 ScCsvGrid::GetColumnX( sal_uInt32 nColIndex ) const
-{
- return GetX( GetColumnPos( nColIndex ) );
-}
-
-sal_uInt32 ScCsvGrid::GetColumnFromX( sal_Int32 nX ) const
-{
- sal_Int32 nPos = (nX - GetFirstX()) / GetCharWidth() + GetFirstVisPos();
- return ((GetFirstVisPos() <= nPos) && (nPos <= GetLastVisPos())) ?
- GetColumnFromPos( nPos ) : CSV_COLUMN_INVALID;
-}
-
-sal_uInt32 ScCsvGrid::GetColumnFromPos( sal_Int32 nPos ) const
-{
- return maSplits.UpperBound( nPos );
-}
-
-sal_Int32 ScCsvGrid::GetColumnWidth( sal_uInt32 nColIndex ) const
-{
- return IsValidColumn( nColIndex ) ? (GetColumnPos( nColIndex + 1 ) - GetColumnPos( nColIndex )) : 0;
-}
-
-void ScCsvGrid::SetColumnStates( const ScCsvColStateVec& rStates )
-{
- maColStates = rStates;
- maColStates.resize( maSplits.Count() - 1 );
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- AccSendTableUpdateEvent( 0, GetColumnCount(), false );
- AccSendSelectionEvent();
-}
-
-sal_Int32 ScCsvGrid::GetColumnType( sal_uInt32 nColIndex ) const
-{
- return IsValidColumn( nColIndex ) ? maColStates[ nColIndex ].mnType : CSV_TYPE_NOSELECTION;
-}
-
-void ScCsvGrid::SetColumnType( sal_uInt32 nColIndex, sal_Int32 nColType )
-{
- if( IsValidColumn( nColIndex ) )
- {
- maColStates[ nColIndex ].mnType = nColType;
- AccSendTableUpdateEvent( nColIndex, nColIndex, false );
- }
-}
-
-sal_Int32 ScCsvGrid::GetSelColumnType() const
-{
- sal_uInt32 nColIx = GetFirstSelected();
- if( nColIx == CSV_COLUMN_INVALID )
- return CSV_TYPE_NOSELECTION;
-
- sal_Int32 nType = GetColumnType( nColIx );
- while( (nColIx != CSV_COLUMN_INVALID) && (nType != CSV_TYPE_MULTI) )
- {
- if( nType != GetColumnType( nColIx ) )
- nType = CSV_TYPE_MULTI;
- nColIx = GetNextSelected( nColIx );
- }
- return nType;
-}
-
-void ScCsvGrid::SetSelColumnType( sal_Int32 nType )
-{
- if( (nType != CSV_TYPE_MULTI) && (nType != CSV_TYPE_NOSELECTION) )
- {
- for( sal_uInt32 nColIx = GetFirstSelected(); nColIx != CSV_COLUMN_INVALID; nColIx = GetNextSelected( nColIx ) )
- SetColumnType( nColIx, nType );
- Repaint( true );
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- }
-}
-
-void ScCsvGrid::SetTypeNames( const StringVec& rTypeNames )
-{
- OSL_ENSURE( !rTypeNames.empty(), "ScCsvGrid::SetTypeNames - vector is empty" );
- maTypeNames = rTypeNames;
- Repaint( true );
-
- maPopup.Clear();
- sal_uInt32 nCount = maTypeNames.size();
- sal_uInt32 nIx;
- sal_uInt16 nItemId;
- for( nIx = 0, nItemId = 1; nIx < nCount; ++nIx, ++nItemId )
- maPopup.InsertItem( nItemId, maTypeNames[ nIx ] );
-
- ::std::for_each( maColStates.begin(), maColStates.end(), Func_SetType( CSV_TYPE_DEFAULT ) );
-}
-
-const String& ScCsvGrid::GetColumnTypeName( sal_uInt32 nColIndex ) const
-{
- sal_uInt32 nTypeIx = static_cast< sal_uInt32 >( GetColumnType( nColIndex ) );
- return (nTypeIx < maTypeNames.size()) ? maTypeNames[ nTypeIx ] : EMPTY_STRING;
-}
-
-sal_uInt8 lcl_GetExtColumnType( sal_Int32 nIntType )
-{
- static sal_uInt8 pExtTypes[] =
- { SC_COL_STANDARD, SC_COL_TEXT, SC_COL_DMY, SC_COL_MDY, SC_COL_YMD, SC_COL_ENGLISH, SC_COL_SKIP };
- static sal_Int32 nExtTypeCount = SAL_N_ELEMENTS(pExtTypes);
- return pExtTypes[ ((0 <= nIntType) && (nIntType < nExtTypeCount)) ? nIntType : 0 ];
-}
-
-void ScCsvGrid::FillColumnDataSep( ScAsciiOptions& rOptions ) const
-{
- sal_uInt32 nCount = GetColumnCount();
- ScCsvExpDataVec aDataVec;
-
- for( sal_uInt32 nColIx = 0; nColIx < nCount; ++nColIx )
- {
- if( GetColumnType( nColIx ) != CSV_TYPE_DEFAULT )
- // 1-based column index
- aDataVec.push_back( ScCsvExpData(
- static_cast< xub_StrLen >( nColIx + 1 ),
- lcl_GetExtColumnType( GetColumnType( nColIx ) ) ) );
- }
- rOptions.SetColumnInfo( aDataVec );
-}
-
-void ScCsvGrid::FillColumnDataFix( ScAsciiOptions& rOptions ) const
-{
- sal_uInt32 nCount = Min( GetColumnCount(), static_cast<sal_uInt32>(MAXCOLCOUNT) );
- ScCsvExpDataVec aDataVec( nCount + 1 );
-
- for( sal_uInt32 nColIx = 0; nColIx < nCount; ++nColIx )
- {
- ScCsvExpData& rData = aDataVec[ nColIx ];
- rData.mnIndex = static_cast< xub_StrLen >(
- Min( static_cast< sal_Int32 >( STRING_MAXLEN ), GetColumnPos( nColIx ) ) );
- rData.mnType = lcl_GetExtColumnType( GetColumnType( nColIx ) );
- }
- aDataVec[ nCount ].mnIndex = STRING_MAXLEN;
- aDataVec[ nCount ].mnType = SC_COL_SKIP;
- rOptions.SetColumnInfo( aDataVec );
-}
-
-void ScCsvGrid::ScrollVertRel( ScMoveMode eDir )
-{
- sal_Int32 nLine = GetFirstVisLine();
- switch( eDir )
- {
- case MOVE_PREV: --nLine; break;
- case MOVE_NEXT: ++nLine; break;
- case MOVE_FIRST: nLine = 0; break;
- case MOVE_LAST: nLine = GetMaxLineOffset(); break;
- case MOVE_PREVPAGE: nLine -= GetVisLineCount() - 2; break;
- case MOVE_NEXTPAGE: nLine += GetVisLineCount() - 2; break;
- default:
- {
- // added to avoid warnings
- }
- }
- Execute( CSVCMD_SETLINEOFFSET, nLine );
-}
-
-void ScCsvGrid::ExecutePopup( const Point& rPos )
-{
- sal_uInt16 nItemId = maPopup.Execute( this, rPos );
- if( nItemId ) // 0 = cancelled
- Execute( CSVCMD_SETCOLUMNTYPE, maPopup.GetItemPos( nItemId ) );
-}
-
-
-// selection handling ---------------------------------------------------------
-
-bool ScCsvGrid::IsSelected( sal_uInt32 nColIndex ) const
-{
- return IsValidColumn( nColIndex ) && maColStates[ nColIndex ].IsSelected();
-}
-
-sal_uInt32 ScCsvGrid::GetFirstSelected() const
-{
- return IsSelected( 0 ) ? 0 : GetNextSelected( 0 );
-}
-
-sal_uInt32 ScCsvGrid::GetNextSelected( sal_uInt32 nFromIndex ) const
-{
- sal_uInt32 nColCount = GetColumnCount();
- for( sal_uInt32 nColIx = nFromIndex + 1; nColIx < nColCount; ++nColIx )
- if( IsSelected( nColIx ) )
- return nColIx;
- return CSV_COLUMN_INVALID;
-}
-
-void ScCsvGrid::Select( sal_uInt32 nColIndex, bool bSelect )
-{
- if( IsValidColumn( nColIndex ) )
- {
- maColStates[ nColIndex ].Select( bSelect );
- ImplDrawColumnSelection( nColIndex );
- Repaint();
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- if( bSelect )
- mnRecentSelCol = nColIndex;
- AccSendSelectionEvent();
- }
-}
-
-void ScCsvGrid::ToggleSelect( sal_uInt32 nColIndex )
-{
- Select( nColIndex, !IsSelected( nColIndex ) );
-}
-
-void ScCsvGrid::SelectRange( sal_uInt32 nColIndex1, sal_uInt32 nColIndex2, bool bSelect )
-{
- if( nColIndex1 == CSV_COLUMN_INVALID )
- Select( nColIndex2 );
- else if( nColIndex2 == CSV_COLUMN_INVALID )
- Select( nColIndex1 );
- else if( nColIndex1 > nColIndex2 )
- {
- SelectRange( nColIndex2, nColIndex1, bSelect );
- if( bSelect )
- mnRecentSelCol = nColIndex1;
- }
- else if( IsValidColumn( nColIndex1 ) && IsValidColumn( nColIndex2 ) )
- {
- for( sal_uInt32 nColIx = nColIndex1; nColIx <= nColIndex2; ++nColIx )
- {
- maColStates[ nColIx ].Select( bSelect );
- ImplDrawColumnSelection( nColIx );
- }
- Repaint();
- Execute( CSVCMD_EXPORTCOLUMNTYPE );
- if( bSelect )
- mnRecentSelCol = nColIndex1;
- AccSendSelectionEvent();
- }
-}
-
-void ScCsvGrid::SelectAll( bool bSelect )
-{
- SelectRange( 0, GetColumnCount() - 1, bSelect );
-}
-
-void ScCsvGrid::MoveCursor( sal_uInt32 nColIndex )
-{
- DisableRepaint();
- if( IsValidColumn( nColIndex ) )
- {
- sal_Int32 nPosBeg = GetColumnPos( nColIndex );
- sal_Int32 nPosEnd = GetColumnPos( nColIndex + 1 );
- sal_Int32 nMinPos = Max( nPosBeg - CSV_SCROLL_DIST, sal_Int32( 0 ) );
- sal_Int32 nMaxPos = Min( nPosEnd - GetVisPosCount() + CSV_SCROLL_DIST + sal_Int32( 1 ), nMinPos );
- if( nPosBeg - CSV_SCROLL_DIST + 1 <= GetFirstVisPos() )
- Execute( CSVCMD_SETPOSOFFSET, nMinPos );
- else if( nPosEnd + CSV_SCROLL_DIST >= GetLastVisPos() )
- Execute( CSVCMD_SETPOSOFFSET, nMaxPos );
- }
- Execute( CSVCMD_MOVEGRIDCURSOR, GetColumnPos( nColIndex ) );
- EnableRepaint();
-}
-
-void ScCsvGrid::MoveCursorRel( ScMoveMode eDir )
-{
- if( GetFocusColumn() != CSV_COLUMN_INVALID )
- {
- switch( eDir )
- {
- case MOVE_FIRST:
- MoveCursor( 0 );
- break;
- case MOVE_LAST:
- MoveCursor( GetColumnCount() - 1 );
- break;
- case MOVE_PREV:
- if( GetFocusColumn() > 0 )
- MoveCursor( GetFocusColumn() - 1 );
- break;
- case MOVE_NEXT:
- if( GetFocusColumn() < GetColumnCount() - 1 )
- MoveCursor( GetFocusColumn() + 1 );
- break;
- default:
- {
- // added to avoid warnings
- }
- }
- }
-}
-
-void ScCsvGrid::ImplClearSelection()
-{
- ::std::for_each( maColStates.begin(), maColStates.end(), Func_Select( false ) );
- ImplDrawGridDev();
-}
-
-void ScCsvGrid::DoSelectAction( sal_uInt32 nColIndex, sal_uInt16 nModifier )
-{
- if( !(nModifier & KEY_MOD1) )
- ImplClearSelection();
- if( nModifier & KEY_SHIFT ) // SHIFT always expands
- SelectRange( mnRecentSelCol, nColIndex );
- else if( !(nModifier & KEY_MOD1) ) // no SHIFT/CTRL always selects 1 column
- Select( nColIndex );
- else if( IsTracking() ) // CTRL in tracking does not toggle
- Select( nColIndex, mbMTSelecting );
- else // CTRL only toggles
- ToggleSelect( nColIndex );
- Execute( CSVCMD_MOVEGRIDCURSOR, GetColumnPos( nColIndex ) );
-}
-
-
-// cell contents --------------------------------------------------------------
-
-void ScCsvGrid::ImplSetTextLineSep(
- sal_Int32 nLine, const String& rTextLine,
- const String& rSepChars, sal_Unicode cTextSep, bool bMergeSep )
-{
- if( nLine < GetFirstVisLine() ) return;
-
- sal_uInt32 nLineIx = nLine - GetFirstVisLine();
- while( maTexts.size() <= nLineIx )
- maTexts.push_back( StringVec() );
- StringVec& rStrVec = maTexts[ nLineIx ];
- rStrVec.clear();
-
- // scan for separators
- String aCellText;
- const sal_Unicode* pSepChars = rSepChars.GetBuffer();
- const sal_Unicode* pChar = rTextLine.GetBuffer();
- sal_uInt32 nColIx = 0;
-
- while( *pChar && (nColIx < sal::static_int_cast<sal_uInt32>(CSV_MAXCOLCOUNT)) )
- {
- // scan for next cell text
- bool bIsQuoted = false;
- pChar = ScImportExport::ScanNextFieldFromString( pChar, aCellText, cTextSep, pSepChars, bMergeSep, bIsQuoted );
-
- // update column width
- sal_Int32 nWidth = Max( CSV_MINCOLWIDTH, aCellText.Len() + sal_Int32( 1 ) );
- if( IsValidColumn( nColIx ) )
- {
- // expand existing column
- sal_Int32 nDiff = nWidth - GetColumnWidth( nColIx );
- if( nDiff > 0 )
- {
- Execute( CSVCMD_SETPOSCOUNT, GetPosCount() + nDiff );
- for( sal_uInt32 nSplitIx = GetColumnCount() - 1; nSplitIx > nColIx; --nSplitIx )
- {
- sal_Int32 nPos = maSplits[ nSplitIx ];
- maSplits.Remove( nPos );
- maSplits.Insert( nPos + nDiff );
- }
- }
- }
- else
- {
- // append new column
- sal_Int32 nLastPos = GetPosCount();
- Execute( CSVCMD_SETPOSCOUNT, nLastPos + nWidth );
- ImplInsertSplit( nLastPos );
- }
-
- if( aCellText.Len() <= CSV_MAXSTRLEN )
- rStrVec.push_back( aCellText );
- else
- rStrVec.push_back( aCellText.Copy( 0, CSV_MAXSTRLEN ) );
- ++nColIx;
- }
- InvalidateGfx();
-}
-
-void ScCsvGrid::ImplSetTextLineFix( sal_Int32 nLine, const String& rTextLine )
-{
- if( nLine < GetFirstVisLine() ) return;
-
- sal_Int32 nChars = rTextLine.Len();
- if( nChars > GetPosCount() )
- Execute( CSVCMD_SETPOSCOUNT, nChars );
-
- sal_uInt32 nLineIx = nLine - GetFirstVisLine();
- while( maTexts.size() <= nLineIx )
- maTexts.push_back( StringVec() );
-
- StringVec& rStrVec = maTexts[ nLineIx ];
- rStrVec.clear();
- sal_uInt32 nColCount = GetColumnCount();
- xub_StrLen nStrLen = rTextLine.Len();
- xub_StrLen nStrIx = 0;
- for( sal_uInt32 nColIx = 0; (nColIx < nColCount) && (nStrIx < nStrLen); ++nColIx )
- {
- xub_StrLen nColWidth = static_cast< xub_StrLen >( GetColumnWidth( nColIx ) );
- rStrVec.push_back( rTextLine.Copy( nStrIx, Max( nColWidth, CSV_MAXSTRLEN ) ) );
- nStrIx = sal::static_int_cast<xub_StrLen>( nStrIx + nColWidth );
- }
- InvalidateGfx();
-}
-
-const String& ScCsvGrid::GetCellText( sal_uInt32 nColIndex, sal_Int32 nLine ) const
-{
- if( nLine < GetFirstVisLine() ) return EMPTY_STRING;
-
- sal_uInt32 nLineIx = nLine - GetFirstVisLine();
- if( nLineIx >= maTexts.size() ) return EMPTY_STRING;
-
- const StringVec& rStrVec = maTexts[ nLineIx ];
- if( nColIndex >= rStrVec.size() ) return EMPTY_STRING;
-
- return rStrVec[ nColIndex ];
-}
-
-
-// event handling -------------------------------------------------------------
-
-void ScCsvGrid::Resize()
-{
- ScCsvControl::Resize();
- InitSizeData();
- Execute( CSVCMD_UPDATECELLTEXTS );
-}
-
-void ScCsvGrid::GetFocus()
-{
- ScCsvControl::GetFocus();
- Execute( CSVCMD_MOVEGRIDCURSOR, GetNoScrollCol( GetGridCursorPos() ) );
- Repaint();
-}
-
-void ScCsvGrid::LoseFocus()
-{
- ScCsvControl::LoseFocus();
- Repaint();
-}
-
-void ScCsvGrid::MouseButtonDown( const MouseEvent& rMEvt )
-{
- DisableRepaint();
- if( !HasFocus() )
- GrabFocus();
-
- Point aPos( rMEvt.GetPosPixel() );
- sal_uInt32 nColIx = GetColumnFromX( aPos.X() );
-
- if( rMEvt.IsLeft() )
- {
- if( (GetFirstX() > aPos.X()) || (aPos.X() > GetLastX()) ) // in header column
- {
- if( aPos.Y() <= GetHdrHeight() )
- SelectAll();
- }
- else if( IsValidColumn( nColIx ) )
- {
- DoSelectAction( nColIx, rMEvt.GetModifier() );
- mnMTCurrCol = nColIx;
- mbMTSelecting = IsSelected( nColIx );
- StartTracking( STARTTRACK_BUTTONREPEAT );
- }
- }
- EnableRepaint();
-}
-
-void ScCsvGrid::Tracking( const TrackingEvent& rTEvt )
-{
- if( rTEvt.IsTrackingEnded() || rTEvt.IsTrackingRepeat() )
- {
- DisableRepaint();
- const MouseEvent& rMEvt = rTEvt.GetMouseEvent();
-
- sal_Int32 nPos = (rMEvt.GetPosPixel().X() - GetFirstX()) / GetCharWidth() + GetFirstVisPos();
- // on mouse tracking: keep position valid
- nPos = Max( Min( nPos, GetPosCount() - sal_Int32( 1 ) ), sal_Int32( 0 ) );
- Execute( CSVCMD_MAKEPOSVISIBLE, nPos );
-
- sal_uInt32 nColIx = GetColumnFromPos( nPos );
- if( mnMTCurrCol != nColIx )
- {
- DoSelectAction( nColIx, rMEvt.GetModifier() );
- mnMTCurrCol = nColIx;
- }
- EnableRepaint();
- }
-}
-
-void ScCsvGrid::KeyInput( const KeyEvent& rKEvt )
-{
- const KeyCode& rKCode = rKEvt.GetKeyCode();
- sal_uInt16 nCode = rKCode.GetCode();
- bool bShift = rKCode.IsShift() == sal_True;
- bool bMod1 = rKCode.IsMod1() == sal_True;
-
- if( !rKCode.IsMod2() )
- {
- ScMoveMode eHDir = GetHorzDirection( nCode, !bMod1 );
- ScMoveMode eVDir = GetVertDirection( nCode, bMod1 );
-
- if( eHDir != MOVE_NONE )
- {
- DisableRepaint();
- MoveCursorRel( eHDir );
- if( !bMod1 )
- ImplClearSelection();
- if( bShift )
- SelectRange( mnRecentSelCol, GetFocusColumn() );
- else if( !bMod1 )
- Select( GetFocusColumn() );
- EnableRepaint();
- }
- else if( eVDir != MOVE_NONE )
- ScrollVertRel( eVDir );
- else if( nCode == KEY_SPACE )
- {
- if( !bMod1 )
- ImplClearSelection();
- if( bShift )
- SelectRange( mnRecentSelCol, GetFocusColumn() );
- else if( bMod1 )
- ToggleSelect( GetFocusColumn() );
- else
- Select( GetFocusColumn() );
- }
- else if( !bShift && bMod1 )
- {
- if( nCode == KEY_A )
- SelectAll();
- else if( (KEY_1 <= nCode) && (nCode <= KEY_9) )
- {
- sal_uInt32 nType = nCode - KEY_1;
- if( nType < maTypeNames.size() )
- Execute( CSVCMD_SETCOLUMNTYPE, nType );
- }
- }
- }
-
- if( rKCode.GetGroup() != KEYGROUP_CURSOR )
- ScCsvControl::KeyInput( rKEvt );
-}
-
-void ScCsvGrid::Command( const CommandEvent& rCEvt )
-{
- switch( rCEvt.GetCommand() )
- {
- case COMMAND_CONTEXTMENU:
- {
- if( rCEvt.IsMouseEvent() )
- {
- Point aPos( rCEvt.GetMousePosPixel() );
- sal_uInt32 nColIx = GetColumnFromX( aPos.X() );
- if( IsValidColumn( nColIx ) && (GetFirstX() <= aPos.X()) && (aPos.X() <= GetLastX()) )
- {
- if( !IsSelected( nColIx ) )
- DoSelectAction( nColIx, 0 ); // focus & select
- ExecutePopup( aPos );
- }
- }
- else
- {
- sal_uInt32 nColIx = GetFocusColumn();
- if( !IsSelected( nColIx ) )
- Select( nColIx );
- sal_Int32 nX1 = Max( GetColumnX( nColIx ), GetFirstX() );
- sal_Int32 nX2 = Min( GetColumnX( nColIx + 1 ), GetWidth() );
- ExecutePopup( Point( (nX1 + nX2) / 2, GetHeight() / 2 ) );
- }
- }
- break;
- case COMMAND_WHEEL:
- {
- Point aPoint;
- Rectangle aRect( aPoint, maWinSize );
- if( aRect.IsInside( rCEvt.GetMousePosPixel() ) )
- {
- const CommandWheelData* pData = rCEvt.GetWheelData();
- if( pData && (pData->GetMode() == COMMAND_WHEEL_SCROLL) && !pData->IsHorz() )
- Execute( CSVCMD_SETLINEOFFSET, GetFirstVisLine() - pData->GetNotchDelta() );
- }
- }
- break;
- default:
- ScCsvControl::Command( rCEvt );
- }
-}
-
-void ScCsvGrid::DataChanged( const DataChangedEvent& rDCEvt )
-{
- if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
- {
- InitColors();
- InitFonts();
- UpdateLayoutData();
- Execute( CSVCMD_UPDATECELLTEXTS );
- }
- ScCsvControl::DataChanged( rDCEvt );
-}
-
-void ScCsvGrid::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 )
-{
- InitColors();
- Repaint();
-}
-
-
-// painting -------------------------------------------------------------------
-
-void ScCsvGrid::Paint( const Rectangle& )
-{
- Repaint();
-}
-
-void ScCsvGrid::ImplRedraw()
-{
- if( IsVisible() )
- {
- if( !IsValidGfx() )
- {
- ValidateGfx();
- ImplDrawBackgrDev();
- ImplDrawGridDev();
- }
- DrawOutDev( Point(), maWinSize, Point(), maWinSize, maGridDev );
- ImplDrawTrackingRect( GetFocusColumn() );
- }
-}
-
-EditEngine* ScCsvGrid::GetEditEngine()
-{
- return mpEditEngine.get();
-}
-
-void ScCsvGrid::ImplSetColumnClipRegion( OutputDevice& rOutDev, sal_uInt32 nColIndex )
-{
- rOutDev.SetClipRegion( Region( Rectangle(
- Max( GetColumnX( nColIndex ), GetFirstX() ) + 1, 0,
- Min( GetColumnX( nColIndex + 1 ), GetLastX() ), GetHeight() - 1 ) ) );
-}
-
-void ScCsvGrid::ImplDrawColumnHeader( OutputDevice& rOutDev, sal_uInt32 nColIndex, Color aFillColor )
-{
- sal_Int32 nX1 = GetColumnX( nColIndex ) + 1;
- sal_Int32 nX2 = GetColumnX( nColIndex + 1 );
- sal_Int32 nHdrHt = GetHdrHeight();
-
- rOutDev.SetLineColor();
- rOutDev.SetFillColor( aFillColor );
- rOutDev.DrawRect( Rectangle( nX1, 0, nX2, nHdrHt ) );
-
- rOutDev.SetFont( maHeaderFont );
- rOutDev.SetTextColor( maHeaderTextColor );
- rOutDev.SetTextFillColor();
- rOutDev.DrawText( Point( nX1 + 1, 0 ), GetColumnTypeName( nColIndex ) );
-
- rOutDev.SetLineColor( maHeaderGridColor );
- rOutDev.DrawLine( Point( nX1, nHdrHt ), Point( nX2, nHdrHt ) );
- rOutDev.DrawLine( Point( nX2, 0 ), Point( nX2, nHdrHt ) );
-}
-
-void ScCsvGrid::ImplDrawCellText( const Point& rPos, const String& rText )
-{
- String aPlainText( rText );
- aPlainText.SearchAndReplaceAll( '\t', ' ' );
- aPlainText.SearchAndReplaceAll( '\n', ' ' );
- mpEditEngine->SetPaperSize( maEdEngSize );
-
- /* #i60296# If string contains mixed script types, the space character
- U+0020 may be drawn with a wrong width (from non-fixed-width Asian or
- Complex font). Now we draw every non-space portion separately. */
- xub_StrLen nTokenCount = aPlainText.GetTokenCount( ' ' );
- xub_StrLen nCharIx = 0;
- for( xub_StrLen nToken = 0; nToken < nTokenCount; ++nToken )
- {
- xub_StrLen nBeginIx = nCharIx;
- String aToken = aPlainText.GetToken( 0, ' ', nCharIx );
- if( aToken.Len() > 0 )
- {
- sal_Int32 nX = rPos.X() + GetCharWidth() * nBeginIx;
- mpEditEngine->SetText( aToken );
- mpEditEngine->Draw( &maBackgrDev, Point( nX, rPos.Y() ) );
- }
- }
-
- nCharIx = 0;
- while( (nCharIx = rText.Search( '\t', nCharIx )) != STRING_NOTFOUND )
- {
- sal_Int32 nX1 = rPos.X() + GetCharWidth() * nCharIx;
- sal_Int32 nX2 = nX1 + GetCharWidth() - 2;
- sal_Int32 nY = rPos.Y() + GetLineHeight() / 2;
- Color aColor( maTextColor );
- maBackgrDev.SetLineColor( aColor );
- maBackgrDev.DrawLine( Point( nX1, nY ), Point( nX2, nY ) );
- maBackgrDev.DrawLine( Point( nX2 - 2, nY - 2 ), Point( nX2, nY ) );
- maBackgrDev.DrawLine( Point( nX2 - 2, nY + 2 ), Point( nX2, nY ) );
- ++nCharIx;
- }
- nCharIx = 0;
- while( (nCharIx = rText.Search( '\n', nCharIx )) != STRING_NOTFOUND )
- {
- sal_Int32 nX1 = rPos.X() + GetCharWidth() * nCharIx;
- sal_Int32 nX2 = nX1 + GetCharWidth() - 2;
- sal_Int32 nY = rPos.Y() + GetLineHeight() / 2;
- Color aColor( maTextColor );
- maBackgrDev.SetLineColor( aColor );
- maBackgrDev.DrawLine( Point( nX1, nY ), Point( nX2, nY ) );
- maBackgrDev.DrawLine( Point( nX1 + 2, nY - 2 ), Point( nX1, nY ) );
- maBackgrDev.DrawLine( Point( nX1 + 2, nY + 2 ), Point( nX1, nY ) );
- maBackgrDev.DrawLine( Point( nX2, nY - 2 ), Point( nX2, nY ) );
- ++nCharIx;
- }
-}
-
-void ScCsvGrid::ImplDrawFirstLineSep( bool bSet )
-{
- if( IsVisibleLine( mnFirstImpLine ) && (mnFirstImpLine != GetFirstVisLine() ) )
- {
- sal_Int32 nY = GetY( mnFirstImpLine );
- sal_Int32 nX = Min( GetColumnX( GetLastVisColumn() + 1 ), GetLastX() );
- maBackgrDev.SetLineColor( bSet ? maGridPBColor : maGridColor );
- maBackgrDev.DrawLine( Point( GetFirstX() + 1, nY ), Point( nX, nY ) );
- }
-}
-
-void ScCsvGrid::ImplDrawColumnBackgr( sal_uInt32 nColIndex )
-{
- if( !IsVisibleColumn( nColIndex ) )
- return;
-
- ImplSetColumnClipRegion( maBackgrDev, nColIndex );
-
- // grid
- maBackgrDev.SetLineColor();
- maBackgrDev.SetFillColor( maBackColor );
- sal_Int32 nX1 = GetColumnX( nColIndex ) + 1;
- sal_Int32 nX2 = GetColumnX( nColIndex + 1 );
- sal_Int32 nY2 = GetY( GetLastVisLine() + 1 );
- sal_Int32 nHdrHt = GetHdrHeight();
- Rectangle aRect( nX1, nHdrHt, nX2, nY2 );
- maBackgrDev.DrawRect( aRect );
- maBackgrDev.SetLineColor( maGridColor );
- maBackgrDev.DrawGrid( aRect, Size( 1, GetLineHeight() ), GRID_HORZLINES );
- maBackgrDev.DrawLine( Point( nX2, nHdrHt ), Point( nX2, nY2 ) );
- ImplDrawFirstLineSep( true );
-
- // cell texts
- mpEditEngine->SetDefaultItem( SvxColorItem( maTextColor, EE_CHAR_COLOR ) );
- size_t nLineCount = ::std::min( static_cast< size_t >( GetLastVisLine() - GetFirstVisLine() + 1 ), maTexts.size() );
- // #i67432# cut string to avoid edit engine performance problems with very large strings
- sal_Int32 nFirstVisPos = ::std::max( GetColumnPos( nColIndex ), GetFirstVisPos() );
- sal_Int32 nLastVisPos = ::std::min( GetColumnPos( nColIndex + 1 ), GetLastVisPos() );
- xub_StrLen nStrPos = static_cast< xub_StrLen >( nFirstVisPos - GetColumnPos( nColIndex ) );
- xub_StrLen nStrLen = static_cast< xub_StrLen >( nLastVisPos - nFirstVisPos + 1 );
- sal_Int32 nStrX = GetX( nFirstVisPos );
- for( size_t nLine = 0; nLine < nLineCount; ++nLine )
- {
- StringVec& rStrVec = maTexts[ nLine ];
- if( (nColIndex < rStrVec.size()) && (rStrVec[ nColIndex ].Len() > nStrPos) )
- {
- String aText( rStrVec[ nColIndex ], nStrPos, nStrLen );
- ImplDrawCellText( Point( nStrX, GetY( GetFirstVisLine() + nLine ) ), aText );
- }
- }
-
- // header
- ImplDrawColumnHeader( maBackgrDev, nColIndex, maHeaderBackColor );
-
- maBackgrDev.SetClipRegion();
-}
-
-void ScCsvGrid::ImplDrawRowHeaders()
-{
- maBackgrDev.SetLineColor();
- maBackgrDev.SetFillColor( maAppBackColor );
- Point aPoint( GetHdrX(), 0 );
- Rectangle aRect( aPoint, Size( GetHdrWidth() + 1, GetHeight() ) );
- maBackgrDev.DrawRect( aRect );
-
- maBackgrDev.SetFillColor( maHeaderBackColor );
- aRect.Bottom() = GetY( GetLastVisLine() + 1 );
- maBackgrDev.DrawRect( aRect );
-
- // line numbers
- maBackgrDev.SetFont( maHeaderFont );
- maBackgrDev.SetTextColor( maHeaderTextColor );
- maBackgrDev.SetTextFillColor();
- sal_Int32 nLastLine = GetLastVisLine();
- for( sal_Int32 nLine = GetFirstVisLine(); nLine <= nLastLine; ++nLine )
- {
- String aText( String::CreateFromInt32( nLine + 1 ) );
- sal_Int32 nX = GetHdrX() + (GetHdrWidth() - maBackgrDev.GetTextWidth( aText )) / 2;
- maBackgrDev.DrawText( Point( nX, GetY( nLine ) ), aText );
- }
-
- // grid
- maBackgrDev.SetLineColor( maHeaderGridColor );
- if( IsRTL() )
- {
- maBackgrDev.DrawLine( Point( 0, 0 ), Point( 0, GetHeight() - 1 ) );
- maBackgrDev.DrawLine( aRect.TopLeft(), aRect.BottomLeft() );
- }
- else
- maBackgrDev.DrawLine( aRect.TopRight(), aRect.BottomRight() );
- aRect.Top() = GetHdrHeight();
- maBackgrDev.DrawGrid( aRect, Size( 1, GetLineHeight() ), GRID_HORZLINES );
-}
-
-void ScCsvGrid::ImplDrawBackgrDev()
-{
- maBackgrDev.SetLineColor();
- maBackgrDev.SetFillColor( maAppBackColor );
- maBackgrDev.DrawRect( Rectangle(
- Point( GetFirstX() + 1, 0 ), Size( GetWidth() - GetHdrWidth(), GetHeight() ) ) );
-
- sal_uInt32 nLastCol = GetLastVisColumn();
- for( sal_uInt32 nColIx = GetFirstVisColumn(); nColIx <= nLastCol; ++nColIx )
- ImplDrawColumnBackgr( nColIx );
-
- ImplDrawRowHeaders();
-}
-
-void ScCsvGrid::ImplDrawColumnSelection( sal_uInt32 nColIndex )
-{
- ImplInvertCursor( GetRulerCursorPos() );
- ImplSetColumnClipRegion( maGridDev, nColIndex );
- maGridDev.DrawOutDev( Point(), maWinSize, Point(), maWinSize, maBackgrDev );
-
- if( IsSelected( nColIndex ) )
- {
- sal_Int32 nX1 = GetColumnX( nColIndex ) + 1;
- sal_Int32 nX2 = GetColumnX( nColIndex + 1 );
-
- // header
- Rectangle aRect( nX1, 0, nX2, GetHdrHeight() );
- maGridDev.SetLineColor();
- if( maHeaderBackColor.IsDark() )
- // redraw with light gray background in dark mode
- ImplDrawColumnHeader( maGridDev, nColIndex, COL_LIGHTGRAY );
- else
- {
- // use transparent active color
- maGridDev.SetFillColor( maSelectColor );
- maGridDev.DrawTransparent( PolyPolygon( Polygon( aRect ) ), CSV_HDR_TRANSPARENCY );
- }
-
- // column selection
- aRect = Rectangle( nX1, GetHdrHeight() + 1, nX2, GetY( GetLastVisLine() + 1 ) - 1 );
- ImplInvertRect( maGridDev, aRect );
- }
-
- maGridDev.SetClipRegion();
- ImplInvertCursor( GetRulerCursorPos() );
-}
-
-void ScCsvGrid::ImplDrawGridDev()
-{
- maGridDev.DrawOutDev( Point(), maWinSize, Point(), maWinSize, maBackgrDev );
- sal_uInt32 nLastCol = GetLastVisColumn();
- for( sal_uInt32 nColIx = GetFirstVisColumn(); nColIx <= nLastCol; ++nColIx )
- ImplDrawColumnSelection( nColIx );
-}
-
-void ScCsvGrid::ImplDrawColumn( sal_uInt32 nColIndex )
-{
- ImplDrawColumnBackgr( nColIndex );
- ImplDrawColumnSelection( nColIndex );
-}
-
-void ScCsvGrid::ImplDrawHorzScrolled( sal_Int32 nOldPos )
-{
- sal_Int32 nPos = GetFirstVisPos();
- if( !IsValidGfx() || (nPos == nOldPos) )
- return;
- if( Abs( nPos - nOldPos ) > GetVisPosCount() / 2 )
- {
- ImplDrawBackgrDev();
- ImplDrawGridDev();
- return;
- }
-
- Point aSrc, aDest;
- sal_uInt32 nFirstColIx, nLastColIx;
- if( nPos < nOldPos )
- {
- aSrc = Point( GetFirstX() + 1, 0 );
- aDest = Point( GetFirstX() + GetCharWidth() * (nOldPos - nPos) + 1, 0 );
- nFirstColIx = GetColumnFromPos( nPos );
- nLastColIx = GetColumnFromPos( nOldPos );
- }
- else
- {
- aSrc = Point( GetFirstX() + GetCharWidth() * (nPos - nOldPos) + 1, 0 );
- aDest = Point( GetFirstX() + 1, 0 );
- nFirstColIx = GetColumnFromPos( Min( nOldPos + GetVisPosCount(), GetPosCount() ) - 1 );
- nLastColIx = GetColumnFromPos( Min( nPos + GetVisPosCount(), GetPosCount() ) - 1 );
- }
-
- ImplInvertCursor( GetRulerCursorPos() + (nPos - nOldPos) );
- Rectangle aRectangle( GetFirstX(), 0, GetLastX(), GetHeight() - 1 );
- Region aClipReg( aRectangle );
- maBackgrDev.SetClipRegion( aClipReg );
- maBackgrDev.CopyArea( aDest, aSrc, maWinSize );
- maBackgrDev.SetClipRegion();
- maGridDev.SetClipRegion( aClipReg );
- maGridDev.CopyArea( aDest, aSrc, maWinSize );
- maGridDev.SetClipRegion();
- ImplInvertCursor( GetRulerCursorPos() );
-
- for( sal_uInt32 nColIx = nFirstColIx; nColIx <= nLastColIx; ++nColIx )
- ImplDrawColumn( nColIx );
-
- sal_Int32 nLastX = GetX( GetPosCount() ) + 1;
- if( nLastX <= GetLastX() )
- {
- Rectangle aRect( nLastX, 0, GetLastX(), GetHeight() - 1 );
- maBackgrDev.SetLineColor();
- maBackgrDev.SetFillColor( maAppBackColor );
- maBackgrDev.DrawRect( aRect );
- maGridDev.SetLineColor();
- maGridDev.SetFillColor( maAppBackColor );
- maGridDev.DrawRect( aRect );
- }
-}
-
-void ScCsvGrid::ImplInvertCursor( sal_Int32 nPos )
-{
- if( IsVisibleSplitPos( nPos ) )
- {
- sal_Int32 nX = GetX( nPos ) - 1;
- Rectangle aRect( Point( nX, 0 ), Size( 3, GetHdrHeight() ) );
- ImplInvertRect( maGridDev, aRect );
- aRect.Top() = GetHdrHeight() + 1;
- aRect.Bottom() = GetY( GetLastVisLine() + 1 );
- ImplInvertRect( maGridDev, aRect );
- }
-}
-
-void ScCsvGrid::ImplDrawTrackingRect( sal_uInt32 nColIndex )
-{
- if( HasFocus() && IsVisibleColumn( nColIndex ) )
- {
- sal_Int32 nX1 = Max( GetColumnX( nColIndex ), GetFirstX() ) + 1;
- sal_Int32 nX2 = Min( GetColumnX( nColIndex + 1 ) - sal_Int32( 1 ), GetLastX() );
- sal_Int32 nY2 = Min( GetY( GetLastVisLine() + 1 ), GetHeight() ) - 1;
- InvertTracking( Rectangle( nX1, 0, nX2, nY2 ), SHOWTRACK_SMALL | SHOWTRACK_WINDOW );
- }
-}
-
-
-// accessibility ==============================================================
-
-ScAccessibleCsvControl* ScCsvGrid::ImplCreateAccessible()
-{
- std::auto_ptr<ScAccessibleCsvControl> pControl(new ScAccessibleCsvGrid( *this ));
- pControl->Init();
- return pControl.release();
-}
-
-
-// ============================================================================
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */