Browse Source

- prompt for group name
- show group name in static at top of ditto window
- other minor bug fixes


git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@54 595ec19a-5cb4-439b-94a8-42fb3063c22c

sabrogden 22 years ago
parent
commit
0e4976f6e3
15 changed files with 521 additions and 83 deletions
  1. 4 4
      CP_Main.cpp
  2. 16 0
      CP_Main.dsp
  3. 36 11
      CP_Main.rc
  4. 60 0
      GroupName.cpp
  5. 47 0
      GroupName.h
  6. 116 0
      GroupStatic.cpp
  7. 63 0
      GroupStatic.h
  8. 8 1
      Misc.cpp
  9. 5 0
      Misc.h
  10. 13 1
      ProcessCopy.cpp
  11. 4 0
      ProcessPaste.cpp
  12. 5 3
      QListCtrl.cpp
  13. 134 59
      QPasteWnd.cpp
  14. 4 1
      QPasteWnd.h
  15. 6 3
      Resource.h

+ 4 - 4
CP_Main.cpp

@@ -291,9 +291,9 @@ int count;
 
 	count = pClips->AddToDB( true );
 	if( count > 0 )
-	{
-		OnCopyCompleted( lID, count );
+	{		
 		lID = pClips->GetTail()->m_ID;
+		OnCopyCompleted( lID, count );
 	}
 
 	delete pClips;
@@ -433,8 +433,8 @@ BOOL bResult = FALSE;
 			{
 				m_GroupID = recs.m_lID;
 				m_GroupParentID = recs.m_lParentID;
-				if( m_GroupParentID == 0 )
-                    m_GroupParentID = -1; // back out into "all top-level groups" list.
+//				if( m_GroupParentID == 0 )
+//	                 m_GroupParentID = -1; // back out into "all top-level groups" list.
 				m_GroupText = recs.m_strText;
 				bResult = TRUE;
 			}

+ 16 - 0
CP_Main.dsp

@@ -203,6 +203,14 @@ SOURCE=.\ComboBoxSearch.h
 # End Source File
 # Begin Source File
 
+SOURCE=.\GroupStatic.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\GroupStatic.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\HyperLink.cpp
 # End Source File
 # Begin Source File
@@ -260,6 +268,10 @@ SOURCE=.\DataTable.cpp
 # End Source File
 # Begin Source File
 
+SOURCE=.\GroupName.cpp
+# End Source File
+# Begin Source File
+
 SOURCE=.\InternetUpdate.cpp
 # End Source File
 # Begin Source File
@@ -369,6 +381,10 @@ SOURCE=.\DataTable.h
 # End Source File
 # Begin Source File
 
+SOURCE=.\GroupName.h
+# End Source File
+# Begin Source File
+
 SOURCE=.\HyperLink.h
 # End Source File
 # Begin Source File

+ 36 - 11
CP_Main.rc

@@ -157,18 +157,12 @@ IDR_QUICK_PASTE MENU DISCARDABLE
 BEGIN
     POPUP "Menu"
     BEGIN
-        MENUITEM "New Group\tF7",               ID_MENU_NEWGROUP
-        MENUITEM "New Group Selection\tCtrl-F7", ID_MENU_NEWGROUPSELECTION
-        MENUITEM "View Full Description\tF3",   ID_MENU_VIEWFULLDESCRIPTION
-        MENUITEM SEPARATOR
-        MENUITEM "Delete Entry\tDel",           ID_MENU_DELETE
-        MENUITEM SEPARATOR
-        MENUITEM "Properties\tAlt-Enter",       ID_MENU_PROPERTIES
-        MENUITEM SEPARATOR
-        MENUITEM "Reconnect To Clipboard Chain", 
-                                                ID_MENU_RECONNECTTOCLIPBOARDCHAIN
+        POPUP "Groups"
+        BEGIN
+            MENUITEM "New Group\tCtrl-F7",          ID_MENU_NEWGROUP
+            MENUITEM "New Group Selection\tF7",     ID_MENU_NEWGROUPSELECTION
 
-        MENUITEM "Options...",                  ID_MENU_OPTIONS
+        END
         POPUP "Quick Options"
         BEGIN
             POPUP "Lines Per Row"
@@ -250,7 +244,19 @@ BEGIN
             MENUITEM "Auto Roll-up",                ID_MENU_AUTOHIDE
             MENUITEM "Always Show Description",     ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION
 
+            MENUITEM "Prompt For New Group Names",  ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES
+
         END
+        MENUITEM "View Full Description\tF3",   ID_MENU_VIEWFULLDESCRIPTION
+        MENUITEM SEPARATOR
+        MENUITEM "Delete Entry\tDel",           ID_MENU_DELETE
+        MENUITEM SEPARATOR
+        MENUITEM "Properties\tAlt-Enter",       ID_MENU_PROPERTIES
+        MENUITEM SEPARATOR
+        MENUITEM "Reconnect To Clipboard Chain", 
+                                                ID_MENU_RECONNECTTOCLIPBOARDCHAIN
+
+        MENUITEM "Options...",                  ID_MENU_OPTIONS
         MENUITEM SEPARATOR
         MENUITEM "Exit Program",                ID_MENU_EXITPROGRAM
     END
@@ -502,6 +508,17 @@ BEGIN
     LTEXT           "E-mail Scott Brogden",IDC_HYPER_LINK,7,109,67,8
 END
 
+IDD_GROUP_NAME DIALOG DISCARDABLE  0, 0, 186, 49
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Ditto"
+FONT 8, "MS Sans Serif"
+BEGIN
+    DEFPUSHBUTTON   "OK",IDOK,75,28,50,14
+    PUSHBUTTON      "Cancel",IDCANCEL,129,28,50,14
+    LTEXT           "Name",IDC_STATIC,7,1,59,10
+    EDITTEXT        IDC_NAME,7,11,172,12,ES_AUTOHSCROLL
+END
+
 
 #ifndef _MAC
 /////////////////////////////////////////////////////////////////////////////
@@ -639,6 +656,14 @@ BEGIN
         TOPMARGIN, 7
         BOTTOMMARGIN, 117
     END
+
+    IDD_GROUP_NAME, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 179
+        TOPMARGIN, 1
+        BOTTOMMARGIN, 42
+    END
 END
 #endif    // APSTUDIO_INVOKED
 

+ 60 - 0
GroupName.cpp

@@ -0,0 +1,60 @@
+// GroupName.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "cp_main.h"
+#include "GroupName.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupName dialog
+
+
+CGroupName::CGroupName(CWnd* pParent /*=NULL*/)
+	: CDialog(CGroupName::IDD, pParent)
+{
+	//{{AFX_DATA_INIT(CGroupName)
+	m_csName = _T("");
+	//}}AFX_DATA_INIT
+}
+
+
+void CGroupName::DoDataExchange(CDataExchange* pDX)
+{
+	CDialog::DoDataExchange(pDX);
+	//{{AFX_DATA_MAP(CGroupName)
+	DDX_Text(pDX, IDC_NAME, m_csName);
+	//}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CGroupName, CDialog)
+	//{{AFX_MSG_MAP(CGroupName)
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupName message handlers
+
+void CGroupName::OnOK() 
+{
+	UpdateData(TRUE);
+	
+	CDialog::OnOK();
+}
+
+BOOL CGroupName::OnInitDialog() 
+{
+	CDialog::OnInitDialog();
+
+	CWnd *pWnd = GetDlgItem(IDC_NAME);
+	if(pWnd)
+		pWnd->SetFocus();
+		
+	return FALSE;
+}

+ 47 - 0
GroupName.h

@@ -0,0 +1,47 @@
+#if !defined(AFX_GROUPNAME_H__C0A39EC3_DC62_43FF_A9BF_9AC3E356C498__INCLUDED_)
+#define AFX_GROUPNAME_H__C0A39EC3_DC62_43FF_A9BF_9AC3E356C498__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+// GroupName.h : header file
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupName dialog
+
+class CGroupName : public CDialog
+{
+// Construction
+public:
+	CGroupName(CWnd* pParent = NULL);   // standard constructor
+
+// Dialog Data
+	//{{AFX_DATA(CGroupName)
+	enum { IDD = IDD_GROUP_NAME };
+	CString	m_csName;
+	//}}AFX_DATA
+
+
+// Overrides
+	// ClassWizard generated virtual function overrides
+	//{{AFX_VIRTUAL(CGroupName)
+	protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
+	//}}AFX_VIRTUAL
+
+// Implementation
+protected:
+
+	// Generated message map functions
+	//{{AFX_MSG(CGroupName)
+	virtual void OnOK();
+	virtual BOOL OnInitDialog();
+	//}}AFX_MSG
+	DECLARE_MESSAGE_MAP()
+};
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_GROUPNAME_H__C0A39EC3_DC62_43FF_A9BF_9AC3E356C498__INCLUDED_)

+ 116 - 0
GroupStatic.cpp

@@ -0,0 +1,116 @@
+// GroupStatic.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "cp_main.h"
+#include "GroupStatic.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupStatic
+
+CGroupStatic::CGroupStatic()
+{
+	m_dwTextColor = 0;
+	m_dwBkColor = RGB(255, 255, 255);
+}
+
+CGroupStatic::~CGroupStatic()
+{
+}
+
+
+BEGIN_MESSAGE_MAP(CGroupStatic, CStatic)
+	//{{AFX_MSG_MAP(CGroupStatic)
+		// NOTE - the ClassWizard will add and remove mapping macros here.
+	//}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupStatic message handlers
+
+BOOL CGroupStatic::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
+{  
+#ifndef WIN32
+      return CStatic::OnChildNotify(message, wParam, lParam, pLResult);
+#else
+   // If not setting static control color, do default processing
+   if( message != WM_CTLCOLORSTATIC )
+      return CStatic::OnChildNotify(message, wParam, lParam, pLResult);
+
+   HDC hdcChild = (HDC)wParam;
+
+   // Set the foreground color
+   ::SetTextColor( hdcChild, m_dwTextColor );
+
+   // If a background color is pre-determined
+   if(m_dwBkColor != -1)
+   {  
+      ::SetBkMode(hdcChild, TRANSPARENT);
+      ::SetBkColor(hdcChild, m_dwBkColor);  
+	   m_brush.DeleteObject();
+	   m_brush.CreateSolidBrush(m_dwBkColor);
+      *pLResult = (LRESULT)(m_brush.GetSafeHandle());
+   }
+   else
+   {
+   // Determine the current background color based on my parent window
+      static COLORREF clrPrevValid = -1;
+      HWND hParent = ::GetParent(m_hWnd);
+      HDC  hParentDc = ::GetDC(hParent);
+
+      // Get the color based on the 0, 0 reference
+      COLORREF clrParentBkground = ::GetPixel(hParentDc, 0, 0);
+      ::ReleaseDC(hParent, hParentDc);
+
+      // If found (not off of the screen or under another window)
+      // set my current color to it
+      if(clrParentBkground == -1)
+      {  clrParentBkground = clrPrevValid;  }
+      else
+      {  clrPrevValid = clrParentBkground;  }
+
+      // If either the current, or previous color found was not valid
+      // allow to perform default processing
+      if(clrParentBkground == -1)
+      {  return FALSE;  }
+
+
+      // Set the background mode to transparent
+      ::SetBkMode(hdcChild, TRANSPARENT);
+
+      // Set the background color and brush based on my parent's color
+      ::SetBkColor(hdcChild, clrParentBkground);  
+	   m_brush.DeleteObject();
+	   m_brush.CreateSolidBrush(clrParentBkground);
+      *pLResult = (LRESULT)(m_brush.GetSafeHandle());
+   }
+
+   // Return TRUE to indicate that the message was handled
+   return TRUE;
+#endif
+}
+
+
+/*************************************************************************
+*
+*************************************************************************/
+void CGroupStatic::SetFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC )
+{
+   // If a font has been allocated, delete it
+   if( m_pFont )
+      delete m_pFont;
+
+   m_pFont = new CFont;
+
+   // Create a font using the given attributes
+   m_pFont->CreatePointFont( nPointSize, lpszFaceName, pDC );
+
+   // Set the window's current font to the specified font
+   CStatic::SetFont( m_pFont );
+}

