Просмотр исходного кода

Draw color of copied color code in the format #CD5C5C or rgb(120,153,160) (#665)

sabrogden 1 год назад
Родитель
Сommit
ffba08b4f7
6 измененных файлов с 170 добавлено и 6 удалено
  1. 11 0
      AdvGeneral.cpp
  2. 4 1
      MainTableFunctions.cpp
  3. 89 0
      Options.cpp
  4. 4 0
      Options.h
  5. 61 5
      QListCtrl.cpp
  6. 1 0
      QListCtrl.h

+ 11 - 0
AdvGeneral.cpp

@@ -144,6 +144,7 @@ END_MESSAGE_MAP()
 #define SETTING_SUPPORT_ALL_TYPES 93
 #define SETTING_IGNORE_ANNOYING_CF_DIB 94
 #define SETTING_REGEX_CASE_INSENSITIVE 95
+#define SETTING_DRAW_COPIED_COLOR_CODE 96
 
 BOOL CAdvGeneral::OnInitDialog()
 {
@@ -199,6 +200,8 @@ BOOL CAdvGeneral::OnInitDialog()
 
 	pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Double shortcut keystroke timeout)"), (long)CGetSetOptions::GetDoubleKeyStrokeTimeout(), _T(""), SETTING_DOUBLE_KEYSTROKE_TIMEOUT));
 
+	AddTrueFalse(pGroupTest, _T("Draw copied copied color code (hex #RRGGBB or rgb(r,g,b)"), CGetSetOptions::GetDrawCopiedColorCode(), SETTING_DRAW_COPIED_COLOR_CODE);
+
 	AddTrueFalse(pGroupTest, _T("Draw RTF text in list (for RTF types) (could increase memory usage an display speed)"), CGetSetOptions::GetDrawRTF(), SETTING_DRAW_RTF);
 	pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Editor default font size"), (long)CGetSetOptions::GetEditorDefaultFontSize(), _T(""), SETTING_EDITOR_FONT_SIZE));
 	AddTrueFalse(pGroupTest, _T("Elevated privileges to paste into elevated apps"), CGetSetOptions::GetPasteAsAdmin(), SETTING_PASTE_AS_ADMIN);
@@ -838,6 +841,14 @@ void CAdvGeneral::OnBnClickedOk()
 					BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
 					CGetSetOptions::SetRegexCaseInsensitive(val);
 				}
+				break;
+			case SETTING_DRAW_COPIED_COLOR_CODE:
+				if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
+				{
+					BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
+					CGetSetOptions::SetDrawCopiedColorCode(val);
+				}
+				break;
 			}
 		}
 	}

+ 4 - 1
MainTableFunctions.cpp

@@ -105,7 +105,10 @@ CString CMainTableFunctions::GetDisplayText(int nMaxLines, const CString &OrigTe
 			text += line;
 		}
 
-		text += _T("\n");
+		if (i != count - 1)
+		{
+			text += _T("\n");
+		}
 	}
 
 	return text;

+ 89 - 0
Options.cpp

@@ -9,6 +9,7 @@
 #include "ActionEnums.h"
 #include "Shared/Tokenizer.h"
 #include <set>
+#include <Wincrypt.h>
 
 using namespace nsPath;
 
@@ -43,6 +44,7 @@ BOOL CGetSetOptions::m_bLogSendReceiveErrors;
 BOOL CGetSetOptions::m_HideDittoOnHotKeyIfAlreadyShown;
 long CGetSetOptions::m_lPort;
 BOOL CGetSetOptions::m_bDrawThumbnail;
+BOOL CGetSetOptions::m_bDrawCopiedColorCode;
 BOOL CGetSetOptions::m_bFastThumbnailMode;
 CStringA CGetSetOptions::m_csPassword;
 BOOL CGetSetOptions::m_bDrawRTF;
@@ -90,6 +92,79 @@ BOOL CGetSetOptions::m_supportAllTypes = FALSE;
 
 CGetSetOptions::CGetSetOptions()
 {
+	//DATA_BLOB DataIn;
+	//DATA_BLOB DataOut;
+	//DATA_BLOB DataVerify;
+	//BYTE* pbDataInput = (BYTE*)"Hello world of data protection.";
+	//DWORD cbDataInput = strlen((char*)pbDataInput) + 1;
+	//DataIn.pbData = pbDataInput;
+	//DataIn.cbData = cbDataInput;
+	//CRYPTPROTECT_PROMPTSTRUCT PromptStruct;
+	//LPWSTR pDescrOut = NULL;
+
+	//CRYPTPROTECT_LOCAL_MACHINE
+
+	////-------------------------------------------------------------------
+	////  Begin processing.
+
+	//printf("The data to be encrypted is: %s\n", pbDataInput);
+
+	////-------------------------------------------------------------------
+	////  Initialize PromptStruct.
+
+	////ZeroMemory(&PromptStruct, sizeof(PromptStruct));
+	////PromptStruct.cbSize = sizeof(PromptStruct);
+	////PromptStruct.dwPromptFlags = CRYPTPROTECT_PROMPT_ON_PROTECT;
+	////PromptStruct.szPrompt = L"This is a user prompt.";
+
+	////-------------------------------------------------------------------
+	////  Begin protect phase.
+
+	//if (CryptProtectData(
+	//	&DataIn,
+	//	L"This is the description string.", // A description string. 
+	//	NULL,                               // Optional entropy
+	//	// not used.
+	//	NULL,                               // Reserved.
+	//	NULL,                      // Pass a PromptStruct.
+	//	0,
+	//	&DataOut))
+	//{
+	//	printf("The encryption phase worked. \n");
+	//}
+	//else
+	//{
+	//	//MyHandleError("Encryption error!");
+	//}
+
+	//if (CryptUnprotectData(
+	//	&DataOut,
+	//	&pDescrOut,
+	//	NULL,                 // Optional entropy
+	//	NULL,                 // Reserved
+	//	NULL,        // Optional PromptStruct
+	//	0,
+	//	&DataVerify))
+	//{
+	//	printf("The decrypted data is: %s\n", DataVerify.pbData);
+	//	printf("The description of the data was: %S\n", pDescrOut);
+	//}
+	//else
+	//{
+	//	//MyHandleError("Decryption error!");
+	//}
+	////-------------------------------------------------------------------
+	//// At this point, memcmp could be used to compare DataIn.pbData and 
+	//// DataVerify.pbDate for equality. If the two functions worked
+	//// correctly, the two byte strings are identical. 
+
+	////-------------------------------------------------------------------
+	////  Clean up.
+
+	//LocalFree(pDescrOut);
+	//LocalFree(DataOut.pbData);
+	//LocalFree(DataVerify.pbData);
+ // End of main
 }
 
 CGetSetOptions::~CGetSetOptions()
@@ -189,6 +264,7 @@ void CGetSetOptions::LoadSettings()
 	m_HideDittoOnHotKeyIfAlreadyShown = GetHideDittoOnHotKeyIfAlreadyShown();
 	m_lPort = GetPort();
 	m_bDrawThumbnail = GetDrawThumbnail();
+	m_bDrawCopiedColorCode = GetDrawCopiedColorCode();
 	m_bFastThumbnailMode = GetFastThumbnailMode();
 	m_csPassword = GetNetworkPassword();
 	m_bDrawRTF = GetDrawRTF();
@@ -3023,4 +3099,17 @@ BOOL CGetSetOptions::GetRegexCaseInsensitive()
 void CGetSetOptions::SetRegexCaseInsensitive(BOOL val)
 {
 	SetProfileLong("RegexCaseInsensitive", val);
+}
+
+void CGetSetOptions::SetDrawCopiedColorCode(long bDraw)
+{
+	SetProfileLong("DrawCopiedColorCode", bDraw);
+	m_bDrawCopiedColorCode = bDraw;
+}
+
+BOOL CGetSetOptions::GetDrawCopiedColorCode()
+{
+	BOOL drawCopiedColorCode = TRUE;
+
+	return GetProfileLong("DrawCopiedColorCode", drawCopiedColorCode);
 }

+ 4 - 0
Options.h

@@ -685,6 +685,10 @@ public:
 
 	static BOOL GetRegexCaseInsensitive();
 	static void SetRegexCaseInsensitive(BOOL val);
+
+	static BOOL		m_bDrawCopiedColorCode;
+	static void		SetDrawCopiedColorCode(long bDraw);
+	static BOOL		GetDrawCopiedColorCode();
 };
 
 // global for easy access and for initialization of fast access variables

+ 61 - 5
QListCtrl.cpp

@@ -348,8 +348,9 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 		nOldBKMode = pDC->SetBkMode(TRANSPARENT);
 
 		CRect rcText = rcItem;
