Index: src/TortoiseProc/LogPromptDlg.h
===================================================================
--- src/TortoiseProc/LogPromptDlg.h	(revision 2013)
+++ src/TortoiseProc/LogPromptDlg.h	(working copy)
@@ -77,6 +77,7 @@
 	afx_msg void OnBnClickedFilllog();
 	afx_msg void OnCbnSelchangeOldlogs();
 	afx_msg void OnCbnCloseupOldlogs();
+	afx_msg LRESULT OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM);
 	void Refresh();
 	DECLARE_MESSAGE_MAP()
 public:
Index: src/TortoiseProc/TortoiseProc.vcproj
===================================================================
--- src/TortoiseProc/TortoiseProc.vcproj	(revision 2013)
+++ src/TortoiseProc/TortoiseProc.vcproj	(working copy)
@@ -239,6 +239,9 @@
 					RelativePath=".\RevisionGraph.h">
 				</File>
 				<File
+					RelativePath="..\Utils\stdex_vector.h">
+				</File>
+				<File
 					RelativePath="..\Utils\StringUtils.cpp">
 				</File>
 				<File
Index: src/TortoiseProc/LogPromptDlg.cpp
===================================================================
--- src/TortoiseProc/LogPromptDlg.cpp	(revision 2013)
+++ src/TortoiseProc/LogPromptDlg.cpp	(working copy)
@@ -72,9 +72,9 @@
 	ON_BN_CLICKED(IDC_FILLLOG, OnBnClickedFilllog)
 	ON_CBN_SELCHANGE(IDC_OLDLOGS, OnCbnSelchangeOldlogs)
 	ON_CBN_CLOSEUP(IDC_OLDLOGS, OnCbnCloseupOldlogs)
+	ON_REGISTERED_MESSAGE(CSVNStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED, OnSVNStatusListCtrlItemCountChanged)
 END_MESSAGE_MAP()
 
-
 // CLogPromptDlg message handlers
 // If you add a minimize button to your dialog, you will need the code below
 // to draw the icon.  For MFC applications using the document/view model,
@@ -573,12 +573,13 @@
 	}
 }
 
-
-
-
-
-
-
-
-
-
+LRESULT CLogPromptDlg::OnSVNStatusListCtrlItemCountChanged(WPARAM, LPARAM)
+{
+	if (m_ListCtrl.GetItemCount()==0)
+	{
+		CMessageBox::Show(*this, IDS_LOGPROMPT_NOTHINGTOCOMMIT, IDS_APPNAME, MB_ICONINFORMATION);
+		GetDlgItem(IDCANCEL)->EnableWindow(true);
+		EndDialog(0);
+	} // if (m_ListCtrl.GetItemCount()==0)
+	return 0;
+}
Index: src/Utils/stdex_vector.h
===================================================================
--- src/Utils/stdex_vector.h	(revision 0)
+++ src/Utils/stdex_vector.h	(revision 0)
@@ -0,0 +1,104 @@
+// TortoiseSVN - a Windows shell extension for easy version control
+
+// Copyright (C) 2004-2004 - Damian Powell
+
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+#pragma once
+
+#include <vector>
+
+namespace stdex {
+
+	/**
+	 * Subclass of the STL's vector class that allows the class to be used more
+	 * freely in place of a C-style array.
+	 * @author Damian Powell
+	 */
+	template <class T, class Al = std::allocator<T> >
+	class vector : public std::vector<T, Al> {
+
+	  public:
+
+		/**
+		 * Default constructor creates an empty vector.
+		 */
+		inline vector()
+		{ }
+
+		/**
+		 * Creates a vector of n items where each item is initialized to its
+		 * default value as defined by 'T()'
+		 * @param n The number of items to allocate in the new vector.
+		 */
+		inline vector(size_type n)
+			: std::vector<T, Al> (n)
+		{ }
+
+		/**
+		 * Creates a vector of n items where each item is initialized to the
+		 * specified value t.
+		 * @param n The number of items to allocate in the new vector.
+		 * @param t The value that each new item shall be initialized to.
+		 */
+		inline vector(size_type n, const T& t)
+			: std::vector<T, Al> (n, t)
+		{ }
+
+		/**
+		 * Index operator returns reference to the specified immutable item.
+		 * No additional bounds checking is performed.
+		 * @param i The index of the value to return a reference to.
+		 * @return An immutable reference to the item at index i.
+		 */
+		inline const_reference operator [] (size_type i) const {
+			ASSERT(i < size());
+			return std::vector<T, Al>::operator [] (i);
+		}
+
+		/**
+		 * Index operator returns a reference to the specified item. No
+		 * additional bounds checking is performed.
+		 * @param i The index of the value to return a reference to.
+		 * @return A reference to the item at index i.
+		 */
+		inline reference operator [] (size_type i) {
+			ASSERT(i < size());
+			return std::vector<T, Al>::operator [] (i);
+		}
+
+		/**
+		 * Conversion operator returns pointer to the immutable item at the
+		 * beginning of this array of NULL if the array is empty.
+		 * @param i The index of the value to return a reference to.
+		 * @return A pointer to an immutable item or NULL.
+		 */
+		inline operator const_pointer () const {
+			return empty() ? NULL : &operator[](0);
+		}
+
+		/**
+		 * Conversion operator returns pointer to the item at the beginning of
+		 * this array of NULL if the array is empty.
+		 * @param i The index of the value to return a reference to.
+		 * @return A pointer to an item or NULL.
+		 */
+		inline operator pointer () {
+			return empty() ? NULL : &operator[](0);
+		}
+
+	};
+
+}
Index: src/Utils/DIB.cpp
===================================================================
--- src/Utils/DIB.cpp	(revision 2013)
+++ src/Utils/DIB.cpp	(working copy)
@@ -18,6 +18,7 @@
 //
 
 #include "stdafx.h"