+ 63 - 0
GroupStatic.h

@@ -0,0 +1,63 @@
+#if !defined(AFX_GROUPSTATIC_H__C7039DB6_84EE_4622_8054_6DBA48FA21A9__INCLUDED_)
+#define AFX_GROUPSTATIC_H__C7039DB6_84EE_4622_8054_6DBA48FA21A9__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+// GroupStatic.h : header file
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// CGroupStatic window
+
+class CGroupStatic : public CStatic
+{
+// Construction
+public:
+	CGroupStatic();
+
+// Attributes
+public:
+
+// Operations
+public:
+
+	void SetTextColor( COLORREF color )		{ m_dwTextColor = color;	}
+	void SetBkColor( COLORREF color )		{ m_dwBkColor = color;		}
+	void SetFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL );
+	void SetFont(CFont *pFont)				{ CStatic::SetFont(pFont);		}
+
+// Overrides
+	// ClassWizard generated virtual function overrides
+	//{{AFX_VIRTUAL(CGroupStatic)
+	public:
+	virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult);
+	//}}AFX_VIRTUAL
+
+// Implementation
+public:
+	virtual ~CGroupStatic();
+
+protected:
+	COLORREF m_dwTextColor;
+	COLORREF m_dwBkColor;
+	CFont*   m_pFont;
+	CBrush   m_brush;
+	CString  m_strBuff;        // Holds the static controls contents before & after the control is displayed
+
+
+	// Generated message map functions
+protected:
+	//{{AFX_MSG(CGroupStatic)
+		// NOTE - the ClassWizard will add and remove member functions here.
+	//}}AFX_MSG
+
+	DECLARE_MESSAGE_MAP()
+};
+
+/////////////////////////////////////////////////////////////////////////////
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_GROUPSTATIC_H__C7039DB6_84EE_4622_8054_6DBA48FA21A9__INCLUDED_)