-		rcText.left += ROW_LEFT_BORDER;
-		rcText.top++;
+		rcText.left += m_windowDpi->Scale(ROW_LEFT_BORDER);
+		rcText.top += m_windowDpi->Scale(1);
+		rcText.bottom -= m_windowDpi->Scale(1);
 
 		if (m_showIfClipWasPasted &&
 			strSymbols.GetLength() > 0 &&
@@ -357,11 +358,9 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 		{
 			CRect pastedRect(rcItem);
 			pastedRect.left++;
-			pastedRect.right = rcItem.left + m_windowDpi->Scale(3);
+			pastedRect.right = pastedRect.left + m_windowDpi->Scale(2);
 
 			pDC->FillSolidRect(pastedRect, g_Opt.m_Theme.ClipPastedColor());
-
-			rcText.left += m_windowDpi->Scale(4);
 		}
 
 		// set firstTenNum to the first ten number (1-10) corresponding to
@@ -373,6 +372,10 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 		{
 			rcText.left += m_windowDpi->Scale(12);
 		}
+		else
+		{
+			rcText.left += m_windowDpi->Scale(3);
+		}
 
 		bool drawInGroupIcon = true;
 		// if we are inside a group, don't display the "in group" flag
@@ -383,6 +386,8 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 				drawInGroupIcon = false;
 		}
 
+		DrawCopiedColorCode(csText, rcText, pDC);
+
 		DrawBitMap(nItem, rcText, pDC, csText);
 
 		// draw the symbol box
@@ -488,6 +493,57 @@ void CQListCtrl::OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult)
 	}
 }
 
+void CQListCtrl::DrawCopiedColorCode(CString& csText, CRect& rcText, CDC* pDC)
+{
+	if (g_Opt.m_bDrawCopiedColorCode == FALSE)
+		return;
+
+	//draw hex color copied like #FF0000
+	if ((csText.GetLength() >= 7 &&
+		csText.GetLength() < 14 &&
+		csText[0] == '#'))
+	{
+		int r, g, b;
+		int scanRet = swscanf(csText, _T("#%02x%02x%02x"), &r, &g, &b);
+		if (scanRet == 3)
+		{
+			CRect pastedRect(rcText);
+			//pastedRect.left += 2;
+			pastedRect.right = pastedRect.left + m_windowDpi->Scale(rcText.Height());
+
+			pDC->FillSolidRect(pastedRect, COLORREF(RGB(r, g, b)));
+
+			rcText.left += m_windowDpi->Scale(rcText.Height());
+			rcText.left += m_windowDpi->Scale(ROW_LEFT_BORDER);
+		}
+	}
+
+	//draw rgb color copied like rgb(255,0,0)
+	if (csText.GetLength() >= 10 &&
+		csText.Left(4).MakeLower() == _T("rgb("))
+	{
+		int endBracket = csText.Find(_T(")"), 4);
+		if (endBracket > 0)
+		{
+			int startBracket = 4;
+			CString rgb = csText.Mid(startBracket, endBracket - startBracket);
+			int r, g, b;
+			int scanRet = swscanf(rgb, _T("%d,%d,%d"), &r, &g, &b);
+			if (scanRet == 3)
+			{
+				CRect pastedRect(rcText);
+				//pastedRect.left += 2;
+				pastedRect.right = pastedRect.left + m_windowDpi->Scale(rcText.Height());
+
+				pDC->FillSolidRect(pastedRect, COLORREF(RGB(r, g, b)));
+
+				rcText.left += m_windowDpi->Scale(rcText.Height());
+				rcText.left += m_windowDpi->Scale(ROW_LEFT_BORDER);
+			}
+		}
+	}
+}
+
 BOOL CQListCtrl::DrawRtfText(int nItem, CRect &crRect, CDC *pDC)
 {
 	if (g_Opt.m_bDrawRTF == FALSE)

+ 1 - 0
QListCtrl.h

@@ -203,6 +203,7 @@ protected:
 	//{{AFX_MSG(CQListCtrl)
 	afx_msg void OnKeydown(NMHDR* pNMHDR, LRESULT* pResult);
 	afx_msg void OnCustomdrawList(NMHDR* pNMHDR, LRESULT* pResult);
+	void DrawCopiedColorCode(CString& csText, CRect& rcText, CDC* pDC);
 	afx_msg void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
 	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
 	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);