You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
258 lines
5.7 KiB
258 lines
5.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "workspacebrowser.h" |
|
#include "workspace.h" |
|
#include "project.h" |
|
#include <windows.h> |
|
#include "resource.h" |
|
#include "project.h" |
|
#include "vcdfile.h" |
|
#include "soundentry.h" |
|
#include "scene.h" |
|
#include "workspacemanager.h" |
|
|
|
enum |
|
{ |
|
IDC_WSB_TREE = 101, |
|
}; |
|
|
|
class CBrowserTree : public mxTreeView |
|
{ |
|
public: |
|
CBrowserTree( mxWindow *parent, int id = 0 ) |
|
: mxTreeView( parent, 0, 0, 0, 0, id ) |
|
{ |
|
// SendMessage ( (HWND)getHandle(), WM_SETFONT, (WPARAM) (HFONT) GetStockObject (ANSI_FIXED_FONT), MAKELPARAM (TRUE, 0)); |
|
} |
|
}; |
|
|
|
int CALLBACK CWorkspaceBrowser::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) |
|
{ |
|
ITreeItem const *item1 = (ITreeItem *)lParam1; |
|
ITreeItem const *item2 = (ITreeItem *)lParam2; |
|
|
|
Assert( item1 && item2 ); |
|
|
|
if ( item1->GetOrdinal() < item2->GetOrdinal() ) |
|
return -1; |
|
else if ( item1->GetOrdinal() > item2->GetOrdinal() ) |
|
return 1; |
|
|
|
// Ok, just compare pointers... sigh |
|
return ( item1 < item2 ) ? -1 : 1; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *parent - |
|
//----------------------------------------------------------------------------- |
|
CWorkspaceBrowser::CWorkspaceBrowser( mxWindow *parent, CWorkspaceManager *manager, int id ) : |
|
BaseClass( parent, 0, 0, 0, 0, "Workspace Browser", id ) |
|
{ |
|
m_pManager = manager; |
|
|
|
SceneManager_MakeToolWindow( this, false ); |
|
|
|
m_pLastSelected = NULL; |
|
|
|
m_pCurrentWorkspace = NULL; |
|
m_pTree = new CBrowserTree( this, IDC_WSB_TREE ); |
|
|
|
HIMAGELIST list = GetWorkspaceManager()->CreateImageList(); |
|
|
|
// Associate the image list with the tree-view control. |
|
m_pTree->setImageList( (void *)list ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *event - |
|
// Output : int |
|
//----------------------------------------------------------------------------- |
|
int CWorkspaceBrowser::handleEvent( mxEvent *event ) |
|
{ |
|
int iret = 0; |
|
switch ( event->event ) |
|
{ |
|
default: |
|
break; |
|
case mxEvent::Action: |
|
{ |
|
switch ( event->action ) |
|
{ |
|
default: |
|
break; |
|
case IDC_WSB_TREE: |
|
{ |
|
iret = 1; |
|
|
|
bool rightmouse = ( event->flags == mxEvent::RightClicked ) ? true : false; |
|
bool doubleclicked = ( event->flags == mxEvent::DoubleClicked ) ? true : false; |
|
|
|
OnTreeItemSelected( event->x, event->y, rightmouse, doubleclicked ); |
|
} |
|
break; |
|
} |
|
} |
|
break; |
|
case mxEvent::Size: |
|
{ |
|
m_pTree->setBounds( 0, 0, w2(), h2() ); |
|
|
|
GetWorkspaceManager()->SetWorkspaceDirty(); |
|
|
|
iret = 1; |
|
} |
|
break; |
|
case mxEvent::Close: |
|
{ |
|
iret = 1; |
|
} |
|
break; |
|
} |
|
|
|
return iret; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : CWorkspace |
|
//----------------------------------------------------------------------------- |
|
CWorkspace *CWorkspaceBrowser::GetWorkspace() |
|
{ |
|
return m_pCurrentWorkspace; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CWorkspaceBrowser::PopulateTree() |
|
{ |
|
m_pLastSelected = NULL; |
|
|
|
CWorkspace *w = m_pCurrentWorkspace; |
|
|
|
if ( !w ) |
|
return; |
|
|
|
// Add root element |
|
char sz[ 128 ]; |
|
if ( w->GetProjectCount() == 1 ) |
|
{ |
|
Q_snprintf( sz, sizeof( sz ), "Workspace '%s': %i project", w->GetName(), w->GetProjectCount() ); |
|
} |
|
else |
|
{ |
|
Q_snprintf( sz, sizeof( sz ), "Workspace '%s': %i projects", w->GetName(), w->GetProjectCount() ); |
|
} |
|
|
|
|
|
mxTreeViewItem *root = w->FindItem( m_pTree, NULL ); |
|
if ( !root ) |
|
{ |
|
root = m_pTree->add( NULL, sz ); |
|
} |
|
|
|
// Reset the label |
|
m_pTree->setLabel( root, sz ); |
|
|
|
m_pTree->setImages( root, w->GetIconIndex(), w->GetIconIndex() ); |
|
m_pTree->setUserData( root, w ); |
|
|
|
w->ValidateTree( m_pTree, root ); |
|
|
|
m_pTree->setOpen( root, true ); |
|
|
|
m_pTree->sortTree( root, true, CompareFunc, 0 ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *w - |
|
//----------------------------------------------------------------------------- |
|
void CWorkspaceBrowser::SetWorkspace( CWorkspace *w ) |
|
{ |
|
m_pCurrentWorkspace = w; |
|
|
|
PopulateTree(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *project - |
|
//----------------------------------------------------------------------------- |
|
void CWorkspaceBrowser::AddProject( CProject *project ) |
|
{ |
|
if ( !m_pCurrentWorkspace ) |
|
return; |
|
|
|
m_pCurrentWorkspace->AddProject( project ); |
|
|
|
PopulateTree(); |
|
} |
|
|
|
ITreeItem *CWorkspaceBrowser::GetSelectedItem() |
|
{ |
|
return m_pLastSelected; |
|
} |
|
|
|
CWorkspaceManager *CWorkspaceBrowser::GetManager() |
|
{ |
|
return m_pManager; |
|
} |
|
|
|
void CWorkspaceBrowser::OnTreeItemSelected( int x, int y, bool rightmouse, bool doubleclick ) |
|
{ |
|
mxTreeViewItem *item = m_pTree->getSelectedItem(); |
|
if ( !item ) |
|
{ |
|
Con_Printf( "No item selected\n" ); |
|
return; |
|
} |
|
|
|
ITreeItem *p = (ITreeItem *)m_pTree->getUserData( item ); |
|
if ( !p ) |
|
{ |
|
Con_Printf( "No userdata for item\n" ); |
|
return; |
|
} |
|
|
|
m_pLastSelected = p; |
|
|
|
GetManager()->UpdateMenus(); |
|
|
|
if ( p->GetSoundEntry() || p->GetWaveFile() ) |
|
{ |
|
GetManager()->OnSoundShowInBrowsers(); |
|
} |
|
|
|
if ( !rightmouse ) |
|
{ |
|
if ( doubleclick ) |
|
{ |
|
GetManager()->OnDoubleClicked( GetSelectedItem() ); |
|
} |
|
return; |
|
} |
|
|
|
POINT pt; |
|
GetCursorPos( &pt ); |
|
|
|
ScreenToClient( (HWND)GetManager()->getHandle(), &pt ); |
|
|
|
GetManager()->ShowContextMenu( pt.x, pt.y, GetSelectedItem() ); |
|
} |
|
|
|
void CWorkspaceBrowser::JumpTo( ITreeItem *item ) |
|
{ |
|
mxTreeViewItem *found = item->FindItem( m_pTree, NULL, true ); |
|
if ( found ) |
|
{ |
|
m_pTree->scrollTo( found ); |
|
} |
|
} |