Bläddra i källkod

Added option to invert case special paste

Scott Brogden 6 år sedan
förälder
incheckning
aef303f5e1
10 ändrade filer med 930 tillägg och 797 borttagningar
  1. 525 522
      ActionEnums.cpp
  2. 137 136
      ActionEnums.h
  3. 1 0
      CP_Main.rc
  4. 88 3
      OleClipSource.cpp
  5. 46 45
      OleClipSource.h
  6. 35 0
      QPasteWnd.cpp
  7. 3 0
      QPasteWnd.h
  8. 2 1
      Resource.h
  9. 37 36
      SpecialPasteOptions.cpp
  10. 56 54
      SpecialPasteOptions.h

+ 525 - 522
ActionEnums.cpp

@@ -1,523 +1,526 @@
-#include "stdafx.h"
-#include "ActionEnums.h"
-#include "Accels.h"
-#include "Misc.h"
-#include "CP_Main.h"
-
-ActionEnums::ActionEnums()
-{
-}
-
-
-ActionEnums::~ActionEnums()
-{
-}
-
-
-CString ActionEnums::EnumDescription(ActionEnumValues value)
-{
-	CString val = _T("");
-
-	switch (value)
-	{
-	case SHOWDESCRIPTION:
-		val = "View Full Description";
-		break;
-	case NEXTDESCRIPTION:
-		val = "Next Full Description";
-		break;
-	case PREVDESCRIPTION:
-		val = "Previous Full Description";
-		break;
-	case SHOWMENU:
-		val = "Show Context Menu";
-		break;
-	case NEWGROUP:
-		val = "New Group";
-		break;
-	case NEWGROUPSELECTION:
-		val = "New Group Selection";
-		break;
-	case TOGGLEFILELOGGING:
-		val = "Toggle On File Logging";
-		break;
-	case TOGGLEOUTPUTDEBUGSTRING:
-		val = "Toggle OutputDebugString Logging";
-		break;
-	case CLOSEWINDOW:
-		val = "Close Window";
-		break;
-	case NEXTTABCONTROL:
-		val = "NEXTTABCONTROL";
-		break;
-	case PREVTABCONTROL:
-		val = "PREVTABCONTROL";
-		break;
-	case SHOWGROUPS:
-		val = "View Groups";
-		break;
-	case NEWCLIP:
-		val = "New Clip";
-		break;
-	case EDITCLIP:
-		val = "Edit Clip";
-		break;
-	case MODIFIER_ACTVE_SELECTIONUP:
-		val = "MODIFIER_ACTVE_SELECTIONUP";
-		break;
-	case MODIFIER_ACTVE_SELECTIONDOWN:
-		val = "MODIFIER_ACTVE_SELECTIONDOWN";
-		break;
-	case MODIFIER_ACTVE_MOVEFIRST:
-		val = "MODIFIER_ACTVE_MOVEFIRST";
-		break;
-	case MODIFIER_ACTVE_MOVELAST:
-		val = "MODIFIER_ACTVE_MOVELAST";
-		break;
-	case CANCELFILTER:
-		val = "Cancel Filter";
-		break;
-	case HOMELIST:
-		val = "HOMELIST";
-		break;
-	case BACKGRROUP:
-		val = "Back Group";
-		break;
-	case TOGGLESHOWPERSISTANT:
-		val = "Toggle Show Persistent";
-		break;
-	case PASTE_SELECTED:
-		val = "Paste Selected";
-		break;
-	case DELETE_SELECTED:
-		val = "Delete Selected";
-		break;
-	case CLIP_PROPERTIES:
-		val = "Clip Properties";
-		break;
-	case PASTE_SELECTED_PLAIN_TEXT:
-		val = "Paste Selected Plain Text";
-		break;
-	case MOVE_CLIP_TO_GROUP:
-		val = "Move Clip To Group";
-		break;
-	case ELEVATE_PRIVlEGES:
-		val = "Option - Elevate Privileges";
-		break;
-	case SHOW_IN_TASKBAR:
-		val = "Option - Show In TaskBar";
-		break;
-	case COMPARE_SELECTED_CLIPS:
-		val = "Compare Selected Clips";
-		break;
-	case SELECT_LEFT_SIDE_COMPARE:
-		val = "Select Left File For Compare";
-		break;
-	case SELECT_RIGHT_SITE_AND_DO_COMPARE:
-		val = "Select Right File And Do Compare";
-		break;
-	case EXPORT_TO_TEXT_FILE:
-		val = "Export To Text File";
-		break;
-	case EXPORT_TO_QR_CODE:
-		val = "Export To QR Code";
-		break;
-	case EXPORT_TO_GOOGLE_TRANSLATE:
-		val = "Export To Google Translate";
-		break;
-	case EXPORT_TO_BITMAP_FILE:
-		val = "Export To Image File";
-		break;
-	case SAVE_CURRENT_CLIPBOARD:
-		val = "Save Current Clipboard";
-		break;
-	case MOVE_CLIP_UP:
-		val = "Move Clip Up";
-		break;
-	case MOVE_CLIP_DOWN:
-		val = "Move Clip Down";
-		break;
-	case MOVE_CLIP_TOP:
-		val = "Move Clip Top";
-		break;
-	case FILTER_ON_SELECTED_CLIP:
-		val = "Filter On Selected Clip";
-		break;
-	case PASTE_UPPER_CASE:
-		val = "Paste Upper Case";
-		break;
-	case PASTE_LOWER_CASE:
-		val = "Paste Lower Case";
-		break;
-	case PASTE_CAPITALiZE:
-		val = "Paste Capitalize";
-		break;
-	case PASTE_SENTENCE_CASE:
-		val = "Paste Sentence Case";
-		break;
-	case PASTE_REMOVE_LINE_FEEDS:
-		val = "Paste Remove Line Feeds";
-		break;
-	case PASTE_ADD_ONE_LINE_FEED:
-		val = "Paste Add One Line Feed";
-		break;
-	case PASTE_ADD_TWO_LINE_FEEDS:
-		val = "Paste Add Two Line Feeds";
-		break;
-	case PASTE_TYPOGLYCEMIA:
-		val = "Paste Typoglycemia";
-		break;
-	case SEND_TO_FRIEND_1:
-		val = "Send to friend 1";
-		break;
-	case SEND_TO_FRIEND_2:
-		val = "Send to friend 2";
-		break;
-	case SEND_TO_FRIEND_3:
-		val = "Send to friend 3";
-		break;
-	case SEND_TO_FRIEND_4:
-		val = "Send to friend 4";
-		break;
-	case SEND_TO_FRIEND_5:
-		val = "Send to friend 5";
-		break;
-	case SEND_TO_FRIEND_6:
-		val = "Send to friend 6";
-		break;
-	case SEND_TO_FRIEND_7:
-		val = "Send to friend 7";
-		break;
-	case SEND_TO_FRIEND_8:
-		val = "Send to friend 8";
-		break;
-	case SEND_TO_FRIEND_9:
-		val = "Send to friend 9";
-		break;
-	case SEND_TO_FRIEND_10:
-		val = "Send to friend 10";
-		break;
-	case SEND_TO_FRIEND_11:
-		val = "Send to friend 11";
-		break;
-	case SEND_TO_FRIEND_12:
-		val = "Send to friend 12";
-		break;
-	case SEND_TO_FRIEND_13:
-		val = "Send to friend 13";
-		break;
-	case SEND_TO_FRIEND_14:
-		val = "Send to friend 14";
-		break;
-	case SEND_TO_FRIEND_15:
-		val = "Send to friend 15";
-		break;
-	case PASTE_POSITION_1:
-		val = "Paste Position 1";
-		break;
-	case PASTE_POSITION_2:
-		val = "Paste Position 2";
-		break;
-	case PASTE_POSITION_3:
-		val = "Paste Position 3";
-		break;
-	case PASTE_POSITION_4:
-		val = "Paste Position 4";
-		break;
-	case PASTE_POSITION_5:
-		val = "Paste Position 5";
-		break;
-	case PASTE_POSITION_6:
-		val = "Paste Position 6";
-		break;
-	case PASTE_POSITION_7:
-		val = "Paste Position 7";
-		break;
-	case PASTE_POSITION_8:
-		val = "Paste Position 8";
-		break;
-	case PASTE_POSITION_9:
-		val = "Paste Position 9";
-		break;
-	case PASTE_POSITION_10:
-		val = "Paste Position 10";
-		break;
-	case CONFIG_SHOW_FIRST_TEN_TEXT:
-		val = "Option - Show text for first ten copy hot keys";
-		break;
-	case CONFIG_SHOW_CLIP_WAS_PASTED:
-		val = "Option - Show indicator a clip has been pasted";
-		break;
-	case TOGGLE_LAST_GROUP_TOGGLE:
-		val = "Toggle Last Group Toggle";
-		break;
-	case MAKE_TOP_STICKY:
-		val = "Make Top Sticky Clip";
-		break;
-	case MAKE_LAST_STICKY:
-		val = "Make Last Sticky Clip";
-		break;
-	case REMOVE_STICKY:
-		val = "Remove Sticky Setting";
-		break;
-	case PASTE_ADD_CURRENT_TIME:
-		val = "Paste Add Current Time";
-		break;
-	case IMPORT_CLIP:
-		val = "Import Clip";
-		break;
-	case GLOBAl_HOTKEYS:
-		val = "Global HotKeys";
-		break;
-	case DELETE_CLIP_DATA:
-		val = "Delete Clip Data";
-		break;
-	case REPLACE_TOP_STICKY_CLIP:
-		val = "Replace Top Sticky Clip";
-		break;
-	case PROMPT_SEND_TO_FRIEND:
-		val = "Prompt send to friend";
-		break;
-	case SAVE_CF_HDROP_FIlE_DATA:
-		val = "Save copied file (cf_hdrop) contents into Ditto";
-		break;
-	case TOGGLE_CLIPBOARD_CONNECTION:
-		val = "Toggle clipboard connection";
-		break;
-	case MOVE_SELECTION_UP:
-		val = "Move Selection Up";
-		break;
-	case MOVE_SELECTION_DOWN:
-		val = "Move Selection Down";
-		break;
-	case TOGGLE_DESCRIPTION_WORD_WRAP:
-		val = "Toggle Description Word Wrap";
-		break;
-	case APPLY_LAST_SEARCH:
-		val = "Apply Last Search";
-		break;
-	case TOGGLE_SEARCH_METHOD:
-		val = "Toggle Search Method";
-		break;
-	case MOVE_CLIP_LAST:
-		val = "Move Clip Last";
-		break;
-	case PASTE_SCRIPT:
-		val = "Paste Script";
-		break;
-	case PASTE_DONT_MOVE_CLIP:
-		val = "Paste, Don't Change Clip Order";
-		break;
-	case PASTE_TRIM_WHITE_SPACE:
-		val = "Paste, Trim White Space";
-		break;
-	case TRANSPARENCY_NONE:
-		val = "Set Transparency None";
-		break;
-	case TRANSPARENCY_5:
-		val = "Set Transparency 5%";
-		break;
-	case TRANSPARENCY_10:
-		val = "Set Transparency 10%";
-		break;
-	case TRANSPARENCY_15:
-		val = "Set Transparency 15%";
-		break;
-	case TRANSPARENCY_20:
-		val = "Set Transparency 20%";
-		break;
-	case TRANSPARENCY_25:
-		val = "Set Transparency 25%";
-		break;
-	case TRANSPARENCY_30:
-		val = "Set Transparency 30%";
-		break;
-	case TRANSPARENCY_35:
-		val = "Set Transparency 35%";
-		break;
-	case TRANSPARENCY_40:
-		val = "Set Transparency 40%";
-		break;
-	case TRANSPARENCY_TOGGLE:
-		val = "Toggle Transparency Enabled";
-		break;
-	case TRANSPARENCY_INCREASE:
-		val = "Increase Transparency %";
-		break;
-	case TRANSPARENCY_DECREASE:
-		val = "Decrease Transparency %";
-		break;
-	case EMAILTO_BODY:
-		val = "EMail, Content In Body";
-		break;
-	case EMAILTO_ATTACH_EXPORT:
-		val = "EMail, Clip Export As Attachment";
-		break;
-	case EMAILTO_ATTACH_CONTENT:
-		val = "EMail, Content As Attachment";
-		break;
-	case GMAIL:
-		val = "Gmail";
-		break;
-	case SLUGIFY:
-		val = "Slugify";
-		break;
-	}
-
-	CString translatedValue = theApp.m_Language.GetQuickPasteKeyboardString(value, val);
-
-	if (translatedValue != _T(""))
-	{
-		return translatedValue;
-	}
-
-	return val;
-}
-
-int ActionEnums::GetDefaultShortCutKeyA(ActionEnumValues value, int pos)
-{
-	switch(pos)
-	{
-	case 0:
-		switch (value)
-		{
-		case ActionEnums::SHOWDESCRIPTION:
-			return VK_F3;
-		case ActionEnums::NEXTDESCRIPTION:
-			return 'N';
-		case ActionEnums::PREVDESCRIPTION:
-			return 'P';		
-		case ActionEnums::NEWGROUP:
-			return ACCEL_MAKEKEY(VK_F7, HOTKEYF_CONTROL);
-		case ActionEnums::NEWGROUPSELECTION:
-			return VK_F7;
-		case ActionEnums::SHOWGROUPS:
-			return ACCEL_MAKEKEY('G', HOTKEYF_CONTROL);
-		case ActionEnums::NEWCLIP:
-			return ACCEL_MAKEKEY('N', HOTKEYF_CONTROL);
-		case ActionEnums::EDITCLIP:
-			return ACCEL_MAKEKEY('E', HOTKEYF_CONTROL);
-		case ActionEnums::CANCELFILTER:
-			return ACCEL_MAKEKEY('C', HOTKEYF_ALT);
-		case ActionEnums::TOGGLESHOWPERSISTANT:
-			return ACCEL_MAKEKEY(VK_SPACE, HOTKEYF_CONTROL);
-		case ActionEnums::CLIP_PROPERTIES:
-			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_ALT);
-		case ActionEnums::PASTE_SELECTED_PLAIN_TEXT:
-			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_SHIFT);
-		case ActionEnums::COMPARE_SELECTED_CLIPS:
-			return ACCEL_MAKEKEY(VK_F2, HOTKEYF_CONTROL);
-		case ActionEnums::PASTE_SELECTED:
-			return VK_RETURN;
-		case ActionEnums::SHOWMENU:
-			return VK_MOUSE_RIGHT_CLICK;
-		case PASTE_POSITION_1:
-			return ACCEL_MAKEKEY('1', HOTKEYF_CONTROL);
-		case PASTE_POSITION_2:
-			return ACCEL_MAKEKEY('2', HOTKEYF_CONTROL);
-		case PASTE_POSITION_3:
-			return ACCEL_MAKEKEY('3', HOTKEYF_CONTROL);
-		case PASTE_POSITION_4:
-			return ACCEL_MAKEKEY('4', HOTKEYF_CONTROL);
-		case PASTE_POSITION_5:
-			return ACCEL_MAKEKEY('5', HOTKEYF_CONTROL);
-		case PASTE_POSITION_6:
-			return ACCEL_MAKEKEY('6', HOTKEYF_CONTROL);
-		case PASTE_POSITION_7:
-			return ACCEL_MAKEKEY('7', HOTKEYF_CONTROL);
-		case PASTE_POSITION_8:
-			return ACCEL_MAKEKEY('8', HOTKEYF_CONTROL);
-		case PASTE_POSITION_9:
-			return ACCEL_MAKEKEY('9', HOTKEYF_CONTROL);
-		case PASTE_POSITION_10:
-			return ACCEL_MAKEKEY('0', HOTKEYF_CONTROL);
-		case CLOSEWINDOW:
-			return VK_ESCAPE;
-		case TOGGLE_DESCRIPTION_WORD_WRAP:
-			return 'W';
-		}
-		break;
-	case 1:
-		switch (value)
-		{		
-		case ActionEnums::PASTE_SELECTED:
-			return VK_MOUSE_DOUBLE_CLICK;
-		case PASTE_POSITION_1:
-			return ACCEL_MAKEKEY(VK_NUMPAD1, HOTKEYF_CONTROL);
-		case PASTE_POSITION_2:
-			return ACCEL_MAKEKEY(VK_NUMPAD2, HOTKEYF_CONTROL);
-		case PASTE_POSITION_3:
-			return ACCEL_MAKEKEY(VK_NUMPAD3, HOTKEYF_CONTROL);
-		case PASTE_POSITION_4:
-			return ACCEL_MAKEKEY(VK_NUMPAD4, HOTKEYF_CONTROL);
-		case PASTE_POSITION_5:
-			return ACCEL_MAKEKEY(VK_NUMPAD5, HOTKEYF_CONTROL);
-		case PASTE_POSITION_6:
-			return ACCEL_MAKEKEY(VK_NUMPAD6, HOTKEYF_CONTROL);
-		case PASTE_POSITION_7:
-			return ACCEL_MAKEKEY(VK_NUMPAD7, HOTKEYF_CONTROL);
-		case PASTE_POSITION_8:
-			return ACCEL_MAKEKEY(VK_NUMPAD8, HOTKEYF_CONTROL);
-		case PASTE_POSITION_9:
-			return ACCEL_MAKEKEY(VK_NUMPAD9, HOTKEYF_CONTROL);
-		case PASTE_POSITION_10:
-			return ACCEL_MAKEKEY(VK_NUMPAD0, HOTKEYF_CONTROL);
-		}
-		break;
-	}
-
-	return -1;
-}
-
-int ActionEnums::GetDefaultShortCutKeyB(ActionEnumValues value, int pos)
-{
-	switch (pos)
-	{
-	case 0:
-		//switch (value)
-		//{
-		//}
-		break;
-	}
-
-	return -1;
-}
-
-bool ActionEnums::UserConfigurable(ActionEnumValues value)
-{
-	switch (value)
-	{
-	case ActionEnums::NEXTTABCONTROL:
-	case ActionEnums::PREVTABCONTROL:
-	case ActionEnums::MODIFIER_ACTVE_SELECTIONUP:
-	case ActionEnums::MODIFIER_ACTVE_SELECTIONDOWN:
-	case ActionEnums::MODIFIER_ACTVE_MOVEFIRST:
-	case ActionEnums::MODIFIER_ACTVE_MOVELAST:
-	case ActionEnums::BACKGRROUP:
-	case ActionEnums::DELETE_SELECTED:
-	case ActionEnums::TOGGLEFILELOGGING:
-	case ActionEnums::TOGGLEOUTPUTDEBUGSTRING:
-	case ActionEnums::HOMELIST:
-	case ActionEnums::PASTE_SCRIPT:
-		return false;
-	}
-
-	return true;
-}
-
-bool ActionEnums::ToolTipAction(ActionEnumValues value)
-{
-	switch (value)
-	{
-	case ActionEnums::NEXTDESCRIPTION:
-	case ActionEnums::PREVDESCRIPTION:
-	case ActionEnums::TOGGLESHOWPERSISTANT:
-	case ActionEnums::TOGGLE_DESCRIPTION_WORD_WRAP:
-	case ActionEnums::CLOSEWINDOW:
-	case ActionEnums::SHOWDESCRIPTION:
-
-		return true;
-	}
-
-	return false;
+#include "stdafx.h"
+#include "ActionEnums.h"
+#include "Accels.h"
+#include "Misc.h"
+#include "CP_Main.h"
+
+ActionEnums::ActionEnums()
+{
+}
+
+
+ActionEnums::~ActionEnums()
+{
+}
+
+
+CString ActionEnums::EnumDescription(ActionEnumValues value)
+{
+	CString val = _T("");
+
+	switch (value)
+	{
+	case SHOWDESCRIPTION:
+		val = "View Full Description";
+		break;
+	case NEXTDESCRIPTION:
+		val = "Next Full Description";
+		break;
+	case PREVDESCRIPTION:
+		val = "Previous Full Description";
+		break;
+	case SHOWMENU:
+		val = "Show Context Menu";
+		break;
+	case NEWGROUP:
+		val = "New Group";
+		break;
+	case NEWGROUPSELECTION:
+		val = "New Group Selection";
+		break;
+	case TOGGLEFILELOGGING:
+		val = "Toggle On File Logging";
+		break;
+	case TOGGLEOUTPUTDEBUGSTRING:
+		val = "Toggle OutputDebugString Logging";
+		break;
+	case CLOSEWINDOW:
+		val = "Close Window";
+		break;
+	case NEXTTABCONTROL:
+		val = "NEXTTABCONTROL";
+		break;
+	case PREVTABCONTROL:
+		val = "PREVTABCONTROL";
+		break;
+	case SHOWGROUPS:
+		val = "View Groups";
+		break;
+	case NEWCLIP:
+		val = "New Clip";
+		break;
+	case EDITCLIP:
+		val = "Edit Clip";
+		break;
+	case MODIFIER_ACTVE_SELECTIONUP:
+		val = "MODIFIER_ACTVE_SELECTIONUP";
+		break;
+	case MODIFIER_ACTVE_SELECTIONDOWN:
+		val = "MODIFIER_ACTVE_SELECTIONDOWN";
+		break;
+	case MODIFIER_ACTVE_MOVEFIRST:
+		val = "MODIFIER_ACTVE_MOVEFIRST";
+		break;
+	case MODIFIER_ACTVE_MOVELAST:
+		val = "MODIFIER_ACTVE_MOVELAST";
+		break;
+	case CANCELFILTER:
+		val = "Cancel Filter";
+		break;
+	case HOMELIST:
+		val = "HOMELIST";
+		break;
+	case BACKGRROUP:
+		val = "Back Group";
+		break;
+	case TOGGLESHOWPERSISTANT:
+		val = "Toggle Show Persistent";
+		break;
+	case PASTE_SELECTED:
+		val = "Paste Selected";
+		break;
+	case DELETE_SELECTED:
+		val = "Delete Selected";
+		break;
+	case CLIP_PROPERTIES:
+		val = "Clip Properties";
+		break;
+	case PASTE_SELECTED_PLAIN_TEXT:
+		val = "Paste Selected Plain Text";
+		break;
+	case MOVE_CLIP_TO_GROUP:
+		val = "Move Clip To Group";
+		break;
+	case ELEVATE_PRIVlEGES:
+		val = "Option - Elevate Privileges";
+		break;
+	case SHOW_IN_TASKBAR:
+		val = "Option - Show In TaskBar";
+		break;
+	case COMPARE_SELECTED_CLIPS:
+		val = "Compare Selected Clips";
+		break;
+	case SELECT_LEFT_SIDE_COMPARE:
+		val = "Select Left File For Compare";
+		break;
+	case SELECT_RIGHT_SITE_AND_DO_COMPARE:
+		val = "Select Right File And Do Compare";
+		break;
+	case EXPORT_TO_TEXT_FILE:
+		val = "Export To Text File";
+		break;
+	case EXPORT_TO_QR_CODE:
+		val = "Export To QR Code";
+		break;
+	case EXPORT_TO_GOOGLE_TRANSLATE:
+		val = "Export To Google Translate";
+		break;
+	case EXPORT_TO_BITMAP_FILE:
+		val = "Export To Image File";
+		break;
+	case SAVE_CURRENT_CLIPBOARD:
+		val = "Save Current Clipboard";
+		break;
+	case MOVE_CLIP_UP:
+		val = "Move Clip Up";
+		break;
+	case MOVE_CLIP_DOWN:
+		val = "Move Clip Down";
+		break;
+	case MOVE_CLIP_TOP:
+		val = "Move Clip Top";
+		break;
+	case FILTER_ON_SELECTED_CLIP:
+		val = "Filter On Selected Clip";
+		break;
+	case PASTE_UPPER_CASE:
+		val = "Paste Upper Case";
+		break;
+	case PASTE_LOWER_CASE:
+		val = "Paste Lower Case";
+		break;
+	case PASTE_CAPITALiZE:
+		val = "Paste Capitalize";
+		break;
+	case PASTE_SENTENCE_CASE:
+		val = "Paste Sentence Case";
+		break;
+	case PASTE_REMOVE_LINE_FEEDS:
+		val = "Paste Remove Line Feeds";
+		break;
+	case PASTE_ADD_ONE_LINE_FEED:
+		val = "Paste Add One Line Feed";
+		break;
+	case PASTE_ADD_TWO_LINE_FEEDS:
+		val = "Paste Add Two Line Feeds";
+		break;
+	case PASTE_TYPOGLYCEMIA:
+		val = "Paste Typoglycemia";
+		break;
+	case SEND_TO_FRIEND_1:
+		val = "Send to friend 1";
+		break;
+	case SEND_TO_FRIEND_2:
+		val = "Send to friend 2";
+		break;
+	case SEND_TO_FRIEND_3:
+		val = "Send to friend 3";
+		break;
+	case SEND_TO_FRIEND_4:
+		val = "Send to friend 4";
+		break;
+	case SEND_TO_FRIEND_5:
+		val = "Send to friend 5";
+		break;
+	case SEND_TO_FRIEND_6:
+		val = "Send to friend 6";
+		break;
+	case SEND_TO_FRIEND_7:
+		val = "Send to friend 7";
+		break;
+	case SEND_TO_FRIEND_8:
+		val = "Send to friend 8";
+		break;
+	case SEND_TO_FRIEND_9:
+		val = "Send to friend 9";
+		break;
+	case SEND_TO_FRIEND_10:
+		val = "Send to friend 10";
+		break;
+	case SEND_TO_FRIEND_11:
+		val = "Send to friend 11";
+		break;
+	case SEND_TO_FRIEND_12:
+		val = "Send to friend 12";
+		break;
+	case SEND_TO_FRIEND_13:
+		val = "Send to friend 13";
+		break;
+	case SEND_TO_FRIEND_14:
+		val = "Send to friend 14";
+		break;
+	case SEND_TO_FRIEND_15:
+		val = "Send to friend 15";
+		break;
+	case PASTE_POSITION_1:
+		val = "Paste Position 1";
+		break;
+	case PASTE_POSITION_2:
+		val = "Paste Position 2";
+		break;
+	case PASTE_POSITION_3:
+		val = "Paste Position 3";
+		break;
+	case PASTE_POSITION_4:
+		val = "Paste Position 4";
+		break;
+	case PASTE_POSITION_5:
+		val = "Paste Position 5";
+		break;
+	case PASTE_POSITION_6:
+		val = "Paste Position 6";
+		break;
+	case PASTE_POSITION_7:
+		val = "Paste Position 7";
+		break;
+	case PASTE_POSITION_8:
+		val = "Paste Position 8";
+		break;
+	case PASTE_POSITION_9:
+		val = "Paste Position 9";
+		break;
+	case PASTE_POSITION_10:
+		val = "Paste Position 10";
+		break;
+	case CONFIG_SHOW_FIRST_TEN_TEXT:
+		val = "Option - Show text for first ten copy hot keys";
+		break;
+	case CONFIG_SHOW_CLIP_WAS_PASTED:
+		val = "Option - Show indicator a clip has been pasted";
+		break;
+	case TOGGLE_LAST_GROUP_TOGGLE:
+		val = "Toggle Last Group Toggle";
+		break;
+	case MAKE_TOP_STICKY:
+		val = "Make Top Sticky Clip";
+		break;
+	case MAKE_LAST_STICKY:
+		val = "Make Last Sticky Clip";
+		break;
+	case REMOVE_STICKY:
+		val = "Remove Sticky Setting";
+		break;
+	case PASTE_ADD_CURRENT_TIME:
+		val = "Paste Add Current Time";
+		break;
+	case IMPORT_CLIP:
+		val = "Import Clip";
+		break;
+	case GLOBAl_HOTKEYS:
+		val = "Global HotKeys";
+		break;
+	case DELETE_CLIP_DATA:
+		val = "Delete Clip Data";
+		break;
+	case REPLACE_TOP_STICKY_CLIP:
+		val = "Replace Top Sticky Clip";
+		break;
+	case PROMPT_SEND_TO_FRIEND:
+		val = "Prompt send to friend";
+		break;
+	case SAVE_CF_HDROP_FIlE_DATA:
+		val = "Save copied file (cf_hdrop) contents into Ditto";
+		break;
+	case TOGGLE_CLIPBOARD_CONNECTION:
+		val = "Toggle clipboard connection";
+		break;
+	case MOVE_SELECTION_UP:
+		val = "Move Selection Up";
+		break;
+	case MOVE_SELECTION_DOWN:
+		val = "Move Selection Down";
+		break;
+	case TOGGLE_DESCRIPTION_WORD_WRAP:
+		val = "Toggle Description Word Wrap";
+		break;
+	case APPLY_LAST_SEARCH:
+		val = "Apply Last Search";
+		break;
+	case TOGGLE_SEARCH_METHOD:
+		val = "Toggle Search Method";
+		break;
+	case MOVE_CLIP_LAST:
+		val = "Move Clip Last";
+		break;
+	case PASTE_SCRIPT:
+		val = "Paste Script";
+		break;
+	case PASTE_DONT_MOVE_CLIP:
+		val = "Paste, Don't Change Clip Order";
+		break;
+	case PASTE_TRIM_WHITE_SPACE:
+		val = "Paste, Trim White Space";
+		break;
+	case TRANSPARENCY_NONE:
+		val = "Set Transparency None";
+		break;
+	case TRANSPARENCY_5:
+		val = "Set Transparency 5%";
+		break;
+	case TRANSPARENCY_10:
+		val = "Set Transparency 10%";
+		break;
+	case TRANSPARENCY_15:
+		val = "Set Transparency 15%";
+		break;
+	case TRANSPARENCY_20:
+		val = "Set Transparency 20%";
+		break;
+	case TRANSPARENCY_25:
+		val = "Set Transparency 25%";
+		break;
+	case TRANSPARENCY_30:
+		val = "Set Transparency 30%";
+		break;
+	case TRANSPARENCY_35:
+		val = "Set Transparency 35%";
+		break;
+	case TRANSPARENCY_40:
+		val = "Set Transparency 40%";
+		break;
+	case TRANSPARENCY_TOGGLE:
+		val = "Toggle Transparency Enabled";
+		break;
+	case TRANSPARENCY_INCREASE:
+		val = "Increase Transparency %";
+		break;
+	case TRANSPARENCY_DECREASE:
+		val = "Decrease Transparency %";
+		break;
+	case EMAILTO_BODY:
+		val = "EMail, Content In Body";
+		break;
+	case EMAILTO_ATTACH_EXPORT:
+		val = "EMail, Clip Export As Attachment";
+		break;
+	case EMAILTO_ATTACH_CONTENT:
+		val = "EMail, Content As Attachment";
+		break;
+	case GMAIL:
+		val = "Gmail";
+		break;
+	case SLUGIFY:
+		val = "Slugify";
+		break;
+	case INVERT_CASE:
+		val = "Invert Case";
+		break;
+	}
+
+	CString translatedValue = theApp.m_Language.GetQuickPasteKeyboardString(value, val);
+
+	if (translatedValue != _T(""))
+	{
+		return translatedValue;
+	}
+
+	return val;
+}
+
+int ActionEnums::GetDefaultShortCutKeyA(ActionEnumValues value, int pos)
+{
+	switch(pos)
+	{
+	case 0:
+		switch (value)
+		{
+		case ActionEnums::SHOWDESCRIPTION:
+			return VK_F3;
+		case ActionEnums::NEXTDESCRIPTION:
+			return 'N';
+		case ActionEnums::PREVDESCRIPTION:
+			return 'P';		
+		case ActionEnums::NEWGROUP:
+			return ACCEL_MAKEKEY(VK_F7, HOTKEYF_CONTROL);
+		case ActionEnums::NEWGROUPSELECTION:
+			return VK_F7;
+		case ActionEnums::SHOWGROUPS:
+			return ACCEL_MAKEKEY('G', HOTKEYF_CONTROL);
+		case ActionEnums::NEWCLIP:
+			return ACCEL_MAKEKEY('N', HOTKEYF_CONTROL);
+		case ActionEnums::EDITCLIP:
+			return ACCEL_MAKEKEY('E', HOTKEYF_CONTROL);
+		case ActionEnums::CANCELFILTER:
+			return ACCEL_MAKEKEY('C', HOTKEYF_ALT);
+		case ActionEnums::TOGGLESHOWPERSISTANT:
+			return ACCEL_MAKEKEY(VK_SPACE, HOTKEYF_CONTROL);
+		case ActionEnums::CLIP_PROPERTIES:
+			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_ALT);
+		case ActionEnums::PASTE_SELECTED_PLAIN_TEXT:
+			return ACCEL_MAKEKEY(VK_RETURN, HOTKEYF_SHIFT);
+		case ActionEnums::COMPARE_SELECTED_CLIPS:
+			return ACCEL_MAKEKEY(VK_F2, HOTKEYF_CONTROL);
+		case ActionEnums::PASTE_SELECTED:
+			return VK_RETURN;
+		case ActionEnums::SHOWMENU:
+			return VK_MOUSE_RIGHT_CLICK;
+		case PASTE_POSITION_1:
+			return ACCEL_MAKEKEY('1', HOTKEYF_CONTROL);
+		case PASTE_POSITION_2:
+			return ACCEL_MAKEKEY('2', HOTKEYF_CONTROL);
+		case PASTE_POSITION_3:
+			return ACCEL_MAKEKEY('3', HOTKEYF_CONTROL);
+		case PASTE_POSITION_4:
+			return ACCEL_MAKEKEY('4', HOTKEYF_CONTROL);
+		case PASTE_POSITION_5:
+			return ACCEL_MAKEKEY('5', HOTKEYF_CONTROL);
+		case PASTE_POSITION_6:
+			return ACCEL_MAKEKEY('6', HOTKEYF_CONTROL);
+		case PASTE_POSITION_7:
+			return ACCEL_MAKEKEY('7', HOTKEYF_CONTROL);
+		case PASTE_POSITION_8:
+			return ACCEL_MAKEKEY('8', HOTKEYF_CONTROL);
+		case PASTE_POSITION_9:
+			return ACCEL_MAKEKEY('9', HOTKEYF_CONTROL);
+		case PASTE_POSITION_10:
+			return ACCEL_MAKEKEY('0', HOTKEYF_CONTROL);
+		case CLOSEWINDOW:
+			return VK_ESCAPE;
+		case TOGGLE_DESCRIPTION_WORD_WRAP:
+			return 'W';
+		}
+		break;
+	case 1:
+		switch (value)
+		{		
+		case ActionEnums::PASTE_SELECTED:
+			return VK_MOUSE_DOUBLE_CLICK;
+		case PASTE_POSITION_1:
+			return ACCEL_MAKEKEY(VK_NUMPAD1, HOTKEYF_CONTROL);
+		case PASTE_POSITION_2:
+			return ACCEL_MAKEKEY(VK_NUMPAD2, HOTKEYF_CONTROL);
+		case PASTE_POSITION_3:
+			return ACCEL_MAKEKEY(VK_NUMPAD3, HOTKEYF_CONTROL);
+		case PASTE_POSITION_4:
+			return ACCEL_MAKEKEY(VK_NUMPAD4, HOTKEYF_CONTROL);
+		case PASTE_POSITION_5:
+			return ACCEL_MAKEKEY(VK_NUMPAD5, HOTKEYF_CONTROL);
+		case PASTE_POSITION_6:
+			return ACCEL_MAKEKEY(VK_NUMPAD6, HOTKEYF_CONTROL);
+		case PASTE_POSITION_7:
+			return ACCEL_MAKEKEY(VK_NUMPAD7, HOTKEYF_CONTROL);
+		case PASTE_POSITION_8:
+			return ACCEL_MAKEKEY(VK_NUMPAD8, HOTKEYF_CONTROL);
+		case PASTE_POSITION_9:
+			return ACCEL_MAKEKEY(VK_NUMPAD9, HOTKEYF_CONTROL);
+		case PASTE_POSITION_10:
+			return ACCEL_MAKEKEY(VK_NUMPAD0, HOTKEYF_CONTROL);
+		}
+		break;
+	}
+
+	return -1;
+}
+
+int ActionEnums::GetDefaultShortCutKeyB(ActionEnumValues value, int pos)
+{
+	switch (pos)
+	{
+	case 0:
+		//switch (value)
+		//{
+		//}
+		break;
+	}
+
+	return -1;
+}
+
+bool ActionEnums::UserConfigurable(ActionEnumValues value)
+{
+	switch (value)
+	{
+	case ActionEnums::NEXTTABCONTROL:
+	case ActionEnums::PREVTABCONTROL:
+	case ActionEnums::MODIFIER_ACTVE_SELECTIONUP:
+	case ActionEnums::MODIFIER_ACTVE_SELECTIONDOWN:
+	case ActionEnums::MODIFIER_ACTVE_MOVEFIRST:
+	case ActionEnums::MODIFIER_ACTVE_MOVELAST:
+	case ActionEnums::BACKGRROUP:
+	case ActionEnums::DELETE_SELECTED:
+	case ActionEnums::TOGGLEFILELOGGING:
+	case ActionEnums::TOGGLEOUTPUTDEBUGSTRING:
+	case ActionEnums::HOMELIST:
+	case ActionEnums::PASTE_SCRIPT:
+		return false;
+	}
+
+	return true;
+}
+
+bool ActionEnums::ToolTipAction(ActionEnumValues value)
+{
+	switch (value)
+	{
+	case ActionEnums::NEXTDESCRIPTION:
+	case ActionEnums::PREVDESCRIPTION:
+	case ActionEnums::TOGGLESHOWPERSISTANT:
+	case ActionEnums::TOGGLE_DESCRIPTION_WORD_WRAP:
+	case ActionEnums::CLOSEWINDOW:
+	case ActionEnums::SHOWDESCRIPTION:
+
+		return true;
+	}
+
+	return false;
 }

