diff options
Diffstat (limited to 'sc/source/ui/dbgui/csvtablebox.cxx')
-rw-r--r-- | sc/source/ui/dbgui/csvtablebox.cxx | 464 |
1 files changed, 464 insertions, 0 deletions
diff --git a/sc/source/ui/dbgui/csvtablebox.cxx b/sc/source/ui/dbgui/csvtablebox.cxx new file mode 100644 index 000000000000..842f1cc81dea --- /dev/null +++ b/sc/source/ui/dbgui/csvtablebox.cxx @@ -0,0 +1,464 @@ +/************************************************************************* + * + * 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 "csvtablebox.hxx" +#include <tools/debug.hxx> +#include <vcl/lstbox.hxx> + +// ause +#include "editutil.hxx" + +// ============================================================================ + +//UNUSED2009-05 ScCsvTableBox::ScCsvTableBox( Window* pParent ) : +//UNUSED2009-05 ScCsvControl( pParent, maData, WB_BORDER | WB_TABSTOP | WB_DIALOGCONTROL ), +//UNUSED2009-05 maRuler( *this ), +//UNUSED2009-05 maGrid( *this ), +//UNUSED2009-05 maHScroll( this, WB_HORZ | WB_DRAG ), +//UNUSED2009-05 maVScroll( this, WB_VERT | WB_DRAG ), +//UNUSED2009-05 maScrollBox( this ) +//UNUSED2009-05 { +//UNUSED2009-05 Init(); +//UNUSED2009-05 } + +ScCsvTableBox::ScCsvTableBox( Window* pParent, const ResId& rResId ) : + ScCsvControl( pParent, maData, rResId ), + maRuler( *this ), + maGrid( *this ), + maHScroll( this, WB_HORZ | WB_DRAG ), + maVScroll( this, WB_VERT | WB_DRAG ), + maScrollBox( this ) +{ + Init(); +} + + +// common table box handling -------------------------------------------------- + +void ScCsvTableBox::SetSeparatorsMode() +{ + if( mbFixedMode ) + { + // rescue data for fixed width mode + mnFixedWidth = GetPosCount(); + maFixColStates = maGrid.GetColumnStates(); + // switch to separators mode + mbFixedMode = false; + // reset and reinitialize controls + DisableRepaint(); + Execute( CSVCMD_SETLINEOFFSET, 0 ); + Execute( CSVCMD_SETPOSCOUNT, 1 ); + Execute( CSVCMD_NEWCELLTEXTS ); + maGrid.SetColumnStates( maSepColStates ); + InitControls(); + EnableRepaint(); + } +} + +void ScCsvTableBox::SetFixedWidthMode() +{ + if( !mbFixedMode ) + { + // rescue data for separators mode + maSepColStates = maGrid.GetColumnStates(); + // switch to fixed width mode + mbFixedMode = true; + // reset and reinitialize controls + DisableRepaint(); + Execute( CSVCMD_SETLINEOFFSET, 0 ); + Execute( CSVCMD_SETPOSCOUNT, mnFixedWidth ); + maGrid.SetSplits( maRuler.GetSplits() ); + maGrid.SetColumnStates( maFixColStates ); + InitControls(); + EnableRepaint(); + } +} + +void ScCsvTableBox::Init() +{ + mbFixedMode = false; + mnFixedWidth = 1; + + maHScroll.EnableRTL( false ); // #107812# RTL + maHScroll.SetLineSize( 1 ); + maVScroll.SetLineSize( 1 ); + + Link aLink = LINK( this, ScCsvTableBox, CsvCmdHdl ); + SetCmdHdl( aLink ); + maRuler.SetCmdHdl( aLink ); + maGrid.SetCmdHdl( aLink ); + + aLink = LINK( this, ScCsvTableBox, ScrollHdl ); + maHScroll.SetScrollHdl( aLink ); + maVScroll.SetScrollHdl( aLink ); + + aLink = LINK( this, ScCsvTableBox, ScrollEndHdl ); + maHScroll.SetEndScrollHdl( aLink ); + maVScroll.SetEndScrollHdl( aLink ); + + InitControls(); +} + +void ScCsvTableBox::InitControls() +{ + maGrid.UpdateLayoutData(); + + long nScrollBarSize = GetSettings().GetStyleSettings().GetScrollBarSize(); + Size aWinSize = CalcOutputSize( GetSizePixel() ); + long nDataWidth = aWinSize.Width() - nScrollBarSize; + long nDataHeight = aWinSize.Height() - nScrollBarSize; + + maData.mnWinWidth = nDataWidth; + maData.mnWinHeight = nDataHeight; + + if( mbFixedMode ) + { + // ruler sets height internally + maRuler.SetPosSizePixel( 0, 0, nDataWidth, 0 ); + sal_Int32 nY = maRuler.GetSizePixel().Height(); + maData.mnWinHeight -= nY; + maGrid.SetPosSizePixel( 0, nY, nDataWidth, maData.mnWinHeight ); + } + else + maGrid.SetPosSizePixel( 0, 0, nDataWidth, nDataHeight ); + maGrid.Show(); + maRuler.Show( mbFixedMode ); + + // scrollbars always visible + maHScroll.SetPosSizePixel( 0, nDataHeight, nDataWidth, nScrollBarSize ); + InitHScrollBar(); + maHScroll.Show(); + + // scrollbars always visible + maVScroll.SetPosSizePixel( nDataWidth, 0, nScrollBarSize, nDataHeight ); + InitVScrollBar(); + maVScroll.Show(); + + bool bScrBox = maHScroll.IsVisible() && maVScroll.IsVisible(); + if( bScrBox ) + maScrollBox.SetPosSizePixel( nDataWidth, nDataHeight, nScrollBarSize, nScrollBarSize ); + maScrollBox.Show( bScrBox ); + + // let the controls self-adjust to visible area + Execute( CSVCMD_SETPOSOFFSET, GetFirstVisPos() ); + Execute( CSVCMD_SETLINEOFFSET, GetFirstVisLine() ); +} + +void ScCsvTableBox::InitHScrollBar() +{ + maHScroll.SetRange( Range( 0, GetPosCount() + 2 ) ); + maHScroll.SetVisibleSize( GetVisPosCount() ); + maHScroll.SetPageSize( GetVisPosCount() * 3 / 4 ); + maHScroll.SetThumbPos( GetFirstVisPos() ); +} + +void ScCsvTableBox::InitVScrollBar() +{ + maVScroll.SetRange( Range( 0, GetLineCount() + 1 ) ); + maVScroll.SetVisibleSize( GetVisLineCount() ); + maVScroll.SetPageSize( GetVisLineCount() - 2 ); + maVScroll.SetThumbPos( GetFirstVisLine() ); +} + +void ScCsvTableBox::MakePosVisible( sal_Int32 nPos ) +{ + if( (0 <= nPos) && (nPos < GetPosCount()) ) + { + if( nPos - CSV_SCROLL_DIST + 1 <= GetFirstVisPos() ) + Execute( CSVCMD_SETPOSOFFSET, nPos - CSV_SCROLL_DIST ); + else if( nPos + CSV_SCROLL_DIST >= GetLastVisPos() ) + Execute( CSVCMD_SETPOSOFFSET, nPos - GetVisPosCount() + CSV_SCROLL_DIST ); + } +} + + +// cell contents -------------------------------------------------------------- + +void ScCsvTableBox::SetUniStrings( + const String* pTextLines, const String& rSepChars, + sal_Unicode cTextSep, bool bMergeSep ) +{ + // assuming that pTextLines is a string array with size CSV_PREVIEW_LINES + // -> will be dynamic sometime + DisableRepaint(); + sal_Int32 nEndLine = GetFirstVisLine() + CSV_PREVIEW_LINES; + const String* pString = pTextLines; + for( sal_Int32 nLine = GetFirstVisLine(); nLine < nEndLine; ++nLine, ++pString ) + { + if( mbFixedMode ) + maGrid.ImplSetTextLineFix( nLine, *pString ); + else + maGrid.ImplSetTextLineSep( nLine, *pString, rSepChars, cTextSep, bMergeSep ); + } + EnableRepaint(); +} + +//UNUSED2009-05 void ScCsvTableBox::SetByteStrings( +//UNUSED2009-05 const ByteString* pTextLines, CharSet eCharSet, +//UNUSED2009-05 const String& rSepChars, sal_Unicode cTextSep, bool bMergeSep ) +//UNUSED2009-05 { +//UNUSED2009-05 // assuming that pTextLines is a string array with size CSV_PREVIEW_LINES +//UNUSED2009-05 // -> will be dynamic sometime +//UNUSED2009-05 DisableRepaint(); +//UNUSED2009-05 sal_Int32 nEndLine = GetFirstVisLine() + CSV_PREVIEW_LINES; +//UNUSED2009-05 const ByteString* pString = pTextLines; +//UNUSED2009-05 for( sal_Int32 nLine = GetFirstVisLine(); nLine < nEndLine; ++nLine, ++pString ) +//UNUSED2009-05 { +//UNUSED2009-05 if( mbFixedMode ) +//UNUSED2009-05 maGrid.ImplSetTextLineFix( nLine, String( *pString, eCharSet ) ); +//UNUSED2009-05 else +//UNUSED2009-05 maGrid.ImplSetTextLineSep( nLine, String( *pString, eCharSet ), rSepChars, cTextSep, bMergeSep ); +//UNUSED2009-05 } +//UNUSED2009-05 EnableRepaint(); +//UNUSED2009-05 } + + +// column settings ------------------------------------------------------------ + +void ScCsvTableBox::InitTypes( const ListBox& rListBox ) +{ + sal_uInt16 nTypeCount = rListBox.GetEntryCount(); + StringVec aTypeNames( nTypeCount ); + for( sal_uInt16 nIndex = 0; nIndex < nTypeCount; ++nIndex ) + aTypeNames[ nIndex ] = rListBox.GetEntry( nIndex ); + maGrid.SetTypeNames( aTypeNames ); +} + +void ScCsvTableBox::FillColumnData( ScAsciiOptions& rOptions ) const +{ + if( mbFixedMode ) + maGrid.FillColumnDataFix( rOptions ); + else + maGrid.FillColumnDataSep( rOptions ); +} + + +// event handling ------------------------------------------------------------- + +void ScCsvTableBox::Resize() +{ + ScCsvControl::Resize(); + InitControls(); +} + +void ScCsvTableBox::DataChanged( const DataChangedEvent& rDCEvt ) +{ + if( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) ) + InitControls(); + ScCsvControl::DataChanged( rDCEvt ); +} + +IMPL_LINK( ScCsvTableBox, CsvCmdHdl, ScCsvControl*, pCtrl ) +{ + DBG_ASSERT( pCtrl, "ScCsvTableBox::CsvCmdHdl - missing sender" ); + + const ScCsvCmd& rCmd = pCtrl->GetCmd(); + ScCsvCmdType eType = rCmd.GetType(); + sal_Int32 nParam1 = rCmd.GetParam1(); + sal_Int32 nParam2 = rCmd.GetParam2(); + + bool bFound = true; + switch( eType ) + { + case CSVCMD_REPAINT: + if( !IsNoRepaint() ) + { + maGrid.ImplRedraw(); + maRuler.ImplRedraw(); + InitHScrollBar(); + InitVScrollBar(); + } + break; + case CSVCMD_MAKEPOSVISIBLE: + MakePosVisible( nParam1 ); + break; + + case CSVCMD_NEWCELLTEXTS: + if( mbFixedMode ) + Execute( CSVCMD_UPDATECELLTEXTS ); + else + { + DisableRepaint(); + ScCsvColStateVec aStates( maGrid.GetColumnStates() ); + sal_Int32 nPos = GetFirstVisPos(); + Execute( CSVCMD_SETPOSCOUNT, 1 ); + Execute( CSVCMD_UPDATECELLTEXTS ); + Execute( CSVCMD_SETPOSOFFSET, nPos ); + maGrid.SetColumnStates( aStates ); + EnableRepaint(); + } + break; + case CSVCMD_UPDATECELLTEXTS: + maUpdateTextHdl.Call( this ); + break; + case CSVCMD_SETCOLUMNTYPE: + maGrid.SetSelColumnType( nParam1 ); + break; + case CSVCMD_EXPORTCOLUMNTYPE: + maColTypeHdl.Call( this ); + break; + case CSVCMD_SETFIRSTIMPORTLINE: + maGrid.SetFirstImportedLine( nParam1 ); + break; + + case CSVCMD_INSERTSPLIT: + DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::InsertSplit - invalid call" ); + if( maRuler.GetSplitCount() + 1 < sal::static_int_cast<sal_uInt32>(CSV_MAXCOLCOUNT) ) + { + maRuler.InsertSplit( nParam1 ); + maGrid.InsertSplit( nParam1 ); + } + break; + case CSVCMD_REMOVESPLIT: + DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveSplit - invalid call" ); + maRuler.RemoveSplit( nParam1 ); + maGrid.RemoveSplit( nParam1 ); + break; + case CSVCMD_TOGGLESPLIT: + Execute( maRuler.HasSplit( nParam1 ) ? CSVCMD_REMOVESPLIT : CSVCMD_INSERTSPLIT, nParam1 ); + break; + case CSVCMD_MOVESPLIT: + DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::MoveSplit - invalid call" ); + maRuler.MoveSplit( nParam1, nParam2 ); + maGrid.MoveSplit( nParam1, nParam2 ); + break; + case CSVCMD_REMOVEALLSPLITS: + DBG_ASSERT( mbFixedMode, "ScCsvTableBox::CsvCmdHdl::RemoveAllSplits - invalid call" ); + maRuler.RemoveAllSplits(); + maGrid.RemoveAllSplits(); + break; + default: + bFound = false; + } + if( bFound ) + return 0; + + const ScCsvLayoutData aOldData( maData ); + switch( eType ) + { + case CSVCMD_SETPOSCOUNT: + maData.mnPosCount = Max( nParam1, sal_Int32( 1 ) ); + ImplSetPosOffset( GetFirstVisPos() ); + break; + case CSVCMD_SETPOSOFFSET: + ImplSetPosOffset( nParam1 ); + break; + case CSVCMD_SETHDRWIDTH: + maData.mnHdrWidth = Max( nParam1, sal_Int32( 0 ) ); + ImplSetPosOffset( GetFirstVisPos() ); + break; + case CSVCMD_SETCHARWIDTH: + maData.mnCharWidth = Max( nParam1, sal_Int32( 1 ) ); + ImplSetPosOffset( GetFirstVisPos() ); + break; + case CSVCMD_SETLINECOUNT: + maData.mnLineCount = Max( nParam1, sal_Int32( 1 ) ); + ImplSetLineOffset( GetFirstVisLine() ); + break; + case CSVCMD_SETLINEOFFSET: + ImplSetLineOffset( nParam1 ); + break; + case CSVCMD_SETHDRHEIGHT: + maData.mnHdrHeight = Max( nParam1, sal_Int32( 0 ) ); + ImplSetLineOffset( GetFirstVisLine() ); + break; + case CSVCMD_SETLINEHEIGHT: + maData.mnLineHeight = Max( nParam1, sal_Int32( 1 ) ); + ImplSetLineOffset( GetFirstVisLine() ); + break; + case CSVCMD_MOVERULERCURSOR: + maData.mnPosCursor = IsVisibleSplitPos( nParam1 ) ? nParam1 : CSV_POS_INVALID; + break; + case CSVCMD_MOVEGRIDCURSOR: + maData.mnColCursor = ((0 <= nParam1) && (nParam1 < GetPosCount())) ? nParam1 : CSV_POS_INVALID; + break; + default: + { + // added to avoid warnings + } + } + + if( maData != aOldData ) + { + DisableRepaint(); + maRuler.ApplyLayout( aOldData ); + maGrid.ApplyLayout( aOldData ); + EnableRepaint(); + } + + return 0; +} + +IMPL_LINK( ScCsvTableBox, ScrollHdl, ScrollBar*, pScrollBar ) +{ + DBG_ASSERT( pScrollBar, "ScCsvTableBox::ScrollHdl - missing sender" ); + + if( pScrollBar == &maHScroll ) + Execute( CSVCMD_SETPOSOFFSET, pScrollBar->GetThumbPos() ); + else if( pScrollBar == &maVScroll ) + Execute( CSVCMD_SETLINEOFFSET, pScrollBar->GetThumbPos() ); + + return 0; +} + +IMPL_LINK( ScCsvTableBox, ScrollEndHdl, ScrollBar*, pScrollBar ) +{ + DBG_ASSERT( pScrollBar, "ScCsvTableBox::ScrollEndHdl - missing sender" ); + + if( pScrollBar == &maHScroll ) + { + if( GetRulerCursorPos() != CSV_POS_INVALID ) + Execute( CSVCMD_MOVERULERCURSOR, maRuler.GetNoScrollPos( GetRulerCursorPos() ) ); + if( GetGridCursorPos() != CSV_POS_INVALID ) + Execute( CSVCMD_MOVEGRIDCURSOR, maGrid.GetNoScrollCol( GetGridCursorPos() ) ); + } + + return 0; +} + + +// accessibility -------------------------------------------------------------- + +ScCsvTableBox::XAccessibleRef ScCsvTableBox::CreateAccessible() +{ + // do not use the ScCsvControl mechanism, return default accessible object + return Control::CreateAccessible(); +} + +ScAccessibleCsvControl* ScCsvTableBox::ImplCreateAccessible() +{ + return NULL; // not used, see CreateAccessible() +} + + +// ============================================================================ + |