+ 8 - 1
Misc.cpp

@@ -415,7 +415,8 @@ BOOL CGetSetOptions::m_bHistoryStartTop;
 long CGetSetOptions::m_bDescTextSize;
 BOOL CGetSetOptions::m_bDescShowLeadingWhiteSpace;
 BOOL CGetSetOptions::m_bAllwaysShowDescription;
-LONG CGetSetOptions::m_bDoubleClickingOnCaptionDoes;
+long CGetSetOptions::m_bDoubleClickingOnCaptionDoes;
+BOOL CGetSetOptions::m_bPrompForNewGroupName;
 
 CGetSetOptions g_Opt;
 
@@ -432,6 +433,7 @@ CGetSetOptions::CGetSetOptions()
 	m_bDescShowLeadingWhiteSpace = GetDescShowLeadingWhiteSpace();
 	m_bAllwaysShowDescription = GetAllwaysShowDescription();
 	m_bDoubleClickingOnCaptionDoes = GetDoubleClickingOnCaptionDoes();
+	m_bPrompForNewGroupName = GetPrompForNewGroupName();
 }
 
 CGetSetOptions::~CGetSetOptions()
@@ -896,6 +898,11 @@ BOOL CGetSetOptions::GetAllwaysShowDescription()			{	return GetProfileLong("Allw
 
 void CGetSetOptions::SetDoubleClickingOnCaptionDoes(long lOption)	{	SetProfileLong("DoubleClickingOnCaptionDoes", lOption); m_bDoubleClickingOnCaptionDoes = lOption; }
 long CGetSetOptions::GetDoubleClickingOnCaptionDoes()				{	return GetProfileLong("DoubleClickingOnCaptionDoes", TOGGLES_ALLWAYS_ON_TOP); }
+
+void CGetSetOptions::SetPrompForNewGroupName(BOOL bOption)	{	SetProfileLong("PrompForNewGroupName", bOption); m_bPrompForNewGroupName = bOption; }
+BOOL CGetSetOptions::GetPrompForNewGroupName()				{	return GetProfileLong("PrompForNewGroupName", TRUE); }
+
+
 /*------------------------------------------------------------------*\
 	CHotKey - a single system-wide hotkey
 \*------------------------------------------------------------------*/

+ 5 - 0
Misc.h

@@ -240,6 +240,11 @@ public:
 	static void		SetDoubleClickingOnCaptionDoes(long lOption);
 	static long		GetDoubleClickingOnCaptionDoes();
 
+	static BOOL		m_bPrompForNewGroupName;
+	static void		SetPrompForNewGroupName(BOOL bOption);
+	static BOOL		GetPrompForNewGroupName();
+
+
 	/*
 	BOOL IsAutoRun();
 	void SetAutoRun(BOOL bRun);

+ 13 - 1
ProcessCopy.cpp

@@ -613,6 +613,7 @@ HGLOBAL hGlobal = 0;
 
 	try
 	{
+		BOOL bShiftIsDown = (GetKeyState(VK_SHIFT) & 0x8000);
 		CDataTable recset;
 
 		//Open the data table for all that have the parent id
@@ -626,6 +627,17 @@ HGLOBAL hGlobal = 0;
 
 		while( !recset.IsEOF() )
 		{
+			cf.m_cfType = GetFormatID( recset.m_strClipBoardFormat );
+
+			if(bShiftIsDown)
+			{
+				if(cf.m_cfType != CF_TEXT)
+				{
+					recset.MoveNext();
+					continue;
+				}
+			}
+
 			// create a new HGLOBAL duplicate
 			hGlobal = NewGlobalH( recset.m_ooData.m_hData, recset.m_ooData.m_dwDataLength );
 			// XOR take the recset's HGLOBAL... is this SAFE??
@@ -636,7 +648,7 @@ HGLOBAL hGlobal = 0;
 				//::_RPT0( _CRT_WARN, GetErrorString(::GetLastError()) );
 				ASSERT(FALSE);
 			}
-			cf.m_cfType = GetFormatID( recset.m_strClipBoardFormat );
+			
 			cf.m_hgData = hGlobal;
 			formats.Add( cf );
 			recset.MoveNext();

+ 4 - 0
ProcessPaste.cpp

@@ -97,6 +97,7 @@ CTime time;
 		lID = recset.m_lID;
 
 		recset.m_lDate = (long) time.GetTime();
+		recset.m_lDontAutoDelete = (long) time.GetTime();
 
 		if( text != "" )
 			recset.m_strText = text;
@@ -477,6 +478,8 @@ BOOL bChangeOrder = (dIncrement >= 0);
 			{
 				recs.Edit();
 				recs.m_lParentID = lParentID;
+
+				recs.m_lDontAutoDelete = (long)CTime::GetCurrentTime().GetTime();
 				if( bChangeOrder )
 					recs.m_dOrder = dOrder;
 				recs.Update();
@@ -629,6 +632,7 @@ long lCopyID;
 				pAddTable->AddNew(); // overridden to fetch autoincr lID
 				lCopyID = pAddTable->m_lID;
 				pAddTable->CopyRec( *pTable ); // copy the fields
+				pAddTable->m_lDontAutoDelete  = (long)CTime::GetCurrentTime().GetTime();
 				if( lParentID > 0 ) // if valid, assign the given parent
 					pAddTable->m_lParentID = lParentID;
 				pAddTable->Update();

+ 5 - 3
QListCtrl.cpp

@@ -436,11 +436,11 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 			csText = CString(' ',numSpaces) + csText;
 
 			// draw the symbols
-//			pDC->FillSolidRect( rectSym, GetSysColor(COLOR_INFOBK) );
-			pDC->FillSolidRect( rectSym, RGB(0,255,255) );
+			pDC->FillSolidRect( rectSym, GetSysColor(COLOR_ACTIVECAPTION) );
+			//pDC->FillSolidRect( rectSym, RGB(0,255,255) );
 	        pDC->Draw3dRect(rectSym, GetSysColor(COLOR_3DLIGHT), GetSysColor(COLOR_3DDKSHADOW));
 //		COLORREF crOld = pDC->SetTextColor(GetSysColor(COLOR_INFOTEXT));
-		COLORREF crOld = pDC->SetTextColor(0);
+		COLORREF crOld = pDC->SetTextColor(RGB(255, 255, 255));
 			pDC->DrawText(strSymbols, rectSym, DT_VCENTER | DT_EXPANDTABS);
 			pDC->SetTextColor(crOld);
 		}
@@ -856,6 +856,8 @@ void CQListCtrl::OnSelectionChange(NMHDR* pNMHDR, LRESULT* pResult)
 			KillTimer(TIMER_SHOW_PROPERTIES);
 			SetTimer(TIMER_SHOW_PROPERTIES, 300, NULL);
 		}
+		if(GetSelectedCount() > 0 )
+			theApp.SetStatus(NULL, TRUE);
 	}
 }
 

+ 134 - 59
QPasteWnd.cpp

@@ -6,6 +6,7 @@
 #include "QPasteWnd.h"
 #include "ProcessPaste.h"
 #include "CopyProperties.h"
+#include "GroupName.h"
 #include ".\qpastewnd.h"
 
 #ifdef _DEBUG
@@ -19,6 +20,7 @@ static char THIS_FILE[] = __FILE__;
 #define ID_LIST_HEADER			0x201
 #define ID_EDIT_SEARCH			0x202
 #define ID_CANCEL				0x203
+#define ID_GROUP_TEXT			0x204
 
 
 #define QPASTE_WIDTH			200
@@ -71,7 +73,6 @@ BEGIN_MESSAGE_MAP(CQPasteWnd, CWndEx)
 	ON_COMMAND(ID_MENU_PROPERTIES, OnMenuProperties)
 	ON_WM_CLOSE()
 	ON_NOTIFY(LVN_BEGINDRAG, ID_LIST_HEADER, OnBegindrag)
-	ON_NOTIFY(LVN_ITEMCHANGED, ID_LIST_HEADER, OnSelectionChange)
 	ON_WM_SYSKEYDOWN()
 	ON_NOTIFY(LVN_GETDISPINFO, ID_LIST_HEADER, GetDispInfo)
 	ON_NOTIFY(LVN_ODFINDITEM, ID_LIST_HEADER, OnFindItem)
@@ -81,6 +82,7 @@ BEGIN_MESSAGE_MAP(CQPasteWnd, CWndEx)
 	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop)
 	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow)
 	ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription)
+	ON_COMMAND(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, OnMenuQuickoptionsPromptfornewgroupnames)
 	//}}AFX_MSG_MAP
 	ON_MESSAGE(NM_SELECT, OnListSelect)
 	ON_MESSAGE(NM_END, OnListEnd)
@@ -139,6 +141,8 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 
 	m_btCancel.Create("&C", WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP/*|BS_FLAT*/, CRect(0, 0, 0, 0), this, ID_CANCEL);
 
+	m_stGroup.Create("", WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, ID_GROUP_TEXT);
+
 	//Set the z-order
 	m_lstHeader.SetWindowPos(this, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
 	m_cbSearch.SetWindowPos(&m_lstHeader, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
@@ -163,9 +167,12 @@ int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	DEFAULT_PITCH|FF_SWISS,"Arial");
 	
 	m_SearchFont.CreatePointFont(80, "MS Sans Serif");
+	
+	GroupFont.CreateFont(-11, 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, "MS Sans Serif");
 
 	m_cbSearch.SetFont(&m_SearchFont);
 	m_btCancel.SetFont(&m_SearchFont);
+	m_stGroup.SetFont(&GroupFont);
 
 	
 	return 0;
@@ -188,8 +195,19 @@ void CQPasteWnd::MoveControls()
 	int cx = crRect.Width();
 	int cy = crRect.Height();
 
+	long lTopOfListBox = 0;
+
+	if( theApp.m_GroupID > 0 )
+	{
+		m_stGroup.ShowWindow(SW_SHOW);
+		m_stGroup.MoveWindow(0, 0, cx, 16);
+		lTopOfListBox = 16;	
+	}
+	else
+		m_stGroup.ShowWindow(SW_HIDE);
+
 	// Resize the list control
-	m_lstHeader.MoveWindow(0, 0, cx, cy - 22);
+	m_lstHeader.MoveWindow(0, lTopOfListBox, cx, cy - 22);
 
 	int nWidth = cx;
 
@@ -247,7 +265,7 @@ BOOL CQPasteWnd::HideQPasteWindow()
 	m_lstHeader.DestroyAndCreateAccelerator(FALSE);
 
 	// save the caret position
-int nCaretPos = m_lstHeader.GetCaret();
+	int nCaretPos = m_lstHeader.GetCaret();
 	if( nCaretPos >= 0 )
 		theApp.m_FocusID = m_lstHeader.GetItemData( nCaretPos );
 
@@ -331,7 +349,7 @@ BOOL CQPasteWnd::OpenID( long lID )
 		return TRUE;
 
 	// else, it is a clip, so paste it
-CProcessPaste paste;
+	CProcessPaste paste;
 	paste.GetClipIDs().Add( lID );
 	paste.DoPaste();
 	theApp.OnPasteCompleted();
@@ -340,10 +358,10 @@ CProcessPaste paste;
 
 BOOL CQPasteWnd::OpenSelection()
 {
-ARRAY IDs;
+	ARRAY IDs;
 	m_lstHeader.GetSelectionItemData( IDs );
     
-int count = IDs.GetSize();
+	int count = IDs.GetSize();
 
 	if( count <= 0 )
 		return FALSE;
@@ -352,7 +370,7 @@ int count = IDs.GetSize();
 		return OpenID( IDs[0] );
 	// else count > 1
 
-CProcessPaste paste;
+	CProcessPaste paste;
 	paste.GetClipIDs().Copy( IDs );
 	paste.DoPaste();
 	theApp.OnPasteCompleted();
@@ -366,20 +384,39 @@ BOOL CQPasteWnd::OpenIndex( long nItem )
 
 BOOL CQPasteWnd::NewGroup( bool bGroupSelection )
 {
-long lID = NewGroupID( theApp.GetValidGroupID() );
+	m_bHideWnd = false;
 
-	if( lID <= 0 )
+	//Get the selected ids
+	CClipIDs IDs;
+	m_lstHeader.GetSelectionItemData( IDs );
+
+	CGroupName Name;
+	CString csName("");
+	
+	if(g_Opt.m_bPrompForNewGroupName)
+	{
+		int nRet = Name.DoModal();
+	
+		m_bHideWnd = true;
+
+		if(nRet == IDOK)
+			csName = Name.m_csName;
+		else
+			return false;
+	}
+	
+	long lID = NewGroupID(theApp.GetValidGroupID(), csName);
+
+	if(lID <= 0)
 		return FALSE;
 
-	if( !bGroupSelection )
+	if(!bGroupSelection )
 	{
 		theApp.m_FocusID = lID; // focus on the new group
 		FillList();
 		return TRUE;
 	}
-
-CClipIDs IDs;
-	m_lstHeader.GetSelectionItemData( IDs );
+	
 	IDs.MoveTo( lID );
 	theApp.EnterGroupID( lID );
 	return TRUE;
@@ -387,7 +424,7 @@ CClipIDs IDs;
 
 BOOL CQPasteWnd::SetListID( long lID )
 {
-int index;
+	int index;
 	if( !m_Recset.FindFirst( StrF("lID = %d",lID) ) )
 		return FALSE;
 	index = m_Recset.GetAbsolutePosition();
@@ -406,15 +443,19 @@ LRESULT CQPasteWnd::OnListSelect_Index(WPARAM wParam, LPARAM lParam)
 {
 	if( (int) wParam >= m_lstHeader.GetItemCount() )
 		return FALSE;
+
 	OpenIndex( wParam );
+
 	return TRUE;
 }
 
 LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
 {
-int nCount = (int) wParam;
-long *pItems = (long*) lParam;
+	int nCount = (int) wParam;
+	long *pItems = (long*) lParam;
+
 	OpenSelection();
+
 	return TRUE;
 }
 
@@ -429,11 +470,13 @@ LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
 	MSG msg;
 	// remove all additional refresh view messages from the queue
 	while( ::PeekMessage( &msg, m_hWnd, WM_REFRESH_VIEW, WM_REFRESH_VIEW, PM_REMOVE ) )
-	{}
+	{
+	}
 	if( theApp.m_bShowingQuickPaste )
 	{
 		FillList();
 	}
+
 	return TRUE;
 }
 
@@ -450,8 +493,8 @@ void CQPasteWnd::RefreshNc( bool bRepaintImmediately )
 
 void CQPasteWnd::UpdateStatus( bool bRepaintImmediately )
 {
-CString title = m_Title;
-CString prev;
+	CString title = m_Title;
+	CString prev;
 
 	GetWindowText(prev);
 
@@ -471,13 +514,6 @@ CString prev;
 	else
 		title += " - ";
 
-	// asterisk means we are in the default group
-	if( theApp.m_GroupID == theApp.m_GroupDefaultID )
-		title += "*";
-
-	title += theApp.m_GroupText;
-	title += " - ";
-
 	if( theApp.m_IC_IDs.GetSize() > 0 )
 	{
 		if( theApp.m_IC_bCopy )
@@ -502,28 +538,33 @@ CString prev;
 
 BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
 {
-//	if(m_Recset.IsOpen())
-//		m_Recset.Close();
-CString strFilter;
+	CString strFilter;
 
 	// History Group
 	if( theApp.m_GroupID == 0 )
 	{
 		m_lstHeader.m_bStartTop = g_Opt.m_bHistoryStartTop;
 		if( g_Opt.m_bHistoryStartTop )
-			m_Recset.m_strSort = "lDate DESC";
+			m_Recset.m_strSort = "bIsGroup DESC, lDate DESC";
 		else
-			m_Recset.m_strSort = "lDate ASC";
+			m_Recset.m_strSort = "bIsGroup ASC, lDate ASC";
 	}
 	else // it's some other group
 	{
 		m_lstHeader.m_bStartTop = true;
-		m_Recset.m_strSort = "bIsGroup ASC, Left([mText],250) ASC";
+
+		if( g_Opt.m_bHistoryStartTop )
+			m_Recset.m_strSort = "bIsGroup DESC, Left([mText],250) DESC";
+		else
+			m_Recset.m_strSort = "bIsGroup ASC, Left([mText],250) ASC";
+			
 
 		if( theApp.m_GroupID > 0 )
 			strFilter.Format( "lParentID = %d", theApp.m_GroupID );
 		else // All top-level groups
 			strFilter = "bIsGroup = TRUE AND lParentID = 0";
+
+		m_stGroup.SetWindowText(" " + theApp.m_GroupText);
 	}
 
 	// maintain the previous position if theApp.m_FocusID == -1
@@ -600,7 +641,10 @@ CString strFilter;
 
 	theApp.m_FocusID = -1; // maintain previous position from now on.
 
-//	m_lstHeader.Invalidate();
+	theApp.SetStatus(NULL, true);
+
+	MoveControls();
+
 	RedrawWindow(0,0,RDW_INVALIDATE);
 
 	return TRUE;
@@ -624,6 +668,16 @@ void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult)
 
 		m_lstHeader.m_Popup.Hide();
 
+		if(pNMHDR == NULL)
+		{
+			int nItem = m_lstHeader.GetCaret();
+			CRect rc;
+			m_lstHeader.GetItemRect(nItem, rc, LVIR_BOUNDS);
+			ClientToScreen(rc);
+			pp.x = rc.left;
+			pp.y = rc.bottom;
+		}
+
 		cmSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
 				pp.x, pp.y, this, NULL);
 	}
@@ -765,6 +819,11 @@ void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
 			pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, MF_CHECKED);
 			break;
 	}
+
+	if(CGetSetOptions::m_bPrompForNewGroupName)
+	{
+		pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, MF_CHECKED);
+	}
 }
 
 LRESULT CQPasteWnd::OnSearch(WPARAM wParam, LPARAM lParam)