+ 137 - 136
ActionEnums.h

@@ -1,136 +1,137 @@
-#pragma once
-class ActionEnums
-{
-public:
-	ActionEnums();
-	~ActionEnums();
-
-	enum ActionEnumValues
-	{ 
-		FIRST_ACTION,
-		SHOWDESCRIPTION,
-		NEXTDESCRIPTION,
-		PREVDESCRIPTION,
-		SHOWMENU,
-		NEWGROUP,
-		NEWGROUPSELECTION,
-		TOGGLEFILELOGGING,
-		TOGGLEOUTPUTDEBUGSTRING,
-		CLOSEWINDOW,
-		NEXTTABCONTROL,
-		PREVTABCONTROL,
-		SHOWGROUPS,
-		NEWCLIP,
-		EDITCLIP,
-		MODIFIER_ACTVE_SELECTIONUP,
-		MODIFIER_ACTVE_SELECTIONDOWN,
-		MODIFIER_ACTVE_MOVEFIRST,
-		MODIFIER_ACTVE_MOVELAST,
-		CANCELFILTER,
-		HOMELIST,
-		BACKGRROUP,
-		TOGGLESHOWPERSISTANT,
-		PASTE_SELECTED,
-		DELETE_SELECTED,
-		CLIP_PROPERTIES,
-		PASTE_SELECTED_PLAIN_TEXT,
-		MOVE_CLIP_TO_GROUP,
-		ELEVATE_PRIVlEGES,
-		SHOW_IN_TASKBAR,
-		COMPARE_SELECTED_CLIPS,
-		SELECT_LEFT_SIDE_COMPARE,
-		SELECT_RIGHT_SITE_AND_DO_COMPARE,
-		EXPORT_TO_TEXT_FILE,
-		EXPORT_TO_QR_CODE,
-		EXPORT_TO_GOOGLE_TRANSLATE,
-		EXPORT_TO_BITMAP_FILE,
-		SAVE_CURRENT_CLIPBOARD,
-		MOVE_CLIP_UP,
-		MOVE_CLIP_DOWN,
-		MOVE_CLIP_TOP,
-		FILTER_ON_SELECTED_CLIP,
-		PASTE_UPPER_CASE,
-		PASTE_LOWER_CASE,
-		PASTE_CAPITALiZE,
-		PASTE_SENTENCE_CASE,
-		PASTE_REMOVE_LINE_FEEDS,
-		PASTE_ADD_ONE_LINE_FEED,
-		PASTE_ADD_TWO_LINE_FEEDS,
-		PASTE_TYPOGLYCEMIA,
-		SEND_TO_FRIEND_1,
-		SEND_TO_FRIEND_2,
-		SEND_TO_FRIEND_3,
-		SEND_TO_FRIEND_4,
-		SEND_TO_FRIEND_5,
-		SEND_TO_FRIEND_6,
-		SEND_TO_FRIEND_7,
-		SEND_TO_FRIEND_8,
-		SEND_TO_FRIEND_9,
-		SEND_TO_FRIEND_10,
-		SEND_TO_FRIEND_11,
-		SEND_TO_FRIEND_12,
-		SEND_TO_FRIEND_13,
-		SEND_TO_FRIEND_14,
-		SEND_TO_FRIEND_15,
-		PASTE_POSITION_1,
-		PASTE_POSITION_2,
-		PASTE_POSITION_3,
-		PASTE_POSITION_4,
-		PASTE_POSITION_5,
-		PASTE_POSITION_6,
-		PASTE_POSITION_7,
-		PASTE_POSITION_8,
-		PASTE_POSITION_9,
-		PASTE_POSITION_10,
-		CONFIG_SHOW_FIRST_TEN_TEXT,
-		CONFIG_SHOW_CLIP_WAS_PASTED,
-		TOGGLE_LAST_GROUP_TOGGLE,
-		MAKE_TOP_STICKY,
-		MAKE_LAST_STICKY,
-		REMOVE_STICKY,
-		PASTE_ADD_CURRENT_TIME,
-		IMPORT_CLIP,
-		GLOBAl_HOTKEYS,
-		DELETE_CLIP_DATA,
-		REPLACE_TOP_STICKY_CLIP,
-		PROMPT_SEND_TO_FRIEND,
-		SAVE_CF_HDROP_FIlE_DATA,
-		TOGGLE_CLIPBOARD_CONNECTION,
-		MOVE_SELECTION_UP,
-		MOVE_SELECTION_DOWN,
-		TOGGLE_DESCRIPTION_WORD_WRAP,
-		APPLY_LAST_SEARCH,
-		TOGGLE_SEARCH_METHOD,
-		PASTE_SCRIPT,
-		MOVE_CLIP_LAST,
-		PASTE_DONT_MOVE_CLIP,
-		PASTE_TRIM_WHITE_SPACE,
-		TRANSPARENCY_NONE,
-		TRANSPARENCY_5,
-		TRANSPARENCY_10,
-		TRANSPARENCY_15,
-		TRANSPARENCY_20,
-		TRANSPARENCY_25,
-		TRANSPARENCY_30,
-		TRANSPARENCY_35,
-		TRANSPARENCY_40,
-		TRANSPARENCY_TOGGLE,
-		TRANSPARENCY_INCREASE,
-		TRANSPARENCY_DECREASE,
-		EMAILTO_BODY,
-		EMAILTO_ATTACH_EXPORT,
-		EMAILTO_ATTACH_CONTENT,
-		GMAIL,
-		SLUGIFY,
-
-		LAST_ACTION
-	};
-
-	static CString EnumDescription(ActionEnumValues value);
-
-	static int GetDefaultShortCutKeyA(ActionEnumValues value, int pos);
-	static int GetDefaultShortCutKeyB(ActionEnumValues value, int pos);
-	static bool UserConfigurable(ActionEnumValues value);
-	static bool ToolTipAction(ActionEnumValues value);
-};
-
+#pragma once
+class ActionEnums
+{
+public:
+	ActionEnums();
+	~ActionEnums();
+
+	enum ActionEnumValues
+	{ 
+		FIRST_ACTION,
+		SHOWDESCRIPTION,
+		NEXTDESCRIPTION,
+		PREVDESCRIPTION,
+		SHOWMENU,
+		NEWGROUP,
+		NEWGROUPSELECTION,
+		TOGGLEFILELOGGING,
+		TOGGLEOUTPUTDEBUGSTRING,
+		CLOSEWINDOW,
+		NEXTTABCONTROL,
+		PREVTABCONTROL,
+		SHOWGROUPS,
+		NEWCLIP,
+		EDITCLIP,
+		MODIFIER_ACTVE_SELECTIONUP,
+		MODIFIER_ACTVE_SELECTIONDOWN,
+		MODIFIER_ACTVE_MOVEFIRST,
+		MODIFIER_ACTVE_MOVELAST,
+		CANCELFILTER,
+		HOMELIST,
+		BACKGRROUP,
+		TOGGLESHOWPERSISTANT,
+		PASTE_SELECTED,
+		DELETE_SELECTED,
+		CLIP_PROPERTIES,
+		PASTE_SELECTED_PLAIN_TEXT,
+		MOVE_CLIP_TO_GROUP,
+		ELEVATE_PRIVlEGES,
+		SHOW_IN_TASKBAR,
+		COMPARE_SELECTED_CLIPS,
+		SELECT_LEFT_SIDE_COMPARE,
+		SELECT_RIGHT_SITE_AND_DO_COMPARE,
+		EXPORT_TO_TEXT_FILE,
+		EXPORT_TO_QR_CODE,
+		EXPORT_TO_GOOGLE_TRANSLATE,
+		EXPORT_TO_BITMAP_FILE,
+		SAVE_CURRENT_CLIPBOARD,
+		MOVE_CLIP_UP,
+		MOVE_CLIP_DOWN,
+		MOVE_CLIP_TOP,
+		FILTER_ON_SELECTED_CLIP,
+		PASTE_UPPER_CASE,
+		PASTE_LOWER_CASE,
+		PASTE_CAPITALiZE,
+		PASTE_SENTENCE_CASE,
+		PASTE_REMOVE_LINE_FEEDS,
+		PASTE_ADD_ONE_LINE_FEED,
+		PASTE_ADD_TWO_LINE_FEEDS,
+		PASTE_TYPOGLYCEMIA,
+		SEND_TO_FRIEND_1,
+		SEND_TO_FRIEND_2,
+		SEND_TO_FRIEND_3,
+		SEND_TO_FRIEND_4,
+		SEND_TO_FRIEND_5,
+		SEND_TO_FRIEND_6,
+		SEND_TO_FRIEND_7,
+		SEND_TO_FRIEND_8,
+		SEND_TO_FRIEND_9,
+		SEND_TO_FRIEND_10,
+		SEND_TO_FRIEND_11,
+		SEND_TO_FRIEND_12,
+		SEND_TO_FRIEND_13,
+		SEND_TO_FRIEND_14,
+		SEND_TO_FRIEND_15,
+		PASTE_POSITION_1,
+		PASTE_POSITION_2,
+		PASTE_POSITION_3,
+		PASTE_POSITION_4,
+		PASTE_POSITION_5,
+		PASTE_POSITION_6,
+		PASTE_POSITION_7,
+		PASTE_POSITION_8,
+		PASTE_POSITION_9,
+		PASTE_POSITION_10,
+		CONFIG_SHOW_FIRST_TEN_TEXT,
+		CONFIG_SHOW_CLIP_WAS_PASTED,
+		TOGGLE_LAST_GROUP_TOGGLE,
+		MAKE_TOP_STICKY,
+		MAKE_LAST_STICKY,
+		REMOVE_STICKY,
+		PASTE_ADD_CURRENT_TIME,
+		IMPORT_CLIP,
+		GLOBAl_HOTKEYS,
+		DELETE_CLIP_DATA,
+		REPLACE_TOP_STICKY_CLIP,
+		PROMPT_SEND_TO_FRIEND,
+		SAVE_CF_HDROP_FIlE_DATA,
+		TOGGLE_CLIPBOARD_CONNECTION,
+		MOVE_SELECTION_UP,
+		MOVE_SELECTION_DOWN,
+		TOGGLE_DESCRIPTION_WORD_WRAP,
+		APPLY_LAST_SEARCH,
+		TOGGLE_SEARCH_METHOD,
+		PASTE_SCRIPT,
+		MOVE_CLIP_LAST,
+		PASTE_DONT_MOVE_CLIP,
+		PASTE_TRIM_WHITE_SPACE,
+		TRANSPARENCY_NONE,
+		TRANSPARENCY_5,
+		TRANSPARENCY_10,
+		TRANSPARENCY_15,
+		TRANSPARENCY_20,
+		TRANSPARENCY_25,
+		TRANSPARENCY_30,
+		TRANSPARENCY_35,
+		TRANSPARENCY_40,
+		TRANSPARENCY_TOGGLE,
+		TRANSPARENCY_INCREASE,
+		TRANSPARENCY_DECREASE,
+		EMAILTO_BODY,
+		EMAILTO_ATTACH_EXPORT,
+		EMAILTO_ATTACH_CONTENT,
+		GMAIL,
+		SLUGIFY,
+		INVERT_CASE,
+
+		LAST_ACTION
+	};
+
+	static CString EnumDescription(ActionEnumValues value);
+
+	static int GetDefaultShortCutKeyA(ActionEnumValues value, int pos);
+	static int GetDefaultShortCutKeyB(ActionEnumValues value, int pos);
+	static bool UserConfigurable(ActionEnumValues value);
+	static bool ToolTipAction(ActionEnumValues value);
+};
+

