summaryrefslogtreecommitdiff
path: root/hammer/manifestdialog.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /hammer/manifestdialog.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'hammer/manifestdialog.cpp')
-rw-r--r--hammer/manifestdialog.cpp1177
1 files changed, 1177 insertions, 0 deletions
diff --git a/hammer/manifestdialog.cpp b/hammer/manifestdialog.cpp
new file mode 100644
index 0000000..129e266
--- /dev/null
+++ b/hammer/manifestdialog.cpp
@@ -0,0 +1,1177 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// ManifestDialog.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "hammer.h"
+#include "ManifestDialog.h"
+#include "MapDoc.h"
+#include "Manifest.h"
+#include "MapInstance.h"
+#include "ControlBarIDs.h"
+#include "p4lib/ip4.h"
+
+// CManifestMove dialog
+
+IMPLEMENT_DYNAMIC(CManifestMove, CDialog)
+
+//-----------------------------------------------------------------------------
+// Purpose: contructor
+// Input : pParent - the parent window of this dialog
+//-----------------------------------------------------------------------------
+CManifestMove::CManifestMove( bool bIsMove, CWnd* pParent /*=NULL*/ )
+ : CDialog(CManifestMove::IDD, pParent)
+{
+ m_bIsMove = bIsMove;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: the default destructor
+//-----------------------------------------------------------------------------
+CManifestMove::~CManifestMove()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: MFC data exchange function
+// Input : pDX -
+//-----------------------------------------------------------------------------
+void CManifestMove::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_MANIFEST_FILENAME, m_FileNameControl);
+ DDX_Control(pDX, IDC_MANIFEST_CENTER_AROUND_BRUSH, m_CenterContentsControl);
+ DDX_Control(pDX, IDC_MANIFEST_NAME2, m_FriendlyNameControl);
+ DDX_Control(pDX, IDC_FULL_PATH, m_FullPathNameControl);
+}
+
+
+BEGIN_MESSAGE_MAP(CManifestMove, CDialog)
+ ON_EN_CHANGE(IDC_MANIFEST_FILENAME, &CManifestMove::OnEnChangeManifestFilename)
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: the default dialog initialization routine
+// Output : returns true upon success
+//-----------------------------------------------------------------------------
+BOOL CManifestMove::OnInitDialog()
+{
+ CDialog::OnInitDialog();
+
+ m_FileNameControl.SetWindowText( "" );
+
+ if ( m_bIsMove == false )
+ {
+ m_CenterContentsControl.ShowWindow( SW_HIDE );
+ }
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: This function responds to the user hitting the OK button.
+//-----------------------------------------------------------------------------
+void CManifestMove::OnOK()
+{
+ char FullFileName[ MAX_PATH ];
+
+ CDialog::OnOK();
+
+ m_FriendlyNameControl.GetWindowText( m_FriendlyName );
+ m_FileNameControl.GetWindowText( m_FileName );
+ strcpy( FullFileName, m_FileName );
+ V_SetExtension( FullFileName, ".vmf", sizeof( FullFileName ) );
+ m_FileName = FullFileName;
+ m_CenterContents = ( m_CenterContentsControl.GetCheck() == BST_CHECKED );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function is called when the file name edit box is updated. it sets the static text
+// field for the full file name.
+//-----------------------------------------------------------------------------
+void CManifestMove::OnEnChangeManifestFilename()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+
+ if ( activeDoc )
+ {
+ if ( activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+ char FullFileName[ MAX_PATH ];
+
+ m_FileNameControl.GetWindowText( m_FileName );
+ strcpy( FullFileName, m_FileName );
+ GetDlgItem( IDOK )->EnableWindow( FullFileName[ 0 ] != 0 );
+ V_SetExtension( FullFileName, ".vmf", sizeof( FullFileName ) );
+ m_FileName = FullFileName;
+ pManifest->GetFullMapPath( m_FileName, FullFileName );
+
+ m_FullPathNameControl.SetWindowText( FullFileName );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this is the default constructor for the manifest list box
+//-----------------------------------------------------------------------------
+CManifestListBox::CManifestListBox( void ) :
+ CListBox()
+{
+ m_Icons.Create( IDB_MANIFEST_ICONS, 16, 1, RGB( 0, 255, 255 ) );
+
+ m_ManifestFilterMenu.LoadMenu( IDR_MANIFEST_FILTER );
+ m_ManifestFilterSecondaryMenu.Attach( ::GetSubMenu( m_ManifestFilterMenu.m_hMenu, 0 ) );
+ m_ManifestFilterPrimaryMenu.Attach( ::GetSubMenu( m_ManifestFilterMenu.m_hMenu, 1 ) );
+ m_ManifestFilterBlankMenu.Attach( ::GetSubMenu( m_ManifestFilterMenu.m_hMenu, 2 ) );
+
+ m_pTrackerManifestMap = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the owner draw of the list box for each manifest sub map
+// Input : lpDrawItemStruct - the list box item being rendered
+//-----------------------------------------------------------------------------
+void CManifestListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
+{
+ CDC dc;
+ RECT &r = lpDrawItemStruct->rcItem;
+ RECT ItemRect;
+
+ ItemRect = r;
+ ItemRect.left += 36;
+
+ dc.Attach( lpDrawItemStruct->hDC );
+ dc.SetROP2( R2_COPYPEN );
+
+ CPen m_hPen, *pOldPen;
+ m_hPen.CreatePen( PS_SOLID, 1, ::GetSysColor( COLOR_3DSHADOW ) );
+ pOldPen = dc.SelectObject( &m_hPen );
+
+ int iBackIndex = COLOR_WINDOW;
+ int iForeIndex = COLOR_WINDOWTEXT;
+
+ CManifestMap *pManifestMap = NULL;
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+ pManifestMap = pManifest->GetMap( ( int )lpDrawItemStruct->itemData );
+ }
+
+ dc.FillSolidRect( &lpDrawItemStruct->rcItem, ::GetSysColor( COLOR_3DFACE ) );
+ if ( ( lpDrawItemStruct->itemState & ODS_SELECTED ) )
+ {
+ dc.FillSolidRect( &ItemRect, ::GetSysColor( COLOR_HIGHLIGHT ) );
+ iForeIndex = COLOR_HIGHLIGHTTEXT;
+ }
+ else if ( m_pTrackerManifestMap == pManifestMap )
+ {
+ dc.FillSolidRect( &ItemRect, ::GetSysColor( COLOR_INACTIVECAPTION ) );
+ }
+
+ dc.MoveTo( r.left, r.top );
+ dc.LineTo( r.right, r.top );
+ dc.MoveTo( r.left, r.bottom );
+ dc.LineTo( r.right, r.bottom );
+ dc.MoveTo( r.left + 35, r.top );
+ dc.LineTo( r.left + 35, r.bottom );
+
+ if ( pManifestMap )
+ {
+ // draw the visible icon
+ RECT VisibleRect;
+ POINT p;
+
+ VisibleRect.left = r.left + 1;
+ VisibleRect.top = r.top + 2;
+ VisibleRect.right = VisibleRect.left + 16;
+ VisibleRect.bottom = VisibleRect.top + 16;
+ p.x = VisibleRect.left;
+ p.y = VisibleRect.top;
+
+ dc.FillSolidRect( &VisibleRect, ::GetSysColor( COLOR_3DFACE ) );
+ dc.Draw3dRect( &VisibleRect, ::GetSysColor( COLOR_3DSHADOW ), ::GetSysColor( COLOR_3DHILIGHT ) );
+
+ if ( pManifestMap->m_bVisible )
+ {
+ m_Icons.Draw( &dc, 0, p, ILD_NORMAL );
+ }
+
+ VisibleRect.left = r.left + 1 + 17;
+ VisibleRect.right = VisibleRect.left + 16;
+ p.x = VisibleRect.left;
+ p.y = VisibleRect.top;
+
+ dc.FillSolidRect( &VisibleRect, ::GetSysColor( COLOR_3DFACE ) );
+ dc.Draw3dRect( &VisibleRect, ::GetSysColor( COLOR_3DSHADOW ), ::GetSysColor( COLOR_3DHILIGHT ) );
+
+ if ( pManifestMap->m_bProtected )
+ {
+ m_Icons.Draw( &dc, 1, p, ILD_NORMAL );
+ }
+ else if ( pManifestMap->m_bReadOnly )
+ {
+ m_Icons.Draw( &dc, 2, p, ILD_NORMAL );
+ }
+ else if ( pManifestMap->m_bCheckedOut )
+ {
+ m_Icons.Draw( &dc, 3, p, ILD_NORMAL );
+ }
+
+
+ VisibleRect.left = r.left + 1 + 17;
+ VisibleRect.top = r.top + 2 + 17;
+ VisibleRect.right = VisibleRect.left + 16;
+ VisibleRect.bottom = VisibleRect.top + 16;
+ p.x = VisibleRect.left;
+ p.y = VisibleRect.top;
+
+ dc.FillSolidRect( &VisibleRect, ::GetSysColor( COLOR_3DFACE ) );
+ dc.Draw3dRect( &VisibleRect, ::GetSysColor( COLOR_3DSHADOW ), ::GetSysColor( COLOR_3DHILIGHT ) );
+
+ if ( pManifestMap->m_Map->IsModified() )
+ {
+ m_Icons.Draw( &dc, 4, p, ILD_NORMAL );
+ }
+
+
+ dc.SetTextColor( GetSysColor( iForeIndex ) );
+ dc.SetBkColor( GetSysColor( iBackIndex ) );
+
+ dc.SetBkMode( TRANSPARENT );
+ VisibleRect.left = r.left + 36;
+ VisibleRect.top = r.top + 1;
+ VisibleRect.right = r.right - 1;
+ VisibleRect.bottom = r.bottom - 1;
+
+ dc.DrawText( pManifestMap->m_FriendlyName, -1, &VisibleRect, DT_LEFT | DT_VCENTER );
+ }
+
+ if ( ( lpDrawItemStruct->itemState & ODS_FOCUS ) )
+ {
+ dc.DrawFocusRect( &ItemRect );
+ }
+
+ dc.SelectObject( pOldPen );
+ dc.Detach();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function returns the height for the owner draw item
+// Output : sets the item height
+//-----------------------------------------------------------------------------
+void CManifestListBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
+{
+ lpMeasureItemStruct->itemHeight = 36;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function compares two items - it does nothing
+// Output : returns 0 indicating no sorting has happened
+//-----------------------------------------------------------------------------
+int CManifestListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
+{
+ return 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function responds to the left mouse button being pressed. the left side of the manifest item
+// is the visibility toggle. the right side handles the selection to make it the primary map.
+// Input : nFlags - ignored
+// point - the location of the click
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnLButtonDown(UINT nFlags, CPoint point)
+{
+ BOOL bOutside;
+
+ m_pTrackerManifestMap = NULL;
+
+ int index = ItemFromPoint( point, bOutside );
+ if ( bOutside == false )
+ {
+ int height = GetItemHeight( index );
+
+ if ( point.x < 36 )
+ {
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+ CManifestMap *pManifestMap = pManifest->GetMap( ( int )GetItemData( index ) );
+ if ( pManifestMap )
+ {
+ if ( point.x < 18 && ( point.y % height ) < 18 )
+ {
+ pManifest->SetVisibility( pManifestMap, !pManifestMap->m_bVisible );
+ }
+ }
+ }
+ }
+ else
+ {
+ CListBox::OnLButtonDown( nFlags, point );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: passes along the double click message if it is on the right side of a list item
+// Input : nFlags - not used
+// point - the mouse coordinates
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnLButtonDblClk(UINT nFlags, CPoint point)
+{
+ BOOL bOutside;
+
+ m_pTrackerManifestMap = NULL;
+
+// int index =
+ ItemFromPoint( point, bOutside );
+ if ( bOutside == false )
+ {
+ if ( point.x >= 36 )
+ {
+ CListBox::OnLButtonDblClk( nFlags, point );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this handles bringing up the specific context menu based upon if you
+// are over the primary map, a different sub map, or an empty spot.
+// Input : nFlags - not used
+// point - the mouse coordinates
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnRButtonUp(UINT nFlags, CPoint point)
+{
+ BOOL bOutside;
+ CMenu *pWhichMenu;
+ const UINT nEnable = MF_BYCOMMAND | MF_ENABLED;
+ const UINT nDisable = MF_BYCOMMAND | MF_DISABLED | MF_GRAYED;
+
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+ m_pTrackerManifestMap = NULL;
+
+ CPoint ptScreen( point.x, point.y );
+ ClientToScreen(& ptScreen );
+
+ int index = ItemFromPoint( point, bOutside );
+
+ if ( bOutside )
+ {
+ pWhichMenu = &m_ManifestFilterBlankMenu;
+ }
+ else
+ {
+ m_pTrackerManifestMap = pManifest->GetMap( ( int )GetItemData( index ) );
+
+ if ( m_pTrackerManifestMap->m_bPrimaryMap )
+ {
+ pWhichMenu = &m_ManifestFilterPrimaryMenu;
+ }
+ else
+ {
+ pWhichMenu = &m_ManifestFilterSecondaryMenu;
+ }
+ }
+
+ if ( activeDoc->GetSelection()->IsEmpty() == false )
+ {
+ pWhichMenu->EnableMenuItem( ID_MOVESELECTIONTO_SUBMAP, nEnable );
+ pWhichMenu->EnableMenuItem( ID_MOVESELECTIONTO_NEWSUBMAP, nEnable );
+ }
+ else
+ {
+ pWhichMenu->EnableMenuItem( ID_MOVESELECTIONTO_SUBMAP, nDisable );
+ pWhichMenu->EnableMenuItem( ID_MOVESELECTIONTO_NEWSUBMAP, nDisable );
+ }
+
+ if ( pManifest->GetNumMaps() > 1 )
+ {
+ pWhichMenu->EnableMenuItem( ID_MANIFEST_REMOVE, nEnable );
+ }
+ else
+ {
+ pWhichMenu->EnableMenuItem( ID_MANIFEST_REMOVE, nDisable );
+ }
+
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_CHECKOUT, nDisable );
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_CHECKIN, nDisable );
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_ADD, nDisable );
+
+ if ( p4 && m_pTrackerManifestMap )
+ {
+ if ( m_pTrackerManifestMap->m_bIsVersionControlled )
+ {
+ if ( m_pTrackerManifestMap->m_bCheckedOut )
+ {
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_CHECKIN, nEnable );
+ }
+ else
+ {
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_CHECKOUT, nEnable );
+ }
+ }
+ else
+ {
+ pWhichMenu->EnableMenuItem( ID_VERSIONCONTROL_ADD, nEnable );
+ }
+ }
+
+ Invalidate();
+ pWhichMenu->TrackPopupMenu( TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_LEFTALIGN, ptScreen.x, ptScreen.y, this );
+
+ CListBox::OnRButtonUp(nFlags, point);
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the menu command for moving the selection to an existing sub map
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnMoveSelectionToSubMap()
+{
+ if ( !m_pTrackerManifestMap )
+ {
+ return;
+ }
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ pManifest->MoveSelectionToSubmap( m_pTrackerManifestMap, false );
+
+ m_pTrackerManifestMap = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the menu command for moving the selection to a new sub map
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnMoveSelectionToNewSubMap()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifestMove ManifestMove( true );
+
+ if ( ManifestMove.DoModal() == IDOK )
+ {
+ CString FriendlyName, FileName;
+
+ ManifestMove.GetFriendlyName( FriendlyName );
+ ManifestMove.GetFileName( FileName );
+
+ CManifest *pManifest = activeDoc->GetManifest();
+ CManifestMap *pNewManifestMap = pManifest->MoveSelectionToNewSubmap( FriendlyName, FileName, ManifestMove.GetCenterContents() );
+ if ( pNewManifestMap )
+ {
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnVersionControlCheckOut()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ if ( !p4->OpenFileForEdit( m_pTrackerManifestMap->m_AbsoluteMapFileName ) )
+ {
+ char temp[ 2048 ];
+
+ sprintf( temp, "Could not check out map: %s", p4->GetLastError() );
+ AfxMessageBox( temp, MB_ICONHAND | MB_OK );
+ }
+ else
+ {
+ pManifest->CheckFileStatus();
+ Invalidate();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnVersionControlCheckIn()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ pManifest->m_bDefaultCheckin = false;
+ for( int i = 0; i < pManifest->GetNumMaps(); i++ )
+ {
+ CManifestMap *pManifestMap = pManifest->GetMap( i );
+ pManifestMap->m_bDefaultCheckin = false;
+ }
+ if ( m_pTrackerManifestMap )
+ {
+ m_pTrackerManifestMap->m_bDefaultCheckin = true;
+ }
+
+ CManifestCheckin ManifestCheckin;
+ if ( ManifestCheckin.DoModal() == IDOK )
+ {
+ pManifest->CheckFileStatus();
+ Invalidate();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnVersionControlAdd()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ if ( !p4->OpenFileForAdd( m_pTrackerManifestMap->m_AbsoluteMapFileName ) )
+ {
+ char temp[ 2048 ];
+
+ sprintf( temp, "Could not add map: %s", p4->GetLastError() );
+ AfxMessageBox( temp, MB_ICONHAND | MB_OK );
+ }
+ else
+ {
+ pManifest->CheckFileStatus();
+ Invalidate();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the menu command to insert a new empty sub map
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnInsertEmptySubMap()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifestMove ManifestMove( false );
+
+ if ( ManifestMove.DoModal() == IDOK )
+ {
+ CString FriendlyName, FileName;
+
+ ManifestMove.GetFriendlyName( FriendlyName );
+ ManifestMove.GetFileName( FileName );
+
+ CManifest *pManifest = activeDoc->GetManifest();
+ CManifestMap *pNewManifestMap = pManifest->AddNewSubmap( FriendlyName, FileName );
+ if ( pNewManifestMap )
+ {
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the menu command to insert an existing sub map
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnInsertExistingSubMap()
+{
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ pManifest->AddExistingMap();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will handle bringing up the properties dialog of a sub map
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnManifestProperties()
+{
+ if ( !m_pTrackerManifestMap )
+ {
+ return;
+ }
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ CManifestMapDlg ManifestMapDlg( m_pTrackerManifestMap, this );
+
+ if ( ManifestMapDlg.DoModal() == IDOK )
+ {
+ pManifest->SetManifestPrefsModifiedFlag( true );
+ Invalidate();
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will remove an existing sub map from the manifest, but will
+// not delete the file.
+//-----------------------------------------------------------------------------
+void CManifestListBox::OnManifestRemove()
+{
+ if ( !m_pTrackerManifestMap )
+ {
+ return;
+ }
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ return;
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ if ( AfxMessageBox( "Are you sure you want to remove this sub map from the manifest?", MB_YESNO | MB_ICONQUESTION ) == IDNO )
+ {
+ return;
+ }
+
+ pManifest->RemoveSubMap( m_pTrackerManifestMap );
+ pManifest->SetPrimaryMap( pManifest->GetMap( 0 ) );
+ m_pTrackerManifestMap = NULL;
+
+ AfxMessageBox( "The sub map has been removed from the manifest, but the file has not been deleted.", MB_OK | MB_ICONASTERISK );
+}
+
+
+BEGIN_MESSAGE_MAP(CManifestListBox, CListBox)
+ //{{AFX_MSG_MAP(CManifestListBox)
+ ON_WM_LBUTTONDOWN()
+ ON_WM_RBUTTONUP()
+ //}}AFX_MSG_MAP
+ ON_WM_LBUTTONDBLCLK()
+ ON_COMMAND(ID_MOVESELECTIONTO_SUBMAP, OnMoveSelectionToSubMap)
+ ON_COMMAND(ID_MOVESELECTIONTO_NEWSUBMAP, OnMoveSelectionToNewSubMap)
+ ON_COMMAND(ID_VERSIONCONTROL_CHECKOUT, OnVersionControlCheckOut)
+ ON_COMMAND(ID_VERSIONCONTROL_CHECKIN, OnVersionControlCheckIn)
+ ON_COMMAND(ID_VERSIONCONTROL_ADD, OnVersionControlAdd)
+ ON_COMMAND(ID_INSERT_EMPTYSUBMAP, OnInsertEmptySubMap)
+ ON_COMMAND(ID_INSERT_EXISTINGSUBMAP, OnInsertExistingSubMap)
+ ON_COMMAND(ID_MANIFEST_PROPERTIES, OnManifestProperties)
+ ON_COMMAND(ID_MANIFEST_REMOVE, OnManifestRemove)
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will create the hammber bar window
+// Input : pParentWnd -
+// Output : Returns TRUE on success, FALSE on failure.
+//-----------------------------------------------------------------------------
+BOOL CManifestFilter::Create(CWnd *pParentWnd)
+{
+ if (!CHammerBar::Create(pParentWnd, IDD_MANIFEST_CONTROL, CBRS_RIGHT | CBRS_SIZE_DYNAMIC, IDCB_MANIFEST_CONTROL, "Manifest Control"))
+ {
+ return FALSE;
+ }
+
+ m_ManifestList.SubclassDlgItem( IDC_MANIFEST_LIST, this );
+ m_ManifestList.SetItemHeight( 0, 36 );
+
+ AddControl( IDC_MANIFEST_LIST, GROUP_BOX );
+
+ UpdateManifestList();
+
+ m_pBkBrush = new CBrush( ::GetSysColor( COLOR_3DFACE ) );
+
+ bInitialized = TRUE;
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: default destructor
+//-----------------------------------------------------------------------------
+CManifestFilter::~CManifestFilter()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will update the manifest list ( for when sub maps are added / removed
+// or the primary map is changed.
+//-----------------------------------------------------------------------------
+void CManifestFilter::UpdateManifestList( void )
+{
+ m_ManifestList.ResetContent();
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ for( int i = 0; i < pManifest->GetNumMaps(); i++ )
+ {
+ CManifestMap *pManifestMap = pManifest->GetMap( i );
+
+ int index = m_ManifestList.AddString( "Manifest" );
+ m_ManifestList.SetItemData( index, i );
+
+ if ( pManifestMap->m_bPrimaryMap )
+ {
+ m_ManifestList.SetCurSel( index );
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: data exchange function for assigning variables to controls
+//-----------------------------------------------------------------------------
+void CManifestFilter::DoDataExchange(CDataExchange* pDX)
+{
+ __super::DoDataExchange(pDX);
+}
+
+
+BEGIN_MESSAGE_MAP(CManifestFilter, CHammerBar)
+ ON_LBN_SELCHANGE(IDC_MANIFEST_LIST, &CManifestFilter::OnLbnSelchangeManifestList)
+ ON_LBN_DBLCLK(IDC_MANIFEST_LIST, &CManifestFilter::OnLbnDblClkManifestList)
+ ON_WM_CTLCOLOR()
+ ON_WM_DESTROY()
+ ON_WM_SIZE()
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will handle the selection of a sub map to set it to the primary map
+//-----------------------------------------------------------------------------
+void CManifestFilter::OnLbnSelchangeManifestList()
+{
+ int nIndex = m_ManifestList.GetCurSel();
+ int nCount = m_ManifestList.GetCount();
+
+ if ( ( nIndex != LB_ERR ) && ( nCount > 1 ) )
+ {
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+ CManifestMap *pManifestMap = pManifest->GetMap( ( int )m_ManifestList.GetItemData( nIndex ) );
+
+ pManifest->SetPrimaryMap( pManifestMap );
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function will bring up the properties dialog of a sub map
+//-----------------------------------------------------------------------------
+void CManifestFilter::OnLbnDblClkManifestList()
+{
+ int nIndex = m_ManifestList.GetCurSel();
+// int nCount = m_ManifestList.GetCount();
+
+ if ( ( nIndex != LB_ERR ) )
+ {
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+ CManifestMap *pManifestMap = pManifest->GetMap( ( int )m_ManifestList.GetItemData( nIndex ) );
+
+ CManifestMapDlg ManifestMapDlg( pManifestMap, this );
+
+ if ( ManifestMapDlg.DoModal() == IDOK )
+ {
+ pManifest->SetManifestPrefsModifiedFlag( true );
+ m_ManifestList.Invalidate();
+ }
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function sets the text and background color of the custom list box
+// Input : pDC - the display context
+// pWnd - the owning window
+// nCtlColor - the color type to be set
+// Output : returns the brush for the control color
+//-----------------------------------------------------------------------------
+HBRUSH CManifestFilter::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
+{
+ switch (nCtlColor)
+ {
+ case CTLCOLOR_LISTBOX:
+ pDC->SetTextColor( ::GetSysColor( COLOR_WINDOWTEXT ) );
+ pDC->SetBkColor( ::GetSysColor( COLOR_3DFACE ) );
+ return ( HBRUSH )( m_pBkBrush->GetSafeHandle() );
+
+ default:
+ return __super::OnCtlColor(pDC, pWnd, nCtlColor);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the destruction of the dialog to make sure the brush is destroyed
+//-----------------------------------------------------------------------------
+void CManifestFilter::OnDestroy()
+{
+ __super::OnDestroy();
+
+ delete m_pBkBrush;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : nType -
+// cx -
+// cy -
+//-----------------------------------------------------------------------------
+void CManifestFilter::OnSize(UINT nType, int cx, int cy)
+{
+ // TODO: make larger / resizable when floating
+ //if (IsFloating())
+ //{
+ // CWnd *pwnd = GetDlgItem(IDC_GROUPS);
+ // if (pwnd && IsWindow(pwnd->GetSafeHwnd()))
+ // {
+ // pwnd->MoveWindow(2, 10, cx - 2, cy - 2, TRUE);
+ // }
+ //}
+
+ CHammerBar::OnSize(nType, cx, cy);
+}
+
+
+IMPLEMENT_DYNAMIC(CManifestMapDlg, CDialog)
+
+
+//-----------------------------------------------------------------------------
+// Purpose: default constructor
+// Input : pManifestMap - the map for this dialog
+// pParent - the parent window
+//-----------------------------------------------------------------------------
+CManifestMapDlg::CManifestMapDlg( CManifestMap *pManifestMap, CWnd* pParent /*=NULL*/ )
+ : CDialog(CManifestMapDlg::IDD, pParent)
+{
+ m_pManifestMap = pManifestMap;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: default destructor
+//-----------------------------------------------------------------------------
+CManifestMapDlg::~CManifestMapDlg()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: data exchange function for assigning variables to controls
+//-----------------------------------------------------------------------------
+void CManifestMapDlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_MANIFEST_FRIENDLY_NAME, m_FriendlyNameControl);
+ DDX_Control(pDX, IDC_MANIFEST_FULL_FILENAME, m_FullFileNameCtrl);
+}
+
+
+BEGIN_MESSAGE_MAP(CManifestMapDlg, CDialog)
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose: routine to handle the initialization of the dialog
+//-----------------------------------------------------------------------------
+BOOL CManifestMapDlg::OnInitDialog()
+{
+ CDialog::OnInitDialog();
+
+ m_FriendlyNameControl.SetWindowText( m_pManifestMap->m_FriendlyName );
+ m_FullFileNameCtrl.SetWindowText( m_pManifestMap->m_AbsoluteMapFileName );
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: this function handles the user hitting ok
+//-----------------------------------------------------------------------------
+void CManifestMapDlg::OnOK()
+{
+ m_FriendlyNameControl.GetWindowText( m_pManifestMap->m_FriendlyName );
+
+ CDialog::OnOK();
+}
+
+
+
+// CManifestCheckin dialog
+
+IMPLEMENT_DYNAMIC(CManifestCheckin, CDialog)
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+CManifestCheckin::CManifestCheckin(CWnd* pParent /*=NULL*/)
+ : CDialog(CManifestCheckin::IDD, pParent)
+{
+
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+CManifestCheckin::~CManifestCheckin()
+{
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void CManifestCheckin::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ DDX_Control(pDX, IDC_CHECKIN_LIST, m_CheckinListCtrl);
+ DDX_Control(pDX, IDC_CHECKIN_DESCRIPTION, m_DescriptionCtrl);
+}
+
+
+BEGIN_MESSAGE_MAP(CManifestCheckin, CDialog)
+ ON_BN_CLICKED(IDOK, &CManifestCheckin::OnBnClickedOk)
+END_MESSAGE_MAP()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+BOOL CManifestCheckin::OnInitDialog()
+{
+ P4File_t FileInfo;
+
+ CDialog::OnInitDialog();
+
+ m_CheckinListCtrl.SetExtendedStyle( m_CheckinListCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT );
+
+ m_CheckinListCtrl.InsertColumn( 0, "", LVCFMT_LEFT, 30, -1 );
+ m_CheckinListCtrl.InsertColumn( 1, "Status", LVCFMT_LEFT, 50, -1 );
+ m_CheckinListCtrl.InsertColumn( 2, "Name", LVCFMT_LEFT, 100, -1 );
+ m_CheckinListCtrl.InsertColumn( 3, "Folder", LVCFMT_LEFT, 350, -1 );
+
+ if ( p4 == NULL )
+ {
+ return TRUE;
+ }
+
+ int nCount = 0;
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( activeDoc && activeDoc->GetManifest() )
+ {
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ if ( pManifest->m_bCheckedOut )
+ {
+ if ( p4->GetFileInfo( pManifest->GetPathName(), &FileInfo ) == true )
+ {
+ int nIndex = m_CheckinListCtrl.InsertItem( nCount, "" );
+ nCount++;
+ m_CheckinListCtrl.SetItemData( nIndex, ( DWORD_PTR )NULL );
+ switch( FileInfo.m_eOpenState )
+ {
+ case P4FILE_OPENED_FOR_ADD:
+ m_CheckinListCtrl.SetItemText( nIndex, 1, "Add" );
+ break;
+
+ case P4FILE_OPENED_FOR_EDIT:
+ m_CheckinListCtrl.SetItemText( nIndex, 1, "Edit" );
+ break;
+ }
+ m_CheckinListCtrl.SetItemText( nIndex, 2, p4->String( FileInfo.m_sName ) );
+ m_CheckinListCtrl.SetItemText( nIndex, 3, p4->String( FileInfo.m_sPath ) );
+
+ if ( pManifest->m_bDefaultCheckin )
+ {
+ ListView_SetItemState( m_CheckinListCtrl.m_hWnd, nIndex, INDEXTOSTATEIMAGEMASK( LVIS_SELECTED ), LVIS_STATEIMAGEMASK );
+ }
+ }
+ }
+
+ for( int i = 0; i < pManifest->GetNumMaps(); i++ )
+ {
+ CManifestMap *pManifestMap = pManifest->GetMap( i );
+
+ if ( pManifestMap->m_bCheckedOut )
+ {
+ if ( p4->GetFileInfo( pManifestMap->m_AbsoluteMapFileName, &FileInfo ) == true )
+ {
+ int nIndex = m_CheckinListCtrl.InsertItem( nCount, "" );
+ nCount++;
+ m_CheckinListCtrl.SetItemData( nIndex, ( DWORD_PTR )pManifestMap );
+ switch( FileInfo.m_eOpenState )
+ {
+ case P4FILE_OPENED_FOR_ADD:
+ m_CheckinListCtrl.SetItemText( nIndex, 1, "Add" );
+ break;
+
+ case P4FILE_OPENED_FOR_EDIT:
+ m_CheckinListCtrl.SetItemText( nIndex, 1, "Edit" );
+ break;
+ }
+ m_CheckinListCtrl.SetItemText( nIndex, 2, p4->String( FileInfo.m_sName ) );
+ m_CheckinListCtrl.SetItemText( nIndex, 3, p4->String( FileInfo.m_sPath ) );
+
+ if ( pManifestMap->m_bDefaultCheckin )
+ {
+ ListView_SetItemState( m_CheckinListCtrl.m_hWnd, nIndex, INDEXTOSTATEIMAGEMASK( LVIS_SELECTED ), LVIS_STATEIMAGEMASK );
+ }
+ }
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void CManifestCheckin::OnBnClickedOk()
+{
+ int nFileCount = 0;
+
+ CMapDoc *activeDoc = CMapDoc::GetActiveMapDoc();
+ if ( !activeDoc || !activeDoc->GetManifest() )
+ {
+ OnOK();
+ }
+
+ CManifest *pManifest = activeDoc->GetManifest();
+
+ for( int i = 0; i < m_CheckinListCtrl.GetItemCount(); i++ )
+ {
+ if ( m_CheckinListCtrl.GetItemState( i, LVIS_STATEIMAGEMASK ) == INDEXTOSTATEIMAGEMASK( LVIS_SELECTED ) )
+ {
+ nFileCount++;
+ }
+ }
+
+ if ( nFileCount > 0 )
+ {
+ CString Description;
+ m_DescriptionCtrl.GetWindowText( Description );
+ if ( Description.GetLength() < 2 )
+ {
+ AfxMessageBox( "Please put in something descriptive for the description. I took the time to type this dialog, the least you could do is type something!", MB_ICONHAND | MB_OK );
+ return;
+ }
+
+ const char **ppFileNames = ( const char** )stackalloc( nFileCount * sizeof( char * ) );
+
+ nFileCount = 0;
+ for( int i = 0; i < m_CheckinListCtrl.GetItemCount(); i++ )
+ {
+ if ( m_CheckinListCtrl.GetItemState( i, LVIS_STATEIMAGEMASK ) == INDEXTOSTATEIMAGEMASK( LVIS_SELECTED ) )
+ {
+ CManifestMap *pManifestMap = ( CManifestMap * )m_CheckinListCtrl.GetItemData( i );
+
+ if ( pManifestMap == NULL )
+ {
+ ppFileNames[ nFileCount ] = pManifest->GetPathName();
+ pManifest->SaveVMFManifest( pManifest->GetPathName() );
+ }
+ else
+ {
+ ppFileNames[ nFileCount ] = pManifestMap->m_AbsoluteMapFileName;
+ pManifestMap->m_Map->SaveVMF( pManifestMap->m_AbsoluteMapFileName, 0 );
+ }
+ nFileCount++;
+ }
+ }
+
+ if ( p4->SubmitFiles( nFileCount, ppFileNames, Description ) == false )
+ {
+ char temp[ 2048 ];
+
+ sprintf( temp, "Could not check in map(s): %s", p4->GetLastError() );
+ AfxMessageBox( temp, MB_ICONHAND | MB_OK );
+
+ return;
+ }
+ }
+
+ OnOK();
+}