- // NewWindowDlg.cpp : implementation file
- //
- // This not only handles the creation of a new window with different (or even the same)
- // port-client-user [PCU] (which was its first function, hence the name of the file and class),
- // but it now also provides an easy method of switching the port and/or client and/or user
- // for the current window. In addition it allows the deletion of unwanted PCUs from the
- // list of Most Recently Used [MRU] PCUs.
- #include "stdafx.h"
- #include "p4win.h"
- #include "NewWindowDlg.h"
- #include "MainFrm.h"
- #include "P4Object.h"
- #include "P4ListBrowse.h"
- #include "ImageList.h"
- #include "cmd_clients.h"
- #include "cmd_users.h"
- #include "hlp\p4win.hh"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CNewWindowDlg dialog
- CNewWindowDlg::CNewWindowDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CNewWindowDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CNewWindowDlg)
- m_client = GET_P4REGPTR()->GetP4Client();
- m_port = GET_P4REGPTR()->GetP4Port();
- m_user = GET_P4REGPTR()->GetP4User();
- m_SetDefClient = FALSE;
- m_SetDefPort = FALSE;
- m_SetDefUser = FALSE;
- m_StartWith = GET_P4REGPTR()->GetP4StartWith();
- //}}AFX_DATA_INIT
- m_bSamePort = TRUE;
- }
- void CNewWindowDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CNewWindowDlg)
- DDX_Control(pDX, IDC_PORT, m_PortCombo);
- DDX_Text(pDX, IDC_CLIENT, m_client);
- DDV_MaxChars(pDX, m_client, 1024);
- DDX_Text(pDX, IDC_USER, m_user);
- DDX_Control(pDX, IDC_PORTCLIENTUSER, m_PCUcombo);
- DDX_Check(pDX, IDC_SETDEFCLIENT, m_SetDefClient);
- DDX_Check(pDX, IDC_SETDEFPORT, m_SetDefPort);
- DDX_Check(pDX, IDC_SETDEFUSER, m_SetDefUser);
- DDX_Radio(pDX, IDC_STARTWITHMRUPCU, m_StartWith);
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CNewWindowDlg, CDialog)
- //{{AFX_MSG_MAP(CNewWindowDlg)
- ON_CBN_SELCHANGE(IDC_PORTCLIENTUSER, OnSelchangePortclientuser)
- ON_CBN_EDITCHANGE(IDC_PORTCLIENTUSER, OnEditchangePortclientuser)
- ON_EN_SETFOCUS(IDC_CLIENT, OnSetfocusOther)
- ON_BN_CLICKED(IDC_NEW_WINDOW, OnNewWindow)
- ON_BN_CLICKED(IDC_SETDEFALL, OnSetdefall)
- ON_BN_CLICKED(IDC_REMOVE, OnRemove)
- ON_BN_CLICKED(IDHELP, OnHelp)
- ON_BN_CLICKED(IDC_OPEN, OnOK)
- ON_CBN_SELCHANGE(IDC_PORT, OnSelchangePort)
- ON_CBN_EDITCHANGE(IDC_PORT, OnEditchangePort)
- ON_CBN_SETFOCUS(IDC_PORT, OnSetfocusOther)
- ON_EN_SETFOCUS(IDC_USER, OnSetfocusOther)
- ON_BN_CLICKED(IDC_STARTWITHDEFAULTS, OnStartwithdefaults)
- ON_BN_CLICKED(IDC_STARTWITHMRUPCU, OnStartwithmrupcu)
- ON_BN_CLICKED(IDC_BROWSE_CLIENTS, OnBrowseClients)
- ON_BN_CLICKED(IDC_BROWSE_USERS, OnBrowseUsers)
- ON_WM_HELPINFO()
- ON_MESSAGE(WM_P4CLIENTS, OnP4ClientList )
- ON_MESSAGE(WM_BROWSECALLBACK1, OnBrowseClientsCallBack)
- ON_MESSAGE(WM_P4USERS, OnP4UserList )
- ON_MESSAGE(WM_BROWSECALLBACK2, OnBrowseUsersCallBack)
- ON_MESSAGE(WM_BROWSECLIENTS, OnDoBrowseClients)
- ON_MESSAGE(WM_BROWSEUSERS, OnDoBrowseUsers)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CNewWindowDlg message handlers
- BOOL CNewWindowDlg::OnInitDialog()
- {
- CString str;
- int j;
- CDialog::OnInitDialog();
- if (m_StartWith == 0)
- OnStartwithmrupcu();
- // Get the current port-client-user setting
- CString m_OrigPcu = GET_P4REGPTR()->GetMRUPcu(0);
- if ((j = m_OrigPcu.Find(_T('@'))) > 0)
- m_OrigPcu = m_OrigPcu.Left(j);
- // Make sure the combo is empty
- m_PCUcombo.Clear();
- // Load all MRU pcus into list box
- for(int i=0; i < MAX_MRU_PCUS; i++)
- {
- if(GET_P4REGPTR()->GetMRUPcu(i).GetLength() > 0)
- {
- str = GET_P4REGPTR()->GetMRUPcu(i);
- if ((j = str.Find(_T('@'))) > 0)
- str = str.Left(j);
- m_PCUcombo.AddString(str);
- }
- }
- // Select the current PCU item
- m_PCUcombo.SetCurSel(m_PCUcombo.FindStringExact(-1, m_OrigPcu));
- LoadPortCombo();
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- // This routine loads m_port as the 1st item in the m_PortCombo
- void CNewWindowDlg::LoadPortCombo()
- {
- // Make sure we have the current port setting first in the combo box
- if (m_port.GetLength() > 0)
- GET_P4REGPTR()->AddMRUPort( m_port, GET_P4REGPTR()->GetP4Charset() );
- // Make sure the combo is empty
- m_PortCombo.ResetContent();
- // Load all MRU ports into list box
- for(int i=0; i < MAX_MRU_PORTS; i++)
- {
- if(GET_P4REGPTR()->GetMRUPort(i).GetLength() > 0)
- {
- CString str = GET_P4REGPTR()->GetMRUPort(i);
- if( str.Find(_T(" ")) != -1 )
- str = _T("\"") + str + _T("\"");
- m_PortCombo.AddString(str);
- }
- }
- // Select the first item
- m_PortCombo.SetCurSel(0);
- OnSelchangePort();
- }
- void CNewWindowDlg::OnSelchangePortclientuser()
- {
- if(m_PCUcombo.GetCurSel() != CB_ERR)
- {
- CString pcuStr;
- m_PCUcombo.GetLBText(m_PCUcombo.GetCurSel(), pcuStr);
- m_PCUcombo.SetWindowText( pcuStr );
- }
- else
- m_PCUcombo.SetWindowText(_T(""));
- OnEditchangePortclientuser();
- }
- void CNewWindowDlg::OnEditchangePortclientuser()
- {
- int i;
- int firstsep;
- int secondsep;
- UpdateData();
- CString pcuStr;
- // Get the current text in the combobox's edit control
- if ((i = m_PCUcombo.GetCurSel()) >= 0)
- m_PCUcombo.GetLBText(i, pcuStr);
- else m_PCUcombo.GetWindowText(pcuStr);
- // find the separators (spaces or quotes)
- if (pcuStr.GetAt(0) == _T('\"'))
- firstsep = pcuStr.Find(_T('\"'),1) + 1;
- else
- firstsep = pcuStr.Find(_T(' '));
- secondsep= pcuStr.Find(_T(' '), firstsep+1);
- // set the 3 port, client and user edit controls
- if (firstsep > 0 && secondsep > 0)
- {
- m_port = pcuStr.Left(firstsep);
- m_port.TrimLeft(_T('\"'));
- m_port.TrimRight(_T('\"'));
- m_client= pcuStr.Mid(firstsep+1, secondsep - firstsep - 1);
- m_user = pcuStr.Right(pcuStr.GetLength() - secondsep - 1);
- LoadPortCombo();
- UpdateData(FALSE);
- }
- }
- void CNewWindowDlg::OnSelchangePort()
- {
- if(m_PortCombo.GetCurSel() != CB_ERR)
- {
- CString port;
- m_PortCombo.GetLBText(m_PortCombo.GetCurSel(), port);
- m_PortCombo.SetWindowText( port );
- }
- OnEditchangePort();
- }
- void CNewWindowDlg::OnEditchangePort()
- {
- CString port;
- m_PortCombo.GetWindowText( port );
- port.TrimRight();
- port.TrimLeft();
- if( port.GetAt(0) == _T('\"'))
- {
- port.TrimRight(_T('\"'));
- port.TrimLeft(_T('\"'));
- }
- BOOL b = port.GetLength() > 0;
- m_bSamePort = b && port == GET_P4REGPTR()->GetP4Port();
- if (!m_bSamePort)
- {
- if (b)
- {
- b = _istdigit(port.GetAt(port.GetLength()-1)) && port.Find(_T(' ')) == -1;
- if (b && !_istdigit(port.GetAt(0)))
- b = port.Find(_T(':')) > 0;
- }
- }
- GetDlgItem(IDC_BROWSE_CLIENTS)->EnableWindow(b);
- GetDlgItem(IDC_BROWSE_USERS)->EnableWindow(b);
- }
- void CNewWindowDlg::OnSetfocusOther()
- {
- OnSelchangePort();
- m_PCUcombo.SetWindowText(_T("")); // clear the combobox's edit control if the
- // combobox loses focus
- CEdit *wnd = (CEdit *)GetFocus();
- wnd->SetSel(0, -1); // select the entire field that is receiving focus
- }
- void CNewWindowDlg::OnOK() // OK pressed => set this window to new PCU values
- { // and/or remove any strings requested to be removed
- BOOL bUpdateCapt;
- CString old_client = GET_P4REGPTR()->GetP4Client();
- CString old_port = GET_P4REGPTR()->GetP4Port();
- CString old_user = GET_P4REGPTR()->GetP4User();
- UpdateData();
- if ( EditPort( ) == FALSE )
- return;
- GET_P4REGPTR()->SetP4StartWith(m_StartWith);
- if ( !m_RmvMRUPcu.IsEmpty() ) // if they wanted to remove some PCU strings
- {
- ReloadMRUPcu(); // now actually do the remove
- bUpdateCapt = TRUE;
- }
- else bUpdateCapt = FALSE;
- if (!m_client.IsEmpty() || !m_port.IsEmpty() || !m_user.IsEmpty()
- || m_SetDefPort || m_SetDefClient || m_SetDefUser) // Anything to change?
- {
- // if any of port. client or user is not given, use the current setting
- if (m_port.IsEmpty())
- m_port = old_port;
- if (m_client.IsEmpty())
- m_client = old_client;
- if (m_user.IsEmpty())
- m_user = old_user;
- m_port.TrimLeft(_T('\"'));
- m_port.TrimRight(_T('\"'));
- if (GET_P4REGPTR()->GetExpandFlag() == 1)
- GET_P4REGPTR()->AddMRUPcuPath(((CMainFrame *) AfxGetMainWnd())->GetCurrentItemPath());
- // change only the ones that are different
- if ((m_port != old_port) || m_SetDefPort)
- GET_P4REGPTR()->SetP4Port(m_port, TRUE, m_SetDefPort, m_SetDefPort);
- if ((m_user != old_user) || m_SetDefUser)
- if (!GET_P4REGPTR()->SetP4User(m_user, TRUE, m_SetDefUser, m_SetDefUser))
- AfxMessageBox( IDS_UNABLE_TO_WRITE_P4USER_TO_THE_REGISTRY, MB_ICONEXCLAMATION);
- if ((m_client != old_client) || m_SetDefClient)
- {
- if(!MainFrame()->ClientSpecSwitch(m_client, TRUE, old_port != m_port))// calls OnPerforceOptions()
- { // put the old stuff back for port and user if client switch failed
- if (m_port != old_port)
- GET_P4REGPTR()->SetP4Port(old_port, TRUE, m_SetDefPort, m_SetDefPort);
- if (m_user != old_user)
- GET_P4REGPTR()->SetP4User(old_user, TRUE, m_SetDefUser, m_SetDefUser);
- return;
- }
- else // switch worked - check if need to set default also
- {
- if (m_SetDefClient)
- if (!GET_P4REGPTR()->SetP4Client(m_client, TRUE, TRUE, TRUE))
- AfxMessageBox(IDS_UNABLE_TO_WRITE_P4CLIENT_TO_THE_REGISTRY,
- MB_ICONEXCLAMATION);
- }
- }
- else
- MainFrame()->OnPerforceOptions(FALSE, old_port != m_port);// if not changing client, need to call this for port/user chg
- }
- else if (bUpdateCapt)
- MainFrame()->UpdateCaption(); // updates Settings menu items
- CDialog::OnOK();
- }
- void CNewWindowDlg::OnNewWindow() // Spawn a new P4win with the requested PCU
- {
- HKEY hKey = NULL;
- CString sKey = _T("Software\\Perforce\\environment\\");
- TCHAR path[_MAX_PATH+1];
- DWORD disposition;
- UpdateData();
- if ( EditPort( ) == FALSE )
- return;
- GET_P4REGPTR()->SetP4StartWith(m_StartWith);
- if ( !m_RmvMRUPcu.IsEmpty() ) // if they wanted to remove some PCU strings
- ReloadMRUPcu(); // now actually go do the remove
- // if any of port. client or user is not given, use the current setting
- if (m_port.IsEmpty())
- m_port = GET_P4REGPTR()->GetP4Port();
- if (m_client.IsEmpty())
- m_client = GET_P4REGPTR()->GetP4Client();
- if (m_user.IsEmpty())
- m_user = GET_P4REGPTR()->GetP4User();
- m_port.TrimLeft(_T('\"'));
- m_port.TrimRight(_T('\"'));
- // Fudge the location of the new window by telling it we last shutdown +10, +10
- // from where we actually did
- // The registry will be rewritten by both P4wins when they shutdown.
- CRect rect= GET_P4REGPTR()->GetWindowPosition();
- rect.SetRect( rect.left+10, rect.top+10, rect.right+10, rect.bottom+10 );
- GET_P4REGPTR()->SetWindowPosition(rect);
- // Set default registry entries if requested
- if ( m_SetDefPort || m_SetDefClient || m_SetDefUser )
- {
- LONG rc = RegCreateKeyEx( HKEY_CURRENT_USER, sKey,
- 0, NULL,
- REG_OPTION_NON_VOLATILE,
- KEY_WRITE, NULL,
- &hKey, &disposition );
- if (rc == ERROR_SUCCESS )
- {
- if (m_SetDefPort)
- rc = RegSetValueEx( hKey, _T("P4PORT"), NULL, REG_SZ,
- (LPBYTE)(LPCTSTR) m_port, m_port.GetLength( ) * sizeof(TCHAR) + 1);
- if (m_SetDefClient)
- rc = RegSetValueEx( hKey, _T("P4CLIENT"), NULL, REG_SZ,
- (LPBYTE)(LPCTSTR) m_client, m_client.GetLength( ) * sizeof(TCHAR) + 1);
- if (m_SetDefUser)
- rc = RegSetValueEx( hKey, _T("P4USER"), NULL, REG_SZ,
- (LPBYTE)(LPCTSTR) m_user, m_user.GetLength( ) * sizeof(TCHAR) + 1);
- RegCloseKey( hKey );
- }
- if (rc != ERROR_SUCCESS )
- {
- LPVOID lpMsgBuf;
- FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- rc,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,
- 0,
- NULL
- );
- CString msg;
- msg.FormatMessage(IDS_FAILEDREGWRITE, (TCHAR *)lpMsgBuf);
- AfxMessageBox(msg, MB_OK|MB_ICONERROR );
- }
- }
- if (GET_P4REGPTR()->GetExpandFlag() == 1)
- GET_P4REGPTR()->AddMRUPcuPath(MainFrame()->GetCurrentItemPath());
- // and finally spawn a new P4win
- STARTUPINFO si;
- memset(&si, 0, sizeof(si));
- si.cb = sizeof(si);
- PROCESS_INFORMATION pi;
- if( !GetModuleFileName(GetModuleHandle(NULL), path, sizeof(path)/sizeof(TCHAR)-1) ||
- !_stprintf(path + lstrlen(path), _T(" -q -p %s -c %s -u %s"), m_port, m_client, m_user) ||
- !CreateProcess(NULL, path,
- NULL, NULL,
- #ifdef UNICODE
- FALSE, DETACHED_PROCESS | NORMAL_PRIORITY_CLASS | CREATE_UNICODE_ENVIRONMENT,
- #else
- FALSE, DETACHED_PROCESS | NORMAL_PRIORITY_CLASS,
- #endif
- NULL, NULL, &si, &pi))
- {
- AfxMessageBox(IDS_UNABLE_TO_START_NEW_P4WIN_WINDOW, MB_OK | MB_ICONSTOP);
- }
- CDialog::OnOK();
- }
- BOOL CNewWindowDlg::EditPort()
- {
- CString origPort = m_port;
- m_PortCombo.GetWindowText( m_port );
- m_port.TrimRight();
- m_port.TrimLeft();
- if (!m_port.GetLength()) // if the port field is empty, put back the original port
- m_port = origPort;
- if( m_port.GetAt(0) == _T('\"'))
- {
- m_port.TrimRight(_T('\"'));
- m_port.TrimLeft(_T('\"'));
- }
- if (m_port.GetLength() > 0)
- GET_P4REGPTR()->AddMRUPort( m_port, GET_P4REGPTR()->GetP4Charset() );
- return TRUE;
- }
- void CNewWindowDlg::OnSetdefall() // they pressed the "set all to defualt" button
- {
- UpdateData();
- m_SetDefClient = TRUE;
- m_SetDefPort = TRUE;
- m_SetDefUser = TRUE;
- UpdateData(FALSE);
- }
- void CNewWindowDlg::OnRemove() // they want to remove a PCU string from the MRU list
- {
- int i;
- UpdateData();
- CString txtStr;
- m_PCUcombo.GetWindowText(txtStr);
- CString pcuStr;
- if ((i = m_PCUcombo.GetCurSel()) >= 0)
- {
- m_PCUcombo.GetLBText(i, pcuStr);// get the current selection in the combobox
- if (pcuStr == txtStr)
- {
- m_PCUcombo.DeleteString(i); // remove that string from the combobox
- m_PCUcombo.SetCurSel(-1); // make nothing selected in the combobox
- m_client.Empty();
- m_port.Empty(); // clear the 3 p c u edit controls
- m_user.Empty();
- m_PortCombo.SetWindowText(_T(""));
- UpdateData(FALSE);
- m_RmvMRUPcu.AddHead(pcuStr); // add this string to the list to be actually removed
- } // when they press OK or NewWindow (can't actually
- else // remove now cuz they might press Cancel!)
- MessageBeep(0);
- }
- else
- {
- MessageBeep(0);
- }
- m_PCUcombo.SetFocus();
- }
- void CNewWindowDlg::ReloadMRUPcu() // reload the Reg's MRU strings and remove ones to be removed
- {
- POSITION pos = m_RmvMRUPcu.GetHeadPosition();
- CString pcuStr;
- while (pos) // while there are strings that are to be removed, ask P4Registry.cpp to remove them
- {
- pcuStr = m_RmvMRUPcu.GetNext(pos);
- GET_P4REGPTR()->RmvMRUPcu(pcuStr);
- }
- }
- void CNewWindowDlg::OnHelp()
- {
- AfxGetApp()->WinHelp(TASK_SWITCHING_CLIENT_WORKSPACE);
- }
- BOOL CNewWindowDlg::OnHelpInfo(HELPINFO* pHelpInfo)
- {
- OnHelp();
- return TRUE;
- }
- void CNewWindowDlg::OnStartwithmrupcu()
- {
- GetDlgItem(IDC_SETDEFPORT)->EnableWindow(FALSE);
- GetDlgItem(IDC_SETDEFCLIENT)->EnableWindow(FALSE);
- GetDlgItem(IDC_SETDEFUSER)->EnableWindow(FALSE);
- GetDlgItem(IDC_SETDEFALL)->EnableWindow(FALSE);
- }
- void CNewWindowDlg::OnStartwithdefaults()
- {
- GetDlgItem(IDC_SETDEFPORT)->EnableWindow(TRUE);
- GetDlgItem(IDC_SETDEFCLIENT)->EnableWindow(TRUE);
- GetDlgItem(IDC_SETDEFUSER)->EnableWindow(TRUE);
- GetDlgItem(IDC_SETDEFALL)->EnableWindow(TRUE);
- }
- LRESULT CNewWindowDlg::OnDoBrowseClients(WPARAM wParam, LPARAM lParam)
- {
- OnBrowseClients();
- return 0;
- }
- void CNewWindowDlg::OnBrowseClients()
- {
- if (m_bSamePort)
- {
- ::SendMessage(MainFrame()->ClientWnd(), WM_FETCHOBJECTLIST,
- (WPARAM)(this->m_hWnd), WM_BROWSECALLBACK1);
- }
- else if (EditPort())
- {
- CString old_port = GET_P4REGPTR()->GetP4Port();
- CString old_user = GET_P4REGPTR()->GetP4User();
- UpdateData(TRUE);
- GET_P4REGPTR()->SetP4Port(m_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(m_user, TRUE, FALSE, FALSE);
- CCmd_Clients *pCmd= new CCmd_Clients;
- pCmd->Init( m_hWnd, RUN_ASYNC );
- if( pCmd->Run( ) )
- MainFrame()->UpdateStatus( LoadStringResource(IDS_REQUESTING_CLIENT_LISTING) );
- else
- delete pCmd;
- SET_BUSYCURSOR();
- do
- {
- if ( !MainFrame()->PumpMessages( ) )
- break;
- Sleep(100);
- } while (SERVER_BUSY());
- GET_P4REGPTR()->SetP4Port(old_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(old_user, TRUE, FALSE, FALSE);
- }
- }
- LRESULT CNewWindowDlg::OnP4ClientList(WPARAM wParam, LPARAM lParam)
- {
- CCmd_Clients *pCmd= (CCmd_Clients *) wParam;
- if(!pCmd->GetError())
- {
- SET_APP_HALTED(TRUE);
- // Get the column names and count
- CStringArray cols;
- int nbrcols = MainFrame()->GetClientColNamesAndCount(cols);
- CString subkey = _T("Client List");
- CObList const *clients = pCmd->GetList();
- CObList *objs = new CObList;
- int index = 0; // initialized only to make the compiler shutup
- BOOL isFiltered = GET_P4REGPTR()->GetClientFilteredFlags();
- if ( isFiltered )
- index = LoadClientList(clients, objs, nbrcols, TRUE);
- if( !isFiltered || objs->GetCount() == 0 )
- index = LoadClientList(clients, objs, nbrcols, isFiltered = FALSE);
- if( objs->GetCount() == 0 )
- {
- CString txt;
- txt.FormatMessage(IDS_NO_s_AVAILABLE, LoadStringResource(IDS_PERFORCE_CLIENTS));
- AfxMessageBox(txt, MB_ICONEXCLAMATION);
- SET_APP_HALTED(FALSE);
- }
- else while (1)
- {
- CString msg;
- msg.FormatMessage( IDS_NUMBER_OF_CLIENTS_n, index );
- MainFrame()->UpdateStatus( msg );
- CString caption = LoadStringResource(IDS_PERFORCE_CLIENTS);
- if (isFiltered)
- caption += LoadStringResource(IDS_FILTERED_INPAREN);
- // Display the dialog box.
- CP4ListBrowse dlg(&(MainFrame()->GetClientView()->GetListCtrl()));
- dlg.SetP4ObjectFont(GetFont());
- dlg.SetP4ObjectType(P4CLIENT_SPEC);
- dlg.SetP4ObjectList(objs);
- dlg.SetP4ObjectCols(&cols);
- dlg.SetP4ObjectCurr(&m_client);
- dlg.SetP4ObjectSKey(&subkey);
- dlg.SetP4ObjectCaption(&caption);
- dlg.SetP4ObjectImage(CP4ViewImageList::VI_CLIENT);
- dlg.SetP4ObjectIsFiltered(isFiltered);
- CString old_port;
- CString old_user;
- if (!m_bSamePort)
- {
- old_port = GET_P4REGPTR()->GetP4Port();
- old_user = GET_P4REGPTR()->GetP4User();
- GET_P4REGPTR()->SetP4Port(m_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(_T(""), TRUE, FALSE, FALSE);
- }
- int retcode= dlg.DoModal();
- if (!m_bSamePort)
- {
- GET_P4REGPTR()->SetP4Port(old_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(old_user, TRUE, FALSE, FALSE);
- }
- SET_APP_HALTED(FALSE);
- CString *objname= dlg.GetSelectedP4Object();
- if(retcode == IDOK && !objname->IsEmpty())
- ::SendMessage(m_hWnd, WM_BROWSECALLBACK1, 0, (LPARAM)objname);
- else if (retcode == IDC_REFRESH)
- {
- if (isFiltered)
- {
- isFiltered = FALSE;
- index = LoadClientList(clients, objs, nbrcols, FALSE);
- continue;
- }
- else
- PostMessage(WM_BROWSECLIENTS, 0, 0);
- }
- // Delete the object list
- for(POSITION pos=objs->GetHeadPosition(); pos!=NULL; )
- delete (CP4Object *) objs->GetNext(pos);
- break;
- }
- delete objs;
- for(POSITION pos= clients->GetHeadPosition(); pos != NULL; )
- {
- CP4Client *client = (CP4Client *) clients->GetNext(pos);
- delete client;
- }
- }
- delete pCmd;
- MainFrame()->ClearStatus();
- return 0;
- }
- int CNewWindowDlg::LoadClientList(CObList const *clients, CObList *objs, int nbrcols, BOOL bFilter)
- {
- CString str;
- int index = 0;
- for(POSITION pos= clients->GetHeadPosition(); pos != NULL; index++)
- {
- CP4Client *client = (CP4Client *) clients->GetNext(pos);
- if (bFilter)
- {
- if (MainFrame()->IsClientFilteredOut(client, &m_user))
- continue;
- }
- int subitem;
- CP4Object *newObj= new CP4Object();
- for (subitem = -1; ++subitem < nbrcols; )
- {
- switch(subitem)
- {
- case 0:
- str = client->GetClientName();
- break;
- case 1:
- str = client->GetOwner();
- break;
- case 2:
- str = client->GetHost();
- break;
- case 3:
- str = client->GetDate();
- break;
- case 4:
- str = client->GetRoot();
- break;
- case 5:
- str = client->GetDescription();
- break;
- default:
- ASSERT(0);
- continue;
- }
- if (!subitem)
- newObj->Create(str);
- else
- newObj->AddField(str);
- }
- objs->AddHead(newObj);
- }
- return index;
- }
- LRESULT CNewWindowDlg::OnBrowseClientsCallBack(WPARAM wParam, LPARAM lParam)
- {
- UpdateData(TRUE);
- CString *str = (CString *)lParam;
- m_client = *str;
- UpdateData(FALSE);
- return 0;
- }
- LRESULT CNewWindowDlg::OnDoBrowseUsers(WPARAM wParam, LPARAM lParam)
- {
- OnBrowseUsers();
- return 0;
- }
- void CNewWindowDlg::OnBrowseUsers()
- {
- if (m_bSamePort)
- {
- ::SendMessage(MainFrame()->UserWnd(), WM_FETCHOBJECTLIST,
- (WPARAM)(this->m_hWnd), WM_BROWSECALLBACK2);
- }
- else if (EditPort())
- {
- CString old_port = GET_P4REGPTR()->GetP4Port();
- CString old_user = GET_P4REGPTR()->GetP4User();
- GET_P4REGPTR()->SetP4Port(m_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(_T(""), TRUE, FALSE, FALSE);
- CCmd_Users *pCmd= new CCmd_Users;
- pCmd->Init( m_hWnd, RUN_ASYNC );
- if( pCmd->Run( ) )
- MainFrame()->UpdateStatus( LoadStringResource(IDS_REQUESTING_USER_LISTING) );
- else
- delete pCmd;
- SET_BUSYCURSOR();
- int i = 0;
- do
- {
- Sleep(200);
- } while (SERVER_BUSY() && ++i < 10);
- GET_P4REGPTR()->SetP4Port(old_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(old_user, TRUE, FALSE, FALSE);
- }
- }
- LRESULT CNewWindowDlg::OnP4UserList(WPARAM wParam, LPARAM lParam)
- {
- CCmd_Users *pCmd= (CCmd_Users *) wParam;
- if(!pCmd->GetError())
- {
- SET_APP_HALTED(TRUE);
- // Get the column names and count
- CStringArray cols;
- int nbrcols = MainFrame()->GetUserColNamesAndCount(cols);
- CString str;
- CString caption = LoadStringResource(IDS_PERFORCE_USERS);
- CString subkey = _T("User List");
- CObList const *users = pCmd->GetList();
- CObList *objs = new CObList;
- int index = 0;
- for(POSITION pos= users->GetHeadPosition(); pos != NULL; index++)
- {
- CP4User *user = (CP4User *) users->GetNext(pos);
- int subitem;
- CP4Object *newObj= new CP4Object();
- for (subitem = -1; ++subitem < nbrcols; )
- {
- switch(subitem)
- {
- case 0:
- str = user->GetUserName();
- break;
- case 1:
- str = user->GetEmail();
- break;
- case 2:
- str = user->GetFullName();
- break;
- case 3:
- str = user->GetLastAccess();
- break;
- default:
- ASSERT(0);
- continue;
- }
- if (!subitem)
- newObj->Create(str);
- else
- newObj->AddField(str);
- }
- objs->AddHead(newObj);
- delete user;
- }
- if( objs->GetCount() == 0 )
- {
- CString txt;
- txt.FormatMessage(IDS_NO_s_AVAILABLE, caption);
- AfxMessageBox(txt, MB_ICONEXCLAMATION);
- SET_APP_HALTED(FALSE);
- delete objs;
- return 0;
- }
- CString msg;
- msg.FormatMessage( IDS_NUMBER_OF_USERS_n, index );
- MainFrame()->UpdateStatus( msg );
- // Display the dialog box.
- CP4ListBrowse dlg(&(MainFrame()->GetUserView()->GetListCtrl()));
- dlg.SetP4ObjectFont(GetFont());
- dlg.SetP4ObjectType(P4USER_SPEC);
- dlg.SetP4ObjectList(objs);
- dlg.SetP4ObjectCols(&cols);
- dlg.SetP4ObjectCurr(&m_user);
- dlg.SetP4ObjectSKey(&subkey);
- dlg.SetP4ObjectCaption(&caption);
- dlg.SetP4ObjectImage(CP4ViewImageList::VI_USER);
- CString old_port;
- CString old_user;
- if (!m_bSamePort)
- {
- old_port = GET_P4REGPTR()->GetP4Port();
- old_user = GET_P4REGPTR()->GetP4User();
- GET_P4REGPTR()->SetP4Port(m_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(_T(""), TRUE, FALSE, FALSE);
- }
- int retcode= dlg.DoModal();
- if (!m_bSamePort)
- {
- GET_P4REGPTR()->SetP4Port(old_port, TRUE, FALSE, FALSE);
- GET_P4REGPTR()->SetP4User(old_user, TRUE, FALSE, FALSE);
- }
- SET_APP_HALTED(FALSE);
- // Delete the object list
- for(POSITION pos=objs->GetHeadPosition(); pos!=NULL; )
- delete (CP4Object *) objs->GetNext(pos);
- delete objs;
- CString *objname= dlg.GetSelectedP4Object();
- if(retcode == IDOK && !objname->IsEmpty())
- ::SendMessage(m_hWnd, WM_BROWSECALLBACK2, 0, (LPARAM)objname);
- else if (retcode == IDC_REFRESH)
- PostMessage(WM_BROWSEUSERS, 0, 0);
- }
- delete pCmd;
- MainFrame()->ClearStatus();
- return 0;
- }
- LRESULT CNewWindowDlg::OnBrowseUsersCallBack(WPARAM wParam, LPARAM lParam)
- {
- UpdateData(TRUE);
- CString *str = (CString *)lParam;
- m_user = *str;
- UpdateData(FALSE);
- return 0;
- }
# | 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/NewWindowDlg.cpp | |||||
#1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | 9 years ago | |
//guest/perforce_software/p4win/gui/NewWindowDlg.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 |