📄 fe_libdlg.cpp
字号:
return FALSE;
}
////////////////////////////////////////////////////////////////
// Drag-n-Drop Implementation
void fe_CLibDlg::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 ) ;
}
*pResult = 0;
}
void fe_CLibDlg::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 fe_CLibDlg::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 fe_CLibDlg::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 fe_CLibDlg::IsFolder(HTREEITEM hItem)
{
int nImage,nSelImage;
m_mytree.GetItemImage(hItem,nImage,nSelImage);
if (nImage!=2) return TRUE;
return FALSE;
}
HTREEITEM fe_CLibDlg::CopyItemToLibrary(HTREEITEM hItem, HTREEITEM hTarget)
{
HTREEITEM hResult,hParent,hChild;
CString szLabel = m_mytree.GetItemText(hItem);
int ItemData = 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];
MProp.BHdata=NULL;MProp.BHpoints=NULL;
LibProps.Add(MProp);
int NewItemData=LibProps.GetUpperBound();
CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
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];
MProp.BHdata=NULL;MProp.BHpoints=NULL;
LibProps.Add(MProp);
int NewItemData=LibProps.GetUpperBound();
CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
ItemData=NewItemData;
}
hResult = m_mytree.InsertItem( szLabel, 2, 2, hParent, hTarget );
m_mytree.SetItemData(hResult,ItemData);
}
}
return hResult;
}
HTREEITEM fe_CLibDlg::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_mylist.GetNextSiblingItem(hChild);
}
hResult=hParent;
}
else{
CString szLabel = m_mylist.GetItemText( hItem );
int ItemData = m_mylist.GetItemData(hItem);
if(bDragFromLibrary)
{
CMaterialProp MProp=LibProps[ItemData];
MProp.BHdata=NULL;MProp.BHpoints=NULL;
LibProps.Add(MProp);
int NewItemData=LibProps.GetUpperBound();
CopyBHdata(LibProps[ItemData],LibProps[NewItemData]);
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 fe_CLibDlg::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 fe_CLibDlg::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 fe_CLibDlg::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 fe_CLibDlg::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=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=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("fe_CLibDlg::OnRclickMytree failed to destroy menu resource\n");
pMenu = FALSE;
}
*pResult = 0;
}
void fe_CLibDlg::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("fe_CLibDlg::OnRclickMylist failed to destroy menu resource\n");
pMenu = FALSE;
}
*pResult = 0;
}
void fe_CLibDlg::CopyBHdata(CMaterialProp &source, CMaterialProp &dest)
{
// copy BH data from source to destination
dest.BHpoints=source.BHpoints;
if(source.BHpoints==0) return;
dest.BHdata=(CComplex *)calloc(source.BHpoints,sizeof(CComplex));
for(int k=0;k<source.BHpoints;k++)
dest.BHdata[k]=source.BHdata[k];
}
void fe_CLibDlg::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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -