📄 sheetcontainer.cpp
字号:
/*
* ============================================================================
* Name : CSheetContainer from SheetContainer.h
* Part of : GridDemo
* Created : 2006-11-28 by tomken
* Implementation notes:
* Initial content was generated by Series 60 AppWizard.
* Version :
* Copyright: Copyright (c) 2006-2008
* ============================================================================
*/
// INCLUDE FILES
#include "SheetContainer.h"
#include <eikenv.h>
CSheetContainer::CSheetContainer(MSheetContainerObserver& aObserver) : iObserver(aObserver)
{
iCurrentStartColumnIndex = 0;
iCurrentFocusPos.SetXY(0,0);
iFocusItem = 0;
iLockColumnNumber = KErrNotFound;
}
void CSheetContainer::ConstructL(const TRect& aRect, CCoeControl* aParent)
{
if(aParent)
this->SetContainerWindowL(*aParent);
else
CreateWindowL();
iDataArray = new (ELeave) CDesCArrayFlat(10);
SetRect(aRect);
ActivateL();
}
CSheetContainer::~CSheetContainer()
{
Reset();
iDataArray->Reset();
delete iDataArray;
iDataArray = NULL;
}
void CSheetContainer::Reset()
{
iLockColumnNumber = -1;
iFocusItem = NULL;
iStartLineNumber = 0;
iCurrentStartColumnIndex = 0;
iCurrentFocusPos.SetXY(0,0);
iRows.ResetAndDestroy();
iLineNumber.ResetAndDestroy();
delete iHeaderRow;
iHeaderRow = 0;
iDataArray->Reset();
}
void CSheetContainer::SizeChanged()
{
if(!IsVisible())
return;
TInt ml = Rect().Height() / (ITEM_DEFAULT_HEIGHT-1)- 1;
if(ml > iMaxLines)
{
iMaxLines = ml;
iObserver.HandleSheetSizeChangeEvent(ETrue);
}
else if(ml < iMaxLines)
{
iMaxLines = ml;
iObserver.HandleSheetSizeChangeEvent(EFalse);
}
DrawDeferred();
}
void CSheetContainer::Draw(const TRect& /*aRect*/) const
{
CWindowGc& gc = SystemGc();
TRect wholeRect = Rect();
gc.SetPenStyle(CGraphicsContext::ENullPen);
gc.SetBrushColor(KRgbWhite);
gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
gc.DrawRect(wholeRect);
if(!iHeaderRow)
return;
TInt i, j;
TInt left = ITEM_LINE_WIDTH;
TInt top = 0;
// draw lock colume
if(iLockColumnNumber != KErrNotFound)
{
if(iLockColumnNumber >= 0 && iLockColumnNumber < iHeaderRow->iCells.Count())
{
CCellItem* item = iHeaderRow->iCells[iLockColumnNumber];
TRect rect = TRect(TPoint(left, top), TSize(item->iWidth, ITEM_DEFAULT_HEIGHT));
item->Redraw(gc, rect);
left += item->iWidth;
left -= 1;
}
}
// draw header
for(i = iCurrentStartColumnIndex ; i<iHeaderRow->iCells.Count(); i++)
{
CCellItem* item = iHeaderRow->iCells[i];
TRect rect = TRect(TPoint(left, top), TSize(item->iWidth, ITEM_DEFAULT_HEIGHT));
item->Redraw(gc, rect);
left += item->iWidth;
left -= 1;
if(left > wholeRect.Width())
break;
}
top += ITEM_DEFAULT_HEIGHT;
for(i=0; i<iRows.Count(); i++)
{
TRect rect;
CCellItem* item = NULL;
left = ITEM_LINE_WIDTH;
item = iLineNumber[i];
rect = TRect(TPoint(0, top), TSize(left, ITEM_DEFAULT_HEIGHT));
item->Redraw(gc, rect);
if(iLockColumnNumber >= 0 && iLockColumnNumber < iHeaderRow->iCells.Count())
{
item = iRows[i]->iCells[iLockColumnNumber];
rect = TRect(TPoint(left, top), TSize(item->iWidth, ITEM_DEFAULT_HEIGHT));
item->Redraw(gc, rect , ETrue);
left += item->iWidth;
left -= 1;
}
for(j = iCurrentStartColumnIndex ; j<iRows[i]->iCells.Count(); j++)
{
item = iRows[i]->iCells[j];
rect = TRect(TPoint(left, top), TSize(item->iWidth, ITEM_DEFAULT_HEIGHT));
item->Redraw(gc, rect);
left += item->iWidth;
left -= 1;
if(left > wholeRect.Width())
break;
}
top += ITEM_DEFAULT_HEIGHT;
top -= 1;
if(top > wholeRect.Height())
break;
}
gc.SetBrushStyle(CGraphicsContext::ENullBrush);
gc.SetPenColor(0x000000);
gc.DrawLine(TPoint(0, ITEM_DEFAULT_HEIGHT-1), TPoint(wholeRect.iBr.iX, ITEM_DEFAULT_HEIGHT-1));
gc.DrawLine(TPoint(ITEM_LINE_WIDTH-1, 0) , TPoint(ITEM_LINE_WIDTH-1, (iMaxLines+1)*ITEM_DEFAULT_HEIGHT - iMaxLines));
}
TKeyResponse CSheetContainer::OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType)
{
if(aType != EEventKey)
return EKeyWasConsumed;
switch(aKeyEvent.iCode)
{
case EKeyOK:
case '5':
iObserver.HandleSheetEnterEvent();
break;
case EKeyUpArrow:
MoveUp();
break;
case EKeyDownArrow:
MoveDown();
break;
case EKeyLeftArrow:
MoveLeft();
break;
case EKeyRightArrow:
MoveRight();
break;
case '1':
PageUp();
break;
case '7':
PageDown();
break;
case '3':
GotoTop();
break;
case '9':
GotoBottom();
break;
default:
break;
}
return EKeyWasConsumed;
}
void CSheetContainer::SetHeader(const TDesC& aString)
{
if(iHeaderRow)
delete iHeaderRow;
iHeaderRow = new (ELeave) CRowItem(CRowItem::ERowTypeHeader);
TPtrC ptr = aString;
TInt x = ptr.Locate('\t');
while(x != KErrNotFound)
{
CCellItem* item = new (ELeave) CCellItem();
item->SetCellItemType(CRowItem::ERowTypeHeader);
item->SetAlign(CGraphicsContext::ECenter);
item->SetFont(iEikonEnv->NormalFont());
item->SetText(ptr.Left(x));
iHeaderRow->AppendCellItem(item);
ptr.Set(ptr.Mid(x+1));
x = ptr.Locate('\t');
}
if(ptr.Length() > 0)
{
CCellItem* item = new (ELeave) CCellItem();
item->SetCellItemType(CRowItem::ERowTypeHeader);
item->SetAlign(CGraphicsContext::ECenter);
item->SetFont(iEikonEnv->NormalFont());
item->SetText(ptr);
iHeaderRow->AppendCellItem(item);
}
}
void CSheetContainer::UpdateDisplayData()
{
iFocusItem = NULL;
iRows.ResetAndDestroy();
iLineNumber.ResetAndDestroy();
for(TInt i=0; i<iDataArray->Count(); i++)
{
AddDisplayLine(iStartLineNumber + i);
AddDisplayRow((*iDataArray)[i]);
}
SetFocusItem(iFocusItem);
DrawDeferred();
}
void CSheetContainer::AddDisplayLine(TInt aLineNumber)
{
TBuf<32> nbuf;
nbuf.AppendNum(aLineNumber);
CCellItem* item = new (ELeave) CCellItem();
item->SetCellItemType(CRowItem::ERowTypeHeader);
item->SetFont(iEikonEnv->NormalFont());
item->SetAlign(CGraphicsContext::ELeft);
item->SetText(nbuf);
item->SetWidth(ITEM_LINE_WIDTH);
iLineNumber.Append(item);
}
void CSheetContainer::AddDisplayRow(const TDesC& aData)
{
CRowItem* row = new (ELeave) CRowItem(CRowItem::ERowTypeContent);
TPtrC ptr = aData;
TInt x = ptr.Locate('\t');
TInt idx = 0;
while(x != KErrNotFound)
{
if(idx >= 0 && idx <iHeaderRow->iCells.Count())
{
CCellItem* item = new (ELeave) CCellItem();
item->SetCellItemType(CRowItem::ERowTypeContent);
item->SetAlign(CGraphicsContext::ELeft);
item->SetFont(iEikonEnv->NormalFont());
item->SetText(ptr.Left(x));
item->SetWidth(iHeaderRow->iCells[idx]->iWidth);
row->AppendCellItem(item);
if(!iFocusItem)
iFocusItem = item;
ptr.Set(ptr.Mid(x+1));
x = ptr.Locate('\t');
idx++;
}
else
{
break;
}
}
if(ptr.Length() > 0)
{
if(idx >= 0 && idx <iHeaderRow->iCells.Count())
{
CCellItem* item = new (ELeave) CCellItem();
item->SetCellItemType(CRowItem::ERowTypeContent);
item->SetAlign(CGraphicsContext::ELeft);
item->SetFont(iEikonEnv->NormalFont());
item->SetText(ptr);
item->SetWidth(iHeaderRow->iCells[idx]->iWidth);
row->AppendCellItem(item);
if(!iFocusItem)
iFocusItem = item;
}
}
iRows.Append(row);
}
void CSheetContainer::MoveRight()
{
if(!iFocusItem)
return;
if(iFocusItem->iNextCellItem)
{
SetFocusItem(iFocusItem->iNextCellItem);
iCurrentFocusPos.iX += 1;
}
else
{
return;
}
CalculatePos(EHorizontalRight);
DrawDeferred();
}
void CSheetContainer::MoveLeft()
{
if(!iFocusItem)
return;
if(iFocusItem->iPrevCellItem)
{
SetFocusItem(iFocusItem->iPrevCellItem);
iCurrentFocusPos.iX -= 1;
}
else
{
return;
}
CalculatePos(EHorizontalLeft);
DrawDeferred();
}
void CSheetContainer::MoveDown()
{
if(iCurrentFocusPos.iY < (iMaxLines - 1) && iCurrentFocusPos.iY < (iRows.Count() - 1))
{
iCurrentFocusPos.iY++;
}
else
{
iObserver.HandleSheetScrollDown();
}
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalDown);
DrawDeferred();
}
void CSheetContainer::MoveUp()
{
if(iCurrentFocusPos.iY > 0)
{
iCurrentFocusPos.iY--;
}
else
{
iObserver.HandleSheetScrollUp();
}
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalUp);
DrawDeferred();
}
void CSheetContainer::GotoTop()
{
iObserver.HandleSheetTop();
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalDown);
DrawDeferred();
}
void CSheetContainer::GotoBottom()
{
iObserver.HandleSheetBottom();
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalUp);
DrawDeferred();
}
void CSheetContainer::PageDown()
{
iObserver.HandleSheetPageDown();
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalDown);
DrawDeferred();
}
void CSheetContainer::PageUp()
{
iObserver.HandleSheetPageUp();
SetFocusPos(iCurrentFocusPos);
CalculatePos(EVerticalUp);
DrawDeferred();
}
void CSheetContainer::SetFocusItem(CCellItem* item)
{
if(!item)
return;
if(iFocusItem)
iFocusItem->SetFocus(EFalse);
iFocusItem = item;
iFocusItem->SetFocus(ETrue);
iObserver.HandleSheetFocusChangeEvent();
}
void CSheetContainer::SetFocusPos(TPoint aPos)
{
if( aPos.iY >=0 && aPos.iY <iRows.Count() )
{
if( aPos.iX >= 0 && aPos.iX < iRows[aPos.iY]->iCells.Count() )
{
iCurrentFocusPos = aPos;
SetFocusItem(iRows[iCurrentFocusPos.iY]->iCells[iCurrentFocusPos.iX]);
}
}
}
void CSheetContainer::CalculatePos(TInt aType)
{
if(!iHeaderRow)
return;
TRect rect = Rect();
TInt i;
if(aType == EHorizontalLeft)
{
if(iCurrentFocusPos.iX < iCurrentStartColumnIndex)
iCurrentStartColumnIndex = iCurrentFocusPos.iX;
}
else if(aType == EHorizontalRight)
{
TInt w = 0;
TInt a = 0;
TInt aw = rect.Width() - ITEM_LINE_WIDTH;
if(iLockColumnNumber >= 0 && iLockColumnNumber < iHeaderRow->iCells.Count())
aw -= iHeaderRow->iCells[iLockColumnNumber]->iWidth;
for(i = iCurrentStartColumnIndex; i<iHeaderRow->iCells.Count(); i++)
{
w += iHeaderRow->iCells[i]->iWidth;
if(w > aw)
a++;
if(i == iCurrentFocusPos.iX)
{
iCurrentStartColumnIndex += a;
break;
}
}
}
}
HBufC* CSheetContainer::CurrentRowDetailL()
{
HBufC* buf = HBufC::NewL(512);
for(TInt i=0; i<iHeaderRow->iCells.Count(); i++)
{
if(iHeaderRow->iCells[i]->iText)
{
buf->Des().Append(iHeaderRow->iCells[i]->iText->Des());
buf->Des().Append(_L(": "));
}
else
{
buf->Des().Append(_L("None: "));
}
if(iRows[iCurrentFocusPos.iY]->iCells[i]->iText)
{
buf->Des().Append(iRows[iCurrentFocusPos.iY]->iCells[i]->iText->Des());
}
buf->Des().Append('\n');
if(buf->Des().Length() > buf->Des().MaxLength())
{
buf = buf->ReAllocL(buf->Des().MaxLength() * 2);
}
}
return buf;
}
TPtrC CSheetContainer::GetText(TPoint aPos)
{
if( aPos.iY >=0 && aPos.iY <iRows.Count() )
{
if( aPos.iX >= 0 && aPos.iX < iRows[aPos.iY]->iCells.Count() )
{
return iRows[aPos.iY]->iCells[aPos.iX]->GetText();
}
}
return TPtrC(0,0);
}
void CSheetContainer::LockCurrentColumn()
{
iLockColumnNumber = iCurrentFocusPos.iX;
CalculatePos(EHorizontalRight);
DrawDeferred();
}
void CSheetContainer::UnLockCurrentColumn()
{
iLockColumnNumber = -1;
DrawDeferred();
}
// End of File
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -