?? nodemanagerwindow.cpp
字號:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "NodeManagerWindow.h"
//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW NodeManagerWindow;
//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW::NODE_MANAGER_WINDOW()
{
CurrentlySelectedNode = NULL;
}
//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW::~NODE_MANAGER_WINDOW()
{
//Empty
}
//+-----------------------------------------------------------------------------
//| Creates a new window
//+-----------------------------------------------------------------------------
BOOL NODE_MANAGER_WINDOW::Create()
{
WINDOW_TREEVIEW_INFO TreeviewInfo;
FrameInfo.Title = "Node Manager";
FrameInfo.Width = DEFAULT_NODE_MANAGER_WINDOW_WIDTH;
FrameInfo.Height = DEFAULT_NODE_MANAGER_WINDOW_HEIGHT;
FrameInfo.Style &= (~WS_VISIBLE);
FrameInfo.Style |= (WS_MAXIMIZEBOX | WS_SIZEBOX);
if(!WINDOW_FRAME::Create()) return FALSE;
TreeviewInfo.Parent = Window;
if(!TreeView.Create(TreeviewInfo)) return FALSE;
NodeIcon.AssignIconListToTreeView(TreeView.GetWindow());
return TRUE;
}
//+-----------------------------------------------------------------------------
//| Destroys the window
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::Destroy()
{
TreeView.Destroy();
WINDOW_FRAME::Destroy();
}
//+-----------------------------------------------------------------------------
//| Handles the window messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::MessageHandler(UINT Message, WPARAM W, LPARAM L)
{
switch(Message)
{
case WM_SIZE:
case WM_SIZING:
{
ResizeTreeView();
return 0;
}
case WM_CLOSE:
{
Hide();
return 0;
}
case WM_DESTROY:
{
return 0;
}
}
return DefWindowProc(Window, Message, W, L);
}
//+-----------------------------------------------------------------------------
//| Handles the window menu messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::MenuHandler(WORD MenuItem)
{
switch(MenuItem)
{
case NodeFileCreateAttachment:
case NodeFileCreateAttachment2:
{
if(!CreateNewAttachment())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateBone:
case NodeFileCreateBone2:
{
if(!CreateNewBone())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateCollisionShape:
case NodeFileCreateCollisionShape2:
{
if(!CreateNewCollisionShape())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateEventObject:
case NodeFileCreateEventObject2:
{
if(!CreateNewEventObject())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateHelper:
case NodeFileCreateHelper2:
{
if(!CreateNewHelper())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateLight:
case NodeFileCreateLight2:
{
if(!CreateNewLight())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateParticleEmitter:
case NodeFileCreateParticleEmitter2:
{
if(!CreateNewParticleEmitter())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateParticleEmitter2_1:
case NodeFileCreateParticleEmitter2_2:
{
if(!CreateNewParticleEmitter2())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileCreateRibbonEmitter:
case NodeFileCreateRibbonEmitter2:
{
if(!CreateNewRibbonEmitter())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileDuplicate:
case NodeFileDuplicate2:
{
if(!Duplicate())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileMoveUp:
case NodeFileMoveUp2:
{
if(!MoveUp())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileMoveDown:
case NodeFileMoveDown2:
{
if(!MoveDown())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileMoveLeft:
case NodeFileMoveLeft2:
{
if(!MoveLeft())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileMoveRight:
case NodeFileMoveRight2:
{
if(!MoveRight())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileEdit:
case NodeFileEdit2:
{
if(!Edit())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileEditNode:
case NodeFileEditNode2:
{
if(!EditNode())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case NodeFileRemove:
case NodeFileRemove2:
{
if(!Remove())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
}
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the window control messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::ControlHandler(HWND Control, WORD Code)
{
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the window notify messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::NotifyHandler(HWND Control, UINT Code, NMHDR* Header)
{
if(Control == TreeView.GetWindow())
{
NM_TREEVIEW* TreeViewHeader;
TreeViewHeader = reinterpret_cast<NM_TREEVIEW*>(Header);
if(TreeViewHeader == NULL) return 0;
return TreeViewHandler(Code, TreeViewHeader);
}
return 0;
}
//+-----------------------------------------------------------------------------
//| Handles the treeview messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::TreeViewHandler(UINT Code, NM_TREEVIEW* TreeViewHeader)
{
TVITEM ItemData;
POINT MousePosition;
POINT LocalMousePosition;
TVHITTESTINFO HitTestInfo;
GetCursorPos(&MousePosition);
LocalMousePosition = MousePosition;
ScreenToClient(TreeView.GetWindow(), &LocalMousePosition);
switch(Code)
{
case NM_DBLCLK:
{
if(CurrentlySelectedNode == NULL) return 0;
ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
HitTestInfo.pt = LocalMousePosition;
if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;
if(!Edit())
{
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
TreeView_Expand(TreeView.GetWindow(), HitTestInfo.hItem, TVE_TOGGLE);
return 0;
}
case NM_RCLICK:
{
INT MenuId;
HTREEITEM TreeViewItem;
MenuId = NodeMenu2;
TreeViewItem = NULL;
TreeView_SelectItem(TreeView.GetWindow(), NULL);
CurrentlySelectedNode = NULL;
while(TRUE)
{
ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
HitTestInfo.pt = LocalMousePosition;
if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) break;
if(!(HitTestInfo.flags & TVHT_ONITEM)) break;
TreeViewItem = HitTestInfo.hItem;
if(TreeViewItem == NULL) break;
ZeroMemory(&ItemData, sizeof(TVITEM));
ItemData.mask = TVIF_PARAM;
ItemData.hItem = TreeViewItem;
if(!TreeView_GetItem(TreeView.GetWindow(), &ItemData)) return 0;
TreeView_SelectItem(TreeView.GetWindow(), TreeViewItem);
CurrentlySelectedNode = reinterpret_cast<MODEL_BASE*>(ItemData.lParam);
if(CurrentlySelectedNode == NULL) return 0;
MenuId = NodeMenu;
break;
}
if(!TrackPopupMenuEx(GetSubMenu(LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MenuId)), 0),
TPM_LEFTALIGN | TPM_RIGHTBUTTON, MousePosition.x, MousePosition.y,
Window, NULL))
{
Error.SetMessage("Unable to create popup menu!");
Error.DisplayMessage(Window);
Error.ClearMessage();
return 0;
}
return 0;
}
case TVN_SELCHANGED:
{
CurrentlySelectedNode = reinterpret_cast<MODEL_BASE*>(TreeViewHeader->itemNew.lParam);
if(CurrentlySelectedNode == NULL) return 0;
return 0;
}
}
return 0;
}
//+-----------------------------------------------------------------------------
//| Adds a node
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::AddNode(MODEL_BASE* Node, HTREEITEM InsertionPoint)
{
TVINSERTSTRUCT InsertItem;
HTREEITEM Parent;
if(Node->ParentNode.IsAttached())
{
Parent = Node->ParentNode.GetObjectData()->BaseData()->TreeViewItem;
if(Parent == NULL) Parent = TVI_ROOT;
}
else
{
Parent = TVI_ROOT;
}
InsertItem.hParent = Parent;
InsertItem.hInsertAfter = InsertionPoint;
InsertItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
InsertItem.item.hItem = NULL;
InsertItem.item.state = 0;
InsertItem.item.stateMask = 0;
InsertItem.item.pszText = const_cast<CHAR*>(Node->BaseData()->Name.c_str());
InsertItem.item.cchTextMax = static_cast<INT>(Node->BaseData()->Name.size());
InsertItem.item.iImage = NodeIcon.GetIconIndex(Node->BaseData()->Type);
InsertItem.item.iSelectedImage = InsertItem.item.iImage;
InsertItem.item.cChildren = 0;
InsertItem.item.lParam = reinterpret_cast<LPARAM>(Node);
Node->BaseData()->TreeViewItem = TreeView_InsertItem(TreeView.GetWindow(), &InsertItem);
TreeView_SelectItem(TreeView.GetWindow(), Node->BaseData()->TreeViewItem);
CurrentlySelectedNode = Node;
}
//+-----------------------------------------------------------------------------
//| Adds a node and all of its children (and grandchildren etc...)
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::AddNodeAndChildren(MODEL_BASE* Node, HTREEITEM InsertionPoint)
{
REFERENCE<MODEL_BASE*, MODEL_BASE*>* CurrentReference;
AddNode(Node, InsertionPoint);
CurrentReference = Node->ChildNodes.GetFirstReference();
while(CurrentReference != NULL)
{
AddNodeAndChildren(CurrentReference->GetData(), TVI_LAST);
CurrentReference = Node->ChildNodes.GetNextReference(CurrentReference);
}
}
//+-----------------------------------------------------------------------------
//| Removes a node
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -