//========= 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(); }