+ 1 - 0
CP_Main.rc

@@ -255,6 +255,7 @@ BEGIN
             MENUITEM "lower case",                  ID_SPECIALPASTE_LOWERCASE
             MENUITEM "Capitalize Case",             ID_SPECIALPASTE_CAPITALIZE
             MENUITEM "Sentence case",               ID_SPECIALPASTE_SENTENCE
+            MENUITEM "Invert Case",                 ID_SPECIALPASTE_TOGGLECASE
             MENUITEM "Trim White Space",            ID_SPECIALPASTE_TRIM
             MENUITEM SEPARATOR
             MENUITEM "Remove Line Feeds",           ID_SPECIALPASTE_REMOVELINEFEEDS

+ 88 - 3
OleClipSource.cpp

@@ -192,6 +192,10 @@ BOOL COleClipSource::DoImmediateRender()
 	{
 		Slugify(clip);
 	}
+	else if (m_pasteOptions.m_invertCase)
+	{
+		InvertCase(clip);
+	}
 	
 	SaveDittoFileDataToFile(clip);
 
@@ -298,6 +302,87 @@ void COleClipSource::DoUpperLowerCase(CClip &clip, bool upper)
 	}
 }
 
+void COleClipSource::InvertCase(CClip &clip)
+{
+	IClipFormat *unicodeTextFormat = clip.m_Formats.FindFormatEx(CF_UNICODETEXT);
+	if (unicodeTextFormat != NULL)
+	{
+		HGLOBAL data = unicodeTextFormat->Data();
+		wchar_t * stringData = (wchar_t *)GlobalLock(data);
+		int size = (int)GlobalSize(data);
+		CString cs(stringData);
+		GlobalUnlock(data);
+
+		//free the old text we are going to replace it below with an upper case version
+		unicodeTextFormat->Free();
+
+		long len = cs.GetLength();
+
+		if (len > 0)
+		{
+			wchar_t * pText = cs.GetBuffer();
+			
+			for (int i = 0; i < len; i++)
+			{
+				wchar_t item = pText[i];
+				if (u_isUUppercase(item))
+				{
+					pText[i] = u_tolower(item);
+				}
+				else
+				{
+					pText[i] = u_toupper(item);
+				}
+			}
+		}
+
+		cs.ReleaseBuffer();
+
+		HGLOBAL hGlobal = NewGlobalP(cs.GetBuffer(), ((len + 1) * sizeof(wchar_t)));
+
+		unicodeTextFormat->Data(hGlobal);
+	}
+
+	IClipFormat *asciiTextFormat = clip.m_Formats.FindFormatEx(CF_TEXT);
+	if (asciiTextFormat != NULL)
+	{
+		HGLOBAL data = asciiTextFormat->Data();
+		char * stringData = (char *)GlobalLock(data);
+		int size = (int)GlobalSize(data);
+		CStringA cs(stringData);
+		GlobalUnlock(data);
+
+		//free the old text we are going to replace it below with an upper case version
+		asciiTextFormat->Free();
+
+		long len = cs.GetLength();
+
+		if (len > 0)
+		{
+			char * pText = cs.GetBuffer();
+
+			for (int i = 0; i < len; i++)
+			{
+				char item = pText[i];
+				if (::isupper(item))
+				{
+					pText[i] = ::tolower(item);
+				}
+				else
+				{
+					pText[i] = ::toupper(item);
+				}
+			}
+		}
+
+		cs.ReleaseBuffer();
+
+		HGLOBAL hGlobal = NewGlobalP(cs.GetBuffer(), (len + 1));
+
+		asciiTextFormat->Data(hGlobal);
+	}
+}
+
 void COleClipSource::Capitalize(CClip &clip)
 {
 	IClipFormat *unicodeTextFormat = clip.m_Formats.FindFormatEx(CF_UNICODETEXT);
@@ -374,7 +459,7 @@ void COleClipSource::Capitalize(CClip &clip)
 
 			for (int i = 1; i < len; i++)
 			{
-				wchar_t item = pText[i];
+				char item = pText[i];
 				if (item == ' ')
 				{
 					capitalize = true;
@@ -470,7 +555,7 @@ void COleClipSource::SentenceCase(CClip &clip)
 
 			for (int i = 1; i < len; i++)
 			{
-				wchar_t item = pText[i];
+				char item = pText[i];
 				if (item == '.' ||
 					item == '!' ||
 					item == '?')
@@ -636,7 +721,7 @@ void COleClipSource::AddLineFeeds(CClip &clip, int count)
 
 			for (int i = 0; i < count; i++)
 			{
-				string += _T("\r\n");
+				string += "\r\n";
 			}
 
 			HGLOBAL hGlobal = NewGlobalP(string.GetBuffer(), ((string.GetLength() + 1)));

+ 46 - 45
OleClipSource.h

@@ -1,46 +1,47 @@
-#pragma once
-
-#include "ClipIds.h"
-#include "SpecialPasteOptions.h"
-
-/*------------------------------------------------------------------*\
-	COleClipSource
-\*------------------------------------------------------------------*/
-class COleClipSource : public COleDataSource
-{
-	//DECLARE_DYNAMIC(COleClipSource)
-
-public:
-	CClipIDs	m_ClipIDs;
-	bool		m_bLoadedFormats;
-	CSpecialPasteOptions m_pasteOptions;
-
-	COleClipSource();
-	virtual ~COleClipSource();
-
-	BOOL DoDelayRender();
-	BOOL DoImmediateRender();
-
-	void PlainTextFilter(CClip &clip);
-
-	INT_PTR PutFormatOnClipboard(CClipFormats *pFormats);
-
-public:
-	virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
-
-protected:
-	CClipFormats m_DelayRenderedFormats;
-	bool m_convertToHDROPOnDelayRender;
-
-	void DoUpperLowerCase(CClip &clip, bool upper);
-	void Capitalize(CClip &clip);
-	void SentenceCase(CClip &clip);
-	void RemoveLineFeeds(CClip &clip);
-	void AddLineFeeds(CClip &clip, int count);
-	void Typoglycemia(CClip &clip);
-	HGLOBAL ConvertToFileDrop();
-	void AddDateTime(CClip &clip);
-	void SaveDittoFileDataToFile(CClip &clip);
-	void TrimWhiteSpace(CClip &clip);
-	void Slugify(CClip &clip);
+#pragma once
+
+#include "ClipIds.h"
+#include "SpecialPasteOptions.h"
+
+/*------------------------------------------------------------------*\
+	COleClipSource
+\*------------------------------------------------------------------*/
+class COleClipSource : public COleDataSource
+{
+	//DECLARE_DYNAMIC(COleClipSource)
+
+public:
+	CClipIDs	m_ClipIDs;
+	bool		m_bLoadedFormats;
+	CSpecialPasteOptions m_pasteOptions;
+
+	COleClipSource();
+	virtual ~COleClipSource();
+
+	BOOL DoDelayRender();
+	BOOL DoImmediateRender();
+
+	void PlainTextFilter(CClip &clip);
+
+	INT_PTR PutFormatOnClipboard(CClipFormats *pFormats);
+
+public:
+	virtual BOOL OnRenderGlobalData(LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal);
+
+protected:
+	CClipFormats m_DelayRenderedFormats;
+	bool m_convertToHDROPOnDelayRender;
+
+	void DoUpperLowerCase(CClip &clip, bool upper);
+	void Capitalize(CClip &clip);
+	void SentenceCase(CClip &clip);
+	void RemoveLineFeeds(CClip &clip);
+	void AddLineFeeds(CClip &clip, int count);
+	void Typoglycemia(CClip &clip);
+	HGLOBAL ConvertToFileDrop();
+	void AddDateTime(CClip &clip);
+	void SaveDittoFileDataToFile(CClip &clip);
+	void TrimWhiteSpace(CClip &clip);
+	void Slugify(CClip &clip);
+	void InvertCase(CClip &clip);
 };

+ 35 - 0
QPasteWnd.cpp

@@ -339,6 +339,8 @@ ON_COMMAND(ID_SPECIALPASTE_SLUGIFY, &CQPasteWnd::OnSpecialpasteSlugify)
 ON_UPDATE_COMMAND_UI(ID_SPECIALPASTE_SLUGIFY, &CQPasteWnd::OnUpdateSpecialpasteSlugify)
 ON_COMMAND(ID_IMPORT_EMAIL_CONTENT_ATTACH, &CQPasteWnd::OnImportEmailContentAttach)
 ON_UPDATE_COMMAND_UI(ID_IMPORT_EMAIL_CONTENT_ATTACH, &CQPasteWnd::OnUpdateImportEmailContentAttach)
+ON_COMMAND(ID_SPECIALPASTE_TOGGLECASE, &CQPasteWnd::OnSpecialpasteTogglecase)
+ON_UPDATE_COMMAND_UI(ID_SPECIALPASTE_TOGGLECASE, &CQPasteWnd::OnUpdateSpecialpasteTogglecase)
 END_MESSAGE_MAP()
 
 
@@ -3012,6 +3014,9 @@ bool CQPasteWnd::DoAction(CAccel a)
 	case ActionEnums::PASTE_SENTENCE_CASE:
 		ret = DoPasteSentenceCase();
 		break;
+	case ActionEnums::INVERT_CASE:
+		ret = DoInvertCase();
+		break;
 	case ActionEnums::PASTE_REMOVE_LINE_FEEDS:
 		ret = DoPasteRemoveLineFeeds();
 		break;
@@ -4451,6 +4456,19 @@ bool CQPasteWnd::DoPasteSentenceCase()
 	return false;
 }
 
+bool CQPasteWnd::DoInvertCase()
+{
+	if (::GetFocus() == m_lstHeader.GetSafeHwnd())
+	{
+		CSpecialPasteOptions pasteOptions;
+		pasteOptions.m_invertCase = true;
+		OpenSelection(pasteOptions);
+		return true;
+	}
+
+	return false;
+}
+
 bool CQPasteWnd::DoPasteRemoveLineFeeds()
 {
 	if (::GetFocus() == m_lstHeader.GetSafeHwnd())
@@ -7519,3 +7537,20 @@ void CQPasteWnd::OnUpdateImportEmailContentAttach(CCmdUI *pCmdUI)
 
 	UpdateMenuShortCut(pCmdUI, ActionEnums::EMAILTO_ATTACH_CONTENT);
 }
+
+
+void CQPasteWnd::OnSpecialpasteTogglecase()
+{
+	DoAction(ActionEnums::INVERT_CASE);
+}
+
+
+void CQPasteWnd::OnUpdateSpecialpasteTogglecase(CCmdUI *pCmdUI)
+{
+	if (!pCmdUI->m_pMenu)
+	{
+		return;
+	}
+
+	UpdateMenuShortCut(pCmdUI, ActionEnums::INVERT_CASE);
+}

+ 3 - 0
QPasteWnd.h

@@ -276,6 +276,7 @@ public:
 	bool DoPasteLowerCase();
 	bool DoPasteCapitalize();
 	bool DoPasteSentenceCase();
+	bool DoInvertCase();
 	bool DoPasteRemoveLineFeeds();
 	bool DoPastePlusAddLineFeed();
 	bool DoPasteAddTwoLineFeeds();
@@ -572,4 +573,6 @@ public:
 	afx_msg void OnUpdateSpecialpasteSlugify(CCmdUI *pCmdUI);
 	afx_msg void OnImportEmailContentAttach();
 	afx_msg void OnUpdateImportEmailContentAttach(CCmdUI *pCmdUI);
+	afx_msg void OnSpecialpasteTogglecase();
+	afx_msg void OnUpdateSpecialpasteTogglecase(CCmdUI *pCmdUI);
 };

+ 2 - 1
Resource.h

@@ -773,6 +773,7 @@
 #define ID_IMPORT_EMAIL                 32955
 #define ID_IMPORT_EMAIL_CONTENT_ATTACH  32956
 #define ID_QUICKOPTIONS_AUTO            32957
+#define ID_SPECIALPASTE_TOGGLECASE      32958
 
 // Next default values for new objects
 // 
@@ -780,7 +781,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        383
-#define _APS_NEXT_COMMAND_VALUE         32958
+#define _APS_NEXT_COMMAND_VALUE         32959
 #define _APS_NEXT_CONTROL_VALUE         2172
 #define _APS_NEXT_SYMED_VALUE           104
 #endif

+ 37 - 36
SpecialPasteOptions.cpp

@@ -1,36 +1,37 @@
-#include "stdafx.h"
-#include "SpecialPasteOptions.h"
-
-
-CSpecialPasteOptions::CSpecialPasteOptions()
-{
-	m_pasteAsPlainText = false;
-	m_pPasteFormats = NULL;
-	m_pasteUpperCase = false;
-	m_pasteLowerCase = false;
-	m_pasteCapitalize = false;
-	m_pasteRemoveLineFeeds = false;
-	m_pasteAddOneLineFeed = false;
-	m_pasteAddTwoLineFeeds = false;
-	m_pasteSentenceCase = false;
-	m_pasteTypoglycemia = false;
-	m_pasteAddingDateTime = false;
-	m_delayRenderLockout = 0;
-	m_dragDropFilesOnly = false;
-	m_pasteScriptGuid = _T("");
-	m_updateClipOrder = true;
-	m_trimWhiteSpace = false;
-	m_pasteSlugify = false;
-}
-
-CSpecialPasteOptions::~CSpecialPasteOptions()
-{
-}
-
-CString CSpecialPasteOptions::ToString()
-{
-	CString cs;
-	cs.Format(_T("Plain Text: %d"), m_pasteAsPlainText);
-
-	return cs;
-}
+#include "stdafx.h"
+#include "SpecialPasteOptions.h"
+
+
+CSpecialPasteOptions::CSpecialPasteOptions()
+{
+	m_pasteAsPlainText = false;
+	m_pPasteFormats = NULL;
+	m_pasteUpperCase = false;
+	m_pasteLowerCase = false;
+	m_pasteCapitalize = false;
+	m_pasteRemoveLineFeeds = false;
+	m_pasteAddOneLineFeed = false;
+	m_pasteAddTwoLineFeeds = false;
+	m_pasteSentenceCase = false;
+	m_pasteTypoglycemia = false;
+	m_pasteAddingDateTime = false;
+	m_delayRenderLockout = 0;
+	m_dragDropFilesOnly = false;
+	m_pasteScriptGuid = _T("");
+	m_updateClipOrder = true;
+	m_trimWhiteSpace = false;
+	m_pasteSlugify = false;
+	m_invertCase = false;
+}
+
+CSpecialPasteOptions::~CSpecialPasteOptions()
+{
+}
+
+CString CSpecialPasteOptions::ToString()
+{
+	CString cs;
+	cs.Format(_T("Plain Text: %d"), m_pasteAsPlainText);
+
+	return cs;
+}

+ 56 - 54
SpecialPasteOptions.h

@@ -1,54 +1,56 @@
-#pragma once
-#include "Clip.h"
-
-class CSpecialPasteOptions
-{
-public:
-	CSpecialPasteOptions();
-	~CSpecialPasteOptions();
-
-	bool m_pasteAsPlainText;
-	bool m_pasteUpperCase;
-	bool m_pasteLowerCase;
-	bool m_pasteCapitalize;
-	bool m_pasteSentenceCase;
-	bool m_pasteRemoveLineFeeds;
-	bool m_pasteAddOneLineFeed;
-	bool m_pasteAddTwoLineFeeds;
-	bool m_pasteTypoglycemia;
-	bool m_pasteAddingDateTime;
-	CClipFormats *m_pPasteFormats;
-	DWORD m_delayRenderLockout;
-	bool m_dragDropFilesOnly;
-	CString m_pasteScriptGuid;
-	bool m_updateClipOrder;
-	bool m_trimWhiteSpace;
-	bool m_pasteSlugify;
-
-	bool LimitFormatsToText() 
-	{ 
-		return m_pasteAsPlainText ||
-			m_pasteUpperCase ||
-			m_pasteLowerCase ||
-			m_pasteCapitalize ||
-			m_pasteSentenceCase ||
-			m_pasteRemoveLineFeeds ||
-			m_pasteAddOneLineFeed ||
-			m_pasteAddTwoLineFeeds ||
-			m_pasteTypoglycemia ||
-			m_pasteAddingDateTime || 
-			m_trimWhiteSpace ||
-			m_pasteSlugify;
-	}
-
-	bool IncludeRTFForTextOnly()
-	{
-		return m_pasteRemoveLineFeeds ||
-			m_pasteAddOneLineFeed ||
-			m_pasteAddTwoLineFeeds ||
-			m_pasteAddingDateTime;
-	}
-
-	CString ToString();
-};
-
+#pragma once
+#include "Clip.h"
+
+class CSpecialPasteOptions
+{
+public:
+	CSpecialPasteOptions();
+	~CSpecialPasteOptions();
+
+	bool m_pasteAsPlainText;
+	bool m_pasteUpperCase;
+	bool m_pasteLowerCase;
+	bool m_pasteCapitalize;
+	bool m_pasteSentenceCase;
+	bool m_pasteRemoveLineFeeds;
+	bool m_pasteAddOneLineFeed;
+	bool m_pasteAddTwoLineFeeds;
+	bool m_pasteTypoglycemia;
+	bool m_pasteAddingDateTime;
+	CClipFormats *m_pPasteFormats;
+	DWORD m_delayRenderLockout;
+	bool m_dragDropFilesOnly;
+	CString m_pasteScriptGuid;
+	bool m_updateClipOrder;
+	bool m_trimWhiteSpace;
+	bool m_pasteSlugify;
+	bool m_invertCase;
+
+	bool LimitFormatsToText() 
+	{ 
+		return m_pasteAsPlainText ||
+			m_pasteUpperCase ||
+			m_pasteLowerCase ||
+			m_pasteCapitalize ||
+			m_pasteSentenceCase ||
+			m_pasteRemoveLineFeeds ||
+			m_pasteAddOneLineFeed ||
+			m_pasteAddTwoLineFeeds ||
+			m_pasteTypoglycemia ||
+			m_pasteAddingDateTime || 
+			m_trimWhiteSpace ||
+			m_pasteSlugify || 
+			m_invertCase;
+	}
+
+	bool IncludeRTFForTextOnly()
+	{
+		return m_pasteRemoveLineFeeds ||
+			m_pasteAddOneLineFeed ||
+			m_pasteAddTwoLineFeeds ||
+			m_pasteAddingDateTime;
+	}
+
+	CString ToString();
+};
+