// treetestDlg.cpp : implementation file // #include "stdafx.h" #include "femm.h" #include "cdrawDoc.h" #include "cd_MatDlg.h" #include "cd_libdlg.h" #include "libfolderinfo.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // cdCLibDlg dialog // CLuaConsoleDlg dialog cdCLibDlg::cdCLibDlg(CWnd* pParent /*=NULL*/) : CResizableDialog(cdCLibDlg::IDD, pParent) { //{{AFX_DATA_INIT(cdCLibDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 // m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void cdCLibDlg::DoDataExchange(CDataExchange* pDX) { CResizableDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(cdCLibDlg) DDX_Control(pDX, IDC_MYLIST, m_mylist); DDX_Control(pDX, IDC_MYTREE, m_mytree); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(cdCLibDlg, CResizableDialog) //{{AFX_MSG_MAP(cdCLibDlg) ON_WM_QUERYDRAGICON() ON_NOTIFY(TVN_BEGINDRAG, IDC_MYTREE, OnBegindragMytree) ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_NOTIFY(TVN_BEGINDRAG, IDC_MYLIST, OnBegindragMylist) ON_NOTIFY(NM_RCLICK, IDC_MYLIST, OnRclickMylist) ON_NOTIFY(NM_RCLICK, IDC_MYTREE, OnRclickMytree) ON_NOTIFY(NM_DBLCLK, IDC_MYTREE, OnDblclkMytree) ON_NOTIFY(NM_DBLCLK, IDC_MYLIST, OnDblclkMylist) ON_NOTIFY(TVN_KEYDOWN, IDC_MYLIST, OnKeydownMylist) ON_NOTIFY(TVN_KEYDOWN, IDC_MYTREE, OnKeydownMytree) ON_WM_TIMER() //}}AFX_MSG_MAP ON_COMMAND(ID_EDIT_CUT, Zappit) ON_COMMAND(ID_EDIT_COPY, AddNewProperty) ON_COMMAND(ID_EDIT_PASTE, AddNewFolder) ON_COMMAND(ID_EDIT_REPLACE, MouseModify) ON_COMMAND(ID_EDIT_PASTE_LINK, VendorLink) ON_COMMAND(ID_EDIT_FIND, ImportMaterials) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // cdCLibDlg message handlers BOOL cdCLibDlg::OnInitDialog() { CResizableDialog::OnInitDialog(); // TODO: Add extra initialization here ////////////////////////////////////////////////////////////////// // preset layout AddAnchor(IDOK,BOTTOM_RIGHT); AddAnchor(IDCANCEL,BOTTOM_RIGHT); AddAnchor(IDC_MYTREE,TOP_LEFT,BOTTOM_CENTER); AddAnchor(IDC_MYLIST,TOP_CENTER,BOTTOM_RIGHT); CString LibName=BinDir+"condlib.dat"; FILE *fp; CMaterialProp MProp; CFolderProp FProp; char s[1024]; int i,k; Ancestors.RemoveAll(); Parent=NULL; FProp.FolderName="New Folder"; FProp.FolderURL=""; FProp.FolderVendor=""; // set up materials library tree control m_bIsDragging = FALSE; m_dragTargetTree = NULL; m_dragTargetList = NULL; m_dragItem = NULL; m_imageList.Create( IDB_TREE, 16, 1, RGB(255,0,0) ); m_mytree.SetImageList( &m_imageList, TVSIL_NORMAL ); m_mylist.SetImageList( &m_imageList, TVSIL_NORMAL ); LibParent = m_mytree.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_STATE, "Library Materials",1,1,TVIS_EXPANDED ,TVIS_EXPANDED ,-9999,NULL,NULL); Parent=LibParent; ModelParent = m_mylist.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT | TVIF_STATE, "Model Materials",1,1,TVIS_EXPANDED ,TVIS_EXPANDED ,-9999,NULL,NULL); // Put Model's properties into the InModel edit box; LibProps.RemoveAll(); HTREEITEM hResult; CArray &blockproplist=pDoc->blockproplist; for(i=0;i=0){ Parent=Ancestors[k]; Ancestors.RemoveAt(k); } break; default: break; } } fclose(fp); /* // tutorial example HTREEITEM hChapter; hChapter = m_mytree.InsertItem( "Chapter 1", 0, 1 ); m_mytree.InsertItem( "What", 2, 2, hChapter ); */ Focus=NULL; return TRUE; // return TRUE unless you set the focus to a control } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR cdCLibDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } /////////////////////////////////////////////////// // Implementation of library-specific file I/O /////////////////////////////////////////////////// char* cdCLibDlg::StripKey(char *c) { char *d; int i,k; k=(int) strlen(c); for(i=0;i0) for(i=k-1;i>=0;i--){ if(v[i]=='\"'){ v[i]=0; i=-1; } } FoldProps[FoldProps.GetUpperBound()].FolderName=v; m_mytree.SetItemText(Parent,v); q[0]=NULL; } if( _strnicmp(q,"",10)==0){ v=StripKey(s); k=(int) strlen(v); for(i=0;i0) for(i=k-1;i>=0;i--){ if(v[i]=='\"'){ v[i]=0; i=-1; } } FoldProps[FoldProps.GetUpperBound()].FolderURL=v; q[0]=NULL; } if( _strnicmp(q,"",14)==0){ v=StripKey(s); k=(int) strlen(v); for(i=0;i0) for(i=k-1;i>=0;i--){ if(v[i]=='\"'){ v[i]=0; i=-1; } } FoldProps[FoldProps.GetUpperBound()].FolderVendor=v; q[0]=NULL; } // Block Properties; if( _strnicmp(q,"",12)==0){ MProp.BlockName="New Material"; MProp.ex=1.; MProp.ey=1.; MProp.ltx=0.; MProp.lty=0.; MProp.ox=0.; MProp.oy=0.; q[0]=NULL; } // Library Hierarchy if( _strnicmp(q,"",11)==0){ q[0]=NULL; return 3; } if( _strnicmp(q,"",10)==0){ v=StripKey(s); k=(int) strlen(v); for(i=0;i0) for(i=k-1;i>=0;i--){ if(v[i]=='\"'){ v[i]=0; i=-1; } } MProp.BlockName=v; q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.ex); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.ey); q[0]=NULL; } if( _strnicmp(q,"",5)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.ltx); q[0]=NULL; } if( _strnicmp(q,"",5)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.lty); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.ox); q[0]=NULL; } if( _strnicmp(q,"",4)==0){ v=StripKey(s); sscanf(v,"%lf",&MProp.oy); q[0]=NULL; } if( _strnicmp(q,"",9)==0){ q[0]=NULL; return TRUE; } return FALSE; } //////////////////////////////////////////////////////////////// // Drag-n-Drop Implementation void cdCLibDlg::OnBegindragMytree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; m_dragItem = pNMTreeView->itemNew.hItem; if(m_dragItem!=LibParent) // can't drag top-level folder { CImageList* pDragImage; pDragImage = m_mytree.CreateDragImage( m_dragItem ); m_mytree.SelectItem( m_dragItem ); pDragImage->BeginDrag( 0, CPoint(0,-14) ); pDragImage->DragEnter(this, pNMTreeView->ptDrag); SetCapture(); m_bIsDragging = TRUE; delete pDragImage; SetTimer ( 1, 75, NULL ) ; bDragFromLibrary=TRUE; } *pResult = 0; } void cdCLibDlg::OnBegindragMylist(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; m_dragItem = pNMTreeView->itemNew.hItem; if(m_dragItem!=ModelParent) { CImageList* pDragImage; pDragImage = m_mylist.CreateDragImage( m_dragItem ); m_mylist.SelectItem( m_dragItem ); pDragImage->BeginDrag( 0, CPoint(0,-14) ); pDragImage->DragEnter(this, pNMTreeView->ptDrag); SetCapture(); m_bIsDragging = TRUE; delete pDragImage; bDragFromLibrary=FALSE; SetTimer ( 1, 75, NULL ) ; } *pResult = 0; } void cdCLibDlg::OnMouseMove(UINT nFlags, CPoint point) { if( m_bIsDragging != FALSE ) { CPoint ptDrag( point ); CPoint ptTree( point ); CPoint ptList( point ); UINT uHitTest = TVHT_ONITEM; MapWindowPoints( this, &ptDrag, 1 ); MapWindowPoints( &m_mytree, &ptTree, 1 ); MapWindowPoints( &m_mylist, &ptList, 1 ); CImageList::DragMove( ptDrag ); m_dragTargetTree = m_mytree.HitTest( ptTree, &uHitTest ); m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest ); } CResizableDialog::OnMouseMove(nFlags, point); } void cdCLibDlg::OnLButtonUp(UINT nFlags, CPoint point) { if( m_bIsDragging != FALSE ) { KillTimer ( 1 ) ; CImageList::DragLeave( &m_mytree ); CImageList::EndDrag(); ReleaseCapture(); m_bIsDragging = FALSE; // Do some logic to drop onto the main tree if the property is // dropped onto the tree's window, but not exactly on the list if((m_dragTargetTree==NULL) && (m_dragTargetList==NULL)) { POINT point; GetCursorPos(&point); void* pVoid = (void*)GetDesktopWindow()->WindowFromPoint(point); if((void *) &m_mytree==pVoid) m_dragTargetTree=LibParent; if((void *) &m_mylist==pVoid) m_dragTargetList=ModelParent; } // Drop onto the Library tree if( m_dragTargetTree != NULL ) { if(!IsTailChasing(m_dragItem,m_dragTargetTree)) { CopyItemToLibrary(m_dragItem,m_dragTargetTree); if(bDragFromLibrary) m_mytree.DeleteItem( m_dragItem ); } } // Drop onto the model materials if( m_dragTargetList != NULL ) { CopyItemToModel(m_dragItem,m_dragTargetList); if(!bDragFromLibrary) m_mylist.DeleteItem( m_dragItem ); } } else CResizableDialog::OnLButtonUp(nFlags, point); } BOOL cdCLibDlg::IsFolder(HTREEITEM hItem) { int nImage1, nImage2, nSelImage; m_mytree.GetItemImage(hItem,nImage1,nSelImage); m_mylist.GetItemImage(hItem,nImage2,nSelImage); if ((nImage1!=2) && (nImage2!=2)) return TRUE; return FALSE; } HTREEITEM cdCLibDlg::CopyItemToLibrary(HTREEITEM hItem, HTREEITEM hTarget) { HTREEITEM hResult,hParent,hChild; CString szLabel; int ItemData; if(!bDragFromLibrary) { szLabel = m_mylist.GetItemText(hItem); ItemData = (int) m_mylist.GetItemData(hItem); } else{ szLabel = m_mytree.GetItemText(hItem); ItemData = (int) m_mytree.GetItemData(hItem); } if(IsFolder(hTarget)) { if (IsFolder(hItem)) { hResult = m_mytree.InsertItem( szLabel, 0, 1, hTarget, TVI_LAST ); m_mytree.SetItemData(hResult,ItemData); hChild=m_mytree.GetChildItem(hItem) ; while (hChild!=NULL) { CopyItemToLibrary(hChild,hResult) ; hChild = m_mytree.GetNextSiblingItem(hChild) ; } } else{ if(!bDragFromLibrary) { CMaterialProp MProp=LibProps[ItemData]; LibProps.Add(MProp); int NewItemData=(int) LibProps.GetUpperBound(); ItemData=NewItemData; } hResult = m_mytree.InsertItem( szLabel, 2, 2, hTarget, TVI_LAST); m_mytree.SetItemData(hResult,ItemData); } } else { hParent = m_mytree.GetParentItem(hTarget); if (IsFolder(hItem)) { hResult = m_mytree.InsertItem( szLabel, 0, 1, hParent, hTarget ); m_mytree.SetItemData(hResult,ItemData); hChild=m_mytree.GetChildItem(hItem) ; while (hChild!=NULL) { CopyItemToLibrary(hChild,hResult) ; hChild = m_mytree.GetNextSiblingItem(hChild) ; } } else{ if(!bDragFromLibrary) { CMaterialProp MProp=LibProps[ItemData]; LibProps.Add(MProp); int NewItemData=(int) LibProps.GetUpperBound(); ItemData=NewItemData; } hResult = m_mytree.InsertItem( szLabel, 2, 2, hParent, hTarget ); m_mytree.SetItemData(hResult,ItemData); } } return hResult; } HTREEITEM cdCLibDlg::CopyItemToModel(HTREEITEM hItem, HTREEITEM hTarget) { HTREEITEM hResult,hParent,hChild; if (IsFolder(hItem)) { hChild=m_mytree.GetChildItem(hItem) ; hParent=hTarget; while (hChild!=NULL) { hParent=CopyItemToModel(hChild,hParent) ; hChild = m_mytree.GetNextSiblingItem(hChild); } hResult=hParent; } else{ CString szLabel; int ItemData; if(!bDragFromLibrary) { szLabel = m_mylist.GetItemText(hItem); ItemData = (int) m_mylist.GetItemData(hItem); } else{ szLabel = m_mytree.GetItemText(hItem); ItemData = (int) m_mytree.GetItemData(hItem); } if(bDragFromLibrary) { CMaterialProp MProp=LibProps[ItemData]; LibProps.Add(MProp); int NewItemData=(int) LibProps.GetUpperBound(); ItemData=NewItemData; } hParent = m_mylist.GetParentItem( hTarget ); if( hParent != NULL ) hResult=m_mylist.InsertItem( szLabel, 2, 2, ModelParent, hTarget); else hResult=m_mylist.InsertItem( szLabel, 2, 2, ModelParent, TVI_LAST ); m_mylist.SetItemData(hResult,ItemData); } return hResult; } void cdCLibDlg::AddNewProperty() { HTREEITEM hParent,hResult; if(m_dragTargetList!=NULL) { hParent = m_mylist.GetParentItem(m_dragTargetList); if( hParent != NULL ) hResult=m_mylist.InsertItem("New Material", 2, 2, ModelParent, m_dragTargetList); else hResult=m_mylist.InsertItem("New Material", 2, 2, ModelParent, TVI_LAST ); CMaterialProp MProp; LibProps.Add(MProp); m_mylist.SetItemData(hResult,LibProps.GetUpperBound()); } if(m_dragTargetTree!=NULL) { if(IsFolder(m_dragTargetTree)) hParent=m_dragTargetTree; else hParent = m_mytree.GetParentItem(m_dragTargetTree); if( hParent != NULL ) hResult=m_mytree.InsertItem("New Material", 2, 2, hParent, m_dragTargetTree); else hResult=m_mytree.InsertItem("New Material", 2, 2, LibParent, TVI_LAST ); CMaterialProp MProp; LibProps.Add(MProp); m_mytree.SetItemData(hResult,LibProps.GetUpperBound()); } } void cdCLibDlg::AddNewFolder() { HTREEITEM hParent,hResult; if(m_dragTargetTree!=NULL) { if (IsFolder(m_dragTargetTree)) hParent=m_dragTargetTree; else hParent = m_mytree.GetParentItem(m_dragTargetTree); if( hParent != NULL ) hResult=m_mytree.InsertItem("New Folder", 0, 1, hParent, m_dragTargetTree); else hResult=m_mytree.InsertItem("New Folder", 0, 1, LibParent, TVI_LAST ); CFolderProp FProp; FProp.FolderName="New Folder"; FProp.FolderURL=""; FProp.FolderVendor=""; FoldProps.Add(FProp); m_mytree.SetItemData(hResult,FoldProps.GetUpperBound()); } } void cdCLibDlg::Zappit() { if ((m_dragTargetTree!=NULL) && (m_dragTargetTree!=LibParent)) m_mytree.DeleteItem(m_dragTargetTree); if ((m_dragTargetList!=NULL) && (m_dragTargetList!=ModelParent)) m_mylist.DeleteItem(m_dragTargetList); } void cdCLibDlg::OnRclickMytree(NMHDR* pNMHDR, LRESULT* pResult) { CMenu* pMenu = NULL; try { pMenu = new CMenu; } catch(...) { pMenu = NULL; } ASSERT(pMenu); POINT point; GetCursorPos(&point); CPoint ptTree(point); UINT uHitTest = TVHT_ONITEM; GetDesktopWindow()->MapWindowPoints( &m_mytree, &ptTree, 1 ); m_dragTargetTree = m_mytree.HitTest( ptTree, &uHitTest ); m_dragTargetList = NULL; if(m_dragTargetTree==NULL) m_dragTargetTree=LibParent; VERIFY(pMenu->CreatePopupMenu()); if(m_dragTargetTree!=LibParent) VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_CUT, "Delete Selected")); else VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_FIND, "Import Materials")); VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_COPY, "Add New Material")); VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE, "Add New Folder")); if(m_dragTargetTree!=NULL) { if(!IsFolder(m_dragTargetTree)) { VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Modify Material")); HTREEITEM hParent=m_mytree.GetParentItem(m_dragTargetTree); if(hParent!=LibParent) { int k=(int) m_mytree.GetItemData(hParent); if (FoldProps[k].FolderVendor!="") { CString VendorBlurb; VendorBlurb="Visit " + FoldProps[k].FolderVendor; VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE_LINK, VendorBlurb)); VendorURL=FoldProps[k].FolderURL; VendorName=FoldProps[k].FolderVendor; } } } else if(m_dragTargetTree!=LibParent){ VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Edit Folder Info")); int k=(int) m_mytree.GetItemData(m_dragTargetTree); if (FoldProps[k].FolderVendor!="") { CString VendorBlurb; VendorBlurb="Visit " + FoldProps[k].FolderVendor; VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_PASTE_LINK, VendorBlurb)); VendorURL=FoldProps[k].FolderURL; VendorName=FoldProps[k].FolderVendor; } } } pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x,point.y,this); try { delete pMenu; } catch(...) { ASSERT(FALSE); TRACE("cdCLibDlg::OnRclickMytree failed to destroy menu resource\n"); pMenu = FALSE; } *pResult = 0; } void cdCLibDlg::OnRclickMylist(NMHDR* pNMHDR, LRESULT* pResult) { CMenu* pMenu = NULL; try { pMenu = new CMenu; } catch(...) { pMenu = NULL; } ASSERT(pMenu); POINT point; GetCursorPos(&point); CPoint ptList(point); UINT uHitTest = TVHT_ONITEM; GetDesktopWindow()->MapWindowPoints( &m_mylist, &ptList, 1 ); m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest ); m_dragTargetTree = NULL; if(m_dragTargetList==NULL) m_dragTargetList=ModelParent; VERIFY(pMenu->CreatePopupMenu()); if (m_dragTargetList!=ModelParent) VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_CUT, "Delete Selected")); else VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_FIND, "Import Materials")); VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_COPY, "Add New Material")); if(m_dragTargetList!=NULL) { if(!IsFolder(m_dragTargetList)) VERIFY(pMenu->AppendMenu(MF_STRING, ID_EDIT_REPLACE, "Modify Material")); } pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON,point.x,point.y,this); try { delete pMenu; } catch(...) { ASSERT(FALSE); TRACE("cdCLibDlg::OnRclickMylist failed to destroy menu resource\n"); pMenu = FALSE; } *pResult = 0; } void cdCLibDlg::OnDblclkMylist(NMHDR* pNMHDR, LRESULT* pResult) { POINT point; GetCursorPos(&point); CPoint ptList(point); UINT uHitTest = TVHT_ONITEM; GetDesktopWindow()->MapWindowPoints( &m_mylist, &ptList, 1 ); m_dragTargetList = m_mylist.HitTest( ptList, &uHitTest ); m_dragTargetTree = NULL; if(m_dragTargetList!=NULL) { if(!IsFolder(m_dragTargetList)){ int k=(int) m_mylist.GetItemData(m_dragTargetList); ModifyMaterial(k); m_mylist.SetItemText(m_dragTargetList,LibProps[k].BlockName); } } *pResult = 0; } void cdCLibDlg::OnDblclkMytree(NMHDR* pNMHDR, LRESULT* pResult) { POINT point; GetCursorPos(&point); CPoint ptList(point); UINT uHitTest = TVHT_ONITEM; GetDesktopWindow()->MapWindowPoints( &m_mytree, &ptList, 1 ); m_dragTargetTree = m_mytree.HitTest( ptList, &uHitTest ); m_dragTargetList = NULL; if(m_dragTargetTree!=NULL) { if(!IsFolder(m_dragTargetTree)){ int k=(int) m_mytree.GetItemData(m_dragTargetTree); ModifyMaterial(k); m_mytree.SetItemText(m_dragTargetTree,LibProps[k].BlockName); } } *pResult = 0; } void cdCLibDlg::ModifyMaterial(int k) { cdCMatDlg zDlg; zDlg.m_ex=LibProps[k].ex; zDlg.m_ey=LibProps[k].ey; zDlg.m_ltx=LibProps[k].ltx; zDlg.m_lty=LibProps[k].lty; zDlg.m_ox=LibProps[k].ox; zDlg.m_oy=LibProps[k].oy; zDlg.m_BlockName=LibProps[k].BlockName; // for(int nn=0;nnProblemType==0){ zDlg.m_mu1label="x"; zDlg.m_mu2label="y"; } else{ zDlg.m_mu1label="r"; zDlg.m_mu2label="z"; } if(zDlg.DoModal()==IDOK){ LibProps[k].BlockName=zDlg.m_BlockName; LibProps[k].ex=zDlg.m_ex; LibProps[k].ey=zDlg.m_ey; LibProps[k].ltx=zDlg.m_ltx; LibProps[k].lty=zDlg.m_lty; LibProps[k].ox=zDlg.m_ox; LibProps[k].oy=zDlg.m_oy; } } void cdCLibDlg::MouseModify() { if(m_dragTargetList!=NULL) { if(!IsFolder(m_dragTargetList)){ int k=(int) m_mylist.GetItemData(m_dragTargetList); ModifyMaterial(k); m_mylist.SetItemText(m_dragTargetList,LibProps[k].BlockName); } } if(m_dragTargetTree!=NULL) { if(!IsFolder(m_dragTargetTree)){ int k=(int) m_mytree.GetItemData(m_dragTargetTree); ModifyMaterial(k); m_mytree.SetItemText(m_dragTargetTree,LibProps[k].BlockName); } else{ CLibFolderInfo dlg; int k=(int) m_mytree.GetItemData(m_dragTargetTree); dlg.m_foldername =FoldProps[k].FolderName; dlg.m_folderurl =FoldProps[k].FolderURL; dlg.m_foldervendor=FoldProps[k].FolderVendor; if (dlg.DoModal()==IDOK) { m_mytree.SetItemText(m_dragTargetTree,dlg.m_foldername); FoldProps[k].FolderName =dlg.m_foldername; FoldProps[k].FolderURL =dlg.m_folderurl; FoldProps[k].FolderVendor=dlg.m_foldervendor; } } } } void cdCLibDlg::OnOK() { HTREEITEM hChild; CArray &blockproplist=pDoc->blockproplist; int k; // copy Model Materials into the model blockproplist.RemoveAll(); hChild=m_mylist.GetChildItem(ModelParent) ; while (hChild!=NULL) { k=(int) m_mylist.GetItemData(hChild); blockproplist.Add(LibProps[k]); hChild = m_mylist.GetNextSiblingItem(hChild) ; } // write Library Materials to disk CString LibName=BinDir+"condlib.dat"; FILE *fp; if ((fp=fopen(LibName,"wt"))==NULL) return; hChild=m_mytree.GetChildItem(LibParent); while(hChild!=NULL) { CopyItemToDisk(hChild,fp); hChild = m_mytree.GetNextSiblingItem(hChild) ; } fclose(fp); CResizableDialog::OnOK(); } void cdCLibDlg::CopyItemToDisk(HTREEITEM hItem, FILE *fp) { HTREEITEM hChild; int i =(int) m_mytree.GetItemData(hItem); if (IsFolder(hItem)) { fprintf(fp,"\n"); fprintf(fp," = \"%s\"\n", (const char *) FoldProps[i].FolderName); if(FoldProps[i].FolderURL!="") fprintf(fp," = \"%s\"\n", (const char *) FoldProps[i].FolderURL); if(FoldProps[i].FolderVendor!="") fprintf(fp," = \"%s\"\n", (const char *) FoldProps[i].FolderVendor); hChild=m_mytree.GetChildItem(hItem) ; while (hChild!=NULL) { CopyItemToDisk(hChild,fp) ; hChild = m_mytree.GetNextSiblingItem(hChild) ; } fprintf(fp,"\n"); } else{ fprintf(fp,"\n"); fprintf(fp," = \"%s\"\n", (const char *) LibProps[i].BlockName); fprintf(fp," = %.17g\n",LibProps[i].ox); fprintf(fp," = %.17g\n",LibProps[i].oy); fprintf(fp," = %.17g\n",LibProps[i].ex); fprintf(fp," = %.17g\n",LibProps[i].ey); fprintf(fp," = %.17g\n",LibProps[i].ltx); fprintf(fp," = %.17g\n",LibProps[i].lty); fprintf(fp,"\n\n"); } } void cdCLibDlg::VendorLink() { if (VendorURL!="") ShellExecute(m_hWnd,"open",VendorURL,"","",SW_SHOWMAXIMIZED); else MsgBox("No URL available for %s",VendorName); } void cdCLibDlg::ImportMaterials() { CFileDialog *fname_dia; CString SourceFile; fname_dia=new CFileDialog( TRUE, "fem | * ", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Magnetostatic Input File (*.fem) | *.fem; *.FEM | All Files (*.*) | *.*||", NULL); if(fname_dia->DoModal()==IDCANCEL){ delete[] fname_dia; return; } SourceFile=fname_dia->GetPathName(); delete[] fname_dia; // Add selected properties to the library; FILE *fp; CMaterialProp MProp; CFolderProp FProp; char s[1024]; int k; BOOL bToLibrary=TRUE; if ((fp=fopen(SourceFile,"rt"))==NULL) return; Ancestors.RemoveAll(); if(m_dragTargetTree!=NULL){ // importing into the library // put the imported materials in a new folder Parent=m_mytree.InsertItem("Imported Materials", 0, 1, LibParent, TVI_FIRST ); FProp.FolderName="Imported Materials"; FProp.FolderURL=""; FProp.FolderVendor=""; FoldProps.Add(FProp); m_mytree.SetItemData(Parent,FoldProps.GetUpperBound()); } else if(m_dragTargetList!=NULL){ Parent=ModelParent; bToLibrary=FALSE; } else return; while (fgets(s,1024,fp)!=NULL) { switch(ParseLine(s,fp,MProp)) { case 1: // add a material to library k=(int) LibProps.GetSize(); LibProps.Add(MProp); if(bToLibrary) m_mytree.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT, MProp.BlockName,2,2,NULL,NULL,k,Parent,NULL); else m_mylist.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT, MProp.BlockName,2,2,NULL,NULL,k,Parent,NULL); break; case 2: if (bToLibrary) { // open a new folder if (Parent!=NULL) Ancestors.Add(Parent); k=(int) FoldProps.GetSize(); FoldProps.Add(FProp); Parent=m_mytree.InsertItem(TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT, FProp.FolderName,0,1,NULL,NULL,k,Parent,NULL); } break; case 3: if (bToLibrary) { // close a folder k=(int) Ancestors.GetUpperBound(); if (k>=0){ Parent=Ancestors[k]; Ancestors.RemoveAt(k); } } break; default: break; } } fclose(fp); } BOOL cdCLibDlg::IsTailChasing(HTREEITEM hSource, HTREEITEM hDest) { HTREEITEM hItem; hItem=hDest; while(hItem!=NULL) { if(hSource==hItem) return TRUE; hItem=m_mytree.GetParentItem(hItem); } return FALSE; } void cdCLibDlg::OnKeydownMylist(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR; if(pTVKeyDown->wVKey==VK_DELETE){ HTREEITEM hItem=m_mylist.GetSelectedItem(); if ((hItem!=NULL) && (hItem!=ModelParent)) m_mylist.DeleteItem(hItem); } if(pTVKeyDown->wVKey==VK_INSERT){ m_dragTargetList=m_mylist.GetSelectedItem(); m_dragTargetTree=NULL; AddNewProperty(); } *pResult = 0; } void cdCLibDlg::OnKeydownMytree(NMHDR* pNMHDR, LRESULT* pResult) { TV_KEYDOWN* pTVKeyDown = (TV_KEYDOWN*)pNMHDR; if(pTVKeyDown->wVKey==VK_DELETE){ HTREEITEM hItem=m_mytree.GetSelectedItem(); if ((hItem!=NULL) && (hItem!=LibParent)) m_mytree.DeleteItem(hItem); } if(pTVKeyDown->wVKey==VK_INSERT){ m_dragTargetTree=m_mytree.GetSelectedItem(); m_dragTargetList=NULL; AddNewProperty(); } *pResult = 0; } void cdCLibDlg::OnTimer(UINT_PTR nIDEvent) { POINT pt ; GetCursorPos ( &pt ) ; RECT rect ; // check if Library needs to be scrolled and do it; m_mytree.GetClientRect ( &rect ) ; m_mytree.ClientToScreen ( &rect ) ; if((pt.x>rect.left) && (pt.x rect.bottom - 10 ) { CImageList::DragShowNolock ( FALSE ) ; m_mytree.SendMessage ( WM_VSCROLL, SB_LINEDOWN ) ; CImageList::DragShowNolock ( TRUE ) ; } } } // check if Model Materials needs to be scrolled and do it; m_mylist.GetClientRect ( &rect ) ; m_mylist.ClientToScreen ( &rect ) ; if((pt.x>rect.left) && (pt.x rect.bottom - 10 ) { CImageList::DragShowNolock ( FALSE ) ; m_mylist.SendMessage ( WM_VSCROLL, SB_LINEDOWN ) ; CImageList::DragShowNolock ( TRUE ) ; } } } CResizableDialog::OnTimer(nIDEvent); }