Click here to Skip to main content
15,896,606 members
Articles / Desktop Programming / WTL

SSBrowser: A Sample Visual SourceSafe Automation

Rate me:
Please Sign up or sign in to vote.
4.59/5 (13 votes)
3 Jun 20044 min read 93K   3K   54  
A sample VC++ program for performing Visual SourceSafe operations in your application.
#if !defined(_SSITEMOPERATIONDLG_H_INCLUDED_)
#define _SSITEMOPERATIONDLG_H_INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "ssauto.h"
#include "ListCtrlEx.h"

enum ItemOperation
{
	ge_OP_CHECKOUT,
	ge_OP_UNDOCHECKOUT,
	ge_OP_CHECKIN,
	ge_OP_LABEL,
	ge_OP_ADDSUBITEM,
	ge_OP_NEWPROJECT,
	ge_OP_GET,
};

const long gal_OPTIONS[]=
{
	/*ge_OP_CHECKOUT*/		VSSFLAG_GETYES | VSSFLAG_GETNO | 
							VSSFLAG_RECURSNO | VSSFLAG_RECURSYES | 
							VSSFLAG_USERRONO | VSSFLAG_USERROYES | 
							VSSFLAG_CMPFULL | VSSFLAG_CMPTIME | VSSFLAG_CMPCHKSUM | VSSFLAG_CMPFAIL | 
							VSSFLAG_TIMENOW | VSSFLAG_TIMEMOD | VSSFLAG_TIMEUPD | 
							VSSFLAG_EOLCR | VSSFLAG_EOLLF | VSSFLAG_EOLCRLF | 
							VSSFLAG_REPASK | VSSFLAG_REPREPLACE | VSSFLAG_REPSKIP | 
							VSSFLAG_CHKEXCLUSIVEYES | VSSFLAG_CHKEXCLUSIVENO |
							VSSFLAG_FORCEDIRNO | VSSFLAG_FORCEDIRYES | VSSFLAG_CHKEXCLUSIVEYES,
							
	/*ge_OP_UNDOCHECKOUT*/	VSSFLAG_RECURSNO | VSSFLAG_RECURSYES | 
							VSSFLAG_USERRONO | VSSFLAG_USERROYES | 
							VSSFLAG_CMPFULL | VSSFLAG_CMPTIME | VSSFLAG_CMPCHKSUM | VSSFLAG_CMPFAIL | 
							VSSFLAG_TIMENOW | VSSFLAG_TIMEMOD | VSSFLAG_TIMEUPD | 
							VSSFLAG_EOLCR | VSSFLAG_EOLLF | VSSFLAG_EOLCRLF |
							VSSFLAG_REPASK | VSSFLAG_REPREPLACE | VSSFLAG_REPSKIP | 
							VSSFLAG_FORCEDIRNO | VSSFLAG_FORCEDIRYES | 
							VSSFLAG_KEEPNO | VSSFLAG_KEEPYES |
							VSSFLAG_DELNO | 	VSSFLAG_DELYES | VSSFLAG_DELNOREPLACE,

	/*ge_OP_CHECKIN*/		VSSFLAG_RECURSNO | VSSFLAG_RECURSYES | 
							VSSFLAG_USERRONO | VSSFLAG_USERROYES | 
							VSSFLAG_CMPFULL | VSSFLAG_CMPTIME | VSSFLAG_CMPCHKSUM | VSSFLAG_CMPFAIL | 
							VSSFLAG_TIMENOW | VSSFLAG_TIMEMOD | VSSFLAG_TIMEUPD | 
							VSSFLAG_EOLCR | VSSFLAG_EOLLF | VSSFLAG_EOLCRLF | 
							VSSFLAG_REPASK | VSSFLAG_REPREPLACE | VSSFLAG_REPSKIP | 
							VSSFLAG_FORCEDIRNO | VSSFLAG_FORCEDIRYES | 
							VSSFLAG_KEEPNO | VSSFLAG_KEEPYES | 
							VSSFLAG_DELNO | 	VSSFLAG_DELYES | VSSFLAG_DELNOREPLACE |
							VSSFLAG_UPDASK | VSSFLAG_UPDUPDATE | VSSFLAG_UPDUNCH,

	/*ge_OP_LABEL*/			0,

	/*ge_OP_ADDSUBITEM*/	VSSFLAG_DELTAYES | VSSFLAG_DELTANO |
							VSSFLAG_RECURSNO | VSSFLAG_RECURSYES | 
							VSSFLAG_USERRONO | VSSFLAG_USERROYES | 
							VSSFLAG_KEEPNO | VSSFLAG_KEEPYES | 
							VSSFLAG_BINTEST | VSSFLAG_BINBINARY | VSSFLAG_BINTEXT | 
							VSSFLAG_DELNO | 	VSSFLAG_DELYES | VSSFLAG_DELNOREPLACE,

	/*ge_OP_NEWPROJECT*/	0,	

	/*ge_OP_GET*/			VSSFLAG_RECURSNO | VSSFLAG_RECURSYES | 
							VSSFLAG_USERRONO | VSSFLAG_USERROYES | 
							VSSFLAG_CMPFULL | VSSFLAG_CMPTIME | VSSFLAG_CMPCHKSUM | VSSFLAG_CMPFAIL | 
							VSSFLAG_TIMENOW | VSSFLAG_TIMEMOD | VSSFLAG_TIMEUPD | 
							VSSFLAG_EOLCR | VSSFLAG_EOLLF | VSSFLAG_EOLCRLF | 
							VSSFLAG_REPASK | VSSFLAG_REPREPLACE | VSSFLAG_REPSKIP | 
							VSSFLAG_FORCEDIRNO | VSSFLAG_FORCEDIRYES,
	
};

