⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sheetcontainer.cpp

📁 手机编程
💻 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 + -