DeleteFixes.cpp. #1

  • //
  • guest/
  • YourUncleBob/
  • p4win/
  • main/
  • gui/
  • DeleteFixes.cpp.
  • View
  • Commits
  • Open Download .zip Download (10 KB)
// DeleteFixes.cpp : implementation file
//

#include "stdafx.h"
#include "p4win.h"
#include "reviewlist.h"
#include "DeleteFixes.h"
#include "MainFrm.h"
#include "P4Command.h"
#include "cmd_describe.h"
#include "hlp\p4win.hh"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDeleteFixes dialog


CDeleteFixes::CDeleteFixes(CWnd* pParent /*=NULL*/)
	: CDialog(CDeleteFixes::IDD, pParent)
{
	m_pParent = pParent;
	//{{AFX_DATA_INIT(CDeleteFixes)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	m_OldChgWnd = pParent->m_hWnd;
	m_InitRect.SetRect(0,0,0,0);
	m_InitDialogDone = m_IsMinimized = FALSE;
	m_WinPos.SetWindow( this, _T("DeleteFixes") );
	m_SortFlag = 0;
}

CDeleteFixes::~CDeleteFixes()
{
	delete m_List;
}


void CDeleteFixes::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDeleteFixes)
	DDX_Control(pDX, IDC_JOBSTATUS, m_JobStatus);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDeleteFixes, CDialog)
	//{{AFX_MSG_MAP(CDeleteFixes)
	ON_WM_SETCURSOR()
	ON_WM_SIZE()
	ON_WM_GETMINMAXINFO()
	ON_WM_SHOWWINDOW()
	ON_BN_CLICKED(IDC_DESCRIPTION, OnDescribeJob)
	ON_BN_CLICKED(ID_HELP, OnHelp)
	ON_LBN_SELCHANGE(IDC_LIST, OnSelchangeList)
	ON_WM_DESTROY()
	ON_WM_SYSCOMMAND()
	//}}AFX_MSG_MAP
	ON_WM_HELPINFO()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDeleteFixes message handlers


BOOL CDeleteFixes::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	if (m_pParent)
		MainFrame()->SetModelessWnd(this);

	GetWindowRect(&m_InitRect);
	m_LastRect = m_InitRect;

	SetWindowText(m_Caption);

	CRect rect;
	CWnd *pCtrl=GetDlgItem(IDC_LISTRECT);
	pCtrl->GetWindowRect(&rect);
	ScreenToClient(&rect);

	DWORD style= WS_CHILD | WS_BORDER | WS_VISIBLE | LBS_HASSTRINGS | WS_HSCROLL
		 | LBS_EXTENDEDSEL | LBS_OWNERDRAWFIXED | WS_VSCROLL | WS_TABSTOP | LBS_NOINTEGRALHEIGHT;

	m_List = new CReviewList;
	
	m_List->CreateEx(WS_EX_CLIENTEDGE, MainFrame()->m_ReviewListClass, _T(""),style,
                 rect.left, rect.top, rect.Width(), rect.Height(),
				 this->m_hWnd, (HMENU) IDC_LIST);

	LoadFixes();

	if (!LoadJobStatusComboBox())
	{
		GetDlgItem(IDC_JOBSTATUSPROMPT)->ShowWindow( SW_HIDE );
		GetDlgItem(IDC_JOBSTATUS)->ShowWindow( SW_HIDE );
	}
	OnSelchangeList();

	// Restore window position
	m_InitDialogDone = TRUE;
	m_WinPos.RestoreWindowPosition();

	ShowWindow(SW_SHOW);
	return FALSE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CDeleteFixes::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CDialog::OnShowWindow(bShow, nStatus);
	m_List->SetFocus();
}

void CDeleteFixes::LoadFixes()
{
	CString s;
	int maxlgth = 0;
	for (POSITION pos = m_SelectedList->GetHeadPosition(); pos != NULL; )
	{
		s = m_SelectedList->GetNext(pos);
		if( !s.IsEmpty() )
		{
			maxlgth = max(maxlgth, s.GetLength());
			m_List->AddString( s );
			m_SortFlag |= 2;
		}
		// Get text metrics for font so we can figure scroll extent
		//
		TEXTMETRIC tm;
		CDC *pDC= GetDC();
		pDC->GetTextMetrics( &tm );
		ReleaseDC( pDC );

		m_List->SetHorizontalExtent( tm.tmAveCharWidth * maxlgth + 40 );
	}
}

