Home | Products | Download | Purchase | Support 


   

RecordSample Sample

 

 

The RecordSample sample demonstrates how to create a record table like application, it can be used to build any UML or database design application, it also demos of how to create ports at any side of node, and make links between any ports.

Steps:

Initial the canvas and create record nodes:


void CRecordSampleView::OnInitialUpdate()
{
	SetCurrentModel(GetDocument()->m_pDataModel);
	CFODrawView::OnInitialUpdate();

	CPoint ptStart = CPoint(100,100);
	CSize sz = CSize(160,150);

	CFOListCtrlShape *pNode1 = NULL;
	CFOListCtrlShape *pNode2 = NULL;
	CFOListCtrlShape *pNode3 = NULL;

	CFOListCtrlShape *pNode4 = NULL;
	CFOListCtrlShape *pNode5 = NULL;
	CFOListCtrlShape *pNode6 = NULL;

//#1
	CRect rcPos = CRect(ptStart,sz);
	CFOListCtrlShape *pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("Customers"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	int nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("CustomerID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Company"));

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Address"));

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Phone"));

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("ShipToID")); // 1004

	pNode->UpdateComp();
	pNode->Release();

	pNode1 = pNode;

//#2
	sz = CSize(160,130);
	rcPos = CRect(ptStart,sz);
	rcPos.OffsetRect(CPoint(sz.cx + 40,sz.cy));
	pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("Sales"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("SalesID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("OrderID")); // 1001

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("CustomerID")); // 1002

	pNode->UpdateComp();
	pNode->Release();

	pNode2 = pNode;

//#3
	sz = CSize(160,130);
	rcPos = CRect(ptStart,sz);
	rcPos.OffsetRect(CPoint(sz.cx *2 + 80,0));
	pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("Orders"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("OrderID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("CustomerID")); // 1001

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("DetailID")); // 1002

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("ShipDate"));

	pNode->UpdateComp();
	pNode->Release();

	pNode3 = pNode;

//#4
	sz = CSize(160,130);
	rcPos = CRect(ptStart,sz);
	rcPos.OffsetRect(CPoint(sz.cx *3 + 160,sz.cy));
	pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("Items"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("ItemID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("ProductName"));

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("ProductPrice"));

	pNode->UpdateComp();
	pNode->Release();

	pNode4 = pNode;

//#5
	sz = CSize(160,130);
	rcPos = CRect(ptStart,sz);
	rcPos.OffsetRect(CPoint(0,sz.cy * 2 + 40));
	pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("ShipTo"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("ShipToID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Address"));

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("ShipInstID")); // 1002

	pNode->UpdateComp();
	pNode->Release();

	pNode5 = pNode;

//#6
	sz = CSize(160,150);
	rcPos = CRect(ptStart,sz);
	rcPos.OffsetRect(CPoint(sz.cx + 50,sz.cy * 2 + 40));
	pNode = new CFOListCtrlShape;
	pNode->AddRef();
	pNode->Create(rcPos,_T("Details"));
	GetCurrentModel()->GetShapes()->AddTail(pNode);

	nIdx = 1000;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("DetailID")); // 1000

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Fields1"));

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("ItemID")); // 1002

	nIdx ++;
	pNode->AddNewItem(nIdx,FALSE,FALSE,_T("Fields3"));

	nIdx ++;
	pNode->AddNewItem(nIdx,TRUE,TRUE,_T("OrderID")); // 1004

	pNode->UpdateComp();
	pNode->Release();

	pNode6 = pNode;


	CFOListPortShape *pFrom = NULL;
	CFOListPortShape *pTo = NULL;

	pFrom = pNode1->FindPortFromIndex(1000,TRUE);
	pTo = pNode2->FindPortFromIndex(1002,TRUE);
	AddLinkShape(pFrom,pTo);

	pFrom = pNode1->FindPortFromIndex(1000,FALSE);
	pTo = pNode3->FindPortFromIndex(1001,TRUE);
	AddLinkShape(pFrom,pTo);

	pFrom = pNode2->FindPortFromIndex(1001,FALSE);
	pTo = pNode3->FindPortFromIndex(1000,TRUE);
	AddLinkShape(pFrom,pTo);

	pFrom = pNode1->FindPortFromIndex(1004,FALSE);
	pTo = pNode5->FindPortFromIndex(1000,TRUE);
	AddLinkShape(pFrom,pTo);

	pFrom = pNode3->FindPortFromIndex(1000,FALSE);
	pTo = pNode6->FindPortFromIndex(1004,TRUE);
	AddLinkShape(pFrom,pTo);

	pFrom = pNode4->FindPortFromIndex(1000,TRUE);
	pTo = pNode6->FindPortFromIndex(1002,FALSE);
	AddLinkShape(pFrom,pTo);

	pNode1->SetBkColor(RGB(255,206,160));
}

CFOLinkShape *CRecordSampleView::AddLinkShape(CFOListPortShape *pStart,CFOListPortShape *pEnd)
{
	CFOPExtCornerLinkShape* pLinkComp = new CFOPExtCornerLinkShape;
	pLinkComp->AddRef();
	CPoint ptPoints[2];
	ptPoints[0] = pStart->GetLinkPoint();
	ptPoints[1] = pEnd->GetLinkPoint();
	pLinkComp->Create(ptPoints,2);

	pLinkComp->SetFromPort(pStart);
	pLinkComp->SetToPort(pEnd);

	pLinkComp->SetLineWidth(4);
	pLinkComp->SetShadow(FALSE);

	pStart->AddLinkShape(pLinkComp);
	pEnd->AddLinkShape(pLinkComp);
	
	// Set arrow type.
	int nType = 3;
	pLinkComp->SetEndArrowType(nType);
	GetCurrentModel()->GetShapes()->AddTail(pLinkComp);
	pLinkComp->UpdateComp();
	pLinkComp->RelayoutPoints();
	pLinkComp->Release();
	
	return pLinkComp;
}


[ Home | Products | Download Area | Purchase | SupportContact us ]


Copyright ?1998-2007 UCanCode.Net Software, all rights reserved.
Other product and company names herein may be the trademarks of their respective owners.

Please direct your questions or comments to webmaster@ucancode.com