const LPCTSTR gasz_OPTION_TEXT[] =
{
    _T("VSSFLAG_USERRONO"),
    _T("VSSFLAG_USERROYES"),
    _T("VSSFLAG_TIMENOW"),
    _T("VSSFLAG_TIMEMOD"),
    _T("VSSFLAG_TIMEUPD"),
    _T("VSSFLAG_EOLCR"),
    _T("VSSFLAG_EOLLF"),
    _T("VSSFLAG_EOLCRLF"),
    _T("VSSFLAG_REPASK"),
    _T("VSSFLAG_REPREPLACE"),
    _T("VSSFLAG_REPSKIP"),
    _T("VSSFLAG_REPMERGE"),
    _T("VSSFLAG_CMPFULL"),
    _T("VSSFLAG_CMPTIME"),
    _T("VSSFLAG_CMPCHKSUM"),
    _T("VSSFLAG_CMPFAIL"),
    _T("VSSFLAG_RECURSNO"),
    _T("VSSFLAG_RECURSYES"),
    _T("VSSFLAG_FORCEDIRNO"),
    _T("VSSFLAG_FORCEDIRYES"),
    _T("VSSFLAG_KEEPNO"),
    _T("VSSFLAG_KEEPYES"),
    _T("VSSFLAG_DELNO"),
    _T("VSSFLAG_DELYES"),
    _T("VSSFLAG_DELNOREPLACE"),
    _T("VSSFLAG_BINTEST"),
    _T("VSSFLAG_BINBINARY"),
    _T("VSSFLAG_BINTEXT"),
    _T("VSSFLAG_DELTAYES"),
    _T("VSSFLAG_DELTANO"),
    _T("VSSFLAG_UPDASK"),
    _T("VSSFLAG_UPDUPDATE"),
    _T("VSSFLAG_UPDUNCH"),
    _T("VSSFLAG_GETYES"),
    _T("VSSFLAG_GETNO"),
    _T("VSSFLAG_CHKEXCLUSIVEYES"),
    _T("VSSFLAG_CHKEXCLUSIVENO"),
    _T("VSSFLAG_HISTIGNOREFILES"),
};


