AdvGeneral.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017
  1. // AdvGeneral.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CP_Main.h"
  5. #include "AdvGeneral.h"
  6. #include "afxdialogex.h"
  7. #include "ScriptEditor.h"
  8. #include "DimWnd.h"
  9. // CAdvGeneral dialog
  10. IMPLEMENT_DYNAMIC(CAdvGeneral, CDialogEx)
  11. CAdvGeneral::CAdvGeneral(CWnd* pParent /*=NULL*/)
  12. : CDialogEx(CAdvGeneral::IDD, pParent)
  13. {
  14. }
  15. CAdvGeneral::~CAdvGeneral()
  16. {
  17. }
  18. void CAdvGeneral::DoDataExchange(CDataExchange* pDX)
  19. {
  20. CDialogEx::DoDataExchange(pDX);
  21. DDX_Control(pDX, IDC_MFCPROPERTYGRID1, m_propertyGrid);
  22. }
  23. BEGIN_MESSAGE_MAP(CAdvGeneral, CDialogEx)
  24. ON_BN_CLICKED(IDOK, &CAdvGeneral::OnBnClickedOk)
  25. ON_WM_SIZE()
  26. ON_BN_CLICKED(IDC_BT_COMPACT_AND_REPAIR, &CAdvGeneral::OnBnClickedBtCompactAndRepair)
  27. ON_BN_CLICKED(IDC_BUTTON_COPY_SCRIPTS, &CAdvGeneral::OnBnClickedButtonCopyScripts)
  28. ON_BN_CLICKED(IDC_BUTTON_PASTE_SCRIPTS, &CAdvGeneral::OnBnClickedButtonPasteScripts2)
  29. ON_WM_GETMINMAXINFO()
  30. ON_WM_NCLBUTTONDOWN()
  31. END_MESSAGE_MAP()
  32. // CAdvGeneral message handlers
  33. #define SETTING_DESC_SIZE 1
  34. #define SETTING_SHOW_TASKBAR_ICON 2
  35. #define SETTING_SAVE_MULTI_PASTE 3
  36. #define SETTING_HIDE_ON_HOTKEY_IF_VISIBLE 4
  37. #define SETTING_PASTE_IN_ACTIVE_WINDOW 5
  38. #define SETTING_MAX_CLIP_SIZE 6
  39. #define SETTING_CLIP_SEPARATOR 7
  40. #define SETTING_ENSURE_CONNECTED 8
  41. #define SETTING_COPY_PLAY_SOUND 9
  42. #define SETTING_TEXT_FIRST_TEN 10
  43. #define SETTING_SHOW_LEADING_WHITESPACE 11
  44. #define SETTING_LINES_PER_ROW 12
  45. #define SETTING_ENABLE_TRANSPARENCY 13
  46. #define SETTING_DRAW_THUMBNAILS 14
  47. #define SETTING_DRAW_RTF 15
  48. #define SETTING_FIND_AS_TYPE 16
  49. #define SETTING_ENSURE_WINDOW_IS_VISIBLE 17
  50. #define SETTING_SHOW_GROUP_CLIPS_IN_LIST 18
  51. #define SETTING_PROMPT_ON_DELETE 19
  52. #define SETTING_ALWAYS_SHOW_SCROLL_BAR 20
  53. #define SETTING_PASTE_AS_ADMIN 21
  54. #define SETTTING_SHOW_IN_TASKBAR 22
  55. #define SETTING_SHOW_CLIP_PASTED 23
  56. #define SETTING_DIFF_APP 24
  57. #define SETTING_TRANSPARENCY 25
  58. #define SETTING_UPDATE_ORDER_ON_PASTE 26
  59. #define SETTING_ALLOW_DUPLICATES 27
  60. #define SETTING_REGEX_FILTERING_1 28
  61. #define SETTING_REGEX_FILTERING_2 29
  62. #define SETTING_REGEX_FILTERING_3 30
  63. #define SETTING_REGEX_FILTERING_4 31
  64. #define SETTING_REGEX_FILTERING_5 32
  65. #define SETTING_REGEX_FILTERING_6 33
  66. #define SETTING_REGEX_FILTERING_7 34
  67. #define SETTING_REGEX_FILTERING_8 35
  68. #define SETTING_REGEX_FILTERING_9 36
  69. #define SETTING_REGEX_FILTERING_10 37
  70. #define SETTING_REGEX_FILTERING_11 38
  71. #define SETTING_REGEX_FILTERING_12 39
  72. #define SETTING_REGEX_FILTERING_13 40
  73. #define SETTING_REGEX_FILTERING_14 41
  74. #define SETTING_REGEX_FILTERING_15 42
  75. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_1 43
  76. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_2 44
  77. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_3 45
  78. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_4 46
  79. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_5 47
  80. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_6 48
  81. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_7 49
  82. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_8 50
  83. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_9 51
  84. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_10 52
  85. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_11 53
  86. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_12 54
  87. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_13 55
  88. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_14 56
  89. #define SETTING_REGEX_FILTERING_BY_PROCESS_NAME_15 57
  90. #define SETTING_SHOW_STARTUP_MESSAGE 58
  91. #define SETTING_TOOLTIP_TIMEOUT 59
  92. #define SETTING_SELECTED_INDEX 60
  93. #define SETTING_CLIPBOARD_SAVE_DELAY 61
  94. #define SETTING_SHOW_MSG_WHEN_RECEIVING_MANUAL_SENT_CLIP 62
  95. #define SETTING_MULTIPASTE_REVERSE_ORDER 63
  96. #define SETTING_DEFAULT_PASTE_STRING 64
  97. #define SETTING_DEFAULT_COPY_STRING 65
  98. #define SETTING_DEFAULT_CUT_STRING 66
  99. #define SETTING_REVERT_TO_TOP_LEVEL_GROUP 67
  100. #define SETTING_UPDATE_ORDER_ON_CTRL_C 68
  101. #define SETTING_TOOLTIP_LINES 69
  102. #define SETTING_TOOLTIP_CHARACTERS 70
  103. #define SETTING_ACTIVATE_WINDOW_DELAY 71
  104. #define SETTING_DOUBLE_KEYSTROKE_TIMEOUT 72
  105. #define SETTING_SEND_KEYS_DELAY 73
  106. #define SETTING_FIRST_TEN_HOTKEYS_START 74
  107. #define SETTING_FIRST_TEN_HOTKEYS_FONT_SIZE 75
  108. #define SETTING_OPEN_TO_GROUP_AS_ACTIVE_EXE 76
  109. #define SETTING_ADD_CF_HDROP_ON_DRAG 77
  110. #define SETTING_COPY_SAVE_DELAY 78
  111. #define SETTING_EDITOR_FONT_SIZE 79
  112. #define SETTING_MOVE_SELECTION_ON_OPEN_HOTKEY 80
  113. #define SETTING_ALOW_BACK_TO_BACK_DUPLICATES 81
  114. #define SETTING_MAINTAIN_SEARCH_VIEW 82
  115. #define SETTING_SEND_RECV_PORT 83
  116. #define SETTING_DEBUG_TO_FILE 84
  117. #define SETTING_DEBUG_TO_OUTPUT_STRING 85
  118. #define SETTING_NETWORK_BIND_IP_ADDRESS 86
  119. #define SETTING_DISABLE_FRIENDS 87
  120. #define SETTING_IGNORE_FALSE_COPIES_DELAY 88
  121. #define SETTING_REFRESH_VIEW_AFTER_PASTE 89
  122. #define SETTING_SLUGIFY_SEPARATOR 90
  123. #define SETTING_FAST_THUMBNAIL_MODE 91
  124. #define SETTING_CLIPBOARD_RESTORE_AFTER_COPY_BUFFER_DELAY 92
  125. #define SETTING_SUPPORT_ALL_TYPES 93
  126. #define SETTING_IGNORE_ANNOYING_CF_DIB 94
  127. #define SETTING_REGEX_CASE_INSENSITIVE 95
  128. #define SETTING_DRAW_COPIED_COLOR_CODE 96
  129. #define SETTING_CENTER_WINDOW_BELOW_CURSOR_CARET 97
  130. #define SETTING_TEXT_EDITOR_PATH 98
  131. #define SETTING_RTF_EDITOR_PATH 99
  132. #define SETTING_UPDATE_DESC_ON_CLIP_EDIT 100
  133. #define SETTING_QR_CODE_URL 101
  134. #define SETTING_APPEND_NAME_IP 102
  135. #define SETTING_USE_UTF8_FOR_DIFF 103
  136. BOOL CAdvGeneral::OnInitDialog()
  137. {
  138. CDialogEx::OnInitDialog();
  139. HICON b = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME), IMAGE_ICON, 64, 64, LR_SHARED);
  140. SetIcon(b, TRUE);
  141. m_propertyGrid.ModifyStyle(0, WS_CLIPCHILDREN);
  142. CMFCPropertyGridProperty * pGroupTest = new CMFCPropertyGridProperty( _T( "Ditto" ) );
  143. m_propertyGrid.AddProperty(pGroupTest);
  144. m_Resize.SetParent(m_hWnd);
  145. m_Resize.AddControl(IDC_MFCPROPERTYGRID1, DR_SizeWidth | DR_SizeHeight);
  146. m_Resize.AddControl(IDOK, DR_MoveTop | DR_MoveLeft);
  147. m_Resize.AddControl(IDCANCEL, DR_MoveTop | DR_MoveLeft);
  148. m_Resize.AddControl(IDC_BT_COMPACT_AND_REPAIR, DR_MoveTop);
  149. m_Resize.AddControl(IDC_BUTTON_COPY_SCRIPTS, DR_MoveTop);
  150. m_Resize.AddControl(IDC_BUTTON_PASTE_SCRIPTS, DR_MoveTop);
  151. HDITEM hdItem;
  152. hdItem.mask = HDI_WIDTH; // indicating cxy is width
  153. CDPI dpi(m_hWnd);
  154. hdItem.cxy = dpi.Scale(400); // whatever you want the property name column width to be
  155. m_propertyGrid.GetHeaderCtrl().SetItem(0, &hdItem);
  156. m_propertyGrid.SetFont(this->GetFont());
  157. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Activate window delay (100ms default)"), (long)CGetSetOptions::SendKeysDelay(), _T(""), SETTING_ACTIVATE_WINDOW_DELAY));
  158. AddTrueFalse(pGroupTest, _T("Add file drop when dragging clips"), CGetSetOptions::GetAddCFHDROP_OnDrag(), SETTING_ADD_CF_HDROP_ON_DRAG);
  159. AddTrueFalse(pGroupTest, _T("Allow duplicates"), CGetSetOptions::GetAllowDuplicates(), SETTING_ALLOW_DUPLICATES);
  160. AddTrueFalse(pGroupTest, _T("Allow back to back duplicates (if allowing duplicates)"), CGetSetOptions::GetAllowBackToBackDuplicates(), SETTING_ALOW_BACK_TO_BACK_DUPLICATES);
  161. AddTrueFalse(pGroupTest, _T("Always show scroll bar"), CGetSetOptions::GetShowScrollBar(), SETTING_ALWAYS_SHOW_SCROLL_BAR);
  162. AddTrueFalse(pGroupTest, _T("Append Computer Name and IP when receiving clips"), CGetSetOptions::GetAppendRemoveComputerNameAndIPToDescription(), SETTING_APPEND_NAME_IP);
  163. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Amount of text to save for description"), CGetSetOptions::m_bDescTextSize, _T(""), SETTING_DESC_SIZE));
  164. AddTrueFalse(pGroupTest, _T("Center window below cursor or caret"), CGetSetOptions::GetCenterWindowBelowCursorOrCaret(), SETTING_CENTER_WINDOW_BELOW_CURSOR_CARET);
  165. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Copy and save clipboard delay (ms)"), (long)CGetSetOptions::GetCopyAndSveDelay(), _T(""), SETTING_COPY_SAVE_DELAY));
  166. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Clipboard restore delay after copy buffer sent paste (ms, default: 750)"), (long)(CGetSetOptions::GetDittoRestoreClipboardDelay()), _T(""), SETTING_CLIPBOARD_RESTORE_AFTER_COPY_BUFFER_DELAY));
  167. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Default paste string"), CGetSetOptions::GetDefaultPasteString(), _T(""), SETTING_DEFAULT_PASTE_STRING));
  168. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Default copy string"), CGetSetOptions::GetDefaultCopyString(), _T(""), SETTING_DEFAULT_COPY_STRING));
  169. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Default cut string"), CGetSetOptions::GetDefaultCutString(), _T(""), SETTING_DEFAULT_CUT_STRING));
  170. static TCHAR BASED_CODE szDiffFilter[] = _T("Diff Applications(*.exe)|*.exe||");
  171. CMFCPropertyGridFileProperty* pDiffProp = new CMFCPropertyGridFileProperty(_T("Diff application path"), TRUE, CGetSetOptions::GetDiffApp(), _T("exe"), 0, szDiffFilter, (LPCTSTR)0, SETTING_DIFF_APP);
  172. pGroupTest->AddSubItem(pDiffProp);
  173. AddTrueFalse(pGroupTest, _T("Diff save compare files as utf8"), CGetSetOptions::GetPreferUtf8ForCompare(), SETTING_USE_UTF8_FOR_DIFF);
  174. AddTrueFalse(pGroupTest, _T("Disable friends"), !CGetSetOptions::GetAllowFriends(), SETTING_DISABLE_FRIENDS);
  175. AddTrueFalse(pGroupTest, _T("Display icon in system tray"), CGetSetOptions::GetShowIconInSysTray(), SETTING_SHOW_TASKBAR_ICON);
  176. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Double shortcut keystroke timeout)"), (long)CGetSetOptions::GetDoubleKeyStrokeTimeout(), _T(""), SETTING_DOUBLE_KEYSTROKE_TIMEOUT));
  177. AddTrueFalse(pGroupTest, _T("Draw copied color code (hex #RRGGBB or rgb(r,g,b)"), CGetSetOptions::GetDrawCopiedColorCode(), SETTING_DRAW_COPIED_COLOR_CODE);
  178. AddTrueFalse(pGroupTest, _T("Draw RTF text in list (for RTF types) (could increase memory usage an display speed)"), CGetSetOptions::GetDrawRTF(), SETTING_DRAW_RTF);
  179. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Editor default font size"), (long)CGetSetOptions::GetEditorDefaultFontSize(), _T(""), SETTING_EDITOR_FONT_SIZE));
  180. AddTrueFalse(pGroupTest, _T("Elevated privileges to paste into elevated apps"), CGetSetOptions::GetPasteAsAdmin(), SETTING_PASTE_AS_ADMIN);
  181. AddTrueFalse(pGroupTest, _T("Ensure Ditto is always connected to the clipboard"), CGetSetOptions::GetEnsureConnectToClipboard(), SETTING_ENSURE_CONNECTED);
  182. AddTrueFalse(pGroupTest, _T("Ensure entire window is visible"), CGetSetOptions::GetEnsureEntireWindowCanBeSeen(), SETTING_ENSURE_WINDOW_IS_VISIBLE);
  183. AddTrueFalse(pGroupTest, _T("Fast thumbnail mode (default: true means low quality but fast. false means high quality but slow)"), CGetSetOptions::GetFastThumbnailMode(), SETTING_FAST_THUMBNAIL_MODE);
  184. AddTrueFalse(pGroupTest, _T("Find as you type"), CGetSetOptions::GetFindAsYouType(), SETTING_FIND_AS_TYPE);
  185. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("First ten hot keys start index"), (long)CGetSetOptions::GetFirstTenHotKeysStart(), _T(""), SETTING_FIRST_TEN_HOTKEYS_START));
  186. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("First ten hot keys font size"), (long)CGetSetOptions::GetFirstTenHotKeysFontSize(), _T(""), SETTING_FIRST_TEN_HOTKEYS_FONT_SIZE));
  187. AddTrueFalse(pGroupTest, _T("Hide Ditto on hot key if Ditto is visible"), CGetSetOptions::GetHideDittoOnHotKeyIfAlreadyShown(), SETTING_HIDE_ON_HOTKEY_IF_VISIBLE);
  188. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Ignore copies faster than (ms) (default: 500)"), (long)CGetSetOptions::GetSaveClipDelay(), _T(""), SETTING_IGNORE_FALSE_COPIES_DELAY));
  189. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Ignore annoying CF_DIB when a clip is detected as text content"), CGetSetOptions::GetIgnoreAnnoyingCFDIB(), _T("Case insensitive. Recommended option is \"excel.exe; onenote.exe; powerpnt.exe\" "), SETTING_IGNORE_ANNOYING_CF_DIB));
  190. pGroupTest->AddSubItem( new CMFCPropertyGridProperty(_T("Maximum clip size in bytes (0 for no limit)"), CGetSetOptions::m_lMaxClipSizeInBytes, _T(""), SETTING_MAX_CLIP_SIZE));
  191. AddTrueFalse(pGroupTest, _T("Maintain search view"), CGetSetOptions::GetMaintainSearchView(), SETTING_MAINTAIN_SEARCH_VIEW);
  192. AddTrueFalse(pGroupTest, _T("Move selection on open hot key"), CGetSetOptions::GetMoveSelectionOnOpenHotkey(), SETTING_MOVE_SELECTION_ON_OPEN_HOTKEY);
  193. pGroupTest->AddSubItem( new CMFCPropertyGridProperty(_T("Multi-paste clip separator ([LF] = line feed)"), CGetSetOptions::GetMultiPasteSeparator(false), _T(""), SETTING_CLIP_SEPARATOR));
  194. AddTrueFalse(pGroupTest, _T("Multi-paste in reverse order"), CGetSetOptions::m_bMultiPasteReverse, SETTING_MULTIPASTE_REVERSE_ORDER);
  195. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Network send receive port (default: 23443)"), (long)CGetSetOptions::GetPort(), _T(""), SETTING_SEND_RECV_PORT));
  196. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Network server bind IP (default: *)"), CGetSetOptions::GetNetworkBindIPAddress(), _T(""), SETTING_NETWORK_BIND_IP_ADDRESS));
  197. AddTrueFalse(pGroupTest, _T("Open to group same as active exe"), CGetSetOptions::GetOpenToGroupByActiveExe(), SETTING_OPEN_TO_GROUP_AS_ACTIVE_EXE);
  198. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("QRCode Url"), CGetSetOptions::GetQRCodeUrl(), _T(""), SETTING_QR_CODE_URL));
  199. static TCHAR BASED_CODE szFilter[] = _T("Sounds(*.wav)|*.wav||");
  200. CMFCPropertyGridFileProperty* pFileProp = new CMFCPropertyGridFileProperty(_T("On copy play the sound"), TRUE, CGetSetOptions::GetPlaySoundOnCopy(), _T("wav"), 0, szFilter, (LPCTSTR)0, SETTING_COPY_PLAY_SOUND);
  201. pGroupTest->AddSubItem(pFileProp);
  202. static TCHAR BASED_CODE szTextEditorFilter[] = _T("Applications(*.exe)|*.exe||");
  203. CMFCPropertyGridFileProperty* pTextEditorProp = new CMFCPropertyGridFileProperty(_T("Text editor path"), TRUE, CGetSetOptions::GetTextEditorPath(), _T("exe"), 0, szTextEditorFilter, (LPCTSTR)0, SETTING_TEXT_EDITOR_PATH);
  204. pGroupTest->AddSubItem(pTextEditorProp);
  205. AddTrueFalse(pGroupTest, _T("Paste clip in active window after selection"), CGetSetOptions::GetSendPasteAfterSelection(), SETTING_PASTE_IN_ACTIVE_WINDOW);
  206. AddTrueFalse(pGroupTest, _T("Prompt when deleting clips"), CGetSetOptions::GetPromptWhenDeletingClips(), SETTING_PROMPT_ON_DELETE);
  207. AddTrueFalse(pGroupTest, _T("Revert to top level group on close"), CGetSetOptions::GetRevertToTopLevelGroup(), SETTING_REVERT_TO_TOP_LEVEL_GROUP);
  208. AddTrueFalse(pGroupTest, _T("Refresh view after paste"), CGetSetOptions::GetRefreshViewAfterPasting(), SETTING_REFRESH_VIEW_AFTER_PASTE);
  209. AddTrueFalse(pGroupTest, _T("Regex case insensitive search"), CGetSetOptions::GetRegexCaseInsensitive(), SETTING_REGEX_CASE_INSENSITIVE);
  210. static TCHAR BASED_CODE szRTFEditorFilter[] = _T("Applications(*.exe)|*.exe||");
  211. CMFCPropertyGridFileProperty* pRTFEditorProp = new CMFCPropertyGridFileProperty(_T("RTF editor path"), TRUE, CGetSetOptions::GetRTFEditorPath(), _T("exe"), 0, szRTFEditorFilter, (LPCTSTR)0, SETTING_RTF_EDITOR_PATH);
  212. pGroupTest->AddSubItem(pRTFEditorProp);
  213. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Save clipboard delay (ms, default: 100)"), (long)(CGetSetOptions::GetProcessDrawClipboardDelay()), _T(""), SETTING_CLIPBOARD_SAVE_DELAY));
  214. AddTrueFalse(pGroupTest, _T("Save multi-pastes"), CGetSetOptions::GetSaveMultiPaste(), SETTING_SAVE_MULTI_PASTE);
  215. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Selected index"), (long)(CGetSetOptions::SelectedIndex()+1), _T(""), SETTING_SELECTED_INDEX));
  216. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Send keys delay (ms)"), (long)CGetSetOptions::RealSendKeysDelay(), _T(""), SETTING_SEND_KEYS_DELAY));
  217. AddTrueFalse(pGroupTest, _T("Show clips that are in groups in main list"), CGetSetOptions::GetShowAllClipsInMainList(), SETTING_SHOW_GROUP_CLIPS_IN_LIST);
  218. AddTrueFalse(pGroupTest, _T("Show leading whitespace"), CGetSetOptions::GetDescShowLeadingWhiteSpace(), SETTING_SHOW_LEADING_WHITESPACE);
  219. AddTrueFalse(pGroupTest, _T("Show in taskbar"), CGetSetOptions::GetShowInTaskBar(), SETTTING_SHOW_IN_TASKBAR);
  220. AddTrueFalse(pGroupTest, _T("Show indicator a clip has been pasted"), CGetSetOptions::GetShowIfClipWasPasted(), SETTING_SHOW_CLIP_PASTED);
  221. AddTrueFalse(pGroupTest, _T("Show message that we received a manual sent clip"), CGetSetOptions::GetShowMsgWhenReceivingManualSentClip(), SETTING_SHOW_MSG_WHEN_RECEIVING_MANUAL_SENT_CLIP);
  222. AddTrueFalse(pGroupTest, _T("Show startup tooltip message"), CGetSetOptions::GetShowStartupMessage(), SETTING_SHOW_STARTUP_MESSAGE);
  223. AddTrueFalse(pGroupTest, _T("Show text for first ten copy hot keys"), CGetSetOptions::GetShowTextForFirstTenHotKeys(), SETTING_TEXT_FIRST_TEN);
  224. AddTrueFalse(pGroupTest, _T("Show thumbnails(for CF_DIB and PNG types) (could increase memory usage and display speed)"), CGetSetOptions::GetDrawThumbnail(), SETTING_DRAW_THUMBNAILS);
  225. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Slugify Separator (default: -)"), CGetSetOptions::GetSlugifySeparator(), _T(""), SETTING_SLUGIFY_SEPARATOR));
  226. AddTrueFalse(pGroupTest, _T("Support all types ignoring supported type list (default: false))"), CGetSetOptions::GetSupportAllTypes(), SETTING_SUPPORT_ALL_TYPES);
  227. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Text lines per clip"), CGetSetOptions::GetLinesPerRow(), _T(""), SETTING_LINES_PER_ROW));
  228. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Tooltip display time(ms) max of 32000 (-1 default (5 seconds), 0 to turn off)"), CGetSetOptions::m_tooltipTimeout, _T(""), SETTING_TOOLTIP_TIMEOUT));
  229. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Tooltip maximum display lines"), (long)CGetSetOptions::GetMaxToolTipLines(), _T(""), SETTING_TOOLTIP_LINES));
  230. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Tooltip display characters"), (long)CGetSetOptions::GetMaxToolTipCharacters(), _T(""), SETTING_TOOLTIP_CHARACTERS));
  231. AddTrueFalse(pGroupTest, _T("Transparency enabled"), CGetSetOptions::GetEnableTransparency(), SETTING_ENABLE_TRANSPARENCY);
  232. pGroupTest->AddSubItem(new CMFCPropertyGridProperty(_T("Transparency percentage"), CGetSetOptions::GetTransparencyPercent(), _T(""), SETTING_TRANSPARENCY));
  233. AddTrueFalse(pGroupTest, _T("Update description on clip edit"), CGetSetOptions::GetUpdateDescWhenSavingClip(), SETTING_UPDATE_DESC_ON_CLIP_EDIT);
  234. AddTrueFalse(pGroupTest, _T("Update clip order on paste"), CGetSetOptions::GetUpdateTimeOnPaste(), SETTING_UPDATE_ORDER_ON_PASTE);
  235. AddTrueFalse(pGroupTest, _T("Update clip Order on ctrl-c"), CGetSetOptions::GetUpdateClipOrderOnCtrlC(), SETTING_UPDATE_ORDER_ON_CTRL_C);
  236. AddTrueFalse(pGroupTest, _T("Write debug to file"), CGetSetOptions::GetEnableDebugLogging(), SETTING_DEBUG_TO_FILE);
  237. AddTrueFalse(pGroupTest, _T("Write debug to OutputDebugString"), CGetSetOptions::GetEnableDebugLogging(), SETTING_DEBUG_TO_OUTPUT_STRING);
  238. CMFCPropertyGridProperty * regexFilterGroup = new CMFCPropertyGridProperty(_T("Exclude clips by Regular Expressions"));
  239. m_propertyGrid.AddProperty(regexFilterGroup);
  240. CString processFilterDesc = _T("Process making the copy first must match this before the Regex will be applied (empty or * for all processes) (separate multiples by ;)");
  241. CString regexFilterDesc = _T("If copied text matches this regular expression then the clip will not be saved to Ditto");
  242. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("1 Regex"), CGetSetOptions::GetRegexFilter(0), regexFilterDesc, SETTING_REGEX_FILTERING_1));
  243. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("1 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(0), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_1));
  244. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("2 Regex"), CGetSetOptions::GetRegexFilter(1), regexFilterDesc, SETTING_REGEX_FILTERING_2));
  245. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("2 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(1), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_2));
  246. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("3 Regex"), CGetSetOptions::GetRegexFilter(2), regexFilterDesc, SETTING_REGEX_FILTERING_3));
  247. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("3 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(2), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_3));
  248. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("4 Regex"), CGetSetOptions::GetRegexFilter(3), regexFilterDesc, SETTING_REGEX_FILTERING_4));
  249. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("4 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(3), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_4));
  250. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("5 Regex"), CGetSetOptions::GetRegexFilter(4), regexFilterDesc, SETTING_REGEX_FILTERING_5));
  251. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("5 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(4), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_5));
  252. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("6 Regex"), CGetSetOptions::GetRegexFilter(5), regexFilterDesc, SETTING_REGEX_FILTERING_6));
  253. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("6 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(5), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_6));
  254. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("7 Regex"), CGetSetOptions::GetRegexFilter(6), regexFilterDesc, SETTING_REGEX_FILTERING_7));
  255. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("7 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(6), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_7));
  256. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("8 Regex"), CGetSetOptions::GetRegexFilter(7), regexFilterDesc, SETTING_REGEX_FILTERING_8));
  257. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("8 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(7), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_8));
  258. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("9 Regex"), CGetSetOptions::GetRegexFilter(8), regexFilterDesc, SETTING_REGEX_FILTERING_9));
  259. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("9 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(8), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_9));
  260. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("10 Regex"), CGetSetOptions::GetRegexFilter(9), regexFilterDesc, SETTING_REGEX_FILTERING_10));
  261. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("10 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(9), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_10));
  262. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("11 Regex"), CGetSetOptions::GetRegexFilter(10), regexFilterDesc, SETTING_REGEX_FILTERING_11));
  263. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("11 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(10), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_11));
  264. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("12 Regex"), CGetSetOptions::GetRegexFilter(11), regexFilterDesc, SETTING_REGEX_FILTERING_12));
  265. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("12 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(11), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_12));
  266. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("13 Regex"), CGetSetOptions::GetRegexFilter(12), regexFilterDesc, SETTING_REGEX_FILTERING_13));
  267. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("13 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(12), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_13));
  268. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("14 Regex"), CGetSetOptions::GetRegexFilter(13), regexFilterDesc, SETTING_REGEX_FILTERING_14));
  269. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("14 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(13), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_14));
  270. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("15 Regex"), CGetSetOptions::GetRegexFilter(14), regexFilterDesc, SETTING_REGEX_FILTERING_15));
  271. regexFilterGroup->AddSubItem(new CMFCPropertyGridProperty(_T("15 Process Name"), CGetSetOptions::GetRegexFilterByProcessName(14), processFilterDesc, SETTING_REGEX_FILTERING_BY_PROCESS_NAME_14));
  272. regexFilterGroup->Expand(FALSE);
  273. return TRUE;
  274. }
  275. void CAdvGeneral::AddTrueFalse(CMFCPropertyGridProperty * pGroupTest, CString desc, BOOL value, int settingId)
  276. {
  277. CString stringValue = _T("False");
  278. if(value)
  279. {
  280. stringValue = _T("True");
  281. }
  282. CMFCPropertyGridProperty *pCombo = new CMFCPropertyGridProperty(desc, stringValue, _T(""), settingId);
  283. pCombo->AddOption(_T("True"));
  284. pCombo->AddOption(_T("False"));
  285. pCombo->AllowEdit(FALSE);
  286. pGroupTest->AddSubItem(pCombo);
  287. }
  288. void CAdvGeneral::OnBnClickedOk()
  289. {
  290. int topLevelCount = m_propertyGrid.GetPropertyCount();
  291. for (int topLevel = 0; topLevel < topLevelCount; topLevel++)
  292. {
  293. int count = m_propertyGrid.GetProperty(topLevel)->GetSubItemsCount();
  294. for (int row = 0; row < count; row++)
  295. {
  296. CMFCPropertyGridProperty* prop = m_propertyGrid.GetProperty(topLevel)->GetSubItem(row);
  297. COleVariant i = prop->GetValue();
  298. LPVARIANT pNewValue = (LPVARIANT)i;
  299. COleVariant iOrig = prop->GetOriginalValue();
  300. LPVARIANT pOrigValue = (LPVARIANT)iOrig;
  301. switch ((int)prop->GetData())
  302. {
  303. case SETTING_DESC_SIZE:
  304. if (pNewValue->lVal != pOrigValue->lVal)
  305. {
  306. CGetSetOptions::SetDescTextSize(pNewValue->lVal);
  307. }
  308. break;
  309. case SETTING_SELECTED_INDEX:
  310. if (pNewValue->lVal != pOrigValue->lVal)
  311. {
  312. CGetSetOptions::SetSelectedIndex(max((pNewValue->lVal-1), 0));
  313. }
  314. break;
  315. case SETTING_CLIPBOARD_SAVE_DELAY:
  316. if (pNewValue->lVal != pOrigValue->lVal)
  317. {
  318. CGetSetOptions::SetProcessDrawClipboardDelay(max(pNewValue->lVal, 0));
  319. }
  320. break;
  321. case SETTING_SHOW_TASKBAR_ICON:
  322. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  323. {
  324. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  325. CGetSetOptions::SetShowIconInSysTray(val);
  326. }
  327. break;
  328. case SETTING_SAVE_MULTI_PASTE:
  329. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  330. {
  331. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  332. CGetSetOptions::SetSaveMultiPaste(val);
  333. }
  334. break;
  335. case SETTING_HIDE_ON_HOTKEY_IF_VISIBLE:
  336. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  337. {
  338. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  339. CGetSetOptions::SetHideDittoOnHotKeyIfAlreadyShown(val);
  340. }
  341. break;
  342. case SETTING_PASTE_IN_ACTIVE_WINDOW:
  343. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  344. {
  345. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  346. CGetSetOptions::SetSendPasteAfterSelection(val);
  347. }
  348. break;
  349. case SETTING_MAX_CLIP_SIZE:
  350. if (pNewValue->lVal != pOrigValue->lVal)
  351. {
  352. CGetSetOptions::SetMaxClipSizeInBytes(pNewValue->lVal);
  353. }
  354. break;
  355. case SETTING_CLIP_SEPARATOR:
  356. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  357. {
  358. CGetSetOptions::SetMultiPasteSeparator(pNewValue->bstrVal);
  359. }
  360. break;
  361. case SETTING_ENSURE_CONNECTED:
  362. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  363. {
  364. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  365. CGetSetOptions::SetEnsureConnectToClipboard(val);
  366. }
  367. break;
  368. case SETTING_COPY_PLAY_SOUND:
  369. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  370. {
  371. CGetSetOptions::SetPlaySoundOnCopy(pNewValue->bstrVal);
  372. }
  373. break;
  374. case SETTING_TEXT_FIRST_TEN:
  375. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  376. {
  377. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  378. CGetSetOptions::SetShowTextForFirstTenHotKeys(val);
  379. }
  380. break;
  381. case SETTING_SHOW_LEADING_WHITESPACE:
  382. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  383. {
  384. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  385. CGetSetOptions::SetDescShowLeadingWhiteSpace(val);
  386. }
  387. break;
  388. case SETTING_LINES_PER_ROW:
  389. if (pNewValue->lVal != pOrigValue->lVal)
  390. {
  391. CGetSetOptions::SetLinesPerRow(pNewValue->lVal);
  392. }
  393. break;
  394. case SETTING_ENABLE_TRANSPARENCY:
  395. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  396. {
  397. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  398. CGetSetOptions::SetEnableTransparency(val);
  399. }
  400. break;
  401. case SETTING_TRANSPARENCY:
  402. if (pNewValue->lVal != pOrigValue->lVal)
  403. {
  404. int value = 100;
  405. if (pNewValue->lVal <= 100 && pNewValue->lVal > 0)
  406. {
  407. value = pNewValue->lVal;
  408. }
  409. CGetSetOptions::SetTransparencyPercent(value);
  410. }
  411. break;
  412. case SETTING_DRAW_THUMBNAILS:
  413. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  414. {
  415. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  416. CGetSetOptions::SetDrawThumbnail(val);
  417. }
  418. break;
  419. case SETTING_FAST_THUMBNAIL_MODE:
  420. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  421. {
  422. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  423. CGetSetOptions::SetFastThumbnailMode(val);
  424. }
  425. break;
  426. case SETTING_DRAW_RTF:
  427. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  428. {
  429. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  430. CGetSetOptions::SetDrawRTF(val);
  431. }
  432. break;
  433. case SETTING_FIND_AS_TYPE:
  434. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  435. {
  436. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  437. CGetSetOptions::SetFindAsYouType(val);
  438. }
  439. break;
  440. case SETTING_ENSURE_WINDOW_IS_VISIBLE:
  441. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  442. {
  443. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  444. CGetSetOptions::SetEnsureEntireWindowCanBeSeen(val);
  445. }
  446. break;
  447. case SETTING_SHOW_GROUP_CLIPS_IN_LIST:
  448. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  449. {
  450. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  451. CGetSetOptions::SetShowAllClipsInMainList(val);
  452. }
  453. break;
  454. case SETTING_PROMPT_ON_DELETE:
  455. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  456. {
  457. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  458. CGetSetOptions::SetPromptWhenDeletingClips(val);
  459. }
  460. break;
  461. case SETTING_ALWAYS_SHOW_SCROLL_BAR:
  462. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  463. {
  464. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  465. CGetSetOptions::SetShowScrollBar(val);
  466. }
  467. break;
  468. case SETTING_PASTE_AS_ADMIN:
  469. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  470. {
  471. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  472. CGetSetOptions::SetPasteAsAdmin(val);
  473. }
  474. break;
  475. case SETTTING_SHOW_IN_TASKBAR:
  476. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  477. {
  478. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  479. CGetSetOptions::SetShowInTaskBar(val);
  480. }
  481. break;
  482. case SETTING_SHOW_CLIP_PASTED:
  483. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  484. {
  485. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  486. CGetSetOptions::SetShowIfClipWasPasted(val);
  487. }
  488. break;
  489. case SETTING_SHOW_MSG_WHEN_RECEIVING_MANUAL_SENT_CLIP:
  490. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  491. {
  492. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  493. CGetSetOptions::SetShowMsgWhenReceivingManualSentClip(val);
  494. }
  495. break;
  496. case SETTING_DIFF_APP:
  497. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  498. {
  499. CGetSetOptions::SetDiffApp(pNewValue->bstrVal);
  500. }
  501. break;
  502. case SETTING_UPDATE_ORDER_ON_PASTE:
  503. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  504. {
  505. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  506. CGetSetOptions::SetUpdateTimeOnPaste(val);
  507. }
  508. break;
  509. case SETTING_UPDATE_ORDER_ON_CTRL_C:
  510. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  511. {
  512. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  513. CGetSetOptions::SetUpdateClipOrderOnCtrlC(val);
  514. }
  515. break;
  516. case SETTING_MULTIPASTE_REVERSE_ORDER:
  517. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  518. {
  519. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  520. CGetSetOptions::SetMultiPasteReverse(val);
  521. }
  522. break;
  523. case SETTING_ALLOW_DUPLICATES:
  524. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  525. {
  526. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  527. CGetSetOptions::SetAllowDuplicates(val);
  528. }
  529. break;
  530. case SETTING_ALOW_BACK_TO_BACK_DUPLICATES:
  531. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  532. {
  533. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  534. CGetSetOptions::SetAllowBackToBackDuplicates(val);
  535. }
  536. break;
  537. case SETTING_REGEX_FILTERING_1:
  538. case SETTING_REGEX_FILTERING_2:
  539. case SETTING_REGEX_FILTERING_3:
  540. case SETTING_REGEX_FILTERING_4:
  541. case SETTING_REGEX_FILTERING_5:
  542. case SETTING_REGEX_FILTERING_6:
  543. case SETTING_REGEX_FILTERING_7:
  544. case SETTING_REGEX_FILTERING_8:
  545. case SETTING_REGEX_FILTERING_9:
  546. case SETTING_REGEX_FILTERING_10:
  547. case SETTING_REGEX_FILTERING_11:
  548. case SETTING_REGEX_FILTERING_12:
  549. case SETTING_REGEX_FILTERING_13:
  550. case SETTING_REGEX_FILTERING_14:
  551. case SETTING_REGEX_FILTERING_15:
  552. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  553. {
  554. CGetSetOptions::SetRegexFilter(pNewValue->bstrVal, (((int)prop->GetData()) - SETTING_REGEX_FILTERING_1));
  555. }
  556. break;
  557. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_1:
  558. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_2:
  559. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_3:
  560. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_4:
  561. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_5:
  562. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_6:
  563. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_7:
  564. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_8:
  565. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_9:
  566. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_10:
  567. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_11:
  568. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_12:
  569. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_13:
  570. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_14:
  571. case SETTING_REGEX_FILTERING_BY_PROCESS_NAME_15:
  572. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  573. {
  574. CGetSetOptions::SetRegexFilterByProcessName(pNewValue->bstrVal, (((int)prop->GetData()) - SETTING_REGEX_FILTERING_BY_PROCESS_NAME_1));
  575. }
  576. break;
  577. case SETTING_SHOW_STARTUP_MESSAGE:
  578. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  579. {
  580. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  581. CGetSetOptions::SetShowStartupMessage(val);
  582. }
  583. break;
  584. case SETTING_TOOLTIP_TIMEOUT:
  585. if (pNewValue->lVal != pOrigValue->lVal)
  586. {
  587. CGetSetOptions::SetToolTipTimeout(pNewValue->lVal);
  588. }
  589. break;
  590. case SETTING_TOOLTIP_LINES:
  591. if (pNewValue->lVal != pOrigValue->lVal)
  592. {
  593. CGetSetOptions::SetMaxToolTipLines(pNewValue->lVal);
  594. }
  595. break;
  596. case SETTING_TOOLTIP_CHARACTERS:
  597. if (pNewValue->lVal != pOrigValue->lVal)
  598. {
  599. CGetSetOptions::SetMaxToolTipCharacters(pNewValue->lVal);
  600. }
  601. break;
  602. case SETTING_DEFAULT_PASTE_STRING:
  603. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  604. {
  605. CGetSetOptions::SetDefaultPasteString(pNewValue->bstrVal);
  606. }
  607. break;
  608. case SETTING_DEFAULT_COPY_STRING:
  609. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  610. {
  611. CGetSetOptions::SetDefaultCopyString(pNewValue->bstrVal);
  612. }
  613. break;
  614. case SETTING_DEFAULT_CUT_STRING:
  615. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  616. {
  617. CGetSetOptions::SetDefaultCutString(pNewValue->bstrVal);
  618. }
  619. break;
  620. case SETTING_SLUGIFY_SEPARATOR:
  621. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  622. {
  623. CGetSetOptions::SetSlugifySeparator(pNewValue->bstrVal);
  624. }
  625. break;
  626. case SETTING_REVERT_TO_TOP_LEVEL_GROUP:
  627. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  628. {
  629. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  630. CGetSetOptions::SetRevertToTopLevelGroup(val);
  631. }
  632. break;
  633. case SETTING_ACTIVATE_WINDOW_DELAY:
  634. if (pNewValue->lVal != pOrigValue->lVal)
  635. {
  636. CGetSetOptions::SetSendKeysDelay(pNewValue->lVal);
  637. }
  638. break;
  639. case SETTING_SEND_KEYS_DELAY:
  640. if (pNewValue->lVal != pOrigValue->lVal)
  641. {
  642. CGetSetOptions::SetRealSendKeysDelay(pNewValue->lVal);
  643. }
  644. break;
  645. case SETTING_CLIPBOARD_RESTORE_AFTER_COPY_BUFFER_DELAY:
  646. if (pNewValue->lVal != pOrigValue->lVal)
  647. {
  648. CGetSetOptions::SetDittoRestoreClipboardDelay(pNewValue->lVal);
  649. }
  650. break;
  651. case SETTING_DOUBLE_KEYSTROKE_TIMEOUT:
  652. if (pNewValue->lVal != pOrigValue->lVal)
  653. {
  654. CGetSetOptions::SetDoubleKeyStrokeTimeout(pNewValue->lVal);
  655. }
  656. break;
  657. case SETTING_FIRST_TEN_HOTKEYS_START:
  658. if (pNewValue->lVal != pOrigValue->lVal)
  659. {
  660. CGetSetOptions::SetFirstTenHotKeysStart(pNewValue->lVal);
  661. }
  662. break;
  663. case SETTING_FIRST_TEN_HOTKEYS_FONT_SIZE:
  664. if (pNewValue->lVal != pOrigValue->lVal)
  665. {
  666. CGetSetOptions::SetFirstTenHotKeysFontSize(pNewValue->lVal);
  667. }
  668. break;
  669. case SETTING_OPEN_TO_GROUP_AS_ACTIVE_EXE:
  670. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  671. {
  672. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  673. CGetSetOptions::SetOpenToGroupByActiveExe(val);
  674. }
  675. break;
  676. case SETTING_ADD_CF_HDROP_ON_DRAG:
  677. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  678. {
  679. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  680. CGetSetOptions::SetAddCFHDROP_OnDrag(val);
  681. }
  682. break;
  683. case SETTING_COPY_SAVE_DELAY:
  684. if (pNewValue->lVal != pOrigValue->lVal)
  685. {
  686. CGetSetOptions::SetCopyAndSveDelay(pNewValue->lVal);
  687. }
  688. break;
  689. case SETTING_EDITOR_FONT_SIZE:
  690. if (pNewValue->lVal != pOrigValue->lVal)
  691. {
  692. CGetSetOptions::SetEditorDefaultFontSize(pNewValue->lVal);
  693. }
  694. break;
  695. case SETTING_MOVE_SELECTION_ON_OPEN_HOTKEY:
  696. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  697. {
  698. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  699. CGetSetOptions::SetMoveSelectionOnOpenHotkey(val);
  700. }
  701. break;
  702. case SETTING_MAINTAIN_SEARCH_VIEW:
  703. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  704. {
  705. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  706. CGetSetOptions::SetMaintainSearchView(val);
  707. }
  708. break;
  709. case SETTING_SEND_RECV_PORT:
  710. if (pNewValue->lVal != pOrigValue->lVal)
  711. {
  712. CGetSetOptions::SetPort(pNewValue->lVal);
  713. }
  714. break;
  715. case SETTING_DEBUG_TO_FILE:
  716. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  717. {
  718. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  719. CGetSetOptions::SetEnableDebugLogging(val);
  720. }
  721. break;
  722. case SETTING_DEBUG_TO_OUTPUT_STRING:
  723. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  724. {
  725. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  726. CGetSetOptions::SetEnableOutputDebugStringLogging(val);
  727. }
  728. break;
  729. case SETTING_NETWORK_BIND_IP_ADDRESS:
  730. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  731. {
  732. CGetSetOptions::SetNetworkBindIPAddress(pNewValue->bstrVal);
  733. }
  734. break;
  735. case SETTING_DISABLE_FRIENDS:
  736. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  737. {
  738. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  739. CGetSetOptions::SetAllowFriends(!val);
  740. }
  741. break;
  742. case SETTING_IGNORE_FALSE_COPIES_DELAY:
  743. if (pNewValue->lVal != pOrigValue->lVal)
  744. {
  745. CGetSetOptions::SetSaveClipDelay(pNewValue->lVal);
  746. }
  747. break;
  748. case SETTING_REFRESH_VIEW_AFTER_PASTE:
  749. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  750. {
  751. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  752. CGetSetOptions::SetRefreshViewAfterPasting(val);
  753. }
  754. break;
  755. case SETTING_SUPPORT_ALL_TYPES:
  756. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  757. {
  758. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  759. CGetSetOptions::SetSupportAllTypes(val);
  760. }
  761. break;
  762. case SETTING_IGNORE_ANNOYING_CF_DIB:
  763. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  764. {
  765. CGetSetOptions::SetIgnoreAnnoyingCFDIB(pNewValue->bstrVal);
  766. }
  767. break;
  768. case SETTING_REGEX_CASE_INSENSITIVE:
  769. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  770. {
  771. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  772. CGetSetOptions::SetRegexCaseInsensitive(val);
  773. }
  774. break;
  775. case SETTING_DRAW_COPIED_COLOR_CODE:
  776. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  777. {
  778. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  779. CGetSetOptions::SetDrawCopiedColorCode(val);
  780. }
  781. break;
  782. case SETTING_CENTER_WINDOW_BELOW_CURSOR_CARET:
  783. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  784. {
  785. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  786. CGetSetOptions::SetCenterWindowBelowCursorOrCaret(val);
  787. }
  788. break;
  789. case SETTING_TEXT_EDITOR_PATH:
  790. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  791. {
  792. CGetSetOptions::SetTextEditorPath(pNewValue->bstrVal);
  793. }
  794. break;
  795. case SETTING_RTF_EDITOR_PATH:
  796. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  797. {
  798. CGetSetOptions::SetRTFEditorPath(pNewValue->bstrVal);
  799. }
  800. break;
  801. case SETTING_UPDATE_DESC_ON_CLIP_EDIT:
  802. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  803. {
  804. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  805. CGetSetOptions::SetUpdateDescWhenSavingClip(val);
  806. }
  807. break;
  808. case SETTING_QR_CODE_URL:
  809. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  810. {
  811. CGetSetOptions::SetQRCodeUrl(pNewValue->bstrVal);
  812. }
  813. break;
  814. case SETTING_APPEND_NAME_IP:
  815. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  816. {
  817. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  818. CGetSetOptions::SetAppendRemoveComputerNameAndIPToDescription(val);
  819. }
  820. break;
  821. case SETTING_USE_UTF8_FOR_DIFF:
  822. if (wcscmp(pNewValue->bstrVal, pOrigValue->bstrVal) != 0)
  823. {
  824. BOOL val = wcscmp(pNewValue->bstrVal, L"True") == 0;
  825. CGetSetOptions::SetPreferUtf8ForCompare(val);
  826. }
  827. break;
  828. }
  829. }
  830. }
  831. CDialogEx::OnOK();
  832. }
  833. void CAdvGeneral::OnSize(UINT nType, int cx, int cy)
  834. {
  835. CDialogEx::OnSize(nType, cx, cy);
  836. if (((GetKeyState(VK_LBUTTON) & 0x100) != 0) &&
  837. m_mouseDownOnCaption == false)
  838. {
  839. m_Resize.MoveControls(CSize(cx, cy));
  840. }
  841. else
  842. {
  843. m_Resize.SetParent(m_hWnd);
  844. }
  845. }
  846. void CAdvGeneral::OnBnClickedBtCompactAndRepair()
  847. {
  848. auto msg = theApp.m_Language.GetString("CompactRepairWarning", "Warning this can take quite a long time and require up to double the hard drive space as your current database size, Continue?");
  849. int ret = MessageBox(msg, _T("Ditto"), MB_YESNO);
  850. if (ret == IDYES)
  851. {
  852. CWaitCursor wait;
  853. try
  854. {
  855. try
  856. {
  857. for (int i = 0; i < 100; i++)
  858. {
  859. int toDeleteCount = theApp.m_db.execScalar(_T("SELECT COUNT(clipID) FROM MainDeletes"));
  860. if (toDeleteCount <= 0)
  861. break;
  862. RemoveOldEntries(false);
  863. }
  864. }
  865. CATCH_SQLITE_EXCEPTION
  866. theApp.m_db.execDML(_T("PRAGMA auto_vacuum = 1"));
  867. theApp.m_db.execQuery(_T("VACUUM"));
  868. }
  869. CATCH_SQLITE_EXCEPTION
  870. }
  871. }
  872. void CAdvGeneral::OnBnClickedButtonCopyScripts()
  873. {
  874. CDimWnd dim(this);
  875. CScriptEditor e(this);
  876. e.m_title = _T("Copy Scripts");
  877. e.m_xml.Load(CGetSetOptions::GetCopyScriptsXml());
  878. if (e.DoModal() == IDOK)
  879. {
  880. CGetSetOptions::SetCopyScriptsXml(e.m_xml.Save());
  881. }
  882. }
  883. void CAdvGeneral::OnBnClickedButtonPasteScripts2()
  884. {
  885. CDimWnd dim(this);
  886. CScriptEditor e(this);
  887. e.m_title = _T("Paste Scripts");
  888. e.m_xml.Load(CGetSetOptions::GetPasteScriptsXml());
  889. if (e.DoModal() == IDOK)
  890. {
  891. CGetSetOptions::SetPasteScriptsXml(e.m_xml.Save());
  892. }
  893. }
  894. void CAdvGeneral::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
  895. {
  896. lpMMI->ptMinTrackSize.x = 450;
  897. lpMMI->ptMinTrackSize.y = 450;
  898. CDialogEx::OnGetMinMaxInfo(lpMMI);
  899. }
  900. void CAdvGeneral::OnNcLButtonDown(UINT nHitTest, CPoint point)
  901. {
  902. m_mouseDownOnCaption = false;
  903. if (nHitTest == HTCAPTION)
  904. {
  905. m_mouseDownOnCaption = true;
  906. }
  907. CDialog::OnNcLButtonDown(nHitTest, point);
  908. }