// FlowGraphSampleView.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "FlowGraphSample.h" #include "FlowGraphSampleDoc.h" #include "FlowGraphSampleView.h" #ifdef _DEBUG # define new DEBUG_NEW # undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif const UINT ID_FLOWGRAPH_CONTROL = 100; ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView IMPLEMENT_DYNCREATE(CFlowGraphSampleView, CView) BEGIN_MESSAGE_MAP(CFlowGraphSampleView, CView) //{{AFX_MSG_MAP(CFlowGraphSampleView) ON_WM_CREATE() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_SETFOCUS() ON_COMMAND(ID_EDIT_SELECT_ALL, OnEditSelectAll) ON_COMMAND(ID_FLOWGRAPH_SHOWNODEGROUPSALWAYS, OnFlowgraphShowNodegroupsAlways) ON_UPDATE_COMMAND_UI(ID_FLOWGRAPH_SHOWNODEGROUPSALWAYS, OnUpdateFlowgraphShowNodegroupsAlways) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview) ON_COMMAND(ID_FILE_SAVEASIMAGE, OnSaveToFile) #ifdef _XTP_INCLUDE_COMMANDBARS ON_NOTIFY(XTP_SBN_SCROLL, ID_INDICATOR_ZOOMSLIDER, OnZoomSliderScroll) ON_UPDATE_COMMAND_UI(ID_INDICATOR_ZOOM, OnUpdateViewZoom) #endif ON_COMMAND(ID_VIEW_ZOOM_TOSELECTION, OnZoomToSelection) ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOM_TOSELECTION, OnUpdateHasSelection) ON_COMMAND(ID_VIEW_ZOOM_FITWINDOW, OnZoomFitToWindow) ON_COMMAND(ID_EDIT_ARRANGE, OnEditArrange) ON_NOTIFY(NM_RCLICK, ID_FLOWGRAPH_CONTROL, OnGraphRClick) ON_NOTIFY(XTP_FGN_SELECTIONCHANGED, ID_FLOWGRAPH_CONTROL, OnSelectionChanged) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) ON_COMMAND(ID_EDIT_CUT, OnEditCut) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste) ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) ON_COMMAND(ID_EDIT_REDO, OnEditRedo) ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo) ON_COMMAND(ID_DIAGRAMS_DATABASERELATIONS, OnSwitchGraphType0) ON_COMMAND(ID_DIAGRAMS_NETWORKDIAGRAM, OnSwitchGraphType1) ON_COMMAND(ID_DIAGRAMS_FLOWCHART, OnSwitchGraphType2) ON_COMMAND(ID_FLOWGRAPH_SHOWGRID, OnShowGrid) ON_UPDATE_COMMAND_UI(ID_FLOWGRAPH_SHOWGRID, OnUpdateShowGrid) ON_COMMAND_RANGE(ID_FLOWGRAPH_CONNECTOR_TYPE_0, ID_FLOWGRAPH_CONNECTOR_TYPE_8, OnConnectorType) ON_UPDATE_COMMAND_UI_RANGE(ID_FLOWGRAPH_CONNECTOR_TYPE_0, ID_FLOWGRAPH_CONNECTOR_TYPE_8, OnUpdateConnectorType) ON_COMMAND_RANGE(ID_FLOWGRAPH_QUALITY_HIGHQUALITY, ID_FLOWGRAPH_QUALITY_AUTOQUALITY, OnQuality) ON_UPDATE_COMMAND_UI_RANGE(ID_FLOWGRAPH_QUALITY_HIGHQUALITY, ID_FLOWGRAPH_QUALITY_AUTOQUALITY, OnUpdateQuality) ON_COMMAND(ID_EDIT_DELETE, OnEditDelete) ON_UPDATE_COMMAND_UI(ID_EDIT_DELETE, OnUpdateEditDelete) #ifdef _XTP_INCLUDE_TASKPANEL ON_MESSAGE(XTPWM_TASKPANEL_NOTIFY, OnTaskPanelNotify) #endif #ifdef _XTP_INCLUDE_PROPERTYGRID ON_MESSAGE(XTPWM_PROPERTYGRID_NOTIFY, OnPropertyGridNotify) #endif END_MESSAGE_MAP() //#define RGBA(r, g, b, a) ((COLORREF) (((a) << 24) | ((b) << 16) | ((g) << 8) | (r))) ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView construction/destruction CFlowGraphSampleView::CFlowGraphSampleView() : m_pGrid(NULL) { } CFlowGraphSampleView::~CFlowGraphSampleView() { } BOOL CFlowGraphSampleView::PreCreateWindow(CREATESTRUCT& cs) { cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView drawing void CFlowGraphSampleView::OnDraw(CDC* /*pDC*/) { CFlowGraphSampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here } ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView printing void CFlowGraphSampleView::OnPrint(CDC* pDC, CPrintInfo*) { CFlowGraphSampleDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CXTPFlowGraphDrawContextGdiPlus dc(pDC->m_hDC, pDC->m_hAttribDC, TRUE); m_wndControl.OnDraw(&dc); } BOOL CFlowGraphSampleView::OnPreparePrinting(CPrintInfo* pInfo) { pInfo->m_nNumPreviewPages = 1; pInfo->SetMinPage(1); pInfo->SetMaxPage(1); // default preparation return DoPreparePrinting(pInfo); } void CFlowGraphSampleView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { ASSERT_VALID(this); ASSERT_VALID(pDC); if (!pInfo) return; pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY)); pDC->SetWindowExt(96, 96); // ptOrg is in logical coordinates pDC->OffsetWindowOrg(0, 0); } void CFlowGraphSampleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CFlowGraphSampleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } void CFlowGraphSampleView::OnFilePrintPreview() { #ifdef _XTP_INCLUDE_COMMANDBARS // In derived classes, implement special window handling here // Be sure to Unhook Frame Window close if hooked. // must not create this on the frame. Must outlive this function CPrintPreviewState* pState = new CPrintPreviewState; // DoPrintPreview's return value does not necessarily indicate that // Print preview succeeded or failed, but rather what actions are necessary // at this point. If DoPrintPreview returns TRUE, it means that // OnEndPrintPreview will be (or has already been) called and the // pState structure will be/has been deleted. // If DoPrintPreview returns FALSE, it means that OnEndPrintPreview // WILL NOT be called and that cleanup, including deleting pState // must be done here. if (!DoPrintPreview(XTP_IDD_PREVIEW_DIALOGBAR, this, RUNTIME_CLASS(CXTPPreviewView), pState)) { // In derived classes, reverse special window handling here for // Preview failure case TRACE0("Error: DoPrintPreview failed.\n"); AfxMessageBox(AFX_IDP_COMMAND_FAILURE); delete pState; // preview failed to initialize, delete State now } #else CView::OnFilePrintPreview(); #endif } void CFlowGraphSampleView::OnSaveToFile() { CString strFilter = _T("PNG Files(*.png)|*.png|GIF Files(*.gif)|*.gif|JPG ") _T("Files(*.jpg)|*.jpg|Bitmap Files(*.bmp)|*.bmp|All files (*.*)|*.*||"); CFileDialog fd(FALSE, _T("xml"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter); if (fd.DoModal() == IDOK) { m_wndControl.SaveToFile(fd.GetPathName()); } } ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView diagnostics #ifdef _DEBUG void CFlowGraphSampleView::AssertValid() const { CView::AssertValid(); } void CFlowGraphSampleView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CFlowGraphSampleDoc* CFlowGraphSampleView::GetDocument() // non-debug version is inline { _ASSERTE(m_pDocument->IsKindOf(RUNTIME_CLASS(CFlowGraphSampleDoc))); return (CFlowGraphSampleDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CFlowGraphSampleView message handlers COLORREF clrOfficeColors[] = { RGB(79, 129, 189), // Blue RGB(192, 80, 77), // Red RGB(155, 187, 89), // Green RGB(128, 100, 162), // Purple RGB(75, 172, 198), // Aqua RGB(247, 150, 70), // Orange RGB(31, 73, 125) }; void CFlowGraphSampleView::InsertNewShape(FG_SHAPES_ID id, CPoint point, UINT uResShapeID) { if (id == -1) return; CXTPFlowGraphNode* pNode = NULL; CXTPFlowGraphNodeCustom* pNodeCustom = NULL; if (id != FG_SHAPE_CUSTOM) m_wndControl.GetUndoManager()->StartGroup(); point = m_wndControl.TransformPoint(point); switch (id) { case FG_SHAPE_TABLE: { pNode = m_wndControl.GetActivePage()->GetNodes()->AddNode(new CXTPFlowGraphNode()); pNode->SetLocation(point); pNode->SetCaption(_T("New Node")); pNode->AddNamedConnectionPoints(_T("Output"), xtpFlowGraphPointOutput); pNode->AddNamedConnectionPoints(_T("Input"), xtpFlowGraphPointInput); break; } case FG_SHAPE_PICTURE: { CXTPFlowGraphNodeCustom* pImage = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, point, XTP_DPI(CSize(128, 128))); pImage->SetImageIndex(2); pImage->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImage->SetCaption(_T("Firewall")); pNode = pImage; break; } case FG_SHAPE_FROM_RESOURCE: { pNodeCustom = AddCustomFlowGraphShape(m_wndControl, uResShapeID, point, XTP_DPI(CSize(150, 110))); break; } case FG_SHAPE_USERCARD: { CStringList list; if (rand() % 2) { list.AddTail(_T("Sarah Haras")); list.AddTail(_T("Lunch")); list.AddTail(_T("CJ Diner")); list.AddTail(_T("Kitchen Remodel")); list.AddTail(_T("15 min")); list.AddTail(_T("10")); } else { list.AddTail(_T("John Doe")); list.AddTail(_T("Consulting")); list.AddTail(_T("Plant 2")); list.AddTail(_T("Chart Support")); list.AddTail(_T("18 Hours")); list.AddTail(_T("9")); } CString xaml; XTPResourceManager()->LoadHTML(&xaml, _T("USERCARD_XAML")); pNodeCustom = AddUserCardNode(m_wndControl, xaml, point, XTP_DPI(CSize(340, 172)), list); break; } case FG_SHAPE_CUSTOM: { if (!m_wndControl.GetActivePage()) return; CXTPFlowGraphNodeCustom* pNode = NULL; CString xaml = _T("") _T("") _T(""); _ASSERTE(xaml.GetLength()); m_wndControl.GetUndoManager()->StartGroup(); pNode = m_wndControl.GetActivePage()->GetNodes()->AddCustomNode(); pNode->SetMarkupText(xaml); pNode->SetCaption(_T("Z-Shape")); pNode->SetTooltip(_T("Z-Shape")); pNode->SetLocation(point); pNode->SetSize(XTP_DPI(CSize(150, 110))); pNode->SetColor(RGB(255, 0, 0), 128); m_wndControl.GetUndoManager()->EndGroup(); return; } } if (pNodeCustom) { COLORREF clr = clrOfficeColors[rand() % 7]; COLORREF clr2 = m_wndControl.GetPaintManager()->GetDarkColor(clr); pNodeCustom->SetColor(clr, clr2, xtpFlowGraphCustomNodeFillGradientCenterVertical); } m_wndControl.GetUndoManager()->EndGroup(); CXTPFlowGraphSelectedElements* pSelection = m_wndControl.GetActivePage()->GetSelection(); if (pNode && pSelection) pSelection->SetSelection(pNode); } BOOL CFlowGraphSampleView::OnDrop(COleDataObject* pDataObject, DROPEFFECT /*dropEffect*/, CPoint point) { #ifdef _XTP_INCLUDE_TASKPANEL CXTPTaskPanelItem* pItemDrag = CXTPTaskPanelItem::CreateFromOleData(pDataObject); if (pItemDrag) { InsertNewShape((FG_SHAPES_ID)pItemDrag->GetID(), point, (UINT)pItemDrag->GetItemData()); pItemDrag->InternalRelease(); pItemDrag = NULL; } #endif return TRUE; } DROPEFFECT CFlowGraphSampleView::OnDragOver(COleDataObject* pDataObject, DWORD /*dwKeyState*/, CPoint /*point*/) { DROPEFFECT retReflect = DROPEFFECT_NONE; #ifdef _XTP_INCLUDE_TASKPANEL CXTPTaskPanelItem* pItemDrag = CXTPTaskPanelItem::CreateFromOleData(pDataObject); if (pItemDrag) { if (pItemDrag->GetID() > xtpFlowGraphConnectorElbowDoubleArrow) retReflect = DROPEFFECT_COPY; pItemDrag->InternalRelease(); pItemDrag = NULL; } #endif return retReflect; } DROPEFFECT CFlowGraphSampleView::OnDragEnter(COleDataObject* pDataObject, DWORD /*dwKeyState*/, CPoint /*point*/) { DROPEFFECT retReflect = DROPEFFECT_NONE; #ifdef _XTP_INCLUDE_TASKPANEL CXTPTaskPanelItem* pItemDrag = CXTPTaskPanelItem::CreateFromOleData(pDataObject); if (pItemDrag) { if (pItemDrag->GetID() > xtpFlowGraphConnectorElbowDoubleArrow) retReflect = DROPEFFECT_COPY; pItemDrag->InternalRelease(); pItemDrag = NULL; } #endif return retReflect; } void CFlowGraphSampleView::InitFlowGraphImages() { // 0 CXTPFlowGraphImage* pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), IDB_NODEIMAGE_CUSTOMERS); // 1 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_ORDERDETAILS), _T("PNG")); // 2 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_FIREWALL), _T("PNG")); // 3 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_CLOUD), _T("PNG")); // 4 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_DESKTOP), _T("PNG")); // 5 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_LAPTOP), _T("PNG")); // 6 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_PHONE), _T("PNG")); // 7 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_TABLET), _T("PNG")); // 8 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_DEVICE), _T("PNG")); // 9 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_JOHN), _T("PNG")); // 10 pImage = m_wndControl.GetImages()->AddImage(new CXTPFlowGraphImage()); pImage->LoadFromResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_NODEIMAGE_SARAH), _T("PNG")); } void CFlowGraphSampleView::CreateDatabaseRelationships() { m_wndControl.GetPaintManager()->m_clrConnection = RGB(255, 80, 60); CXTPFlowGraphPage* pPage = m_wndControl.GetPages()->AddPage(new CXTPFlowGraphPage()); // Customers CXTPFlowGraphNode* pTableCustomers = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableCustomers->AddNamedConnectionPoints(_T("ID"), xtpFlowGraphPointInput); pTableCustomers->AddNamedConnectionPoints(_T("Company")); pTableCustomers->AddNamedConnectionPoints(_T("Last Name")); pTableCustomers->AddNamedConnectionPoints(_T("First Name")); pTableCustomers->AddNamedConnectionPoints(_T("Job Title")); pTableCustomers->AddNamedConnectionPoints(_T("Business Phone")); pTableCustomers->SetCaption(_T("Customers")); pTableCustomers->SetTooltip(_T("Customers Table")); pTableCustomers->SetColor(clrOfficeColors[2]); pTableCustomers->SetLocation(XTP_DPI(CPoint(720, 360))); pTableCustomers->SetImageIndex(0); // Orders CXTPFlowGraphNode* pTableOrders = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableOrders->SetCaption(_T("Orders")); pTableOrders->SetTooltip(_T("Orders Table")); pTableOrders->SetLocation(XTP_DPI(CPoint(320, 90))); // pTableOrders->SetColor(clrOfficeColors[1]); pTableOrders->AddNamedConnectionPoints(_T("Order ID"), xtpFlowGraphPointInput); pTableOrders->AddNamedConnectionPoints(_T("Employee ID"), xtpFlowGraphPointOutput); pTableOrders->AddNamedConnectionPoints(_T("Customer ID"), xtpFlowGraphPointOutput); pTableOrders->AddNamedConnectionPoints(_T("Order Date")); pTableOrders->AddNamedConnectionPoints(_T("Shipped Date")); pTableOrders->AddNamedConnectionPoints(_T("Shipper ID"), xtpFlowGraphPointOutput); pTableOrders->AddNamedConnectionPoints(_T("Taxes")); pTableOrders->AddNamedConnectionPoints(_T("Payment Type")); pTableOrders->AddNamedConnectionPoints(_T("Paid Date")); pTableOrders->AddNamedConnectionPoints(_T("Notes")); // Employees CXTPFlowGraphNode* pTableEmployees = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableEmployees->SetCaption(_T("Employees")); pTableEmployees->SetTooltip(_T("Employees Table")); pTableEmployees->SetLocation(XTP_DPI(CPoint(720, 90))); pTableEmployees->SetColor(clrOfficeColors[4]); pTableEmployees->AddNamedConnectionPoints(_T("ID"), xtpFlowGraphPointInput); pTableEmployees->AddNamedConnectionPoints(_T("Company")); pTableEmployees->AddNamedConnectionPoints(_T("Last Name")); pTableEmployees->AddNamedConnectionPoints(_T("First Name")); pTableEmployees->AddNamedConnectionPoints(_T("E-mail Address")); pTableEmployees->AddNamedConnectionPoints(_T("Job Title")); pTableEmployees->AddNamedConnectionPoints(_T("Business Phone")); // Order Details CXTPFlowGraphNode* pTableOrderDetails = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableOrderDetails->SetCaption(_T("Order Details")); pTableOrderDetails->SetTooltip(_T("Order Details Table")); pTableOrderDetails->SetLocation(XTP_DPI(CPoint(90, 200))); pTableOrderDetails->SetColor(clrOfficeColors[1]); pTableOrderDetails->SetImageIndex(1); pTableOrderDetails->AddNamedConnectionPoints(_T("ID"), xtpFlowGraphPointInput); pTableOrderDetails->AddNamedConnectionPoints(_T("Order ID"), xtpFlowGraphPointOutput); pTableOrderDetails->AddNamedConnectionPoints(_T("Product ID"), xtpFlowGraphPointOutput); pTableOrderDetails->AddNamedConnectionPoints(_T("Quantity")); pTableOrderDetails->AddNamedConnectionPoints(_T("Unit Price")); pTableOrderDetails->AddNamedConnectionPoints(_T("Discount")); pTableOrderDetails->AddNamedConnectionPoints(_T("Status ID")); // apply some colors to connection points pTableOrders->GetConnectionPoints() ->FindConnectionPoint(_T("Order ID")) ->SetColor(RGB(0, 0, 255)); pTableOrderDetails->GetConnectionPoints() ->FindConnectionPoint(_T("Order ID")) ->SetColor(RGB(0, 0, 255)); // Shippers CXTPFlowGraphNode* pTableShippers = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableShippers->SetCaption(_T("Shippers")); pTableShippers->SetTooltip(_T("Shippers Table")); pTableShippers->SetLocation(XTP_DPI(CPoint(520, 360))); // pTableShippers->SetColor(clrOfficeColors[3]); pTableShippers->AddNamedConnectionPoints(_T("ID"), xtpFlowGraphPointInput); pTableShippers->AddNamedConnectionPoints(_T("Company")); pTableShippers->AddNamedConnectionPoints(_T("Last Name")); pTableShippers->AddNamedConnectionPoints(_T("First Name")); pTableShippers->AddNamedConnectionPoints(_T("E-mail Address")); pTableShippers->AddNamedConnectionPoints(_T("Job Title")); pTableShippers->AddNamedConnectionPoints(_T("Business Phone")); // Products CXTPFlowGraphNode* pTableProducts = pPage->GetNodes()->AddNode(new CXTPFlowGraphNode()); pTableProducts->SetCaption(_T("Products")); pTableProducts->SetTooltip(_T("Products Table")); pTableProducts->SetLocation(XTP_DPI(CPoint(320, 360))); // pTableProducts->SetColor(clrOfficeColors[4]); pTableProducts->AddNamedConnectionPoints(_T("ID"), xtpFlowGraphPointInput); pTableProducts->AddNamedConnectionPoints(_T("Product Code")); pTableProducts->AddNamedConnectionPoints(_T("Product Name")); pTableProducts->AddNamedConnectionPoints(_T("Description")); pTableProducts->AddNamedConnectionPoints(_T("Price")); pTableProducts->AddNamedConnectionPoints(_T("Category")); // Manage connections CXTPFlowGraphConnection* pConnection; pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint( pTableOrders->GetConnectionPoints()->FindConnectionPoint(_T("Customer ID"))); pConnection->SetInputPoint( pTableCustomers->GetConnectionPoints()->FindConnectionPoint(_T("ID"))); pConnection->SetStyle(xtpFlowGraphConnectorCurvedDoubleArrow); pConnection->SetCaption(_T("Customer relations")); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint( pTableOrders->GetConnectionPoints()->FindConnectionPoint(_T("Shipper ID"))); pConnection->SetInputPoint( pTableShippers->GetConnectionPoints()->FindConnectionPoint(_T("ID"))); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint( pTableOrders->GetConnectionPoints()->FindConnectionPoint(_T("Employee ID"))); pConnection->SetInputPoint( pTableEmployees->GetConnectionPoints()->FindConnectionPoint(_T("ID"))); pConnection->SetStyle(xtpFlowGraphConnectorElbowArrow); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint( pTableOrderDetails->GetConnectionPoints()->FindConnectionPoint(_T("Order ID"))); pConnection->SetInputPoint( pTableOrders->GetConnectionPoints()->FindConnectionPoint(_T("Order ID"))); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint( pTableOrderDetails->GetConnectionPoints()->FindConnectionPoint(_T("Product ID"))); pConnection->SetInputPoint( pTableProducts->GetConnectionPoints()->FindConnectionPoint(_T("ID"))); #if 0 CXTPFlowGraphNodeGroups* pGroups = pPage->GetGroups(); CXTPFlowGraphNodeGroup* pGroup = pGroups->AddGroup(); pGroup->AddNode(pTableEmployees); pGroup->AddNode(pTableCustomers); #endif m_wndControl.SetActivePage(pPage); } void CFlowGraphSampleView::CreateNetworkDiagram() { m_wndControl.GetPaintManager()->m_clrConnection = RGB(40, 40, 150); CXTPFlowGraphPage* pPage = m_wndControl.GetPages()->AddPage(new CXTPFlowGraphPage()); m_wndControl.SetActivePage(pPage); m_wndControl.SetZoomRange(0.5, 5.0); CXTPFlowGraphNodeCustom* pImageCloud = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(400, 100)), XTP_DPI(CSize(128, 112))); pImageCloud->SetImageIndex(3); pImageCloud->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImageCloud->SetCaption(_T("Cloud Data Storage")); pImageCloud->SetTooltip(_T("Centralized cloud storage")); CXTPFlowGraphNodeCustom* pImageDesktop = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(150, 320)), XTP_DPI(CSize(64, 64))); pImageDesktop->SetImageIndex(4); pImageDesktop->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImageDesktop->SetCaption(_T("Desktop PC")); pImageDesktop->SetTooltip(_T("A normal desktop PC")); CXTPFlowGraphNodeCustom* pImageLaptop = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(150, 90)), XTP_DPI(CSize(64, 64))); pImageLaptop->SetImageIndex(5); pImageLaptop->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImageLaptop->SetCaption(_T("Laptop")); pImageLaptop->SetTooltip(_T("A laptop")); CXTPFlowGraphNodeCustom* pImagePhone = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(700, 90)), XTP_DPI(CSize(64, 64))); pImagePhone->SetImageIndex(6); pImagePhone->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImagePhone->SetCaption(_T("Mobile Phone")); pImagePhone->SetTooltip(_T("Android or iOS mobile phone")); CXTPFlowGraphNodeCustom* pImageTablet = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(700, 320)), XTP_DPI(CSize(64, 64))); pImageTablet->SetImageIndex(7); pImageTablet->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImageTablet->SetCaption(_T("Tablet PC")); pImageTablet->SetTooltip(_T("Android or iOS tablet PC")); CXTPFlowGraphNodeCustom* pImageDevice = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_IMAGE, XTP_DPI(CPoint(430, 320)), XTP_DPI(CSize(64, 64))); pImageDevice->SetImageIndex(8); pImageDevice->SetCaptionPosition(xtpFlowGraphCustomNodeCaptionBelow); pImageDevice->SetCaption(_T("Your network device")); pImageDevice->SetTooltip(_T("Custom network device")); // manage connections CXTPFlowGraphConnection* pConnection; pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pImageCloud->GetConnectionPoints()->GetAt(0)); pConnection->SetInputPoint(pImageDesktop->GetConnectionPoints()->GetAt(0)); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pImageCloud->GetConnectionPoints()->GetAt(0)); pConnection->SetInputPoint(pImageLaptop->GetConnectionPoints()->GetAt(0)); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pImageCloud->GetConnectionPoints()->GetAt(0)); pConnection->SetInputPoint(pImagePhone->GetConnectionPoints()->GetAt(0)); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pImageCloud->GetConnectionPoints()->GetAt(0)); pConnection->SetInputPoint(pImageTablet->GetConnectionPoints()->GetAt(0)); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pImageCloud->GetConnectionPoints()->GetAt(0)); pConnection->SetInputPoint(pImageDevice->GetConnectionPoints()->GetAt(0)); } void CFlowGraphSampleView::CreateFlowChart() { m_wndControl.GetPaintManager()->m_clrConnection = RGB(80, 80, 80); COLORREF clr1 = RGB(255, 191, 201); COLORREF clr2 = RGB(255, 255, 138); COLORREF clr3 = RGB(139, 239, 145); CXTPFlowGraphPage* pPage = m_wndControl.GetPages()->AddPage(new CXTPFlowGraphPage()); m_wndControl.SetActivePage(pPage); CXTPFlowGraphNodeCustom* pNode1 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RECTANGLE_ROUNDED, XTP_DPI(CPoint(300, 30)), XTP_DPI(CSize(200, 60))); pNode1->SetColor(clr1); pNode1->SetCaption(_T("Lamp doesn't work")); CXTPFlowGraphNodeCustom* pNode2 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RHOMBUS, XTP_DPI(CPoint(300, 120)), XTP_DPI(CSize(200, 120))); pNode2->SetColor(clr2); pNode2->SetCaption(_T("Lamp plugged in?")); CXTPFlowGraphNodeCustom* pNode3 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RECTANGLE_ROUNDED, XTP_DPI(CPoint(550, 150)), XTP_DPI(CSize(160, 60))); pNode3->SetColor(clr3); pNode3->SetCaption(_T("Plug in lamp")); CXTPFlowGraphNodeCustom* pNode4 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RHOMBUS, XTP_DPI(CPoint(300, 275)), XTP_DPI(CSize(200, 120))); pNode4->SetColor(clr2); pNode4->SetCaption(_T("Bulb burned out?")); CXTPFlowGraphNodeCustom* pNode5 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RECTANGLE_ROUNDED, XTP_DPI(CPoint(550, 305)), XTP_DPI(CSize(160, 60))); pNode5->SetColor(clr3); pNode5->SetCaption(_T("Replace bulb")); CXTPFlowGraphNodeCustom* pNode6 = AddCustomFlowGraphShape(m_wndControl, XTP_FLOWGRAPH_SHAPE_RECTANGLE_ROUNDED, XTP_DPI(CPoint(320, 420)), XTP_DPI(CSize(160, 60))); pNode6->SetColor(clr3); pNode6->SetCaption(_T("Repair lamp")); // manage connections CXTPFlowGraphConnection* pConnection = pPage->GetConnections()->AddConnection( new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pNode1->GetConnectionPoints()->GetAt(2)); pConnection->SetInputPoint(pNode2->GetConnectionPoints()->GetAt(1)); pConnection->SetStyle(xtpFlowGraphConnectorStraightArrow); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pNode2->GetConnectionPoints()->GetAt(2)); pConnection->SetInputPoint(pNode3->GetConnectionPoints()->GetAt(0)); pConnection->SetStyle(xtpFlowGraphConnectorStraightArrow); pConnection->SetCaption(_T("No")); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pNode2->GetConnectionPoints()->GetAt(3)); pConnection->SetInputPoint(pNode4->GetConnectionPoints()->GetAt(1)); pConnection->SetStyle(xtpFlowGraphConnectorStraightArrow); pConnection->SetCaption(_T("Yes")); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pNode4->GetConnectionPoints()->GetAt(2)); pConnection->SetInputPoint(pNode5->GetConnectionPoints()->GetAt(0)); pConnection->SetStyle(xtpFlowGraphConnectorStraightArrow); pConnection->SetCaption(_T("Yes")); pConnection = pPage->GetConnections()->AddConnection(new CXTPFlowGraphConnection()); pConnection->SetOutputPoint(pNode4->GetConnectionPoints()->GetAt(3)); pConnection->SetInputPoint(pNode6->GetConnectionPoints()->GetAt(2)); pConnection->SetStyle(xtpFlowGraphConnectorStraightArrow); pConnection->SetCaption(_T("No")); } void CFlowGraphSampleView::SwitchGraph(int nGraphType) { m_wndControl.GetPages()->RemoveAll(); switch (nGraphType) { case 0: { CreateDatabaseRelationships(); break; } case 1: { CreateNetworkDiagram(); break; } case 2: { CreateFlowChart(); break; } } } int CFlowGraphSampleView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; m_wndControl.Create(WS_VSCROLL | WS_HSCROLL | WS_CHILD | WS_VISIBLE, CRect(0, 0, 0, 0), this, ID_FLOWGRAPH_CONTROL); InitFlowGraphImages(); SwitchGraph(0); return 0; } void CFlowGraphSampleView::OnInitialUpdate() { CView::OnInitialUpdate(); // Register our view as a drop target. static bool bOnce = true; if (bOnce) { m_droptarget.Register(this); bOnce = false; } m_wndControl.SetScrollbarTheme(xtpScrollBarThemeOffice2013); m_wndControl.Reposition(); } void CFlowGraphSampleView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); if (m_wndControl.GetSafeHwnd()) { m_wndControl.MoveWindow(0, 0, cx, cy); } } BOOL CFlowGraphSampleView::OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; } #ifdef _XTP_INCLUDE_COMMANDBARS // Convert 0 -> 10%, 500 -> 100 %, 1000 -> 500 % int PosToZoom(int nPos) { return nPos <= 500 ? 10 + MulDiv(nPos, 90, 500) : 100 + MulDiv(nPos - 500, 400, 500); } int ZoomToPos(int nZoom) { return nZoom < 100 ? MulDiv(nZoom - 10, 500, 90) : 500 + MulDiv(nZoom - 100, 500, 400); } void CFlowGraphSampleView::OnZoomSliderScroll(NMHDR* pNMHDR, LRESULT* pResult) { NMXTPSCROLL* pNMScroll = (NMXTPSCROLL*)pNMHDR; CXTPStatusBarSliderPane* pPane = DYNAMIC_DOWNCAST(CXTPStatusBarSliderPane, pNMScroll->pSender); _ASSERTE(pPane); int nZoom = int(m_wndControl.GetZoomLevel() * 100); int nPrevZoom = nZoom; int nLineDelta = nZoom <= 100 ? 10 : 50; switch (pNMScroll->nSBCode) { case SB_TOP: nZoom = 10; break; case SB_BOTTOM: nZoom = 500; break; case SB_LINEUP: nZoom = max(((nZoom / nLineDelta) - 1) * nLineDelta, 10); break; case SB_LINEDOWN: nZoom = min(((nZoom / nLineDelta) + 1) * nLineDelta, 500); break; case SB_THUMBTRACK: nZoom = PosToZoom(pNMScroll->nPos); if (nZoom > 90 && nZoom < 150) nZoom = 100; break; case SB_PAGEUP: nZoom = max(nZoom - nLineDelta, 10); break; case SB_PAGEDOWN: nZoom = min(nZoom + nLineDelta, 500); break; } *pResult = TRUE; // Handled if (nZoom == nPrevZoom) return; pPane->SetPos(ZoomToPos(nZoom)); CXTPStatusBar* pStatusBar = pPane->GetStatusBar(); CXTPStatusBarPane* pPaneZoomIndicator = pStatusBar->FindPane(ID_INDICATOR_ZOOM); CString strZoom; strZoom.Format(_T("%i%%"), nZoom); pPaneZoomIndicator->SetText(strZoom); m_wndControl.SetZoomLevel(nZoom / 100.0); } void CFlowGraphSampleView::OnUpdateViewZoom(CCmdUI* pCmdUI) { CXTPStatusBar* pStatusBar = DYNAMIC_DOWNCAST(CXTPStatusBar, pCmdUI->m_pOther); if (!pStatusBar) return; int nZoom = int(m_wndControl.GetZoomLevel() * 100); if (m_nZoom != nZoom) { CXTPStatusBarPane* pPane = pStatusBar->GetPane(pCmdUI->m_nIndex); m_nZoom = nZoom; CString strZoom; strZoom.Format(_T("%i%%"), m_nZoom); pPane->SetText(strZoom); CXTPStatusBarSliderPane* pSliderPane = (CXTPStatusBarSliderPane*)pStatusBar->GetPane( pCmdUI->m_nIndex + 1); pSliderPane->SetPos(ZoomToPos(nZoom)); } pCmdUI->Enable(TRUE); } #endif void CFlowGraphSampleView::OnSetFocus(CWnd* pOldWnd) { CView::OnSetFocus(pOldWnd); m_wndControl.SetFocus(); } void CFlowGraphSampleView::OnUpdateHasSelection(CCmdUI* pCmdUI) { pCmdUI->Enable(m_wndControl.GetActivePage()->GetSelection()->GetCount() > 0); } void CFlowGraphSampleView::OnZoomToSelection() { m_wndControl.ZoomToSelection(); } void CFlowGraphSampleView::OnZoomFitToWindow() { m_wndControl.ZoomFitToWindow(); } void CFlowGraphSampleView::OnEditSelectAll() { m_wndControl.SelectAll(); } void CFlowGraphSampleView::OnEditArrange() { m_wndControl.Arrange(); } UINT CFlowGraphSampleView::TrackPopupMenu(CMenu* pMenu, UINT nFlags, int xPos, int yPos) { #ifdef _XTP_INCLUDE_COMMANDBARS return CXTPCommandBars::TrackPopupMenu(pMenu, nFlags, xPos, yPos, this); #else return ::TrackPopupMenu(pMenu->GetSafeHmenu(), nFlags, xPos, yPos, 0, m_hWnd, 0); #endif }; void CFlowGraphSampleView::OnGraphRClick(NMHDR* /*pNMHDR*/, LRESULT* /*pResult*/) { CPoint point; GetCursorPos(&point); m_wndControl.ScreenToClient(&point); CXTPFlowGraphNode* pNode = m_wndControl.HitTestNode(point); CXTPFlowGraphConnection* pConnection = m_wndControl.HitTestConnection(point); CXTPFlowGraphSelectedElements* pSelection = m_wndControl.GetActivePage()->GetSelection(); if (pNode) { if (!pNode->IsSelected()) { pSelection->Clear(); pNode->Select(); } m_wndControl.GetActivePage()->GetNodes()->MoveToFront(pNode); CMenu menu; menu.LoadMenu(IDR_MENU_CONTEXT); CPoint point; GetCursorPos(&point); CPoint pointClient = point; m_wndControl.ScreenToClient(&pointClient); CXTPFlowGraphConnectionPoint* pConnectionPoint = pNode->HitTestConnectionPoint(pointClient); UINT nCommand = TrackPopupMenu(menu.GetSubMenu(pConnectionPoint ? 3 : 0), TPM_RETURNCMD, point.x, point.y); if (nCommand == ID_COLOR_TRANSPARENT) { pNode->SetColor(RGB(255, 255, 255), 0); } else if (nCommand >= ID_NODE_COLOR_BLUE && nCommand <= ID_NODE_COLOR_ORANGE) { pNode->SetColor(clrOfficeColors[nCommand - ID_NODE_COLOR_BLUE]); } else if (nCommand == ID_NODE_DELETE) { pNode->Remove(); } else if (nCommand == ID_CONNECTIONPOINT_DELETE) { pConnectionPoint->Remove(); } else if (nCommand == ID_NODE_RENAME) { m_wndControl.RenameNode(pNode); } else if (nCommand == ID_CONNECTIONPOINT_ADD) { static int iConnectionPointN = 0; CString newPointName; newPointName.Format(_T("New connection point %d"), iConnectionPointN++); pNode->AddNamedConnectionPoints(newPointName, xtpFlowGraphPointInputAndOutput); m_wndControl.RedrawControl(); m_wndControl.RenameConnectionPoint(pConnectionPoint); } else if (nCommand == ID_CONNECTIONPOINT_RENAME) { m_wndControl.RenameConnectionPoint(pConnectionPoint); } else if (nCommand == ID_GROUP_UNGROUP) { for (int i = 0; i < pSelection->GetCount(); i++) { CXTPFlowGraphNode* pNode = DYNAMIC_DOWNCAST(CXTPFlowGraphNode, pSelection->GetAt(i)); if (!pNode) continue; if (pNode->GetGroup() != NULL) { pNode->GetGroup()->RemoveNode(pNode); } } } else if (nCommand == ID_GROUP_GROUP) { CXTPFlowGraphNodeGroup* pGroup = m_wndControl.GetActivePage()->GetGroups()->AddGroup(); for (int i = 0; i < pSelection->GetCount(); i++) { CXTPFlowGraphNode* pNode = DYNAMIC_DOWNCAST(CXTPFlowGraphNode, pSelection->GetAt(i)); if (!pNode) continue; pGroup->AddNode(pNode); } if (pGroup->GetCount() < 2) { pGroup->Remove(); } else { pGroup->GetAt(0)->Select(); } } } else if (pConnection) { if (!pConnection->IsSelected()) { pSelection->Clear(); pSelection->AddSelection(pConnection); } CMenu menu; menu.LoadMenu(IDR_MENU_CONTEXT); CPoint point; GetCursorPos(&point); UINT nCommand = TrackPopupMenu(menu.GetSubMenu(2), TPM_RETURNCMD, point.x, point.y); if (nCommand >= ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_0 && nCommand <= ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_8) { XTPFlowGraphConnectorType type = xtpFlowGraphConnectorStraight; switch (nCommand) { case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_1: { type = xtpFlowGraphConnectorStraightArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_2: { type = xtpFlowGraphConnectorStraightDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_3: { type = xtpFlowGraphConnectorCurved; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_4: { type = xtpFlowGraphConnectorCurvedArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_5: { type = xtpFlowGraphConnectorCurvedDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_6: { type = xtpFlowGraphConnectorElbow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_7: { type = xtpFlowGraphConnectorElbowArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_CONTEXT_8: { type = xtpFlowGraphConnectorElbowDoubleArrow; break; } } pConnection->SetStyle(type); } else if (nCommand == ID_CONNECTION_DELETECONNECTION) { pConnection->Remove(); } else if (nCommand == ID_CONNECTION_CLEANCONTROLPOINTS) { pConnection->SetControlPoint(CPoint(-1, -1)); } } else { CMenu menu; menu.LoadMenu(IDR_MENU_CONTEXT); CPoint point; GetCursorPos(&point); UINT nCommand = TrackPopupMenu(menu.GetSubMenu(1), TPM_RETURNCMD, point.x, point.y); m_wndControl.ScreenToClient(&point); point = m_wndControl.GetActivePage()->ScreenToPage(point); switch (nCommand) { case ID_NODE_ADD: { InsertNewShape(FG_SHAPE_TABLE, point); break; } case ID_ADDCUSTOMNODE_RECTANGLE: { InsertNewShape(FG_SHAPE_FROM_RESOURCE, point, XTP_FLOWGRAPH_SHAPE_RECTANGLE); break; } case ID_ADDCUSTOMNODE_RHOMBUS: { InsertNewShape(FG_SHAPE_FROM_RESOURCE, point, XTP_FLOWGRAPH_SHAPE_RHOMBUS); break; } case ID_ADDCUSTOMNODE_ELLIPSE: { InsertNewShape(FG_SHAPE_FROM_RESOURCE, point, XTP_FLOWGRAPH_SHAPE_ELLIPSE); break; } case ID_ADDCUSTOMNODE_IMAGE_FIREWALL: { InsertNewShape(FG_SHAPE_PICTURE, point); break; } } } } void CFlowGraphSampleView::OnEditCopy() { m_wndControl.GetActivePage()->Copy(); } void CFlowGraphSampleView::OnUpdateEditCopy(CCmdUI* pCmdUI) { BOOL bEnable = m_wndControl.GetActivePage() ? (m_wndControl.GetActivePage()->GetSelection()->GetCount() > 0) : FALSE; pCmdUI->Enable(bEnable); } void CFlowGraphSampleView::OnEditCut() { // if (AfxMessageBox(_T("Are you sure you want delete selected objects"), MB_YESNO) == IDYES) m_wndControl.GetActivePage()->Cut(); } void CFlowGraphSampleView::OnUpdateEditCut(CCmdUI* pCmdUI) { BOOL bEnable = m_wndControl.GetActivePage() ? (m_wndControl.GetActivePage()->GetSelection()->GetCount() > 0) : FALSE; pCmdUI->Enable(bEnable); } void CFlowGraphSampleView::OnEditPaste() { m_wndControl.GetActivePage()->Paste(); } void CFlowGraphSampleView::OnUpdateEditPaste(CCmdUI* pCmdUI) { pCmdUI->Enable(m_wndControl.GetActivePage()->CanPaste()); } void CFlowGraphSampleView::OnEditUndo() { m_wndControl.GetUndoManager()->Undo(); } void CFlowGraphSampleView::OnUpdateEditUndo(CCmdUI* pCmdUI) { pCmdUI->Enable(m_wndControl.GetUndoManager()->CanUndo()); } void CFlowGraphSampleView::OnEditRedo() { m_wndControl.GetUndoManager()->Redo(); } void CFlowGraphSampleView::OnUpdateEditRedo(CCmdUI* pCmdUI) { pCmdUI->Enable(m_wndControl.GetUndoManager()->CanRedo()); } void CFlowGraphSampleView::OnShowGrid() { m_wndControl.GetPaintManager()->m_bShowGrid ^= 1; m_wndControl.RedrawControl(); } void CFlowGraphSampleView::OnUpdateShowGrid(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_wndControl.GetPaintManager()->m_bShowGrid ? 1 : 0); } void CFlowGraphSampleView::OnConnectorType(UINT nCmd) { XTPFlowGraphConnectorType type = xtpFlowGraphConnectorStraight; switch (nCmd) { case ID_FLOWGRAPH_CONNECTOR_TYPE_1: { type = xtpFlowGraphConnectorStraightArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_2: { type = xtpFlowGraphConnectorStraightDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_3: { type = xtpFlowGraphConnectorCurved; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_4: { type = xtpFlowGraphConnectorCurvedArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_5: { type = xtpFlowGraphConnectorCurvedDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_6: { type = xtpFlowGraphConnectorElbow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_7: { type = xtpFlowGraphConnectorElbowArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_8: { type = xtpFlowGraphConnectorElbowDoubleArrow; break; } } CXTPFlowGraphConnections* pConnections = m_wndControl.GetActivePage()->GetConnections(); if (pConnections) { for (int i = 0; i < pConnections->GetCount(); i++) { pConnections->GetAt(i)->SetStyle(type); } } // m_wndControl.GetPaintManager()->m_nConnectorType = type; m_wndControl.GetActivePage()->OnGraphChanged(); } void CFlowGraphSampleView::OnUpdateConnectorType(CCmdUI* pCmdUI) { XTPFlowGraphConnectorType type = xtpFlowGraphConnectorStraight; switch (pCmdUI->m_nID) { case ID_FLOWGRAPH_CONNECTOR_TYPE_1: { type = xtpFlowGraphConnectorStraightArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_2: { type = xtpFlowGraphConnectorStraightDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_3: { type = xtpFlowGraphConnectorCurved; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_4: { type = xtpFlowGraphConnectorCurvedArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_5: { type = xtpFlowGraphConnectorCurvedDoubleArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_6: { type = xtpFlowGraphConnectorElbow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_7: { type = xtpFlowGraphConnectorElbowArrow; break; } case ID_FLOWGRAPH_CONNECTOR_TYPE_8: { type = xtpFlowGraphConnectorElbowDoubleArrow; break; } } pCmdUI->SetCheck(m_wndControl.GetPaintManager()->m_nConnectorType == type); } void CFlowGraphSampleView::OnFlowgraphShowNodegroupsAlways() { m_wndControl.GetPaintManager()->m_bShowNodeGroupsAlways ^= 1; m_wndControl.RedrawControl(); } void CFlowGraphSampleView::OnUpdateFlowgraphShowNodegroupsAlways(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_wndControl.GetPaintManager()->m_bShowNodeGroupsAlways ? 1 : 0); } void CFlowGraphSampleView::OnQuality(UINT nCmd) { m_wndControl.SetSmoothingMode( (XTPFlowGraphSmoothingMode)(nCmd - ID_FLOWGRAPH_QUALITY_HIGHQUALITY)); } void CFlowGraphSampleView::OnUpdateQuality(CCmdUI* pCmdUI) { pCmdUI->SetCheck( m_wndControl.GetSmoothingMode() == (XTPFlowGraphSmoothingMode)(pCmdUI->m_nID - ID_FLOWGRAPH_QUALITY_HIGHQUALITY) ? 1 : 0); } void CFlowGraphSampleView::OnEditDelete() { CArray nodesToRemove; CXTPFlowGraphSelectedElements* pSelection = m_wndControl.GetActivePage()->GetSelection(); if (pSelection) { int c = pSelection->GetCount(); for (int i = 0; i < c; i++) { CXTPFlowGraphNode* pNode = DYNAMIC_DOWNCAST(CXTPFlowGraphNode, pSelection->GetAt(i)); if (!pNode) continue; nodesToRemove.Add(pNode); } } for (int i = 0; i < nodesToRemove.GetSize(); i++) { nodesToRemove[i]->Select(FALSE); nodesToRemove[i]->Remove(); } } void CFlowGraphSampleView::OnUpdateEditDelete(CCmdUI* pCmdUI) { pCmdUI->Enable(m_wndControl.GetActivePage()->GetSelection()->GetCount() > 0); } #ifdef _XTP_INCLUDE_TASKPANEL LRESULT CFlowGraphSampleView::OnTaskPanelNotify(WPARAM wParam, LPARAM lParam) { switch (wParam) { case XTP_TPN_CLICK: { CXTPTaskPanelGroupItem* pItem = (CXTPTaskPanelGroupItem*)lParam; if (pItem && pItem->GetID() < FG_SHAPE_TABLE) { CXTPFlowGraphConnections* pConnections = m_wndControl.GetActivePage()->GetConnections(); if (pConnections) { for (int i = 0; i < pConnections->GetCount(); i++) { pConnections->GetAt(i)->SetStyle((XTPFlowGraphConnectorType)pItem->GetID()); } } // m_wndControl.GetPaintManager()->m_nConnectorType = // (XTPFlowGraphConnectorType)pItem->GetID(); m_wndControl.GetActivePage()->OnGraphChanged(); } break; } } return 0; } #endif enum GRID_ITEM_ID { GRID_ITEM_CAPTION = 0, GRID_ITEM_COLOR, GRID_ITEM_COLOR_2, GRID_ITEM_FILL_TYPE, GRID_ITEM_SIZE, GRID_ITEM_SIZE_WIDTH, GRID_ITEM_SIZE_HEIGHT, GRID_CONNECTION_CAPTION, GRID_CONNECTION_COLOR, GRID_CONNECTION_TYPE, GRID_CONNECTION_WIDTH, GRID_CONNECTION_DASHED }; void CFlowGraphSampleView::OnSelectionChanged(NMHDR* /*pNMHDR*/, LRESULT* pResult) { #ifdef _XTP_INCLUDE_PROPERTYGRID if (m_pGrid) { m_pGrid->ResetContent(); UpdatePropertyGrid(); } #endif *pResult = 0; } #ifdef _XTP_INCLUDE_PROPERTYGRID void CFlowGraphSampleView::UpdatePropertyGrid() { _ASSERTE(m_pGrid); if (!m_pGrid) return; CXTPFlowGraphSelectedElements* pSelectedElements = m_wndControl.GetActivePage()->GetSelection(); if (pSelectedElements->GetCount() == 1) { CXTPFlowGraphElement* pElement = pSelectedElements->GetAt(0); if (pElement) { CXTPFlowGraphNode* pNode = DYNAMIC_DOWNCAST(CXTPFlowGraphNode, pElement); CXTPFlowGraphConnection* pConnection = DYNAMIC_DOWNCAST(CXTPFlowGraphConnection, pElement); if (pNode) { CXTPPropertyGridItem* pGroupNode = m_pGrid->AddCategory(pNode->GetCaption() + CString(_T(" Node"))); CXTPPropertyGridItem* pCaption = pGroupNode->AddChildItem( new CXTPPropertyGridItem(_T("Caption"))); pCaption->SetValue(pNode->GetCaption()); pCaption->SetID(GRID_ITEM_CAPTION); CXTPPropertyGridItemColor* pColor = (CXTPPropertyGridItemColor*)pGroupNode->AddChildItem( new CXTPPropertyGridItemColor(_T("Color"))); pColor->SetID(GRID_ITEM_COLOR); pColor->SetColor(pNode->GetColor()); if (pNode->IsKindOf(RUNTIME_CLASS(CXTPFlowGraphNodeCustom))) { CXTPFlowGraphNodeCustom* pNodeCustom = static_cast( pNode); pColor = (CXTPPropertyGridItemColor*)pGroupNode->AddChildItem( new CXTPPropertyGridItemColor(_T("Color 2"))); pColor->SetID(GRID_ITEM_COLOR_2); pColor->SetColor(pNodeCustom->GetSecondColor()); // fill type CXTPPropertyGridItem* pType = pGroupNode->AddChildItem( new CXTPPropertyGridItem(_T("Fill Type"))); pType->SetID(GRID_ITEM_FILL_TYPE); CXTPPropertyGridItemConstraints* pConstraints = pType->GetConstraints(); pConstraints->AddConstraint(_T("Solid"), (DWORD_PTR)xtpFlowGraphCustomNodeFillSolid); pConstraints->AddConstraint(_T("Gradient Horz"), (DWORD_PTR) xtpFlowGraphCustomNodeFillGradientHorizontal); pConstraints->AddConstraint( _T("Gradient Vert"), (DWORD_PTR)xtpFlowGraphCustomNodeFillGradientVertical); pConstraints->AddConstraint(_T("Gradient Diagonal Left"), (DWORD_PTR) xtpFlowGraphCustomNodeFillGradientDiagonalLeft); pConstraints->AddConstraint( _T("Gradient Diagonal Right"), (DWORD_PTR)xtpFlowGraphCustomNodeFillGradientDiagonalRight); pConstraints->AddConstraint( _T("Gradient Center Horz"), (DWORD_PTR)xtpFlowGraphCustomNodeFillGradientCenterHorizontal); pConstraints->AddConstraint( _T("Gradient Center Vert"), (DWORD_PTR)xtpFlowGraphCustomNodeFillGradientCenterVertical); CXTPPropertyGridItemConstraint* pCurrValue = pConstraints->GetConstraintAt( pConstraints->FindConstraint((DWORD_PTR)pNodeCustom->GetFillType())); if (pCurrValue) pType->SetValue(pCurrValue->m_strConstraint); pType->SetFlags(xtpPropertyGridItemHasComboButton); } if (pNode->IsResizable()) { CXTPPropertyGridItemSize* pSize = (CXTPPropertyGridItemSize*)pGroupNode->AddChildItem( new CXTPPropertyGridItemSize(_T("Size"))); CXTPPropertyGridItems* pChildren = pSize->GetChilds(); _ASSERTE(pChildren->GetCount() == 2); if (pChildren->GetCount() == 2) { pChildren->GetAt(0)->SetID(GRID_ITEM_SIZE_WIDTH); pChildren->GetAt(1)->SetID(GRID_ITEM_SIZE_HEIGHT); } pSize->SetSize(pNode->GetSize()); pSize->SetID(GRID_ITEM_SIZE); // pSize->SetMinSize () ? } pGroupNode->Expand(); } else if (pConnection) { CXTPPropertyGridItem* pGroupConnection = m_pGrid->AddCategory( pConnection->GetCaption().GetLength() ? pConnection->GetCaption() : _T("Connection")); CXTPPropertyGridItem* pCaption = pGroupConnection->AddChildItem( new CXTPPropertyGridItem(_T("Caption"))); if (pConnection->GetCaption().GetLength()) pCaption->SetValue(pConnection->GetCaption()); pCaption->SetID(GRID_CONNECTION_CAPTION); CXTPPropertyGridItemColor* pColor = (CXTPPropertyGridItemColor*)pGroupConnection->AddChildItem( new CXTPPropertyGridItemColor(_T("Color"))); pColor->SetID(GRID_CONNECTION_COLOR); if (pConnection->GetColor() != -1) // not defined pColor->SetColor(pConnection->GetColor()); else pColor->SetColor(m_wndControl.GetPaintManager()->m_clrConnection); // type CXTPPropertyGridItem* pType = pGroupConnection->AddChildItem( new CXTPPropertyGridItem(_T("Type"))); pType->SetID(GRID_CONNECTION_TYPE); CXTPPropertyGridItemConstraints* pConstraints = pType->GetConstraints(); pConstraints->AddConstraint(_T("Straight"), (DWORD_PTR)xtpFlowGraphConnectorStraight); pConstraints->AddConstraint(_T("Straight with arrow"), (DWORD_PTR)xtpFlowGraphConnectorStraightArrow); pConstraints->AddConstraint(_T("Straight with double arrow"), (DWORD_PTR)xtpFlowGraphConnectorStraightDoubleArrow); pConstraints->AddConstraint(_T("Curved"), (DWORD_PTR)xtpFlowGraphConnectorCurved); pConstraints->AddConstraint(_T("Curved with arrow"), (DWORD_PTR)xtpFlowGraphConnectorCurvedArrow); pConstraints->AddConstraint(_T("Curved with double arrow"), (DWORD_PTR)xtpFlowGraphConnectorCurvedDoubleArrow); pConstraints->AddConstraint(_T("Elbow"), (DWORD_PTR)xtpFlowGraphConnectorElbow); pConstraints->AddConstraint(_T("Elbow with arrow"), (DWORD_PTR)xtpFlowGraphConnectorElbowArrow); pConstraints->AddConstraint(_T("Elbow with double arrow"), (DWORD_PTR)xtpFlowGraphConnectorElbowDoubleArrow); int nStyle = (pConnection->GetStyle() != -1) ? pConnection->GetStyle() : m_wndControl.GetPaintManager()->m_nConnectorType; CXTPPropertyGridItemConstraint* pCurrValue = pConstraints->GetConstraintAt( pConstraints->FindConstraint((DWORD_PTR)nStyle)); if (pCurrValue) pType->SetValue(pCurrValue->m_strConstraint); pType->SetFlags(xtpPropertyGridItemHasComboButton); CXTPPropertyGridItemNumber* pWidth = (CXTPPropertyGridItemNumber*)pGroupConnection->AddChildItem( new CXTPPropertyGridItemNumber(_T("Width"))); pWidth->SetNumber(pConnection->GetWidth()); pWidth->SetID(GRID_CONNECTION_WIDTH); CXTPPropertyGridItemBool* pDashed = (CXTPPropertyGridItemBool*)pGroupConnection->AddChildItem( new CXTPPropertyGridItemBool(_T("Dashed"))); pDashed->SetBool(pConnection->GetDashed()); pDashed->SetID(GRID_CONNECTION_DASHED); pGroupConnection->Expand(); } } } else { CXTPPropertyGridItem* pGroupMultiple = m_pGrid->AddCategory( _T("Multiple items are selected")); // don't work with multiple items selected at the moment } } LRESULT CFlowGraphSampleView::OnPropertyGridNotify(WPARAM wParam, LPARAM lParam) { switch (wParam) { case XTP_PGN_USER: { m_pGrid = (CXTPPropertyGrid*)lParam; break; } case XTP_PGN_ITEMVALUE_CHANGED: { CXTPFlowGraphSelectedElements* pSelectedElements = m_wndControl.GetActivePage()->GetSelection(); if (pSelectedElements->GetCount() != 1) return 0; CXTPFlowGraphElement* pElement = pSelectedElements->GetAt(0); CXTPFlowGraphNode* pNode = DYNAMIC_DOWNCAST(CXTPFlowGraphNode, pElement); CXTPFlowGraphConnection* pConnection = DYNAMIC_DOWNCAST(CXTPFlowGraphConnection, pElement); CXTPPropertyGridItem* pChangedItem = reinterpret_cast(lParam); switch (pChangedItem->GetID()) { case GRID_ITEM_CAPTION: { if (pNode) { pNode->SetCaption(pChangedItem->GetValue()); } break; } case GRID_ITEM_COLOR: { if (pNode) { CXTPPropertyGridItemColor* pChangedItemColor = static_cast(pChangedItem); pNode->SetColor(pChangedItemColor->GetColor()); } break; } case GRID_ITEM_COLOR_2: { if (pNode) { CXTPPropertyGridItemColor* pChangedItemColor = static_cast(pChangedItem); ((CXTPFlowGraphNodeCustom*)pNode) ->SetSecondColor(pChangedItemColor->GetColor()); } break; } case GRID_ITEM_FILL_TYPE: { if (pNode) { CXTPFlowGraphNodeCustom* pNodeCustom = static_cast(pNode); CXTPPropertyGridItemConstraints* pConstraints = pChangedItem->GetConstraints(); CXTPPropertyGridItemConstraint* pCurrValue = pConstraints->GetConstraintAt( pConstraints->GetCurrent()); pNodeCustom->SetFillType( (XTPFlowGraphCustomNodeFillType)pCurrValue->m_dwData); } break; } case GRID_ITEM_SIZE: { if (pNode) { CXTPPropertyGridItemSize* pChangedItemSize = static_cast(pChangedItem); pNode->SetSize(pChangedItemSize->GetSize()); } break; } case GRID_ITEM_SIZE_WIDTH: { if (pNode) { CXTPPropertyGridItemNumber* pChangedItemWidth = static_cast(pChangedItem); pNode->SetSize(CSize(pChangedItemWidth->GetNumber(), pNode->GetSize().cy)); } break; } case GRID_ITEM_SIZE_HEIGHT: { if (pNode) { CXTPPropertyGridItemNumber* pChangedItemHeight = static_cast(pChangedItem); pNode->SetSize(CSize(pNode->GetSize().cx, pChangedItemHeight->GetNumber())); } break; } case GRID_CONNECTION_CAPTION: { if (pConnection) { pConnection->SetCaption(pChangedItem->GetValue()); } break; } case GRID_CONNECTION_COLOR: { if (pConnection) { CXTPPropertyGridItemColor* pChangedItemColor = static_cast(pChangedItem); pConnection->SetColor(pChangedItemColor->GetColor()); } break; } case GRID_CONNECTION_TYPE: { if (pConnection) { CXTPPropertyGridItemConstraints* pConstraints = pChangedItem->GetConstraints(); CXTPPropertyGridItemConstraint* pCurrValue = pConstraints->GetConstraintAt( pConstraints->GetCurrent()); if (pCurrValue) { pConnection->SetStyle((int)pCurrValue->m_dwData); } } break; } case GRID_CONNECTION_WIDTH: { if (pConnection) { CXTPPropertyGridItemNumber* pChangedItemNumber = static_cast(pChangedItem); pConnection->SetWidth(pChangedItemNumber->GetNumber()); } break; } case GRID_CONNECTION_DASHED: { if (pConnection) { CXTPPropertyGridItemBool* pChangedItemBool = static_cast(pChangedItem); pConnection->SetDashed(pChangedItemBool->GetBool()); } break; } } break; } } return 0; } #endif void CFlowGraphSampleView::OnSwitchGraphType0() { SwitchGraph(0); } void CFlowGraphSampleView::OnSwitchGraphType1() { SwitchGraph(1); } void CFlowGraphSampleView::OnSwitchGraphType2() { SwitchGraph(2); }