+#include "stdex_vector.h"
 #include "DIB.h"
 
 CDib::CDib()
@@ -48,35 +49,6 @@
     memset(&m_BMinfo, 0, sizeof(m_BMinfo));
 }
 
-template <class T> class fixed_array {
-
-  public:
-
-	typedef typename T value_type;
-
-	inline fixed_array(size_t len)
-		: m_len   (len)
-		, m_array (new value_type[len])
-	{ }
-
-	inline ~fixed_array() {
-		delete [] m_array;
-		m_array = NULL;
-	}
-
-	inline const value_type& operator [] (size_t i) const { ASSERT(i < m_len); return m_array[i];  }
-	inline       value_type& operator [] (size_t i)       { ASSERT(i < m_len); return m_array[i];  }
-
-	inline operator const value_type* () const { return &m_array[0]; }
-	inline operator       value_type* ()       { return &m_array[0]; }
-
-  private:
-
-	size_t      m_len;
-	value_type* m_array;
-
-};
-
 void CDib::Create32BitFromPicture (CPictureHolder* pPicture, int iWidth, int iHeight)
 {
 	CRect r;
@@ -94,7 +66,7 @@
 	pPicture->Render(&tempDC,r,r);
 
 	// Create a 32 bit bitmap
-	fixed_array<DWORD> pBits(iWidth * iHeight);
+	stdex::vector<DWORD> pBits(iWidth * iHeight);
 
 	BITMAPINFO bi;
     bi.bmiHeader.biSize          = sizeof(BITMAPINFOHEADER);
Index: src/SVN/SVNStatusListCtrl.h
===================================================================
--- src/SVN/SVNStatusListCtrl.h	(revision 2013)
+++ src/SVN/SVNStatusListCtrl.h	(working copy)
@@ -91,6 +91,13 @@
 class CSVNStatusListCtrl : public CListCtrl
 {
 public:
+	
+	/**
+	 * Sent to the parent window (using ::SendMessage) after a context menu
+	 * command has finished if the item count has changed.
+	 */
+	static const UINT SVNSLNM_ITEMCOUNTCHANGED;
+
 	CSVNStatusListCtrl();
 	~CSVNStatusListCtrl();
 
Index: src/SVN/SVNStatusListCtrl.cpp
===================================================================
--- src/SVN/SVNStatusListCtrl.cpp	(revision 2013)
+++ src/SVN/SVNStatusListCtrl.cpp	(working copy)
@@ -32,6 +32,9 @@
 #include "SysImageList.h"
 #include ".\svnstatuslistctrl.h"
 
+const UINT CSVNStatusListCtrl::SVNSLNM_ITEMCOUNTCHANGED
+	= ::RegisterWindowMessage(_T("SVNSLNM_ITEMCOUNTCHANGED"));
+
 #define IDSVNLC_REVERT			1
 #define IDSVNLC_COMPARE			2
 #define IDSVNLC_OPEN			3
@@ -1277,6 +1280,7 @@
 				int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);
 				m_bBlock = TRUE;
 				AfxGetApp()->DoWaitCursor(1);
+				int iItemCountBeforeMenuCmd = GetItemCount();
 				switch (cmd)
 				{
 				case IDSVNLC_REVERT:
@@ -1601,6 +1605,15 @@
 				m_bBlock = FALSE;
 				AfxGetApp()->DoWaitCursor(-1);
 				GetStatistics();
+				int iItemCountAfterMenuCmd = GetItemCount();
+				if (iItemCountAfterMenuCmd != iItemCountBeforeMenuCmd)
+				{
+					CWnd* pParent = GetParent();
+					if (NULL != pParent && NULL != pParent->GetSafeHwnd())
+					{
+						pParent->SendMessage(SVNSLNM_ITEMCOUNTCHANGED);
+					}
+				}
 			} // if (popup.CreatePopupMenu())
 		} // if (selIndex >= 0)
 	} // if (pWnd == this)