class CSSItemOperationDlg : public CDialogImpl<CSSItemOperationDlg>,
	public CWinDataExchange<CSSItemOperationDlg>
{
protected:
	ItemOperation me_operation;
	CListCtrlEx m_optionsCtrl;
	IVSSItemPtr m_item;

public:

	CString mstr_label;
	CString mstr_labelValue;
	CString mstr_comment;
	long ml_flags;


	enum { IDD = IDD_ITEM_OPERATION_DIALOG };

	BEGIN_MSG_MAP(CSSItemOperationDlg)
		MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
		COMMAND_ID_HANDLER(IDOK, OnOK)
		COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
		COMMAND_ID_HANDLER(IDC_SELECT_FILE, OnGetFile)
		REFLECT_NOTIFICATIONS();
	END_MSG_MAP()

	BEGIN_DDX_MAP(CSSItemOperationDlg)
		DDX_TEXT(IDC_LABEL, mstr_label)
		DDX_TEXT(IDC_LABEL_VALUE, mstr_labelValue)
		DDX_TEXT(IDC_COMMENT, mstr_comment)
		DDX_CONTROL(IDC_OPTIONS_LIST, m_optionsCtrl);
	END_DDX_MAP()

	CSSItemOperationDlg(IVSSItemPtr item, ItemOperation e_operation)
	{
		m_item = item;
		me_operation = e_operation;
	}

	LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
	{
		CComBSTR bstr_text;
		m_item->get_Name(&bstr_text);

		mstr_label = _T("Item Name:");
		mstr_labelValue = bstr_text;
		BOOL b_labelEditable = FALSE;
		BOOL b_commentEditable = TRUE;
		switch (me_operation)
		{
			case ge_OP_CHECKOUT:
				mstr_label = _T("Checkout Item:");
				break;

			case ge_OP_UNDOCHECKOUT:
				mstr_label = _T("Undo Checkout Item:");
				b_commentEditable = FALSE;
				break;

			case ge_OP_CHECKIN:
				mstr_label = _T("Checkin Item:");
				break;

			case ge_OP_LABEL:
				mstr_label.Format(_T("Label for %s:"), mstr_labelValue);
				mstr_labelValue = _T("");
				b_labelEditable = TRUE;
				break;

			case ge_OP_ADDSUBITEM:
				mstr_label.Format(_T("Add Item under %s:"), mstr_labelValue);
				mstr_labelValue = _T("");
				b_labelEditable = TRUE;
				::EnableWindow(GetDlgItem(IDC_SELECT_FILE), TRUE);
				break;

			case ge_OP_NEWPROJECT:
				mstr_label.Format(_T("Add New Project under %s:"), mstr_labelValue);
				mstr_labelValue = _T("");
				b_labelEditable = TRUE;
				break;

			case ge_OP_GET:
				mstr_label.Format(_T("Retrieve %s to:"), mstr_labelValue);
				m_item->get_LocalSpec(&bstr_text);
				mstr_labelValue = bstr_text;
				break;

		}

		DoDataExchange(FALSE);

		CEdit labelWindow(GetDlgItem(IDC_LABEL_VALUE));
		labelWindow.SetReadOnly(!b_labelEditable);
		CEdit commentWindow(GetDlgItem(IDC_COMMENT));
		labelWindow.SetReadOnly(!b_commentEditable);

		m_optionsCtrl.SetExtendedListViewStyle(LVS_EX_CHECKBOXES);
		m_optionsCtrl.InsertColumn(0, _T("Options"), LVCFMT_LEFT, 50 ,-1);

		long l_optionFlags = gal_OPTIONS[me_operation];
		int i = 0;
		int i_row = 0;
		while (l_optionFlags > 0)
		{
			if (l_optionFlags&0x1)
			{
				m_optionsCtrl.SetItemData(m_optionsCtrl.InsertItem(i_row++, gasz_OPTION_TEXT[i]), i);
			}
			i++;
			l_optionFlags = l_optionFlags>>1;
		}
		m_optionsCtrl.SetColumnWidth(0, LVSCW_AUTOSIZE_USEHEADER);

		return 0L;

	}

	LRESULT OnOK(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		if (DoDataExchange(TRUE))
		{
			ml_flags = 0;
			for (int i = 0; i < m_optionsCtrl.GetItemCount(); i++)
			{
				if (m_optionsCtrl.GetCheckState(i))
				{
					ml_flags |= 0x1<<m_optionsCtrl.GetItemData(i);
				}
			}

			EndDialog(wID);
			return 0;
		}


		return 0;
	}

	LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		ml_flags = 0;

		EndDialog(wID);
		return 0;
	}

	LRESULT OnGetFile(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
	{
		CFileDialog myDLG( TRUE,_T("*.*"), _T("*.*"),OFN_HIDEREADONLY, _T("All Files (*.*)"));

		CComBSTR bstr_text;
		m_item->get_LocalSpec(&bstr_text);

		myDLG.m_ofn.lpstrFile = NULL;
		myDLG.m_ofn.lpstrInitialDir = bstr_text;

		// Display the dialog
		if ( myDLG.DoModal()==IDOK )
		{
			mstr_label = myDLG.m_ofn.lpstrFile;
			DoDataExchange(FALSE);
		}

		return 0;
	}

};

#endif // _SSITEMOPERATIONDLG_H_INCLUDED_

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer (Senior)
United States United States
Roaming halfway around the globe programming in C++, MFC, COM/ATL, WTL, C#, .NET, OLEDB, ADO, ADO/X.

Living under the pleasant weather of Irvine, California, Ferdie is a Computer Engineering graduate of Mapua Institute of Technology (MIT Smile | :) ) in Philippines. Developed GIS applications in Japan for 5 years. Now a member of a team developing Windows GUI and real time software for semi-robotic equipments.

Comments and Discussions