BOOL CDeleteFixes::LoadJobStatusComboBox()
{
	int i;
	m_JobStatus.AddString(LoadStringResource(IDS_PAREN_NOCHANGE_PAREN));
	m_JobStatus.SetCurSel(0);
	if (GET_SERVERLEVEL() < 10)
		return FALSE;

	i = m_pJobSpec->Find(_T("\nFields:\n\t"));
	if (i == -1)
		return FALSE;
	i = m_pJobSpec->Find(_T("\n\t102 "), i);
	if (i == -1)
		return FALSE;
	i += sizeof(_T("\n\t102 "))/sizeof(TCHAR) - 1;
	int j = m_pJobSpec->Find(_T(' '), i);
	if (j == -1)
		return FALSE;
	CString name = m_pJobSpec->Mid(i, j-i);
	i = m_pJobSpec->Find(_T("\nValues:"), j);
	if (i == -1)
	{
		CString dashed = _T("\nValues");
		dashed += _T("-") + name;
		i = m_pJobSpec->Find(dashed, j);
		if (i == -1)
			return FALSE;
	}
	i = m_pJobSpec->Find(name, i);
	if (i == -1)
		return FALSE;
	i += name.GetLength();
	while (1)
	{
		TCHAR c = m_pJobSpec->GetAt(++i);
		if ((c != _T(':')) && (c != _T(' ')) && (c != _T('\t')))
			break;
	}
	j = m_pJobSpec->Find(_T('\n'), i);
	if (j == -1)
		return FALSE;
	CString values = m_pJobSpec->Mid(i, j-i);

	while((i = values.Find(_T('/'))) != -1)
	{
		CString value = values.Mid(0,i);
		m_JobStatus.AddString(value);
		values = values.Mid(i+1);
	}
	m_JobStatus.AddString(values);

	// at this point we have loaded the dropdown; now figure out the initial value
	i = m_pJobSpec->Find(_T("\nPresets:"));
	if (i == -1)
		return TRUE;
	i = m_pJobSpec->Find(name, i);
	if (i == -1)
		return TRUE;
	i += name.GetLength();
	while (1)
	{
		TCHAR c = m_pJobSpec->GetAt(++i);
		if ((c != _T(':')) && (c != _T(' ')) && (c != _T('\t')))
			break;
	}
	j = m_pJobSpec->Find(_T('\n'), i);
	if (j == -1)
		return TRUE;
	CString preset = m_pJobSpec->Mid(i, j-i);
	if ((i = m_JobStatus.FindStringExact(-1, preset)) != CB_ERR)
		m_JobStatus.SetCurSel(i);

	return TRUE;
}

void CDeleteFixes::OnSelectAll() 
{
	for ( int i = 0; i < m_List->GetCount ( ); i++ )
		m_List->SetCheck( i, 1 );
}

void CDeleteFixes::OnUnselectAll() 
{
	for ( int i = 0; i < m_List->GetCount ( ); i++ )
		m_List->SetCheck( i, 0 );
}

void CDeleteFixes::OnCancel() 
{
	::PostMessage(m_OldChgWnd, m_ReturnMsg, (WPARAM)IDCANCEL, (LPARAM)0);
}

void CDeleteFixes::OnOK() 
{
	CString txt;

	m_OutputList->RemoveAll();
	for ( int i = 0; i < m_List->GetCount( ); i++ )
	{
		if (m_List->GetCheck(i))
		{
			m_List->GetText( i, txt );
			m_OutputList->AddTail( txt );
		}
	}

	if (m_OutputList->GetCount() == 0)
	{
		if (IDYES == AfxMessageBox(IDS_NOTHINGSELECTED_CLOSE, MB_YESNO|MB_DEFBUTTON2))
			OnCancel();
		return;
	}

	m_WinPos.SaveWindowPosition();

	int cursel = m_JobStatus.GetCurSel();
	if (cursel != CB_ERR)
		m_JobStatus.GetLBText(cursel, *m_JobStatusValue);
	if (*m_JobStatusValue == LoadStringResource(IDS_PAREN_NOCHANGE_PAREN))
		(*m_JobStatusValue).Empty();
	::PostMessage(m_OldChgWnd, m_ReturnMsg, (WPARAM)IDOK, (LPARAM)FALSE);
}

