catchalldlg.cpp. #1

  • //
  • guest/
  • YourUncleBob/
  • p4win/
  • main/
  • gui/
  • catchalldlg.cpp.
  • View
  • Commits
  • Open Download .zip Download (8 KB)
#include "stdafx.h"
#include "p4win.h"
#include "viewerdlg.h"
#include "UserView.h"
#include "Mainfrm.h"
#include "catchalldlg.h"
#include "..\SpecDescDlg.h"
#include "hlp\p4win.hh"

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


CJobFilter::CJobFilter(CWnd* pParent /*=NULL*/)
	: CDialog(CJobFilter::IDD, pParent)
{
	//{{AFX_DATA_INIT(CJobFilter)
	m_Filter = _T("");
	//}}AFX_DATA_INIT
	m_InitRect.SetRect(0,0,0,0);
}


void CJobFilter::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CJobFilter)
	DDX_Control(pDX, ID_JOBVIEW, m_JobViewBtn);
	DDX_Control(pDX, ID_RMVJOBFILTER, m_RmvFilter);
	DDX_Control(pDX, ID_HELPJOBFILTER, m_Help);
	DDX_Control(pDX, IDC_JOB_FILTER, m_ChangeCombo);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CJobFilter, CDialog)
	//{{AFX_MSG_MAP(CJobFilter)
	ON_BN_CLICKED(ID_HELPJOBFILTER, OnHelpJobFilter)
	ON_BN_CLICKED(ID_RMVJOBFILTER, OnRmvJobFilter)
	ON_BN_CLICKED(ID_JOBVIEW, OnJobView)
	ON_BN_CLICKED(ID_FORMINFO, OnFormInfo)
	ON_WM_SIZE()
	ON_WM_GETMINMAXINFO()
	ON_WM_HELPINFO()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_P4DESCRIBE, OnP4Describe )
    ON_MESSAGE(WM_P4ENDDESCRIBE, OnP4EndDescribe )
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CJobFilter message handlers


BOOL CJobFilter::OnInitDialog() 
{
	CDialog::OnInitDialog();

	// We want to position the job filter dialog in the upper left corner 
	// of the job view pane which has provided it's screen coords in m_top, 
	// m_left & m_right.  However if the dialog box is longer than the job
	// view pane, we need to slide it to the left so that the right edges
	// line up, so get our screen coords for calc'ing the width of our box.
	// We also want to resize the dialogbox to its previous width;
	// so get the previous width, and resize and reposition the dialogbox.

	int w = GET_P4REGPTR()->GetJobFilterWidth();
	m_left = min(m_left, m_right - w);	// calc horiz position
	GetWindowRect(&m_InitRect);

	SetWindowPos( NULL, m_left, m_top, w, m_InitRect.bottom - m_InitRect.top, SWP_NOZORDER );
	
	LoadFilterComboBox();

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

void CJobFilter::LoadFilterComboBox()
{
	// Make sure the combo is empty
	m_ChangeCombo.ResetContent();
	m_ChangeCombo.Clear();

	// Load all MRU filters into list box
	for(int i=0; i < MAX_MRU_FILTERS; i++)
	{
		if(GET_P4REGPTR()->GetMRUFilter(i).GetLength() > 0)
			m_ChangeCombo.AddString(GET_P4REGPTR()->GetMRUFilter(i));
	}

	// Select the first item
	m_ChangeCombo.SetCurSel(0);
}

void CJobFilter::OnOK() 
{
	UpdateData( );
	if(m_ChangeCombo.GetCurSel() != CB_ERR)
		m_ChangeCombo.GetLBText(m_ChangeCombo.GetCurSel(), m_Filter);
	else
		m_ChangeCombo.GetWindowText( m_Filter );
	if (m_Filter.GetLength() > 0)					// if new filter is not blank
		GET_P4REGPTR()->AddMRUFilter( m_Filter );	// save as most recently used in Reg

	CRect rect;
	GetWindowRect(&rect);
	if(!GET_P4REGPTR()->SetJobFilterWidth( rect.Width() ) )
		AfxMessageBox( IDS_BAD_REGISTRY,  MB_ICONSTOP );
	CDialog::OnOK();
}


void CJobFilter::OnHelpJobFilter() 
{
	AfxGetApp()->WinHelp(TASK_SPECIFYING_JOB_FILTERS);
}

BOOL CJobFilter::OnHelpInfo(HELPINFO* pHelpInfo) 
{
	OnHelpJobFilter();
	return TRUE;
}

void CJobFilter::OnRmvJobFilter() 
{
	CString rmvFilter;

	UpdateData( );

	if(m_ChangeCombo.GetCurSel() != CB_ERR)
		m_ChangeCombo.GetLBText(m_ChangeCombo.GetCurSel(), rmvFilter);
	else
		m_ChangeCombo.GetWindowText( rmvFilter );
	if (rmvFilter.GetLength() > 0)					// if filter is not blank
		GET_P4REGPTR()->RmvMRUFilter( rmvFilter );	// remove it from Reg

	// Reload combobox
	LoadFilterComboBox();

	UpdateData(FALSE);
	GotoDlgCtrl(GetDlgItem(IDC_JOB_FILTER));
}

void CJobFilter::OnJobView() 
{
	// Run p4 user to get the server version
	CCmd_Describe *pCmd = new CCmd_Describe;
	pCmd->Init( NULL, RUN_SYNC );
	BOOL cmdStarted= pCmd->Run( P4USER_SPEC, GET_P4REGPTR()->GetP4User() );
	if(cmdStarted && !pCmd->GetError())
	{
		CString jobView = TheApp()->GetClientSpecField( _T("JobView"), pCmd->GetDescription());

		m_ChangeCombo.SetCurSel(-1);
		m_ChangeCombo.SetWindowText( jobView );
		UpdateData(FALSE);
		GotoDlgCtrl(GetDlgItem(IDC_JOB_FILTER));
	}
	else MessageBeep(0);
	delete pCmd;
}

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

	CWnd *pList=GetDlgItem(IDC_JOB_FILTER);
	if (!pList || !IsWindow(pList->m_hWnd))
		return;

	int w;
	CRect rect;

	GetClientRect(&rect);
	int x = rect.Width();
	ClientToScreen(&rect);
	int edge = rect.left;
	
	pList->GetClientRect(&rect);
	pList->ClientToScreen(&rect);
	pList->SetWindowPos(NULL, 0, 0, 
		w = x - ((rect.left - edge)*2), rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);

	POINT pt;
	pt.x = rect.left + w;
	pt.y = rect.top;
	ScreenToClient(&pt);
	int end = pt.x;

	CWnd *pGbox=GetDlgItem(IDC_GROUPBOX);
	pGbox->GetClientRect(&rect);
	pGbox->ClientToScreen(&rect);
	pGbox->SetWindowPos(NULL, 0, 0, 
		x - ((rect.left - edge)*2), rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);

	CWnd *pButton=GetDlgItem(ID_RMVJOBFILTER);
	pButton->InvalidateRect(NULL, TRUE);
	pButton->GetWindowRect(&rect);
	w=rect.Width();
	int xtra = w/10;
	pt.x = rect.left;
	pt.y = rect.top;
	ScreenToClient(&pt);
	int y = pt.y;
	pButton->SetWindowPos(NULL, end - w, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pButton=GetDlgItem(ID_FORMINFO);
	pButton->InvalidateRect(NULL, TRUE);
	pButton->SetWindowPos(NULL, end - (w*2 + xtra), y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pButton=GetDlgItem(ID_JOBVIEW);
	pButton->InvalidateRect(NULL, TRUE);
	pButton->SetWindowPos(NULL, end - (w*3 + xtra*2), y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pButton=GetDlgItem(ID_HELPJOBFILTER);
	pButton->GetWindowRect(&rect);
	pt.x = rect.left;
	pt.y = rect.top;
	ScreenToClient(&pt);
	y = pt.y;
	pButton->InvalidateRect(NULL, TRUE);
	pButton->SetWindowPos(NULL, end - w, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pButton=GetDlgItem(IDCANCEL);
	pButton->InvalidateRect(NULL, TRUE);
	pButton->SetWindowPos(NULL, end - (w*2 + xtra), y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);

	pButton=GetDlgItem(IDOK);
	pButton->InvalidateRect(NULL, TRUE);
	pButton->SetWindowPos(NULL, end - (w*3 + xtra*2), y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}

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

void CJobFilter::OnClearfilter() 
{
	m_Filter.Empty();
	CDialog::OnOK();
}

void CJobFilter::OnFormInfo()
{
	CCmd_Describe *pCmd = new CCmd_Describe;
	pCmd->Init( m_hWnd, RUN_ASYNC );
	if( pCmd->Run( P4JOB_SPEC, _T("0") ) )
		MainFrame()->UpdateStatus( LoadStringResource(IDS_FETCHING_SPEC) );	
	else
		delete pCmd;
	GotoDlgCtrl(GetDlgItem(IDC_JOB_FILTER));
}

LRESULT CJobFilter::OnP4Describe( WPARAM wParam, LPARAM lParam )
{
	CCmd_Describe *pCmd = ( CCmd_Describe * )wParam;

	MainFrame()->ClearStatus();
	if(!pCmd->GetError())
	{
		int i;
		CString desc = MakeCRs( pCmd->GetDescription( ) );
		if ((i = desc.ReverseFind(_T('#'))) != -1)
		{
			if ((i = desc.Find(_T('\n'), i)) != -1)
				desc = desc.Left(i+1);
		}
		int key;
		CSpecDescDlg *dlg = new CSpecDescDlg(this);
		dlg->SetIsModeless(TRUE);
		dlg->SetKey(key = pCmd->HaveServerLock()? pCmd->GetServerKey() : 0);
		dlg->SetDescription( desc, FALSE );
		dlg->SetCaption( LoadStringResource(IDS_P4WIN_SPECIFICATION_NOTES) );
		dlg->SetWinPosName(_T("JobSpecInfo"));
		CRect rect;
		GetWindowRect(&rect);
		rect.top += rect.Height() - 10;
		rect.bottom = GetSystemMetrics(SM_CYFULLSCREEN);
		rect.right  = GetSystemMetrics(SM_CXFULLSCREEN);
		dlg->SetWinPosDefault(rect);
		if (!dlg->Create(IDD_SPECDESC, this))	// display the description dialog box
		{
			dlg->DestroyWindow();	// some error! clean up
			delete dlg;
		}
	}
	delete pCmd;
	GotoDlgCtrl(GetDlgItem(IDC_JOB_FILTER));
	return 0;
}

LRESULT CJobFilter::OnP4EndDescribe(WPARAM wParam, LPARAM lParam)
{
	CSpecDescDlg *dlg = (CSpecDescDlg *)lParam;
	dlg->DestroyWindow();
	return TRUE;
}
# Change User Description Committed
#1 19924 YourUncleBob Populate -o //guest/perforce_software/p4win/...
//guest/YourUncleBob/p4win/.....
//guest/perforce_software/p4win/main/gui/catchalldlg.cpp
#1 16169 perforce_software Move files to follow new path scheme for branches.
//guest/perforce_software/p4win/gui/catchalldlg.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.