--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mulwidgets/muldatamodel/src/mulpagedatawindow.cpp Thu Dec 17 08:56:02 2009 +0200
@@ -0,0 +1,485 @@
+/*
+* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation of Data window
+*
+*/
+
+
+//Includes
+#include "mulpagedatawindow.h"
+
+#include <stdexcept>
+
+//Internal includes
+#include "mulassert.h"
+#include "mulmodelimpl.h"
+#include "mullog.h"
+
+using namespace std;
+
+namespace Alf
+ {
+
+// ---------------------------------------------------------------------------
+// MulPageDataWindow
+// ---------------------------------------------------------------------------
+//
+MulPageDataWindow::MulPageDataWindow( MulModelImpl& aMulModel )
+ :mMulModel( aMulModel ),
+ mHighlight(KNotInitialized),
+ mPageTopIndex(KNotInitialized),
+ mOldPageTopIndex(KNotInitialized),
+ mBufferSize(KNotInitialized),
+ mWindowSize(KNotInitialized),
+ mWindowTop(KNotInitialized),
+ mWindowBottom(KNotInitialized),
+ mBufferTop(0),
+ mBufferBottom(0),
+ mOldBufferTop(KNotInitialized),
+ mOldBufferBottom(KNotInitialized),
+ mRearBufferTop(0),
+ mRearBufferBottom(0),
+ mOldRearBufferTop(KNotInitialized),
+ mOldRearBufferBottom(KNotInitialized)
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// SetWindowSize
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::SetWindowSize( int aWindowSize, int aPageTopIndex )
+ {
+ MUL_LOG_ENTRY_EXIT("MUL::MulDataWindow::SetWindowSize()");
+
+ __MUL_ASSERT( aWindowSize > 0, KLInvalidArgument );
+
+ if( mWindowSize != aWindowSize || mWindowTop != aPageTopIndex)
+ {
+ if( KNotInitialized == mBufferSize )
+ {
+ mBufferSize = aWindowSize;
+ }
+
+ mWindowSize = aWindowSize;
+ mOldPageTopIndex = mPageTopIndex;
+ mPageTopIndex = aPageTopIndex;
+
+
+ /*adjusting window offset
+ //if window size changes then the top and bottom offset should be
+ //adjusted such that highlight remains at the centre
+ //window top and bottom are inclusive*/
+
+ //assing page top index to window top by default aPageTopIndex is KNotInitialized
+ mWindowTop = aPageTopIndex ;
+ mWindowTop = ( mWindowTop == KNotInitialized ) ? 0 : mWindowTop;
+ mWindowBottom = mWindowTop + mWindowSize - 1;
+ //make sure that window bottom is not more than model count
+ mWindowBottom = mWindowBottom >= mMulModel.CurrentItemCount() ? ( mMulModel.CurrentItemCount() -1) : mWindowBottom;
+
+ MUL_LOG_INFO2("MUL::MulDataWindow::SetWindowSize() mWindowTop:%d,mWindowBottom:%d",mWindowTop,mWindowBottom);
+
+ AdjustBuffer();
+ mMulModel.DataWindowUpdated();
+ }
+ //else nothing needed
+ }
+
+// ---------------------------------------------------------------------------
+// SetBufferSize
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::SetBufferSize( int aBufferSize )
+ {
+ MUL_LOG_ENTRY_EXIT("MUL::MulDataWindow::SetBufferSize()");
+
+ __MUL_ASSERT( aBufferSize > 0, KLInvalidArgument );
+
+ if( mBufferSize != aBufferSize )
+ {
+ mBufferSize = aBufferSize;
+
+ if(mMulModel.CurrentItemCount() > 0)
+ {
+ AdjustBuffer();
+ mMulModel.DataWindowUpdated();
+ }
+ }
+ //else nothing needed
+ }
+
+// ---------------------------------------------------------------------------
+// ~MulDataWindow
+// ---------------------------------------------------------------------------
+//
+MulPageDataWindow::~MulPageDataWindow()
+ {
+ // do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// SetHighlight
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::SetHighlight( int aHighlightIndex )
+ {
+ MUL_LOG_INFO2("MUL::MulDataWindow::SetHighlight() mHighlight:%d,modelCount:%d",aHighlightIndex,mMulModel.CurrentItemCount());
+
+ __MUL_ASSERT( aHighlightIndex >= 0 && aHighlightIndex <= mMulModel.CurrentItemCount()-1, KLInvalidArgument );
+
+ mHighlight = aHighlightIndex;
+ }
+
+
+// ---------------------------------------------------------------------------
+// UpdateHighlight
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::UpdateHighlight( int aHighlightIndex )
+ {
+ // No need to assert. We should send highlight -1 when all the items are removed.
+ // Widget should handle. to show emty text visualization
+ mHighlight = aHighlightIndex;
+ }
+
+// ---------------------------------------------------------------------------
+// AdjustOffset
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::AdjustOffset()
+ {
+ if( BottomWindowOffset() >= mMulModel.CurrentItemCount() )
+ {
+ mWindowBottom = mMulModel.CurrentItemCount() -1;
+ mWindowTop = mWindowBottom - WindowSize() + 1;
+ mWindowTop = mWindowTop < 0 ? 0 : mWindowTop;
+
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustOffset() : windowTop:%d::windowBottom%d",mWindowTop,mWindowBottom);
+ }
+ else if( (BottomWindowOffset() - TopWindowOffset() +1 ) < WindowSize() )
+ {
+ mWindowTop = 0;
+ mWindowBottom = mWindowTop + WindowSize() -1;
+ int modelCount = mMulModel.CurrentItemCount();
+ mWindowBottom = mWindowBottom >= modelCount ? (modelCount - 1) : mWindowBottom;
+
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustOffset() :: windowTop:%d::windowBottom%d",mWindowTop,mWindowBottom);
+ }
+
+ // save old values to check if teh buffer offsets are modified. If the buffer offsets are
+ // modified then should inform the widget to update the visualization
+ SaveOldValues();
+ AdjustBuffer();
+ }
+
+
+// ---------------------------------------------------------------------------
+// ScrollWindow
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::ScrollWindow( int aPageTopIndex )
+ {
+ MUL_LOG_INFO2("MUL::MulDataWindow::ScrollWindow() aPageTopIndex:%d,modelCount:%d",aPageTopIndex,mMulModel.CurrentItemCount());
+
+ __MUL_ASSERT( aPageTopIndex >= 0 && aPageTopIndex <= mMulModel.CurrentItemCount()-1, KLInvalidArgument );
+
+ if( mPageTopIndex != aPageTopIndex )
+ {
+ mOldPageTopIndex = mPageTopIndex;
+ mPageTopIndex = aPageTopIndex;
+
+ UpdateDataWindow();
+ }
+ //else same highlight
+ }
+
+
+// ---------------------------------------------------------------------------
+// UpdateDataWindow
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::UpdateDataWindow()
+ {
+ MUL_LOG_INFO1("MUL::MulPageDataWindow::UpdateDataWindow() diff:%d ", mPageTopIndex - mOldPageTopIndex );
+
+ //If diffrence is negative than highlight is moved up else down
+ //(( mPageTopIndex - mOldPageTopIndex ) < 0 ) ? ShiftWindowUp() : ShiftWindowDown() ;
+
+ MUL_LOG_ENTRY_EXIT("MUL::MulPageDataWindow::ShiftWindowDown()");
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::ShiftWindowDown() mPageTopIndex:%d,mWindowBottom:%d",mPageTopIndex,mWindowBottom);
+
+ mWindowTop = mPageTopIndex;
+ mWindowBottom = mWindowTop + mWindowSize -1;
+ //bottom can't exceeding model count
+ mWindowBottom = mWindowBottom >= mMulModel.CurrentItemCount() ?
+ mWindowBottom = mMulModel.CurrentItemCount() - 1 : mWindowBottom;
+
+ MUL_LOG_INFO2("MUL::MulDataWindow::ShiftWindowDown() mWindowTop:%d,mWindowBottom:%d",mWindowTop,mWindowBottom);
+
+ SaveOldValues();
+ AdjustBuffer();
+ mMulModel.DataWindowUpdated();
+ }
+
+// ---------------------------------------------------------------------------
+// AdjustBuffer
+// ---------------------------------------------------------------------------
+//
+void MulPageDataWindow::AdjustBuffer()
+ {
+ MUL_LOG_ENTRY_EXIT("MUL::MulPageDataWindow::AdjustBuffer()");
+
+ int modelCount = mMulModel.CurrentItemCount() -1;
+
+ //remove data is new window is smaller/add is new window is bigger
+ //create rear buffer only if model has more data
+ if( mWindowTop == 0 && ActualBufferSize() <= modelCount )
+ {
+ MUL_LOG_INFO("MUL::MulPageDataWindow::AdjustBuffer() mWindowTop == 0 ");
+
+ mBufferTop = mWindowTop;
+ mBufferBottom = mBufferTop + mWindowSize + mBufferSize - 1;
+
+ //Create rear top and rear bottom only in looping case
+ //window top is zero so data at other end should be buffered
+ mRearBufferBottom = modelCount;
+ mRearBufferTop = mRearBufferBottom - mBufferSize +1;
+ }
+ else if( mWindowBottom == modelCount && ActualBufferSize() <= modelCount )
+ {
+ MUL_LOG_INFO("MUL::MulPageDataWindow::AdjustBuffer() mWindowBottom == modelCount ");
+
+ mBufferBottom = mWindowBottom ;
+ mBufferTop = mBufferBottom - (mWindowSize + mBufferSize) + 1;
+
+ //Create rear top and rear bottom only in looping case
+ //window bottom is equal to model count so data at other end should be buffered
+ mRearBufferTop = 0;
+ mRearBufferBottom = mRearBufferTop + mBufferSize -1 ;
+ }
+ else
+ {
+ MUL_LOG_INFO("MUL::MulPageDataWindow::AdjustBuffer() else ");
+
+ mBufferTop = mWindowTop - mBufferSize;
+ mBufferBottom = mWindowBottom + mBufferSize;
+
+ //check if top or bottom is out of bound and update offset accordingly
+ if( mBufferTop < 0 )
+ {
+ MUL_LOG_INFO("MUL::MulPageDataWindow::AdjustBuffer() mBufferTop < 0 ");
+
+ mBufferTop = 0;
+ mBufferBottom = mBufferTop + ActualBufferSize() - 1;
+ //buffer bottom cant be larger then model count
+ mBufferBottom = mBufferBottom > modelCount ? modelCount : mBufferBottom;
+ }
+ else if( mBufferBottom > modelCount )
+ {
+ MUL_LOG_INFO("MUL::MulPageDataWindow::AdjustBuffer() mBufferBottom > modelCount");
+
+ mBufferBottom = modelCount ;
+ mBufferTop = mBufferBottom - ActualBufferSize() + 1;
+ //buffer top cant be less then 0
+ mBufferTop = mBufferTop < 0 ? 0 : mBufferTop;
+ }
+
+ //in other case rear top and rear bottom is not use set to -1
+ mRearBufferTop = KNotInitialized;
+ mRearBufferBottom = KNotInitialized;
+ }
+
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustBuffer() mOldBufferTop:%d,mOldBufferBottom:%d",mOldBufferTop,mOldBufferBottom);
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustBuffer() mOldRearBufferBottom:%d,mOldRearBufferTop:%d",mOldRearBufferBottom,mOldRearBufferTop);
+
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustBuffer() mBufferTop:%d,mBufferBottom:%d",mBufferTop,mBufferBottom);
+ MUL_LOG_INFO2("MUL::MulPageDataWindow::AdjustBuffer() mRearBufferBottom:%d,mRearBufferTop:%d",mRearBufferBottom,mRearBufferTop);
+
+ __MUL_ASSERT_DEBUG( mWindowTop >= 0 && mWindowBottom < mMulModel.CurrentItemCount(), _L("Invlid Window"));
+ __MUL_ASSERT_DEBUG( mBufferTop >= 0 && mBufferBottom < mMulModel.CurrentItemCount(), _L("Invlid Buffer"));
+ }
+
+// ---------------------------------------------------------------------------
+// IsItemInDataWindow
+// ---------------------------------------------------------------------------
+//
+bool MulPageDataWindow::IsItemInDataWindow(int aItemIndex ) const
+ {
+ //__MUL_ASSERT_DEBUG( aItemIndex >= 0 && aItemIndex <= mMulModel.CurrentItemCount()-1, KLInvalidArgument );
+
+ bool result( false );
+
+ if(mWindowSize == KNotInitialized )
+ {
+ result = false;
+ }
+ //check that rear buffer is on or not in looping case
+ else if( mRearBufferTop != KNotInitialized && mRearBufferBottom != KNotInitialized )
+ {
+ if( ( aItemIndex >= mBufferTop && aItemIndex <= mBufferBottom ) ||
+ ( aItemIndex >= mRearBufferTop && aItemIndex <= mRearBufferBottom ) )
+ {
+ result = true;
+ }
+ }
+ else if( aItemIndex >= mBufferTop && aItemIndex <= mBufferBottom )
+ {
+ result = true;
+ }
+ return result;
+ }
+
+// ---------------------------------------------------------------------------
+// IsItemInDataWindow
+// ---------------------------------------------------------------------------
+//
+bool MulPageDataWindow::IsItemInVisibleWindow(int aItemIndex ) const
+ {
+ //__MUL_ASSERT_DEBUG( aItemIndex >= 0 && aItemIndex <= mMulModel.CurrentItemCount()-1, KLInvalidArgument );
+
+ if(mWindowSize == KNotInitialized )
+ {
+ return false;
+ }
+ else if( aItemIndex >= mWindowTop && aItemIndex <= mWindowBottom )
+ {
+ return true;
+ }
+ return false;
+ }
+
+// ---------------------------------------------------------------------------
+// RelativeIndex
+// ---------------------------------------------------------------------------
+//
+int MulPageDataWindow::RelativeIndex( int aAbsoluteIndex ) const
+ {
+ __MUL_ASSERT_DEBUG( aAbsoluteIndex >= 0 && aAbsoluteIndex <= mMulModel.CurrentItemCount()-1, KLInvalidArgument );
+
+ if( !IsItemInDataWindow(aAbsoluteIndex) )
+ {
+ return -1;
+ }
+
+ if( mRearBufferTop != KNotInitialized && mRearBufferBottom != KNotInitialized )
+ {
+ if( mRearBufferBottom == mMulModel.CurrentItemCount() - 1 )
+ {
+ if( aAbsoluteIndex >= mRearBufferTop && aAbsoluteIndex <= mRearBufferBottom )
+ {
+ int bufferSize = BottomOffset() - TopOffset() + 1;
+ int rearDiff = aAbsoluteIndex - mRearBufferTop;
+ int relativeIndex = bufferSize + rearDiff;
+ return relativeIndex;
+ }
+ else
+ {
+ int relativeIndex = aAbsoluteIndex < TopOffset() ?
+ aAbsoluteIndex : aAbsoluteIndex - TopOffset() ;
+ return relativeIndex;
+ }
+ }
+ else
+ {
+ if( aAbsoluteIndex >= mRearBufferTop && aAbsoluteIndex <= mRearBufferBottom )
+ {
+ int relativeIndex = aAbsoluteIndex < TopOffset() ?
+ aAbsoluteIndex : aAbsoluteIndex - TopOffset() ;
+ return relativeIndex;
+ }
+ else
+ {
+ int bufferSize = mRearBufferBottom - mRearBufferTop + 1;
+ int diff = aAbsoluteIndex - TopOffset();
+ int relativeIndex = bufferSize + diff;
+ return relativeIndex;
+ }
+ }
+ }
+ else
+ {
+ int relativeIndex = aAbsoluteIndex < TopOffset() ?
+ aAbsoluteIndex : aAbsoluteIndex - TopOffset() ;
+ return relativeIndex;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// AbsoluteIndex
+// ---------------------------------------------------------------------------
+//
+int MulPageDataWindow::AbsoluteIndex( int aRelativeIndex ) const
+ {
+ __MUL_ASSERT_DEBUG( aRelativeIndex >= 0 && aRelativeIndex <= ActualBufferSize(), _L("Invalid Relative Index"));
+
+ if( mRearBufferTop != KNotInitialized && mRearBufferBottom != KNotInitialized )
+ {
+ if( mRearBufferBottom == mMulModel.CurrentItemCount() - 1 )
+ {
+ if( aRelativeIndex > BottomOffset() )
+ {
+ //relative index is in loop buffer
+ int diff = aRelativeIndex - BottomOffset() - 1;
+ int absoluteIndex = RearTopOffset() + diff;
+ return absoluteIndex;
+ }
+ else
+ {
+ int absoluteIndex = TopOffset() + aRelativeIndex;
+ return absoluteIndex;
+ }
+ }
+ else
+ {
+ if( aRelativeIndex <= RearBottomOffset() )
+ {
+ //relative index is in loop buffer
+ int absoluteIndex = RearTopOffset() + aRelativeIndex;
+ return absoluteIndex;
+ }
+ else
+ {
+ int diff = aRelativeIndex - RearBottomOffset() - 1;
+ int absoluteIndex = TopOffset() + diff;
+ return absoluteIndex;
+ }
+ }
+ }
+ else
+ {
+ int absoluteIndex = TopOffset() + aRelativeIndex;
+ return absoluteIndex;
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// IsBufferOffsetChanged
+// ---------------------------------------------------------------------------
+//
+bool MulPageDataWindow::IsBufferOffsetChanged()
+ {
+ if(mRearBufferBottom != mOldRearBufferBottom ||
+ mRearBufferTop != mOldRearBufferTop ||
+ mBufferTop != mOldBufferTop ||
+ mBufferBottom != mOldBufferBottom )
+ {
+ return true;
+ }
+ return false;
+ }
+
+ } // namespace Alf
+
+//End of file