void CDeleteFixes::OnHelp() 
{
	AfxGetApp()->WinHelp(TASK_MANAGING_LABELS);
}

BOOL CDeleteFixes::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	OnHelp();
	return TRUE;
}

void CDeleteFixes::OnDescribeJob()
{
	int i;
	CString str;

	if ((i = m_List->GetCurSel()) != LB_ERR)
	{
		m_List->GetText(i, str);
		if ((i = str.Find(_T(' '))) != -1)
		{
			str = str.Left(i);
			CCmd_Describe *pCmd= new CCmd_Describe;
			pCmd->Init( MainFrame()->JobWnd(), RUN_ASYNC );
			if( pCmd->Run( P4JOB_SPEC, str ) )
				MainFrame()->UpdateStatus(LoadStringResource(IDS_FETCHING_JOB_SPEC));
			else
				delete pCmd;
		}
	}
}

void CDeleteFixes::OnSelchangeList() 
{
	GetDlgItem(IDC_DESCRIPTION)->EnableWindow(m_List->GetCurSel() != LB_ERR);
}

BOOL CDeleteFixes::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if(SERVER_BUSY())
		return SET_BUSYCURSOR();
	else
		return CDialog::OnSetCursor(pWnd, nHitTest, message);
}

void CDeleteFixes::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);

	if (!m_InitDialogDone)
		return;

	if (nType == SIZE_MINIMIZED)
	{
		m_IsMinimized = TRUE;
		return;
	}
	else if (m_IsMinimized)
	{
		m_IsMinimized = FALSE;
		return;
	}

	// Compute the change in width (dx)
	CRect rect;
	GetWindowRect(&rect);
	int dx = rect.Width() - m_LastRect.Width();
	int dy = rect.Height() - m_LastRect.Height();
	// Save the new size
	m_LastRect = rect;

	// Widen the list box by the change in width (dx) and
	// heighten the list box by the change in height (dy)
	CWnd *pWnd=GetDlgItem(IDC_LIST);
	pWnd->GetWindowRect(&rect);
	pWnd->SetWindowPos(NULL, 0, 0, rect.right - rect.left + dx, 
								    rect.bottom - rect.top + dy, SWP_NOMOVE | SWP_NOZORDER);
	// Slide the Describe button down by the change in height
	pWnd = GetDlgItem(IDC_DESCRIPTION);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	// Slide the Status label down by the change in height
	pWnd = GetDlgItem(IDC_JOBSTATUSPROMPT);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	// Slide the Status field down by the change in height
	pWnd = GetDlgItem(IDC_JOBSTATUS);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	// Slide the other buttons to the right by the change in width
	// and down by the change in height
	pWnd = GetDlgItem(IDOK);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pWnd = GetDlgItem(IDCANCEL);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pWnd = GetDlgItem(ID_HELP);
	pWnd->GetWindowRect(&rect);
	ScreenToClient(rect);
	pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	InvalidateRect(NULL, TRUE);
}

void CDeleteFixes::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	if (m_InitRect.Height())
	{
		lpMMI->ptMinTrackSize.x= m_InitRect.Width();
		lpMMI->ptMinTrackSize.y= m_InitRect.Height();
	}
}

// This signals the closing of a modeless dialog
// to MainFrame which will delete the 'this' object
void CDeleteFixes::OnDestroy()
{
	::PostMessage(MainFrame()->m_hWnd, WM_P4DLGDESTROY, 0, (LPARAM)this);
}

void CDeleteFixes::OnSysCommand(UINT nID, LPARAM lParam) 
{
	switch(nID)
	{
	case SC_MINIMIZE:
		GetDesktopWindow()->ArrangeIconicWindows();
		break;
	}

	CDialog::OnSysCommand(nID, lParam);
}
# Change User Description Committed
#1 19924 YourUncleBob Populate -o //guest/perforce_software/p4win/...
//guest/YourUncleBob/p4win/.....
//guest/perforce_software/p4win/main/gui/DeleteFixes.cpp
#1 16169 perforce_software Move files to follow new path scheme for branches.
//guest/perforce_software/p4win/gui/DeleteFixes.cpp
#1 8562 Matt Attaway These feet never stop running.

Initial commit of the P4Win source code.  To the best of our knowledge this
compiles and runs using the 2013.3 P4 API and VS 2010. Expect a few changes
as we refine the build process. Please post any build issues to the forums.