- //
- // Copyright 1997 Nicholas J. Irias. All rights reserved.
- //
- //
- // AddListDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "p4win.h"
- #include "AddListDlg.h"
- #include "AddFilterDlg.h"
- #include "MainFrm.h"
- #include "hlp\p4win.hh"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CAddListDlg dialog
- CAddListDlg::CAddListDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CAddListDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CAddListDlg)
- m_Action = m_Default = 0;
- //}}AFX_DATA_INIT
- m_Initialized = m_bEditAndAdd = FALSE;
- m_InitRect.SetRect(0,0,100,100);
- m_WinPos.SetWindow( this, _T("AddListDlg") );
- m_WarnLimit = _ttoi(GET_P4REGPTR()->GetWarnLimit());
- m_Need2Refresh = FALSE;
- }
- void CAddListDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CAddListDlg)
- DDX_Control(pDX, IDC_ADDCHANGNUM, m_ChangeCombo);
- DDX_Control(pDX, ID_DELETESELECTED, m_Delete);
- DDX_Control(pDX, IDC_STATICRECT, m_StaticRect);
- DDX_Control(pDX, IDOK, m_OK);
- DDX_Control(pDX, IDCANCEL, m_Cancel);
- DDX_Radio(pDX, IDC_ADD, m_Action);
- DDX_Radio(pDX, IDC_DEFAULT1, m_Default);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CAddListDlg, CDialog)
- //{{AFX_MSG_MAP(CAddListDlg)
- ON_BN_CLICKED(ID_DELETESELECTED, OnDeleteselected)
- ON_LBN_SELCHANGE(IDC_THELIST, OnSelchangeList)
- ON_WM_SIZE()
- ON_WM_GETMINMAXINFO()
- ON_BN_CLICKED(IDC_FILTERFILES, OnFilterFiles)
- ON_BN_CLICKED(IDHELP, OnHelp)
- ON_WM_HELPINFO()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- void CAddListDlg::Init(CStringList *strList, CStringList *changeList,
- LPCTSTR selChange, BOOL bEditAndAdd, int key)
- {
- ASSERT_KINDOF(CStringList, strList);
- m_pStrList=strList;
- m_pChangeList=changeList;
- m_SelChange= selChange;
- m_bEditAndAdd= bEditAndAdd;
- m_Initialized=TRUE;
- m_DeletedRows=FALSE;
- m_UserTerminated=FALSE;
- m_Key=key;
- /////////////////////////////////
- // Enumerate the files before the dialog window is crafted
- EnumerateFiles();
- }
- /////////////////////////////////////////////////////////////////////////////
- // CAddListDlg message handlers
- BOOL CAddListDlg::OnInitDialog()
- {
- ASSERT(m_Initialized);
- if(m_UserTerminated)
- return FALSE;
- CDialog::OnInitDialog();
- // Record the initial window size, then see if there is a registry preference
- GetWindowRect(&m_InitRect);
- m_LastRect = m_InitRect;
- CRect rect;
- m_StaticRect.GetWindowRect(&rect);
- ScreenToClient(rect);
- DWORD style= WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |
- LBS_SORT | LBS_STANDARD | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT;
- style |= LBS_EXTENDEDSEL;
- m_Delete.ShowWindow(SW_SHOWNOACTIVATE);
- m_Delete.EnableWindow(FALSE);
- /////////////////////////////
- // Fill in the change list, if present, and select the suggested
- // change number
- POSITION pos;
- if(m_pChangeList != NULL)
- {
- ASSERT(m_pChangeList->GetCount() > 0);
- for(pos=m_pChangeList->GetHeadPosition(); pos != NULL; )
- {
- m_ChangeCombo.AddString(m_pChangeList->GetNext(pos));
- }
- }
- int index;
- ASSERT(!m_SelChange.IsEmpty());
- if( (index=m_ChangeCombo.FindString(-1, m_SelChange))==CB_ERR)
- {
- ASSERT(0); //Why wasnt default value in list?
- index=0;
- }
- m_ChangeCombo.SetCurSel(index);
- if (m_bEditAndAdd)
- {
- if(m_EnumeratedList.GetCount()==1)
- m_Caption=LoadStringResource(IDS_CAPTIONADDONEFILE);
- else
- m_Caption.FormatMessage(IDS_CAPTIONADDSEVERALFILES_n, m_EnumeratedList.GetCount());
- GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_ADD )->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_EDIT)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_BOTH)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_DELETE)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_ADD )->EnableWindow(TRUE);
- GetDlgItem(IDC_EDIT)->EnableWindow(TRUE);
- GetDlgItem(IDC_BOTH)->EnableWindow(TRUE);
- GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);
- #if 0 // Setting the default for these radio buttons
- // has been moved to Settings > Options > Files :-(
- GetDlgItem(IDC_DEFAULT1)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_DEFAULT2)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_DEFAULT3)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_DEFAULT4)->ShowWindow(SW_SHOWNORMAL);
- GetDlgItem(IDC_DEFAULT1)->EnableWindow(TRUE);
- GetDlgItem(IDC_DEFAULT2)->EnableWindow(TRUE);
- GetDlgItem(IDC_DEFAULT3)->EnableWindow(TRUE);
- GetDlgItem(IDC_DEFAULT4)->EnableWindow(TRUE);
- #endif
- m_Action = m_Default = GET_P4REGPTR()->GetDefaultDnDfromExp();
- m_OK.SetWindowText(LoadStringResource(IDS_OK));
- }
- else
- {
- if(m_EnumeratedList.GetCount()==1)
- m_Caption=LoadStringResource(IDS_FOUND_ONE_FILE_FOR_ADD);
- else
- m_Caption.FormatMessage(IDS_FOUND_n_FILES_FOR_ADD, m_EnumeratedList.GetCount());
- }
- SetWindowText(m_Caption);
- /////////////////////////////////
- // Fill the file list
- m_List.CreateEx(WS_EX_CLIENTEDGE, _T("ListBox"), _T(""),style,
- rect.left, rect.top, rect.Width(), rect.Height(),
- this->m_hWnd, (HMENU) IDC_THELIST);
- m_List.SetFont(GetFont());
- for(pos=m_EnumeratedList.GetHeadPosition(); pos != NULL; )
- {
- m_List.AddString(m_EnumeratedList.GetNext(pos));
- }
- UpdateData(FALSE);
- m_WinPos.RestoreWindowPosition();
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- void CAddListDlg::OnDeleteselected()
- {
- for(int i=m_List.GetCount()-1; i>=0; i--)
- {
- if(m_List.GetSel(i))
- {
- m_List.DeleteString(i);
- m_DeletedRows=TRUE;
- }
- }
- m_Delete.EnableWindow(FALSE);
- }
- void CAddListDlg::OnSelchangeList()
- {
- if(m_List.GetSelCount() > 0)
- m_Delete.EnableWindow(TRUE);
- else
- m_Delete.EnableWindow(FALSE);
- }
- void CAddListDlg::OnOK()
- {
- UpdateData();
- m_WinPos.SaveWindowPosition();
- // some files were deleted from the listbox, so
- // rebuild the enumerated list from the listbox
- if(m_DeletedRows)
- {
- CString txt;
- m_EnumeratedList.RemoveAll();
- for(int i=0; i< m_List.GetCount(); i++)
- {
- m_List.GetText(i, txt);
- m_EnumeratedList.AddTail(txt);
- }
- }
- // determine which changelist to add files to
- int index=m_ChangeCombo.GetCurSel();
- CString txt;
- m_ChangeCombo.GetLBText(index, txt);
- if(txt.Compare(LoadStringResource(IDS_DEFAULTCHANGELISTNAME)) == 0)
- m_SelectedChange= 0;
- else if(txt.Compare(LoadStringResource(IDS_NEWCHANGELISTNAME)) == 0)
- {
- m_SelectedChange= MainFrame()->CreateNewChangeList(m_Key);
- if (m_SelectedChange == -1) // the user bailed
- return;
- m_Need2Refresh = TRUE;
- }
- else
- m_SelectedChange=_ttol(txt);
- GET_P4REGPTR()->SetDefaultDnDfromExp(m_Default);
- CDialog::OnOK();
- }
- BOOL CAddListDlg::EnumerateFiles()
- {
- m_AddFileCount=0;
- BOOL success=TRUE;
- // Recurse any directories in files list, placing enumerated files into
- // the 'files' list
- POSITION pos=m_pStrList->GetHeadPosition();
- for( int i=0; pos != NULL && success; i++)
- success=AddPath(&m_EnumeratedList, m_pStrList->GetNext(pos));
- return success;
- }
- // Recursive routine to get all subdirs added
- BOOL CAddListDlg::AddPath(CStringList *pList, LPCTSTR path)
- {
- BOOL success=TRUE;
- // Process any accumulated messages
- if (!MainFrame()->IsQuitting())
- {
- MSG msg;
- while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- if (msg.message == WM_QUIT)
- // App was just terminated
- return FALSE;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- // Is path a directory or a file?
- WIN32_FIND_DATA fileInfo;
- HANDLE hFile=FindFirstFile(path, &fileInfo);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- success= FALSE;
- goto ReportErrors;
- }
- FindClose(hFile);
- if( (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
- {
- // Its a file, so just add the one file
- pList->AddHead(path);
- m_AddFileCount++;
- // Every m_WarnLimit, check with user to see if we are out of
- // control.
- if(m_WarnLimit && (m_AddFileCount%m_WarnLimit) == 0 )
- {
- if(VerifyOKToContinue() != IDYES)
- {
- success=FALSE;
- m_UserTerminated=TRUE;
- goto ReportErrors;
- }
- if (m_WarnLimit < 10)
- m_WarnLimit = 5000;
- }
- }
- else
- {
- // Its a directory, so enumerate its contents
- CString subPath(path);
- subPath += _T("\\*.*");
- hFile=FindFirstFile(subPath, &fileInfo);
- if(hFile == INVALID_HANDLE_VALUE)
- {
- success= FALSE;
- goto ReportErrors;
- }
- CString fullName;
- while(1)
- {
- if(lstrcmp(fileInfo.cFileName, _T(".")) !=0 && lstrcmp(fileInfo.cFileName, _T("..")) !=0)
- {
- fullName=path;
- fullName += _T("\\");
- fullName += fileInfo.cFileName;
- if( (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY)
- {
- // Add files directly
- pList->AddHead(fullName);
- m_AddFileCount++;
- if( (m_AddFileCount%m_WarnLimit) == 0 &&
- VerifyOKToContinue() != IDYES )
- {
- success=FALSE;
- m_UserTerminated=TRUE;
- break;
- }
- }
- else
- {
- // Make a recursive call to AddPath for directories
- if(!AddPath(pList, fullName))
- {
- success=FALSE;
- break;
- }
- }
- }
- if( !FindNextFile(hFile, &fileInfo) )
- break;
- }
- FindClose(hFile);
- }
- ReportErrors:
- if(!success && !m_UserTerminated)
- {
- DWORD errNo=GetLastError();
- if(errNo != 0) // Avoid showing same message too many times
- {
- LPVOID lpMsgBuf;
- FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, errNo, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf, 0, NULL );
- // Display the string.
- CString msg = (LPCTSTR)lpMsgBuf;
- if (errNo == 0x7B)
- {
- CString p = path;
- if (p.ReverseFind(_T(':')) != 1)
- msg += LoadStringResource(IDS_CANTADDLNKVIAFILEADD);
- }
- AfxMessageBox(msg + _T('\n') + path, MB_OK|MB_ICONERROR );
- // Free the buffer.
- LocalFree( lpMsgBuf );
- SetLastError(0);
- }
- }
- return success;
- }
- UINT CAddListDlg::VerifyOKToContinue()
- {
- CString warning;
- if(m_AddFileCount == m_WarnLimit)
- warning.FormatMessage(IDS_THIS_FILE_ADD_OPERATION_HAS_ALREADY_FOUND_OVER_n, m_AddFileCount);
- else
- warning.FormatMessage(IDS_THIS_FILE_ADD_OPERATION_HAS_NOW_ADDED_n, m_AddFileCount);
- return AfxMessageBox(warning, MB_YESNO|MB_ICONEXCLAMATION);
- }
- int CAddListDlg::DoModal()
- {
- if(m_UserTerminated)
- return IDCANCEL;
- else
- return CDialog::DoModal();
- }
- void CAddListDlg::OnSize(UINT nType, int cx, int cy)
- {
- CDialog::OnSize(nType, cx, cy);
- if (!m_List || !IsWindow(m_List.m_hWnd))
- 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 and group boxes by the change in width (dx) and
- // heighten the list and group boxes by the change in height (dy)
- m_List.GetWindowRect(&rect);
- m_List.SetWindowPos(NULL, 0, 0, rect.right - rect.left + dx,
- rect.bottom - rect.top + dy, SWP_NOMOVE | SWP_NOZORDER);
- CWnd *pWnd = GetDlgItem(IDC_STATIC3);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, 0, 0, rect.right - rect.left + dx,
- rect.bottom - rect.top + dy, SWP_NOMOVE | SWP_NOZORDER);
- // Slide other controls down by change in height
- pWnd = GetDlgItem(IDC_ADDPROMPT);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_ADDCHANGNUM);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_STATIC1);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_ADD);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_EDIT);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_BOTH);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_DELETE);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_DEFAULT1);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_DEFAULT2);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_DEFAULT3);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(IDC_DEFAULT4);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- // Slide the buttons to the right by the change in width
- // and down by the change in height
- pWnd = GetDlgItem(IDC_FILTERFILES);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- pWnd = GetDlgItem(ID_DELETESELECTED);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- 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(IDHELP);
- pWnd->GetWindowRect(&rect);
- ScreenToClient(rect);
- pWnd->SetWindowPos(NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
- InvalidateRect(NULL, TRUE);
- }
- void CAddListDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
- {
- if (m_InitRect.Height())
- {
- lpMMI->ptMinTrackSize.x= m_InitRect.Width();
- lpMMI->ptMinTrackSize.y= m_InitRect.Height();
- }
- }
- void CAddListDlg::OnFilterFiles()
- {
- CAddFilterDlg dlg;
- CString itemtext;
- CString ext;
- BOOL bFound;
- POSITION pos;
- dlg.m_Extensions = GET_P4REGPTR()->GetAddFileExtFilter();
- if (dlg.DoModal( ) == IDOK)
- {
- GET_P4REGPTR()->SetAddFileExtFilter(dlg.m_Extensions);
- for (int i = m_List.GetCount(); i--; )
- {
- m_List.GetText( i, itemtext );
- for(bFound = FALSE, pos=dlg.m_Exts.GetHeadPosition(); pos != NULL; )
- {
- ext = '.' + dlg.m_Exts.GetNext(pos);
- if (!ext.CompareNoCase(itemtext.Right(ext.GetLength())))
- {
- bFound = TRUE;
- if (dlg.m_Exclude)
- {
- m_List.DeleteString(i);
- m_DeletedRows=TRUE;
- }
- break;
- }
- }
- if (!dlg.m_Exclude && !bFound)
- {
- m_List.DeleteString(i);
- m_DeletedRows=TRUE;
- }
- }
- };
- }
- void CAddListDlg::OnHelp()
- {
- AfxGetApp()->WinHelp(TASK_ADDING_FILES_TO_DEPOT);
- }
- BOOL CAddListDlg::OnHelpInfo(HELPINFO* pHelpInfo)
- {
- OnHelp();
- return TRUE;
- }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
9 years ago | |
//guest/perforce_software/p4win/main/gui/AddListDlg.cpp | |||||
#1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | 9 years ago | |
//guest/perforce_software/p4win/gui/AddListDlg.cpp | |||||
#1 | 8562 | Matt Attaway | These feet never stop running. Initial commit of the P4Win source code. To the be...st 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. « |
11 years ago |