// LabelListCtrl.cpp : implementation file // #include "stdafx.h" #include "p4win.h" #include "DepotView.h" #include "LabelView.h" #include "MainFrm.h" #include "SpecDescDlg.h" #include "P4SpecDlg.h" #include "FilterByOwnerDlg.h" #include "Diff2ObjsDlg.h" #include "cmd_editspec.h" #include "cmd_delete.h" #include "cmd_diff2.h" #include "cmd_get.h" #include "cmd_labels.h" #include "cmd_labelsynch.h" #include "cmd_fstat.h" #include "templatenamedlg.h" #include "ImageList.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define IMG_INDEX(x) (x-IDB_PERFORCE) // the column names and their positions. // enum LabelSubItem { LABEL_NAME, LABEL_OWNER, LABEL_OPTIONS, LABEL_UPDATEDATE, LABEL_DESC, LABEL_MAXCOL }; ///////////////////////////////////////////////////////////////////////////// // CLabelListCtrl IMPLEMENT_DYNCREATE(CLabelListCtrl, CP4ListCtrl) BEGIN_MESSAGE_MAP(CLabelListCtrl, CP4ListCtrl) ON_COMMAND(ID_LABEL_DELETE, OnLabelDelete) ON_UPDATE_COMMAND_UI(ID_LABEL_DELETE, OnUpdateLabelDelete) ON_COMMAND(ID_LABEL_EDIT_SPEC, OnLabelEditspec) ON_COMMAND(ID_LABEL_NEW, OnLabelNew) ON_UPDATE_COMMAND_UI(ID_LABEL_NEW, OnUpdateLabelNew) ON_UPDATE_COMMAND_UI(ID_VIEW_UPDATE_RIGHT, OnUpdateViewUpdate) ON_WM_CONTEXTMENU() ON_UPDATE_COMMAND_UI(ID_LABEL_SYNC, OnUpdateLabelSync) ON_COMMAND(ID_LABEL_SYNC, OnLabelSync) ON_UPDATE_COMMAND_UI(ID_LABEL_SYNC_CLIENT, OnUpdateLabelSyncClient) ON_COMMAND(ID_LABEL_SYNC_CLIENT, OnLabelSyncClient) ON_UPDATE_COMMAND_UI(ID_LABEL_ADDTOLABELVIEW, OnUpdateAddToLabelView) ON_COMMAND(ID_LABEL_ADDTOLABELVIEW, OnAddToLabelView) ON_UPDATE_COMMAND_UI(ID_LABEL_DESCRIBE, OnUpdateLabelDescribe) ON_WM_LBUTTONDBLCLK() ON_COMMAND(ID_LABEL_LISTFILES, OnLabelListfiles) ON_UPDATE_COMMAND_UI(ID_LABEL_LISTFILES, OnUpdateLabelListfiles) ON_COMMAND(ID_LABEL_DELETEFILES, OnLabelDeletefiles) ON_UPDATE_COMMAND_UI(ID_LABEL_DELETEFILES, OnUpdateLabelDeletefiles) ON_UPDATE_COMMAND_UI(ID_LABEL_EDIT_SPEC, OnUpdateLabelEditSpec) ON_COMMAND(ID_LABEL_DESCRIBE, OnDescribe) ON_COMMAND(ID_VIEW_UPDATE_RIGHT, OnViewUpdate) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) ON_NOTIFY_REFLECT(LVN_DELETEITEM, OnDeleteitem) ON_UPDATE_COMMAND_UI(ID_LABEL_TEMPLATE, OnUpdateLabelTemplate) ON_COMMAND(ID_LABEL_TEMPLATE, OnLabelTemplate) ON_COMMAND(ID_LABELFILTER_CLEAR, OnLabelFilterClear) ON_COMMAND(ID_LABELFILTER_CLEARVIEW, OnLabelFilterClear) ON_UPDATE_COMMAND_UI(ID_LABELFILTER_CLEARVIEW, OnUpdateLabelFilterClearview) ON_COMMAND(ID_LABELFILTER_SET, OnLabelFilterSetview) ON_COMMAND(ID_LABELFILTER_SETVIEW, OnLabelFilterSetview) ON_UPDATE_COMMAND_UI(ID_LABELFILTER_SETVIEW, OnUpdateLabelFilterSetview) ON_COMMAND(ID_LABELFILTER_SETVIEWREV, OnLabelFilterSetviewRev) ON_UPDATE_COMMAND_UI(ID_LABELFILTER_SETVIEWREV, OnUpdateLabelFilterSetviewRev) ON_COMMAND(ID_LABELDD_SYNC, OnLabelDDsetSync) ON_COMMAND(ID_LABELDD_DELETEFILES, OnLabelDDsetDeleteFiles) ON_COMMAND(ID_LABELDD_SYNC_CLIENT, OnLabelDDsetSyncClient) ON_COMMAND(ID_LABELDD_ADDTOLABELVIEW, OnLabelDDAddToLabelView) ON_COMMAND(ID_LABELFILTERDD_SETVIEW, OnLabelDDsetFilterSetview) ON_COMMAND(ID_LABELFILTERDD_SETVIEWREV, OnLabelDDsetFilterSetviewRev) ON_COMMAND(ID_LABELDD_SHOWMENU, OnLabelDDsetShowMenu) ON_UPDATE_COMMAND_UI(ID_LABELDD_SHOWMENU, OnUpdateLabelDDsetShowMenu) ON_COMMAND(ID_PERFORCE_OPTIONS, OnPerforceOptions) ON_UPDATE_COMMAND_UI(ID_FILTERBYOWNER, OnUpdateFilterByOwner) ON_COMMAND(ID_FILTERBYOWNER, OnFilterByOwner) ON_UPDATE_COMMAND_UI(ID_CLEAROWNERFILTER, OnUpdateClearFilterByOwner) ON_COMMAND(ID_CLEAROWNERFILTER, OnClearFilterByOwner) ON_UPDATE_COMMAND_UI(ID_LABEL_DIFF2, OnUpdateDiff2Labels) ON_COMMAND(ID_LABEL_DIFF2, OnDiff2Labels) ON_WM_CREATE() ON_MESSAGE(WM_P4LABELS, OnP4LabelList ) ON_MESSAGE(WM_P4FSTAT, OnP4LabelContents ) ON_MESSAGE(WM_P4EDITSPEC, OnP4LabelSpec ) ON_MESSAGE(WM_P4ENDSPECEDIT, OnP4EndSpecEdit ) ON_MESSAGE(WM_P4DELETE, OnP4Delete ) ON_MESSAGE(WM_DOLABELSYNCCLI, OnDoLabelSyncCli ) ON_MESSAGE(WM_DOLABELDELFILES, OnDoLabelDelFiles ) ON_MESSAGE(WM_DOLABELSYNC, OnDoLabelSync ) ON_MESSAGE(WM_P4LABELSYNC, OnP4LabelSync ) ON_MESSAGE(WM_P4DESCRIBE, OnP4Describe ) ON_MESSAGE(WM_P4ENDDESCRIBE, OnP4EndDescribe ) ON_MESSAGE(WM_LABELDROPMENU, OnLabelDropMenu ) ON_MESSAGE(WM_LABELOUFC, CallOnUpdateLabelFilterClearview) ON_MESSAGE(WM_NEWUSER, NewUser ) ON_WM_ACTIVATE() END_MESSAGE_MAP() CLabelListCtrl::CLabelListCtrl() { m_User = GET_P4REGPTR()->GetP4User(); m_SortAscending=TRUE; m_LastSortCol=0; m_AddReplaceDlg = 0; m_DelSyncDlg = 0; m_viewType = P4LABEL_SPEC; m_Need2DoNew = FALSE; m_FilterOwner = GET_P4REGPTR()->GetLabelFilterByOwner(); m_FilterOwnerFlag = GET_P4REGPTR()->GetLabelFilterByOwnerFlag(); m_FilterIncBlank = GET_P4REGPTR()->GetLabelFilterIncBlank(); m_captionplain = LoadStringResource(IDS_PERFORCE_LABELS); m_caption = LoadStringResource(!m_FilterOwnerFlag ? IDS_PERFORCE_LABELS : IDS_PERFORCE_FILTERED_LABELS_BY_OWNER); m_AnyBlankOwner = FALSE; CString format; format.LoadString(IDS_DRAGFROMDEPOT); m_CF_DEPOT=RegisterClipboardFormat(format); } CLabelListCtrl::~CLabelListCtrl() { } ///////////////////////////////////////////////////////////////////////////// // CLabelListCtrl diagnostics #ifdef _DEBUG void CLabelListCtrl::AssertValid() const { CP4ListCtrl::AssertValid(); } void CLabelListCtrl::Dump(CDumpContext& dc) const { CP4ListCtrl::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CLabelListCtrl message handlers void CLabelListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) { int index = GetHitItem ( point ); if( index > -1 ) { // If on an item, so select it and run edit SetItemState(index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); OnDescribe(); } else CP4ListCtrl::OnLButtonDblClk(nFlags, point); } void CLabelListCtrl::Clear() { m_Active=GetSelectedItemText(); if (!m_Active.IsEmpty()) GET_P4REGPTR()->SetLastLabel(m_Active); SetRedraw(FALSE); DeleteAllItems(); SetRedraw(TRUE); CP4ListCtrl::Clear(); } void CLabelListCtrl::OnDeleteitem(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; delete (CP4Label *) GetItemData(pNMListView->iItem); *pResult = 0; } void CLabelListCtrl::OnUpdateLabelSync(CCmdUI* pCmdUI) { CString sel = TruncateString(GetSelectedItemText(), 50); CString txt; txt.FormatMessage(IDS_ADD_REPLACE_FILES_IN_LABEL_s, sel); pCmdUI->SetText ( txt ); pCmdUI->Enable(!SERVER_BUSY() && !sel.IsEmpty() && !SelectedItemIsLocked(LABEL_OPTIONS) && !MainFrame()->IsModlessUp()); } void CLabelListCtrl::OnLabelSync() { if (MainFrame()->IsModlessUp()) return; CStringList list; m_Active= GetSelectedItemText(); m_AddReplaceDlg = new CLabelAddReplace(this); if (!m_AddReplaceDlg) { ASSERT(0); AfxMessageBox(IDS_COULD_NOT_CREATE_LABEL_DIALOG_BOX, MB_ICONSTOP); return; } MainFrame()->SetModelessUp(TRUE); m_AddReplaceDlg->SetActive(m_AddReplaceName = m_Active); MainFrame()->AssembleDepotStringList(&list, TRUE); m_AddReplaceDlg->SetSelected(&list); m_AddReplaceDlg->SetOutputList(&m_AddReplaceList); m_AddReplaceDlg->m_FilesFlag = m_AddReplaceDlg->m_DefaultFlag = GET_P4REGPTR()->GetLabelAddRplDefault(); m_AddReplaceDlg->m_RevFlag = 0; if (!m_AddReplaceDlg->Create(IDD_LABEL_ADD_REPLACE, this)) // display add/replace files dialog { delete m_AddReplaceDlg; MainFrame()->SetModelessUp(FALSE); } } LRESULT CLabelListCtrl::OnDoLabelSync(WPARAM wParam, LPARAM lParam) { BOOL preview = FALSE; if (wParam == IDOK) { preview = lParam; if (!preview) GET_P4REGPTR()->SetLabelAddRplDefault(m_AddReplaceDlg->m_DefaultFlag); if (m_AddReplaceList.GetCount()) { CCmd_LabelSynch *pCmd= new CCmd_LabelSynch; pCmd->Init( m_hWnd, RUN_ASYNC); if( pCmd->Run( m_AddReplaceName, &m_AddReplaceList, preview, FALSE, m_AddReplaceDlg->m_FilesFlag==2 ) ) MainFrame()->UpdateStatus( LoadStringResource(IDS_SYNCING_LABEL) ); else delete pCmd; } else AddToStatus(LoadStringResource(IDS_NOTHING_SELECTED_NOTHING_TO_DO)); } if (m_AddReplaceDlg && !preview) { m_AddReplaceDlg->DestroyWindow(); // deletes m_AddReplaceDlg m_AddReplaceDlg = 0; MainFrame()->SetModelessUp(FALSE); } return 0; } void CLabelListCtrl::OnUpdateLabelSyncClient(CCmdUI* pCmdUI) { CString sel = TruncateString(GetSelectedItemText(), 50); CString txt; txt.FormatMessage(IDS_SYNC_CLIENT_s_TO_LABEL_s, TruncateString(GET_P4REGPTR()->GetP4Client(), 50), sel); pCmdUI->SetText ( txt ); pCmdUI->Enable(!SERVER_BUSY() && !sel.IsEmpty() && !MainFrame()->IsModlessUp()); } void CLabelListCtrl::OnLabelSyncClient() { if (MainFrame()->IsModlessUp()) return; m_Active = GetSelectedItemText(); m_LabelFileCount=0; m_LabelFiles.Empty(); m_DelSyncDlg = new CLabelDelSync(this); if (!m_DelSyncDlg) { ASSERT(0); AfxMessageBox(IDS_COULD_NOT_CREATE_LABEL_DIALOG_BOX, MB_ICONSTOP); return; } MainFrame()->SetModelessUp(TRUE); m_DelSyncDlg->SetActive(m_DelSyncName = m_Active); CString caption; caption.FormatMessage(IDS_SYNC_FILES_IN_LABEL_s, m_Active); m_DelSyncDlg->SetCaption( caption ); m_DelSyncDlg->SetBtnText( LoadStringResource(IDS_SYNC_CLIENT_TO_SELECTED_FILE_REVISIONS) ); MainFrame()->AssembleDepotStringList(&m_StringList, TRUE); m_DelSyncDlg->SetSelected(&m_StringList); m_DelSyncDlg->SetOutputList(&m_DelSyncList); m_DelSyncDlg->SetReturnMsg(WM_DOLABELSYNCCLI); if (!m_DelSyncDlg->Create(IDD_LABEL_DEL_SYNC, this)) // display the sync to label dialog box { delete m_DelSyncDlg; MainFrame()->SetModelessUp(FALSE); } } LRESULT CLabelListCtrl::OnDoLabelSyncCli(WPARAM wParam, LPARAM lParam) { BOOL preview = FALSE; if (wParam == IDOK) { preview = lParam; if (m_DelSyncList.GetCount()) { CCmd_Get *pCmd= new CCmd_Get; pCmd->Init( m_depotWnd, RUN_ASYNC ); if( !pCmd->Run( &m_DelSyncList, preview ) ) delete pCmd; } else AddToStatus(LoadStringResource(IDS_NOTHING_SELECTED_NOTHING_TO_DO)); } if (m_DelSyncDlg && !preview) { m_DelSyncDlg->DestroyWindow(); // deletes m_DelSyncDlg m_DelSyncDlg = 0; MainFrame()->SetModelessUp(FALSE); } return 0; } void CLabelListCtrl::OnUpdateLabelDeletefiles(CCmdUI* pCmdUI) { CString selUser = TruncateString(GetSelectedItemText(), 50); CString txt; txt.FormatMessage(IDS_DELETE_FILES_AT_s, selUser); pCmdUI->SetText ( txt ); pCmdUI->Enable(!SERVER_BUSY() && !selUser.IsEmpty() && !SelectedItemIsLocked(LABEL_OPTIONS) && !MainFrame()->IsModlessUp()); } void CLabelListCtrl::OnLabelDeletefiles() { if (MainFrame()->IsModlessUp()) return; m_Active = GetSelectedItemText(); m_LabelFileCount=0; m_LabelFiles.Empty(); m_DelSyncDlg = new CLabelDelSync(this); if (!m_DelSyncDlg) { ASSERT(0); AfxMessageBox(IDS_COULD_NOT_CREATE_LABEL_DIALOG_BOX, MB_ICONSTOP); return; } MainFrame()->SetModelessUp(TRUE); m_DelSyncDlg->SetActive(m_DelSyncName = m_Active); CString caption; caption.FormatMessage(IDS_DELETE_FILES_FROM_LIST_IN_LABEL_s, m_Active); m_DelSyncDlg->SetCaption( caption ); m_DelSyncDlg->SetBtnText( LoadStringResource(IDS_DELETE_CHECKED_FILES_FROM_LIST_IN_LABEL) ); MainFrame()->AssembleDepotStringList(&m_StringList, TRUE); m_DelSyncDlg->SetSelected(&m_StringList); m_DelSyncDlg->SetOutputList(&m_DelSyncList); m_DelSyncDlg->SetReturnMsg(WM_DOLABELDELFILES); if (!m_DelSyncDlg->Create(IDD_LABEL_DEL_SYNC, this)) // display the remove files from label dialog { delete m_DelSyncDlg; MainFrame()->SetModelessUp(FALSE); } } LRESULT CLabelListCtrl::OnDoLabelDelFiles(WPARAM wParam, LPARAM lParam) { BOOL preview = FALSE; if (wParam == IDOK) { preview = lParam; if (m_DelSyncList.GetCount()) { POSITION pos2; for (POSITION pos1 = m_DelSyncList.GetHeadPosition(); ( pos2 = pos1 ) != NULL; ) { CString str = m_DelSyncList.GetNext(pos1); int i = str.ReverseFind(_T('#')); if (i != -1) str = str.Left(i); str += _T("#none"); m_DelSyncList.SetAt(pos2, str); } CCmd_LabelSynch *pCmd= new CCmd_LabelSynch; pCmd->Init( m_hWnd, RUN_ASYNC); if( pCmd->Run( m_DelSyncName, &m_DelSyncList, preview, FALSE, FALSE ) ) MainFrame()->UpdateStatus( LoadStringResource(IDS_SYNCING_LABEL) ); else delete pCmd; } else AddToStatus(LoadStringResource(IDS_NOTHING_SELECTED_NOTHING_TO_DO)); } if (m_DelSyncDlg && !preview) { m_DelSyncDlg->DestroyWindow(); // deletes m_DelSyncDlg m_DelSyncDlg = 0; MainFrame()->SetModelessUp(FALSE); } return 0; } void CLabelListCtrl::OnUpdateAddToLabelView(CCmdUI* pCmdUI) { CString sel = TruncateString(GetSelectedItemText(), 50); CString txt; txt.FormatMessage(IDS_ADDTOLABELVIEW_s, sel); pCmdUI->SetText ( txt ); pCmdUI->Enable(!SERVER_BUSY() && !sel.IsEmpty() && !m_EditInProgress && !SelectedItemIsLocked(LABEL_OPTIONS)); } void CLabelListCtrl::OnAddToLabelView() { CString txt; txt.FormatMessage(IDS_CONFIRMADDTOLABELVIEW_s, GetSelectedItemText()); if( !SERVER_BUSY() && !m_EditInProgress && IDYES == AfxMessageBox(txt, MB_YESNO|MB_ICONQUESTION)) { ::SendMessage(m_depotWnd, WM_GETSELLIST, (WPARAM) &m_AddToViewList, 0); if(m_AddToViewList.GetCount() > 0) { OnLabelEditspec(); } } } void CLabelListCtrl::OnUpdateLabelDelete(CCmdUI* pCmdUI) { pCmdUI->Enable( OnUpdateShowMenuItem( pCmdUI, IDS_DELETE_s ) && !SelectedItemIsLocked(LABEL_OPTIONS) ); } void CLabelListCtrl::OnLabelDelete() { OnDelete( P4LABEL_DEL ); } void CLabelListCtrl::OnUpdateLabelEditSpec(CCmdUI* pCmdUI) { pCmdUI->Enable( OnUpdateShowMenuItem( pCmdUI, IDS_EDITSPEC_s ) && !m_EditInProgress && (!SelectedItemIsLocked(LABEL_OPTIONS) || !GetSelectedItemOwner(LABEL_OWNER).CompareNoCase(GET_P4REGPTR()->GetP4User())) ); } void CLabelListCtrl::EditTheSpec(CString *name) { m_Active=*name; m_NewLabel=FALSE; EditSpec( m_Active ); } void CLabelListCtrl::OnLabelEditspec() { m_Active=GetSelectedItemText(); m_NewLabel=FALSE; EditSpec( m_Active ); } void CLabelListCtrl::OnUpdateLabelNew(CCmdUI* pCmdUI) { pCmdUI->SetText ( LoadStringResource( IDS_NEW ) ); pCmdUI->Enable(!SERVER_BUSY() && !m_EditInProgress); m_Need2DoNew = FALSE; } void CLabelListCtrl::OnLabelNew() { MainFrame()->ViewLabels(); if (SERVER_BUSY()) m_Need2DoNew = TRUE; else { m_Need2DoNew = FALSE; m_Active.Empty(); m_NewLabel=TRUE; EditSpec( NEWSPECNAME ); } } void CLabelListCtrl::OnUpdateViewUpdate(CCmdUI* pCmdUI) { // pCmdUI->SetText ( SetTextToRefresh( ) ); pCmdUI->Enable(!SERVER_BUSY() && !MainFrame()->IsModlessUp()); } void CLabelListCtrl::OnViewUpdate() { m_Active = GetSelectedItemText(); CCmd_Labels *pCmd= new CCmd_Labels; pCmd->Init( m_hWnd, RUN_ASYNC); if (GET_SERVERLEVEL() >= 11) { // Make a copy of the filter view, because CCmd_Labels will // destroy that copy POSITION pos=m_LabelFilterView.GetHeadPosition(); m_StrList.RemoveAll(); while(pos != NULL) m_StrList.AddTail(m_LabelFilterView.GetNext(pos)); } else if (m_LabelFilterView.GetCount()) { OnLabelFilterClear(); return; } if( pCmd->Run( &m_StrList ) ) { MainFrame()->UpdateStatus( LoadStringResource(IDS_REQUESTING_LABEL_LISTING) ); MainFrame()->SetLabelUpdateTime(GetTickCount()); Clear(); CP4ListCtrl::OnViewUpdate(); } else delete pCmd; } void CLabelListCtrl::OnUpdateLabelListfiles(CCmdUI* pCmdUI) { CString selUser = TruncateString(GetSelectedItemText(), 50); CString txt; txt.FormatMessage(IDS_LIST_FILES_AT_s, selUser); pCmdUI->SetText ( txt ); pCmdUI->Enable(!SERVER_BUSY() && !selUser.IsEmpty()); } void CLabelListCtrl::OnLabelListfiles() { m_Active = GetSelectedItemText(); m_LabelFileCount=0; m_LabelFiles.Empty(); m_LabelFilesInDialog = GET_P4REGPTR()->LabelFilesInDialog( ); CString spec; spec.Format(_T("//...@%s"), m_Active); // Call Fstat, w/ suppress==FALSE CCmd_Fstat *pCmd= new CCmd_Fstat; pCmd->Init( m_hWnd, RUN_ASYNC, LOSE_LOCK); // okay, this is weird, but let's set show entire depot // to true, since we want this command to // read 'p4 fstat //...@mynumber WITHOUT the -C // that would run otherwise. // after all, we all the files to show, not just // the ones on the client view. // BOOL bshowEntireDepot = TRUE; if( pCmd->Run( FALSE, spec, bshowEntireDepot, 0 ) ) { MainFrame()->UpdateStatus( LoadStringResource(IDS_REQUESTING_LABEL_CONTENTS) ); } else { delete pCmd; MainFrame()->ClearStatus(); } } void CLabelListCtrl::OnContextMenu(CWnd* pWnd, CPoint point) { // make sure window is active // GetParentFrame()->ActivateFrame(); // If one of the label modeless dialogs is up, don't display a context menu // instead set the focus to the modeless dialog. if (m_AddReplaceDlg) { m_AddReplaceDlg->SetFocus(); return; } if (m_DelSyncDlg) { m_DelSyncDlg->SetFocus(); return; } /////////////////////////////// // See ContextMenuRules.txt for order of menu commands! // create an empty context menu // CP4Menu popMenu; popMenu.CreatePopupMenu(); int index; SetIndexAndPoint( index, point ); // Can always create new label popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_NEW ); if(index != -1) { // Make sure item is selected SetItemState(index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_EDIT_SPEC ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_DESCRIBE ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_DELETE ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_TEMPLATE ); popMenu.AppendMenu(MF_SEPARATOR); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_LISTFILES ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_SYNC ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_DELETEFILES ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_SYNC_CLIENT ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_ADDTOLABELVIEW ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABEL_DIFF2, LoadStringResource(IDS_LABEL_DIFF2) ); } popMenu.AppendMenu( MF_SEPARATOR ); if(m_LabelFilterView.GetCount() > 0) popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_LABELFILTER_CLEARVIEW, LoadStringResource( IDS_CLEARFILTER ) ); popMenu.AppendMenu(MF_ENABLED | MF_STRING, ID_VIEW_UPDATE, LoadStringResource(IDS_REFRESH) ); MainFrame()->AddToolsToContextMenu(&popMenu); popMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd()); } void CLabelListCtrl::InsertLabel(CP4Label *label, int index) { // Add the data LV_ITEM lvItem; int iActualItem = -1; CString txt; ASSERT(label != NULL); m_iImage = CP4ViewImageList::VI_LABEL; for(int subItem=0; subItem < LABEL_MAXCOL; subItem++) { lvItem.mask=LVIF_TEXT | ((subItem==0) ? LVIF_IMAGE : 0) | ((subItem==0) ? LVIF_PARAM : 0); lvItem.iItem= (subItem==0) ? index : iActualItem; ASSERT(lvItem.iItem != -1); lvItem.iSubItem= subItem; lvItem.iImage = CP4ViewImageList::VI_LABEL; lvItem.lParam=(LPARAM) label; switch(subItem) { case LABEL_NAME: lvItem.pszText = const_cast<LPTSTR>( (LPCTSTR) label->GetLabelName()); break; case LABEL_OWNER: lvItem.pszText = const_cast<LPTSTR>( (LPCTSTR) label->GetOwner()); break; case LABEL_OPTIONS: lvItem.pszText = const_cast<LPTSTR>( (LPCTSTR) label->GetOptions()); break; case LABEL_UPDATEDATE: lvItem.pszText = const_cast<LPTSTR>( (LPCTSTR) label->GetDate()); break; case LABEL_DESC: txt= PadCRs(label->GetDescription()); lvItem.pszText = const_cast<LPTSTR>( (LPCTSTR) txt); break; } if(subItem==0) iActualItem=InsertItem(&lvItem); else SetItem(&lvItem); } } void CLabelListCtrl::UpdateLabel(CP4Label *label, int index) { // After a spec edit, update the appropriate list item // First, switch the label data CP4Label *oldLabel= (CP4Label *) GetItemData(index); delete oldLabel; SetItemData(index, (LPARAM) label); // Then update the text SetItemText(index, LABEL_NAME, const_cast<LPTSTR>((LPCTSTR) label->GetLabelName())); SetItemText(index, LABEL_OWNER, const_cast<LPTSTR>((LPCTSTR) label->GetOwner())); SetItemText(index, LABEL_OPTIONS, const_cast<LPTSTR>((LPCTSTR) label->GetOptions())); SetItemText(index, LABEL_UPDATEDATE, const_cast<LPTSTR>((LPCTSTR) label->GetDate())); CString txt= PadCRs(label->GetDescription()); SetItemText(index, LABEL_DESC, const_cast<LPTSTR>((LPCTSTR)txt)); } /////////////////////////////////////////////////// // Messages posted by server thread LRESULT CLabelListCtrl::OnP4LabelContents(WPARAM wParam, LPARAM lParam) { CString tmp; CCmd_Fstat *pCmd; if(lParam == 0) // completion { pCmd= (CCmd_Fstat *) wParam; ASSERT_KINDOF(CCmd_Fstat,pCmd); if(!pCmd->GetError()) { tmp.FormatMessage(IDS_LABEL_s_POINTS_TO_n_FILES, m_Active, m_LabelFileCount); AddToStatus(tmp, SV_COMPLETION); MainFrame()->ClearStatus(); delete pCmd; if (m_LabelFilesInDialog && m_LabelFileCount) { m_LabelFiles += _T('\n') + tmp; int key; CSpecDescDlg *dlg = new CSpecDescDlg(this); dlg->SetIsModeless(TRUE); dlg->SetKey(key = pCmd->HaveServerLock()? pCmd->GetServerKey() : 0); dlg->SetDescription( m_LabelFiles ); dlg->SetItemName( m_Active ); CString caption; caption.FormatMessage(IDS_FILE_LIST_FOR_LABEL_s, m_Active); dlg->SetCaption( caption ); dlg->SetViewType(P4LABEL_SPEC); if (!dlg->Create(IDD_SPECDESC, this)) // display the description dialog box { dlg->DestroyWindow(); // some error! clean up delete dlg; } m_LabelFiles.Empty(); } } return 0; } else { // Pull a ptr to the command, as well as a batch of CP4FileStats // out of the wrapper CFstatWrapper *pWrap= (CFstatWrapper *) wParam; pCmd= (CCmd_Fstat *) pWrap->pCmd; ASSERT_KINDOF(CCmd_Fstat, pCmd); CObList *list= (CObList *) pWrap->pList; ASSERT_KINDOF(CObList, list); POSITION pos= list->GetHeadPosition(); while(pos != NULL) { // Get the filestats CP4FileStats *stats= (CP4FileStats *) list->GetNext(pos); ASSERT_KINDOF(CP4FileStats, stats); // Increment the counter m_LabelFileCount++; if (m_LabelFilesInDialog) { // Format the file, rev and type tmp.FormatMessage(IDS_s_n_s_CHANGELIST_n_s, stats->GetFullDepotPath(), stats->GetHeadRev(), stats->GetHeadType(), stats->GetHeadChangeNum(), stats->GetActionStr(stats->GetHeadAction())); // And add to Description m_LabelFiles += tmp; } else { // Format the file, rev and type tmp.FormatMessage(IDS_LABEL_s_TO_s_n_s_CHANGELIST_n_s, m_Active, stats->GetFullDepotPath(), stats->GetHeadRev(), stats->GetHeadType(), stats->GetHeadChangeNum(), stats->GetActionStr(stats->GetHeadAction())); // And add to the status window AddToStatus( tmp); } delete stats; } // while row batch not done delete list; delete pWrap; return 0; } // a batch of rows, we'll be called again so dont delete pCmd } LRESULT CLabelListCtrl::OnP4LabelSync(WPARAM wParam, LPARAM lParam) { CCmd_LabelSynch *pCmd= (CCmd_LabelSynch *) wParam; CStringList *list= pCmd->GetList(); ASSERT_KINDOF(CStringList, list); int numFiles=list->GetCount(); if (numFiles && GET_P4REGPTR()->LabelShowPreviewDetail() && pCmd->GetPreview()) { POSITION pos=list->GetHeadPosition(); while(pos != NULL) AddToStatus( list->GetNext(pos), SV_MSG); } CString txt; txt.FormatMessage(pCmd->GetPreview() ? IDS_LABEL_SYNCHRONIZED_n_FILE_REFS_WOULD_BE_UPDATED : IDS_LABEL_SYNCHRONIZED_n_FILE_REFERENCES_UPDATED, numFiles); AddToStatus( txt, SV_COMPLETION); MainFrame()->ClearStatus(); delete pCmd; return 0; } // Receives ak for label spec update void CLabelListCtrl::OnUpdateLabelDescribe(CCmdUI* pCmdUI) { pCmdUI->Enable( OnUpdateShowMenuItem( pCmdUI, IDS_DESCRIBEIT_s ) ); } // Receives ak for label spec update LRESULT CLabelListCtrl::OnP4LabelSpec(WPARAM wParam, LPARAM lParam) { CCmd_EditSpec *pCmd= (CCmd_EditSpec *) wParam; pCmd->SetIsRequestingNew(m_NewLabel); pCmd->SetCaller(DYNAMIC_DOWNCAST(CView, GetParent())); if (m_AddToViewList.GetCount() > 0) // We have files to add to the Reviews list { CString specIn(pCmd->GetSpecIn()); int i; if ((i = specIn.Find(_T("\n\nView:\n"))) == -1) { i = specIn.GetLength(); specIn += _T("\n\nView:\n"); } else specIn += _T("\t@\n"); // A view that is @ means // put a blank line in the list here. POSITION pos; CString filename; for (pos = m_AddToViewList.GetHeadPosition(); pos != NULL; ) { filename = m_AddToViewList.GetNext(pos); if ((i = filename.Find(_T("<contains no files or folders>"))) != -1) filename = filename.Left(i-1) + _T("/..."); if (filename.Find(_T(' '))) filename = _T('\"') + filename + _T('\"'); specIn += _T('\t') + filename + _T('\n'); } m_AddToViewList.RemoveAll(); // this info is no longer needed pCmd->SetSpecIn(specIn); } // show the dialog box if(!pCmd->GetError() && !m_EditInProgress && pCmd->DoSpecDlg(this)) { m_EditInProgress = TRUE; m_EditInProgressWnd = pCmd->GetSpecSheet(); } else { if ( m_pNewSpec ) delete m_pNewSpec; if (pCmd->HaveServerLock()) pCmd->ReleaseServerLock(); delete pCmd; } MainFrame()->ClearStatus(); return 0; } LRESULT CLabelListCtrl::OnP4EndSpecEdit( WPARAM wParam, LPARAM lParam ) { CCmd_EditSpec *pCmd= (CCmd_EditSpec *) wParam; int index; if (lParam != IDCANCEL && lParam != IDABORT) { if (m_UpdateState == LIST_UPDATED) { if(m_NewLabel && FindInList(m_pNewSpec->GetLabelName()) == -1) { InsertLabel(m_pNewSpec, GetItemCount()); ReSort(); index= FindInList(m_pNewSpec->GetLabelName()); } else { index= FindInList(m_pNewSpec->GetLabelName()); UpdateLabel(m_pNewSpec, index); } EnsureVisible(index, TRUE ); SetItemState(index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); } else if ( m_pNewSpec ) delete m_pNewSpec; } else if ( m_pNewSpec ) delete m_pNewSpec; if (lParam != IDABORT) { MainFrame()->ClearStatus(); if (pCmd->HaveServerLock()) pCmd->ReleaseServerLock(); CDialog *dlg = (CDialog *)pCmd->GetSpecSheet(); dlg->DestroyWindow(); } delete pCmd; m_EditInProgress = FALSE; return 0; } LRESULT CLabelListCtrl::OnP4LabelList(WPARAM wParam, LPARAM lParam) { CCmd_Labels *pCmd= (CCmd_Labels *) wParam; m_AnyBlankOwner = FALSE; if(!pCmd->GetError()) { CString msg; CString filterowner; CObList const *labels = pCmd->GetList(); int count = labels->GetCount(); SetRedraw(FALSE); int index = 0; if (m_FilterOwnerFlag) // are we filtering by owner? filterowner = m_FilterOwnerFlag & 0x10 ? m_User : m_FilterOwner; for(POSITION pos= labels->GetHeadPosition(); pos != NULL; index++) { CP4Label *label = (CP4Label *) labels->GetNext(pos); CString owner = label->GetOwner(); if (owner.IsEmpty()) m_AnyBlankOwner = TRUE; if (m_FilterOwnerFlag) // are we filtering by owner? { if (owner.IsEmpty() && m_FilterIncBlank) ; else if (filterowner != owner) { delete label; continue; } } InsertLabel(label, index); if ((index & 0x1FFF) == 0) { msg.FormatMessage(IDS_INSERTING_LABELS, count - index); MainFrame()->UpdateStatus(msg); } } SetRedraw(TRUE); msg.FormatMessage(IDS_NUMBER_OF_LABELS_n, index ); AddToStatus( msg, SV_COMPLETION ); // Make sure first item selected ReSort(); if(labels->GetCount() > 0) { int i = FindInList(m_Active.IsEmpty() ? GET_P4REGPTR()->GetLastLabel() : m_Active); if (i < 0) i=0; SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED); EnsureVisible(i, FALSE); m_Active=GetSelectedItemText(); } CP4ListCtrl::SetUpdateDone(); if (m_Need2DoNew) OnLabelNew(); else { // Notify the mainframe that we have finished getting the labels, // hence the entire set of async command have finished. MainFrame()->ExpandDepotIfNeedBe(); } if (m_PostViewUpdateMsg) PostMessage(m_PostViewUpdateMsg, m_PostViewUpdateWParam, m_PostViewUpdateLParam); } else { CP4ListCtrl::SetUpdateFailed(); m_Need2DoNew = FALSE; } delete pCmd; m_PostViewUpdateMsg = 0; MainFrame()->ClearStatus(); return 0; } ////////////////////////////////////////////////////////////////////////// // Sort callback int CLabelListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int subItem) { ASSERT(lParam1 && lParam2); CP4Label const *label1 = (CP4Label const*)lParam1; CP4Label const *label2 = (CP4Label const*)lParam2; CString txt1, txt2; switch(subItem) { case LABEL_NAME: // label name txt1= label1->GetLabelName(); txt2= label2->GetLabelName(); break; case LABEL_OWNER: // label owner txt1= label1->GetOwner(); txt2= label2->GetOwner(); break; case LABEL_OPTIONS: // label options txt1= label1->GetOptions(); txt2= label2->GetOptions(); break; case LABEL_UPDATEDATE: // label update date txt1= label1->GetDate(); txt2= label2->GetDate(); ConvertDates( txt1, txt2 ); break; case LABEL_DESC: // label desc txt1= label1->GetDescription(); txt2= label2->GetDescription(); break; default: ASSERT(0); return 0; } txt1.MakeUpper(); txt2.MakeUpper(); int rc; if(m_SortAscending) rc = txt1.Compare(txt2); else rc = txt2.Compare(txt1); return rc; } void CLabelListCtrl::EditSpec( const CString &sItem ) { if (m_EditInProgress) { CantEditRightNow(IDS_LABEL); return; } m_pNewSpec= new CP4Label; CCmd_EditSpec *pCmd= new CCmd_EditSpec; pCmd->Init( m_hWnd, RUN_ASYNC, HOLD_LOCK); if( pCmd->Run( P4LABEL_SPEC, sItem, m_pNewSpec ) ) MainFrame()->UpdateStatus( LoadStringResource(IDS_EDITING_LABEL_SPEC) ); else { delete pCmd; delete m_pNewSpec; } } void CLabelListCtrl::OnLabelTemplate() { if( SERVER_BUSY() || m_Active.IsEmpty() || m_EditInProgress || GET_SERVERLEVEL() < 6) return; CStringList list; m_Active= GetSelectedItemText(); list.AddHead( m_Active ); // Prompt for the new label name CTemplateNameDlg dlg; dlg.SetTemplateName( m_Active ); dlg.SetVerbotenSpecNames(&list); dlg.SetNewSpecName(_T("")); dlg.SetSpecType( P4LABEL_SPEC ); if(dlg.DoModal() != IDCANCEL) { CString newName=dlg.GetNewSpecName(); // Let OnP4LabelSpec() determine if this is a new label m_NewLabel=TRUE; m_pNewSpec= new CP4Label; CCmd_EditSpec *pCmd= new CCmd_EditSpec; pCmd->Init( m_hWnd, RUN_ASYNC, HOLD_LOCK); if( pCmd->Run( P4LABEL_SPEC, newName, m_Active, m_pNewSpec ) ) MainFrame()->UpdateStatus( LoadStringResource(IDS_EDITING_LABEL_SPEC) ); else { delete pCmd; delete m_pNewSpec; } } } void CLabelListCtrl::OnUpdateLabelTemplate(CCmdUI* pCmdUI) { m_Active = GetSelectedItemText(); CString prompt; prompt.FormatMessage(IDS_CREATE_UPDATE_LABEL_USING_s_AS_TEMPLATE, TruncateString(m_Active, 50)); pCmdUI->SetText ( prompt ); pCmdUI->Enable( GET_SERVERLEVEL() >= 6 && !SERVER_BUSY() && !m_Active.IsEmpty() && !m_EditInProgress ); } ///////////////////////////////////////////////////////////////////// // Handlers for setting filters for labels view ///////////////////////////////////////////////////////////////////// void CLabelListCtrl::OnLabelFilterClear() { ClearLabelFilter(); m_caption = LoadStringResource(!m_FilterOwnerFlag ? IDS_PERFORCE_LABELS : IDS_PERFORCE_FILTERED_LABELS_BY_OWNER); OnViewReloadall(); } void CLabelListCtrl::ClearLabelFilter() { Clear(); m_LabelFilterView.RemoveAll(); m_caption = LoadStringResource(!m_FilterOwnerFlag ? IDS_PERFORCE_LABELS : IDS_PERFORCE_FILTERED_LABELS_BY_OWNER); CP4PaneContent::GetView()->SetCaption(); } void CLabelListCtrl::OnViewReloadall() { CP4PaneContent::GetView()->SetCaption(); m_Active = GetSelectedItemText(); Clear(); OnViewUpdate(); } void CLabelListCtrl::OnLabelFilterSetview() { if( !SERVER_BUSY() && (GET_SERVERLEVEL() >= 11)) { ::SendMessage(m_depotWnd, WM_GETSELLIST, (WPARAM) &m_LabelFilterView, 0); if(m_LabelFilterView.GetCount() > 0) m_caption = LoadStringResource(!m_FilterOwnerFlag ? IDS_PERFORCE_FILTERED_LABELS : IDS_PERFORCE_FILTERED_LABELS_BY_BOTH); OnViewReloadall(); } } void CLabelListCtrl::OnLabelFilterSetviewRev() { if( !SERVER_BUSY() && (GET_SERVERLEVEL() >= 11)) { ::SendMessage(m_depotWnd, WM_GETSELLIST, (WPARAM) &m_LabelFilterView, 0); if(m_LabelFilterView.GetCount() > 0) { // make a temp copy of the selection strings CStringList tempList; POSITION pos=m_LabelFilterView.GetHeadPosition(); while(pos != NULL) tempList.AddTail(m_LabelFilterView.GetNext(pos)); // now copy the selection back to m_LabelFilterView // and add #have,have to the end to filter on just the current rev m_LabelFilterView.RemoveAll(); pos=tempList.GetHeadPosition(); while(pos != NULL) { CString str = tempList.GetNext(pos) + _T("#have,have"); m_LabelFilterView.AddTail(str); } m_caption = LoadStringResource(!m_FilterOwnerFlag ? IDS_PERFORCE_FILTERED_LABELS : IDS_PERFORCE_FILTERED_LABELS_BY_BOTH); } OnViewReloadall(); } } LRESULT CLabelListCtrl::CallOnUpdateLabelFilterClearview(WPARAM wParam, LPARAM lParam) { OnUpdateLabelFilterClearview((CCmdUI *)lParam); return 0; } void CLabelListCtrl::OnUpdateLabelFilterClearview(CCmdUI* pCmdUI) { pCmdUI->Enable(MainFrame()->SetMenuIcon(pCmdUI, !SERVER_BUSY() && m_LabelFilterView.GetCount() > 0)); } void CLabelListCtrl::OnUpdateLabelFilterSetview(CCmdUI* pCmdUI) { pCmdUI->Enable(MainFrame()->SetMenuIcon(pCmdUI, !SERVER_BUSY() && (GET_SERVERLEVEL() >= 11) && ::SendMessage(m_depotWnd, WM_GETSELCOUNT, 0, 0) > 0)); } void CLabelListCtrl::OnUpdateLabelFilterSetviewRev(CCmdUI* pCmdUI) { pCmdUI->Enable(MainFrame()->SetMenuIcon(pCmdUI, !SERVER_BUSY() && (GET_SERVERLEVEL() >= 11) && ::SendMessage(m_depotWnd, WM_GETSELCOUNT, 0, 0) > 0)); } void CLabelListCtrl::OnLabelFilterClearview() { if( !SERVER_BUSY() ) OnLabelFilterClear(); } ///////////////////////////////////////////////////////////////////// // OLE drag-drop support, to accept depot files or folders // which will be used as per the user's choice on a context menu ///////////////////////////////////////////////////////////////////// DROPEFFECT CLabelListCtrl::OnDragEnter(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point) { m_DropEffect=DROPEFFECT_NONE; m_DragDataFormat=0; CString fname; // Dont allow a drop if the server is busy, since a drop immediately attempts to // invoke a server command if(SERVER_BUSY() || m_EditInProgress) return DROPEFFECT_NONE; if(pDataObject->IsDataAvailable( (unsigned short) m_CF_DEPOT)) { m_DropEffect=DROPEFFECT_COPY; m_DragDataFormat=m_CF_DEPOT; } return m_DropEffect; } DROPEFFECT CLabelListCtrl::OnDragOver(COleDataObject* pDataObject, DWORD dwKeyState, CPoint point) { // Dont allow a drop if the server is busy, since a drop immediately attempts to // invoke a server command if(SERVER_BUSY() || m_EditInProgress) m_DropEffect= DROPEFFECT_NONE; if(m_DragDataFormat == m_CF_DEPOT) { int i = GetSelectedItem( ); if ( i > -1 ) SetItemState(i, 0, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); ClientToScreen(&point); int index= GetContextItem( point ); if (index > -1) SetItemState(index, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); } return m_DropEffect; } BOOL CLabelListCtrl::OnDrop(COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point) { CString fname; if(SERVER_BUSY() || m_EditInProgress) { // OnDragEnter() and OnDragOver() should avoid a drop at // the wrong time! ASSERT(0); return FALSE; } MainFrame()->SetRightSplitter(1); if (m_DragDataFormat == m_CF_DEPOT) { int i = GetSelectedItem( ); if ( i > -1 ) SetItemState(i, 0, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); ClientToScreen(&point); int index= GetContextItem( point ); if (index > -1) SetItemState(index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED ); if ((i > -1) || (GET_P4REGPTR()->GetLabelDragDropOption() == LDD_FILTER)) ::SendMessage(m_depotWnd, WM_DROPTARGET, LABELVIEW, MAKELPARAM(point.x,point.y)); else ::SendMessage(m_depotWnd, WM_DROPTARGET, LABELNOSEL, MAKELPARAM(point.x,point.y)); return TRUE; } // Return false, so depot window doesnt start a file-open operation return FALSE; } void CLabelListCtrl::OnDragLeave( ) { if(m_DragDataFormat == m_CF_DEPOT) { int i = GetSelectedItem( ); if ( i > -1 ) SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_DROPHILITED|LVIS_SELECTED|LVIS_FOCUSED ); } } LRESULT CLabelListCtrl::OnLabelDropMenu(WPARAM wParam, LPARAM lParam) { // label view accepted a drop from the depot // create a context menu CPoint *dropTargetPt = (CPoint *)lParam; CP4Menu popMenu; popMenu.LoadMenu(IDR_LABELDRAGDROP); if (!wParam) { popMenu.RemoveMenu(ID_LABEL_SYNC, MF_BYCOMMAND); popMenu.RemoveMenu(ID_LABEL_DELETEFILES, MF_BYCOMMAND); popMenu.RemoveMenu(ID_LABEL_SYNC_CLIENT, MF_BYCOMMAND); popMenu.RemoveMenu(ID_LABEL_ADDTOLABELVIEW, MF_BYCOMMAND); popMenu.GetSubMenu(0)->RemoveMenu(0, MF_BYPOSITION); // remove separator } // Pause the auto refresh timer SET_APP_HALTED(TRUE); // Finally blast the menu onto the screen popMenu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, dropTargetPt->x, dropTargetPt->y, AfxGetMainWnd()); //Release the auto refresh timer SET_APP_HALTED(FALSE); return 0; } int CLabelListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CP4ListCtrl::OnCreate(lpCreateStruct) == -1) return -1; CStringArray colnames; colnames.Add ( LoadStringResource(IDS_P4LABEL) ); colnames.Add ( LoadStringResource(IDS_OWNER) ); colnames.Add ( LoadStringResource(IDS_LOCKSTR) ); colnames.Add ( LoadStringResource(IDS_DATE) ); colnames.Add ( LoadStringResource(IDS_DESCRIPTION) ); ASSERT( LABEL_MAXCOL == colnames.GetSize( ) ); int width[LABEL_MAXCOL]={90,90,60,90,250}; RestoreSavedWidths(width, colnames.GetSize( ) , _T("Label List")); if (width[3] > 5000 && width[4] > 5000) width[2] = width[3] = width[4] = 90; InsertColumnHeaders( colnames, width ); return 0; } void CLabelListCtrl::OnLabelDDsetSync() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_ADD); } void CLabelListCtrl::OnLabelDDsetDeleteFiles() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_DELETE); } void CLabelListCtrl::OnLabelDDsetSyncClient() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_SYNC); } void CLabelListCtrl::OnLabelDDAddToLabelView() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_ADD2VIEW); } void CLabelListCtrl::OnLabelDDsetFilterSetview() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_FILTER); } void CLabelListCtrl::OnLabelDDsetFilterSetviewRev() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_FILTERREV); } void CLabelListCtrl::OnLabelDDsetShowMenu() { GET_P4REGPTR()->SetLabelDragDropOption(LDD_MENU); } void CLabelListCtrl::OnUpdateLabelDDsetShowMenu(CCmdUI* pCmdUI) { if (pCmdUI->m_pMenu) { UINT lld; switch (GET_P4REGPTR()->GetLabelDragDropOption()) { case LDD_ADD: lld = ID_LABELDD_SYNC; break; case LDD_DELETE: lld = ID_LABELDD_DELETEFILES; break; case LDD_SYNC: lld = ID_LABELDD_SYNC_CLIENT; break; case LDD_ADD2VIEW: lld = ID_LABELDD_ADDTOLABELVIEW; break; case LDD_FILTER: lld = ID_LABELFILTERDD_SETVIEW; break; case LDD_FILTERREV: lld = ID_LABELFILTERDD_SETVIEWREV; break; default: lld = ID_LABELDD_SHOWMENU; break; } pCmdUI->m_pMenu->CheckMenuRadioItem( ID_LABELDD_SYNC, ID_LABELDD_SHOWMENU, lld, MF_BYCOMMAND ) ; } pCmdUI->Enable( TRUE ); } void CLabelListCtrl::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CP4ListCtrl::OnActivate(nState, pWndOther, bMinimized); if(nState != WA_INACTIVE && m_Active.IsEmpty() && GetItemCount() > 1) { int i = FindInList(GET_P4REGPTR()->GetLastLabel()); if (i < 0) i=0; SetItemState(i, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); EnsureVisible(i, FALSE); m_Active=GetSelectedItemText(); } else { m_Active=GetSelectedItemText(); if (!m_Active.IsEmpty()) GET_P4REGPTR()->SetLastLabel(m_Active); } } void CLabelListCtrl::OnPerforceOptions() { MainFrame()->OnPerforceOptions(TRUE, FALSE, IDS_PAGE_LABEL); } void CLabelListCtrl::OnUpdateFilterByOwner(CCmdUI* pCmdUI) { pCmdUI->Enable( MainFrame()->SetMenuIcon(pCmdUI, !SERVER_BUSY()) ); } void CLabelListCtrl::OnFilterByOwner() { CFilterByOwnerDlg dlg; dlg.m_NotUser = GET_P4REGPTR()->GetLabelFilterByOwnerFlag() & 0x01; dlg.m_bShowIncBlanks = m_AnyBlankOwner; if (dlg.DoModal() == IDOK) { GET_P4REGPTR()->SetLabelFilterByOwner(m_FilterOwner = dlg.m_Owner); GET_P4REGPTR()->SetLabelFilterByOwnerFlag(m_FilterOwnerFlag = (dlg.m_NotUser ? 0x1 : 0x10)); GET_P4REGPTR()->SetLabelFilterIncBlank(m_FilterIncBlank = dlg.m_IncBlank); m_caption = LoadStringResource(m_LabelFilterView.IsEmpty() ? IDS_PERFORCE_FILTERED_LABELS_BY_OWNER : IDS_PERFORCE_FILTERED_LABELS_BY_BOTH); OnViewReloadall(); } } void CLabelListCtrl::OnUpdateClearFilterByOwner(CCmdUI* pCmdUI) { pCmdUI->Enable( MainFrame()->SetMenuIcon(pCmdUI, m_FilterOwnerFlag && !SERVER_BUSY()) ); } void CLabelListCtrl::OnClearFilterByOwner() { GET_P4REGPTR()->SetLabelFilterByOwnerFlag(m_FilterOwnerFlag = 0); m_caption = LoadStringResource(m_LabelFilterView.IsEmpty() ? IDS_PERFORCE_LABELS : IDS_PERFORCE_FILTERED_LABELS); OnViewReloadall(); } void CLabelListCtrl::OnUpdateClearFilterLabels(CCmdUI* pCmdUI) { pCmdUI->Enable(!SERVER_BUSY() && (m_FilterOwnerFlag || !m_LabelFilterView.IsEmpty())); } void CLabelListCtrl::OnUpdateDiff2Labels(CCmdUI* pCmdUI) { pCmdUI->Enable( !SERVER_BUSY() ); } void CLabelListCtrl::OnDiff2Labels() { CDiff2ObjsDlg dlg; dlg.m_Type = COMBO_LABEL; m_Active=GetSelectedItemText(); if (!m_Active.IsEmpty()) dlg.m_Edit1 = m_Active; SET_APP_HALTED(TRUE); int rc=dlg.DoModal(); SET_APP_HALTED(FALSE); if (rc == IDOK) { CString x = ""; CCmd_Diff2 *pCmd= new CCmd_Diff2; pCmd->Init( m_depotWnd, RUN_ASYNC); pCmd->SetOutput2Dlg(GET_P4REGPTR()->Diff2InDialog()); if( pCmd->Run( _T("//...@") + dlg.m_Edit1, _T("//...@") + dlg.m_Edit2, 0, 0, x, x, FALSE, FALSE, TRUE) ) MainFrame()->UpdateStatus( LoadStringResource(IDS_DIFFING_FILES) ); else delete pCmd; } } LRESULT CLabelListCtrl::NewUser(WPARAM wParam, LPARAM lParam) { m_User = GET_P4REGPTR()->GetP4User(); if (m_FilterOwnerFlag & 0x10) Clear(); return 0; }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 19924 | YourUncleBob |
Populate -o //guest/perforce_software/p4win/... //guest/YourUncleBob/p4win/..... |
||
//guest/perforce_software/p4win/main/gui/LabelListCtrl.cpp | |||||
#1 | 16169 | perforce_software | Move files to follow new path scheme for branches. | ||
//guest/perforce_software/p4win/gui/LabelListCtrl.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. |