@@ -1018,6 +1077,11 @@ void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription
 	CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_SHOW_DESCRIPTION);	
 }
 
+void CQPasteWnd::OnMenuQuickoptionsPromptfornewgroupnames() 
+{
+	g_Opt.SetPrompForNewGroupName( !g_Opt.m_bPrompForNewGroupName );	
+}
+
 ///////////////////////////////////////////////////////////////////////
 //END END Menu Stuff
 ///////////////////////////////////////////////////////////////////////
@@ -1032,14 +1096,14 @@ LRESULT CQPasteWnd::OnDelete(WPARAM wParam, LPARAM lParam)
 
 void CQPasteWnd::DeleteSelectedRows()
 {
-CClipIDs IDs;
-long lCount = 0;
+	CClipIDs IDs;
+	long lCount = 0;
 
 	if( m_lstHeader.GetSelectedCount() == 0 )
 		return;
 
-POSITION pos = m_lstHeader.GetFirstSelectedItemPosition();
-int nFirstSel = m_lstHeader.GetNextSelectedItem( pos );
+	POSITION pos = m_lstHeader.GetFirstSelectedItemPosition();
+	int nFirstSel = m_lstHeader.GetNextSelectedItem( pos );
 
 	m_lstHeader.GetSelectionItemData( IDs );
 	IDs.DeleteIDs();
@@ -1083,7 +1147,7 @@ CString CQPasteWnd::LoadDescription( int nItem )
 	if( nItem < 0 || nItem >= m_lstHeader.GetItemCount() )
 		return "";
 
-CString cs;
+	CString cs;
 	try
 	{
 		m_Recset.SetAbsolutePosition( nItem );
@@ -1119,22 +1183,39 @@ BOOL CQPasteWnd::PreTranslateMessage(MSG* pMsg)
 
 		switch( pMsg->wParam )
 		{
+		case 93:
+		{
+			long lRet;
+			OnRclickQuickPaste(NULL, &lRet);
+			return 0;
+		}
 		case VK_F7:
-			if(GetKeyState(VK_CONTROL) & 0x8000)
-				NewGroup( true );
-			else
-				NewGroup( false );
-			return TRUE;
+			if(pMsg->hwnd == m_lstHeader.m_hWnd)
+			{
+				if(GetKeyState(VK_CONTROL) & 0x8000)
+					NewGroup( false );
+				else
+					NewGroup( true );
+				return TRUE;
+			}
+			break;
 
 		case VK_BACK:
-			theApp.EnterGroupID( theApp.m_GroupParentID );
-			return TRUE;
+			if(pMsg->hwnd == m_lstHeader.m_hWnd)
+			{
+				theApp.EnterGroupID( theApp.m_GroupParentID );
+				return TRUE;
+			}
+			break;
 
 		case VK_SPACE:
-			if(GetKeyState(VK_CONTROL) & 0x8000)
+			if(pMsg->hwnd == m_lstHeader.m_hWnd)
 			{
-				theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
-				return TRUE;
+				if(GetKeyState(VK_CONTROL) & 0x8000)
+				{
+					theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
+					return TRUE;
+				}
 			}
 			break;
 
@@ -1233,10 +1314,12 @@ void CQPasteWnd::OnClose()
 
 void CQPasteWnd::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult) 
 {
-NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
-CProcessPaste paste;
-CClipIDs& clips = paste.GetClipIDs();
+	NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
+	CProcessPaste paste;
+	CClipIDs& clips = paste.GetClipIDs();
+
 	m_lstHeader.GetSelectionItemData( clips );
+
 	if( clips.GetSize() <= 0 )
 	{
 		ASSERT(0); // does this ever happen ??
@@ -1488,11 +1571,3 @@ void CQPasteWnd::OnWindowPosChanging(WINDOWPOS* lpwndpos)
 		lpwndpos->y = rcScreen.bottom - lpwndpos->cy;
 	}
 }
-
-void CQPasteWnd::OnSelectionChange(NMHDR* pNMHDR, LRESULT* pResult)
-{
-	// avoid temporary 0 flicker when moving cursor
-	// the focus is always implicitly selected.
-	if( m_lstHeader.GetSelectedCount() > 0 )
-		theApp.SetStatus(NULL, TRUE);
-}

+ 4 - 1
QPasteWnd.h

@@ -10,6 +10,7 @@
 #include "QListCtrl.h"
 #include "ComboBoxSearch.h"
 #include "WndEx.h"
+#include "GroupStatic.h"
 
 #ifdef AFTER_98
 	#include "AlphaBlend.h"
@@ -59,6 +60,8 @@ public:
 	bool			m_bHideWnd;
 	CMainTable		m_Recset;
 	CString			m_strSQLSearch;
+	CGroupStatic	m_stGroup;
+	CFont			GroupFont;
 
 	CString			m_Title;
 
@@ -120,7 +123,6 @@ protected:
 	afx_msg void OnMenuProperties();
 	afx_msg void OnClose();
 	afx_msg void OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult);
-	afx_msg void OnSelectionChange(NMHDR* pNMHDR, LRESULT* pResult);
 	afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
 	afx_msg void GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult);
 	afx_msg void OnFindItem(NMHDR* pNMHDR, LRESULT* pResult);
@@ -130,6 +132,7 @@ protected:
 	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop();
 	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow();
 	afx_msg void OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription();
+	afx_msg void OnMenuQuickoptionsPromptfornewgroupnames();
 	//}}AFX_MSG
 	afx_msg LRESULT OnListSelect(WPARAM wParam, LPARAM lParam);
 	afx_msg LRESULT OnListEnd(WPARAM wParam, LPARAM lParam);

+ 6 - 3
Resource.h

@@ -11,6 +11,7 @@
 #define IDD_ADD_TYPE                    134
 #define IDD_COPY_PROPERTIES             135
 #define IDD_ABOUT                       136
+#define IDD_GROUP_NAME                  138
 #define IDC_PATH                        1000
 #define IDC_GET_PATH                    1001
 #define IDC_SELECT                      1003
@@ -81,6 +82,7 @@
 #define IDC_COMPACT_DB                  2018
 #define IDC_REPAIR                      2019
 #define IDC_DESC_SHOW_LEADING_WHITESPACE 2021
+#define IDC_NAME                        2022
 #define ID_FIRST_OPTION                 32771
 #define ID_FIRST_EXIT                   32772
 #define ID_FIRST_SHOWQUICKPASTE         32773
@@ -125,15 +127,16 @@
 #define ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP 32814
 #define ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW 32815
 #define ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION 32816
+#define ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES 32817
 
 // Next default values for new objects
 // 
 #ifdef APSTUDIO_INVOKED
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
-#define _APS_NEXT_RESOURCE_VALUE        138
-#define _APS_NEXT_COMMAND_VALUE         32817
-#define _APS_NEXT_CONTROL_VALUE         2022
+#define _APS_NEXT_RESOURCE_VALUE        141
+#define _APS_NEXT_COMMAND_VALUE         32819
+#define _APS_NEXT_CONTROL_VALUE         2023
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif