QPasteWnd.cpp 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984
  1. // QPasteWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CP_Main.h"
  5. #include "QPasteWnd.h"
  6. #include "ProcessPaste.h"
  7. #include "CopyProperties.h"
  8. #include "GroupName.h"
  9. #include ".\qpastewnd.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. #define QPASTE_TITLE "Ditto"
  16. #define ID_LIST_HEADER 0x201
  17. #define ID_EDIT_SEARCH 0x202
  18. #define ID_CANCEL 0x203
  19. #define ID_GROUP_TEXT 0x204
  20. #define ID_SHOW_GROUPS_BOTTOM 0x205
  21. #define ID_SHOW_GROUPS_TOP 0x206
  22. #define ID_BACK_BUTTON 0x207
  23. #define QPASTE_WIDTH 200
  24. #define QPASTE_HEIGHT 200
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CQPasteWnd
  27. CQPasteWnd::CQPasteWnd()
  28. {
  29. m_Title = QPASTE_TITLE;
  30. m_bHideWnd = true;
  31. m_strSQLSearch = "";
  32. m_bAllowRepaintImmediately = true;
  33. }
  34. CQPasteWnd::~CQPasteWnd()
  35. {
  36. }
  37. BEGIN_MESSAGE_MAP(CQPasteWnd, CWndEx)
  38. //{{AFX_MSG_MAP(CQPasteWnd)
  39. ON_WM_CREATE()
  40. ON_WM_SIZE()
  41. ON_WM_SETFOCUS()
  42. ON_WM_ACTIVATE()
  43. ON_COMMAND(ID_MENU_LINESPERROW_1, OnMenuLinesperrow1)
  44. ON_COMMAND(ID_MENU_LINESPERROW_2, OnMenuLinesperrow2)
  45. ON_COMMAND(ID_MENU_LINESPERROW_3, OnMenuLinesperrow3)
  46. ON_COMMAND(ID_MENU_LINESPERROW_4, OnMenuLinesperrow4)
  47. ON_COMMAND(ID_MENU_LINESPERROW_5, OnMenuLinesperrow5)
  48. ON_COMMAND(ID_MENU_TRANSPARENCY_10, OnMenuTransparency10)
  49. ON_COMMAND(ID_MENU_TRANSPARENCY_15, OnMenuTransparency15)
  50. ON_COMMAND(ID_MENU_TRANSPARENCY_20, OnMenuTransparency20)
  51. ON_COMMAND(ID_MENU_TRANSPARENCY_25, OnMenuTransparency25)
  52. ON_COMMAND(ID_MENU_TRANSPARENCY_30, OnMenuTransparency30)
  53. ON_COMMAND(ID_MENU_TRANSPARENCY_40, OnMenuTransparency40)
  54. ON_COMMAND(ID_MENU_TRANSPARENCY_5, OnMenuTransparency5)
  55. ON_COMMAND(ID_MENU_TRANSPARENCY_NONE, OnMenuTransparencyNone)
  56. ON_NOTIFY(NM_RCLICK, ID_LIST_HEADER, OnRclickQuickPaste)
  57. ON_COMMAND(ID_MENU_DELETE, OnMenuDelete)
  58. ON_COMMAND(ID_MENU_POSITIONING_ATCARET, OnMenuPositioningAtcaret)
  59. ON_COMMAND(ID_MENU_POSITIONING_ATCURSOR, OnMenuPositioningAtcursor)
  60. ON_COMMAND(ID_MENU_POSITIONING_ATPREVIOUSPOSITION, OnMenuPositioningAtpreviousposition)
  61. ON_COMMAND(ID_MENU_OPTIONS, OnMenuOptions)
  62. ON_BN_CLICKED(ID_CANCEL, OnCancelFilter)
  63. ON_COMMAND(ID_MENU_EXITPROGRAM, OnMenuExitprogram)
  64. ON_COMMAND(ID_MENU_RECONNECTTOCLIPBOARDCHAIN, OnMenuReconnecttoclipboardchain)
  65. ON_COMMAND(ID_MENU_PROPERTIES, OnMenuProperties)
  66. ON_WM_CLOSE()
  67. ON_NOTIFY(LVN_BEGINDRAG, ID_LIST_HEADER, OnBegindrag)
  68. ON_WM_SYSKEYDOWN()
  69. ON_NOTIFY(LVN_GETDISPINFO, ID_LIST_HEADER, GetDispInfo)
  70. ON_NOTIFY(LVN_ODFINDITEM, ID_LIST_HEADER, OnFindItem)
  71. ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, OnMenuFirsttenhotkeysUsectrlnum)
  72. ON_COMMAND(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, OnMenuFirsttenhotkeysShowhotkeytext)
  73. ON_COMMAND(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, OnMenuQuickoptionsAllwaysshowdescription)
  74. ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop)
  75. ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow)
  76. ON_COMMAND(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription)
  77. ON_COMMAND(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, OnMenuQuickoptionsPromptfornewgroupnames)
  78. ON_BN_CLICKED(ID_SHOW_GROUPS_BOTTOM, OnShowGroupsBottom)
  79. ON_BN_CLICKED(ID_SHOW_GROUPS_TOP, OnShowGroupsTop)
  80. ON_COMMAND(ID_MENU_VIEWGROUPS, OnMenuViewgroups)
  81. ON_COMMAND(ID_MENU_QUICKPROPERTIES_SETTONEVERAUTODELETE, OnMenuQuickpropertiesSettoneverautodelete)
  82. ON_COMMAND(ID_MENU_QUICKPROPERTIES_AUTODELETE, OnMenuQuickpropertiesAutodelete)
  83. ON_COMMAND(ID_MENU_QUICKPROPERTIES_REMOVEHOTKEY, OnMenuQuickpropertiesRemovehotkey)
  84. ON_COMMAND(ID_MENU_SENTTO_FRIEND_EIGHT, OnMenuSenttoFriendEight)
  85. ON_COMMAND(ID_MENU_SENTTO_FRIEND_ELEVEN, OnMenuSenttoFriendEleven)
  86. ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIFTEEN, OnMenuSenttoFriendFifteen)
  87. ON_COMMAND(ID_MENU_SENTTO_FRIEND_FIVE, OnMenuSenttoFriendFive)
  88. ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORE, OnMenuSenttoFriendFore)
  89. ON_COMMAND(ID_MENU_SENTTO_FRIEND_FORETEEN, OnMenuSenttoFriendForeteen)
  90. ON_COMMAND(ID_MENU_SENTTO_FRIEND_NINE, OnMenuSenttoFriendNine)
  91. ON_COMMAND(ID_MENU_SENTTO_FRIEND_SEVEN, OnMenuSenttoFriendSeven)
  92. ON_COMMAND(ID_MENU_SENTTO_FRIEND_SIX, OnMenuSenttoFriendSix)
  93. ON_COMMAND(ID_MENU_SENTTO_FRIEND_TEN, OnMenuSenttoFriendTen)
  94. ON_COMMAND(ID_MENU_SENTTO_FRIEND_THIRTEEN, OnMenuSenttoFriendThirteen)
  95. ON_COMMAND(ID_MENU_SENTTO_FRIEND_THREE, OnMenuSenttoFriendThree)
  96. ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWELVE, OnMenuSenttoFriendTwelve)
  97. ON_COMMAND(ID_MENU_SENTTO_FRIEND_TWO, OnMenuSenttoFriendTwo)
  98. ON_COMMAND(ID_MENU_SENTTO_FRIENDONE, OnMenuSenttoFriendone)
  99. ON_COMMAND(ID_MENU_SENTTO_PROMPTFORIP, OnMenuSenttoPromptforip)
  100. //}}AFX_MSG_MAP
  101. ON_MESSAGE(NM_SELECT, OnListSelect)
  102. ON_MESSAGE(NM_END, OnListEnd)
  103. ON_MESSAGE(CB_SEARCH, OnSearch)
  104. ON_MESSAGE(NM_DELETE, OnDelete)
  105. ON_MESSAGE(NM_PROPERTIES, OnProperties)
  106. ON_NOTIFY(NM_GETTOOLTIPTEXT, ID_LIST_HEADER, OnGetToolTipText)
  107. ON_MESSAGE(NM_SELECT_DB_ID, OnListSelect_DB_ID)
  108. ON_MESSAGE(NM_SELECT_INDEX, OnListSelect_Index)
  109. ON_MESSAGE(WM_REFRESH_VIEW, OnRefreshView)
  110. ON_WM_NCLBUTTONDBLCLK()
  111. ON_WM_WINDOWPOSCHANGING()
  112. ON_COMMAND(ID_VIEWCAPTIONBARON_RIGHT, OnViewcaptionbaronRight)
  113. ON_COMMAND(ID_VIEWCAPTIONBARON_BOTTOM, OnViewcaptionbaronBottom)
  114. ON_COMMAND(ID_VIEWCAPTIONBARON_LEFT, OnViewcaptionbaronLeft)
  115. ON_COMMAND(ID_VIEWCAPTIONBARON_TOP, OnViewcaptionbaronTop)
  116. ON_COMMAND(ID_MENU_AUTOHIDE, OnMenuAutohide)
  117. ON_COMMAND(ID_MENU_VIEWFULLDESCRIPTION, OnMenuViewfulldescription)
  118. ON_COMMAND(ID_MENU_ALLWAYSONTOP, OnMenuAllwaysontop)
  119. ON_COMMAND(ID_SORT_ASCENDING, OnSortAscending)
  120. ON_COMMAND(ID_SORT_DESCENDING, OnSortDescending)
  121. ON_COMMAND(ID_MENU_NEWGROUP, OnMenuNewGroup)
  122. ON_COMMAND(ID_MENU_NEWGROUPSELECTION, OnMenuNewGroupSelection)
  123. ON_MESSAGE(NM_GROUP_TREE_MESSAGE, OnGroupTreeMessage)
  124. ON_COMMAND(ID_BACK_BUTTON, OnBackButton)
  125. END_MESSAGE_MAP()
  126. /////////////////////////////////////////////////////////////////////////////
  127. // CQPasteWnd message handlers
  128. BOOL CQPasteWnd::Create(const POINT& ptStart, CWnd* pParentWnd)
  129. {
  130. // Get the previous size of the QPaste window
  131. CSize szWnd;
  132. CGetSetOptions::GetQuickPasteSize(szWnd);
  133. return CWndEx::Create(CRect(ptStart, szWnd), pParentWnd);
  134. }
  135. int CQPasteWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
  136. {
  137. if (CWndEx::OnCreate(lpCreateStruct) == -1)
  138. return -1;
  139. SetWindowText( QPASTE_TITLE );
  140. m_cbSearch.Create(CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | WS_CHILD | WS_VISIBLE | CBS_AUTOHSCROLL,
  141. CRect(0, 0, 0, 0), this, ID_EDIT_SEARCH);
  142. // Create the header control
  143. if (!m_lstHeader.Create(WS_TABSTOP|WS_CHILD|WS_VISIBLE|LVS_NOCOLUMNHEADER|LVS_REPORT|LVS_SHOWSELALWAYS|LVS_OWNERDATA,
  144. CRect(0, 0, 0, 0), this, ID_LIST_HEADER))
  145. {
  146. ASSERT(FALSE);
  147. return -1;
  148. }
  149. ((CWnd *)&m_GroupTree)->CreateEx(NULL, "SysTreeView32", NULL, WS_BORDER|WS_POPUP|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS, CRect(0, 0, 100, 100), this, 0);
  150. m_GroupTree.SetNotificationWndEx(m_hWnd);
  151. m_GroupTree.ShowWindow(SW_HIDE);
  152. m_ShowGroupsFolderBottom.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_BOTTOM);
  153. m_ShowGroupsFolderBottom.LoadBitmaps(IDB_CLOSED_FOLDER, IDB_CLOSED_FOLDER_PRESSED, IDB_CLOSED_FOLDER_FOCUSED);
  154. m_ShowGroupsFolderBottom.ShowWindow(SW_SHOW);
  155. m_ShowGroupsFolderTop.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_SHOW_GROUPS_TOP);
  156. m_ShowGroupsFolderTop.LoadBitmaps(IDB_OPEN_FOLDER, IDB_OPEN_FOLDER_PRESSED, IDB_OPEN_FOLDER_FOCUSED);
  157. m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
  158. m_BackButton.Create(NULL, WS_CHILD | BS_OWNERDRAW | WS_TABSTOP, CRect(0, 0, 0, 0), this, ID_BACK_BUTTON);
  159. m_BackButton.LoadBitmaps(IDB_BACK, IDB_BACK_PRESSED, IDB_BACK_FOCUSED);
  160. m_BackButton.ShowWindow(SW_SHOW);
  161. m_btCancel.Create("&C", WS_CHILD|BS_PUSHBUTTON|WS_TABSTOP/*|BS_FLAT*/, CRect(0, 0, 0, 0), this, ID_CANCEL);
  162. m_stGroup.Create("", WS_CHILD|WS_VISIBLE, CRect(0, 0, 0, 0), this, ID_GROUP_TEXT);
  163. //Set the z-order
  164. m_lstHeader.SetWindowPos(this, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
  165. m_cbSearch.SetWindowPos(&m_lstHeader, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
  166. m_btCancel.SetWindowPos(&m_cbSearch, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
  167. m_ShowGroupsFolderBottom.SetWindowPos(&m_cbSearch, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
  168. //LVS_EX_FLATSB
  169. m_lstHeader.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);
  170. // Create the columns
  171. if (m_lstHeader.InsertColumn(0, "", LVCFMT_LEFT, 2500, 0) != 0)
  172. {
  173. ASSERT(FALSE);
  174. return -1;
  175. }
  176. #ifdef AFTER_98
  177. m_Alpha.SetWindowHandle(m_hWnd);
  178. #endif
  179. m_TitleFont.CreateFont(14,0,-900,0,400,FALSE,FALSE,0,ANSI_CHARSET,
  180. OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
  181. DEFAULT_PITCH|FF_SWISS,"Arial");
  182. m_SearchFont.CreatePointFont(80, "MS Sans Serif");
  183. GroupFont.CreateFont(-11, 0, 0, 0, 400, 0, 1, 0, DEFAULT_CHARSET, 3, 2, 1, 34, "MS Sans Serif");
  184. m_cbSearch.SetFont(&m_SearchFont);
  185. m_btCancel.SetFont(&m_SearchFont);
  186. m_stGroup.SetFont(&GroupFont);
  187. return 0;
  188. }
  189. void CQPasteWnd::OnSize(UINT nType, int cx, int cy)
  190. {
  191. CWndEx::OnSize(nType, cx, cy);
  192. if(!IsWindow(m_lstHeader.m_hWnd))
  193. return;
  194. MoveControls();
  195. }
  196. void CQPasteWnd::MoveControls()
  197. {
  198. CRect crRect;
  199. GetClientRect(crRect);
  200. int cx = crRect.Width();
  201. int cy = crRect.Height();
  202. long lTopOfListBox = 0;
  203. if( theApp.m_GroupID > 0 )
  204. {
  205. m_stGroup.ShowWindow(SW_SHOW);
  206. m_ShowGroupsFolderTop.ShowWindow(SW_SHOW);
  207. m_BackButton.ShowWindow(SW_SHOW);
  208. m_BackButton.MoveWindow(0, 0, 18, 16);
  209. m_ShowGroupsFolderTop.MoveWindow(22, 0, 18, 16);
  210. m_stGroup.MoveWindow(44, 0, cx, 16);
  211. lTopOfListBox = 16;
  212. }
  213. else
  214. {
  215. m_BackButton.ShowWindow(SW_HIDE);
  216. m_stGroup.ShowWindow(SW_HIDE);
  217. m_ShowGroupsFolderTop.ShowWindow(SW_HIDE);
  218. }
  219. // Resize the list control
  220. m_lstHeader.MoveWindow(0, lTopOfListBox, cx, cy - 22 - lTopOfListBox);
  221. int nWidth = cx;
  222. if( m_strSQLSearch.IsEmpty() == FALSE )
  223. {
  224. m_btCancel.ShowWindow(SW_SHOW);
  225. m_btCancel.MoveWindow(cx - 20, cy - 20, 20, 20);
  226. nWidth -= 19;
  227. }
  228. else
  229. m_btCancel.ShowWindow(SW_HIDE);
  230. m_cbSearch.MoveWindow(18, cy - 22, nWidth-18, 100);
  231. m_ShowGroupsFolderBottom.MoveWindow(0, cy - 19, 18, 16);
  232. // Set the column widths
  233. //m_lstHeader.SetColumnWidth(0, cx);
  234. }
  235. void CQPasteWnd::OnSetFocus(CWnd* pOldWnd)
  236. {
  237. CWndEx::OnSetFocus(pOldWnd);
  238. // Set the focus to the list control
  239. if(::IsWindow(m_lstHeader.m_hWnd))
  240. m_lstHeader.SetFocus();
  241. }
  242. void CQPasteWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  243. {
  244. CWndEx::OnActivate(nState, pWndOther, bMinimized);
  245. if(m_bHideWnd == false)
  246. return;
  247. if (nState == WA_INACTIVE)
  248. {
  249. if(!g_Opt.m_bShowPersistent)
  250. {
  251. HideQPasteWindow();
  252. }
  253. //re register the global hot keys for the last ten
  254. if(theApp.m_bAppExiting == false)
  255. g_HotKeys.RegisterAll();
  256. }
  257. else if (nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
  258. {
  259. if(!theApp.m_bShowingQuickPaste)
  260. {
  261. ShowQPasteWindow();
  262. }
  263. //Unregister the global hot keys for the last ten copies
  264. g_HotKeys.UnregisterAll(false, true);
  265. }
  266. }
  267. BOOL CQPasteWnd::HideQPasteWindow()
  268. {
  269. if( !theApp.m_bShowingQuickPaste || m_cbSearch.GetShowingDropDown() )
  270. return FALSE;
  271. //Reset the flag
  272. theApp.m_bShowingQuickPaste = false;
  273. theApp.ReleaseFocus();
  274. // Profile optimization -- is it safe to comment this out???
  275. // if(m_Recset.IsOpen())
  276. // m_Recset.Close();
  277. m_lstHeader.DestroyAndCreateAccelerator(FALSE);
  278. // save the caret position
  279. int nCaretPos = m_lstHeader.GetCaret();
  280. if( nCaretPos >= 0 )
  281. theApp.m_FocusID = m_lstHeader.GetItemData( nCaretPos );
  282. //Save the size
  283. CRect rect;
  284. GetWindowRectEx(rect);
  285. CGetSetOptions::SetQuickPasteSize(rect.Size());
  286. CGetSetOptions::SetQuickPastePoint(rect.TopLeft());
  287. // Hide the window when the focus is lost
  288. ShowWindow(SW_HIDE);
  289. //Reset the selection in the search combo
  290. m_cbSearch.SetCurSel(-1);
  291. return TRUE;
  292. }
  293. BOOL CQPasteWnd::ShowQPasteWindow(BOOL bFillList)
  294. {
  295. //Set the flag so we can't open this up again
  296. theApp.m_bShowingQuickPaste = true;
  297. SetCaptionColorActive( !g_Opt.m_bShowPersistent );
  298. // use invalidation to avoid unnecessary repainting
  299. m_bAllowRepaintImmediately = false;
  300. UpdateStatus();
  301. m_lstHeader.DestroyAndCreateAccelerator(TRUE);
  302. m_bHideWnd = true;
  303. #ifdef AFTER_98
  304. //Set the transparency
  305. if(CGetSetOptions::GetEnableTransparency())
  306. {
  307. m_Alpha.SetTransparent(TRUE);
  308. float fPercent = CGetSetOptions::GetTransparencyPercent() / (float)100.0;
  309. m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
  310. }
  311. else
  312. {
  313. m_Alpha.SetTransparent(FALSE);
  314. }
  315. #endif
  316. m_lstHeader.SetNumberOfLinesPerRow(CGetSetOptions::GetLinesPerRow());
  317. m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
  318. if(bFillList)
  319. FillList(); // FillList calls MoveControls
  320. else
  321. MoveControls();
  322. // from now on, for interactive use, we can repaint immediately
  323. m_bAllowRepaintImmediately = true;
  324. // always on top... for persistent showing (g_Opt.m_bShowPersistent)
  325. // SHOWWINDOW was also integrated into this function rather than calling it separately
  326. ::SetWindowPos( m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW );
  327. return TRUE;
  328. }
  329. bool CQPasteWnd::Add(const CString &csHeader, const CString &csText, int nID)
  330. {
  331. int nNewIndex;
  332. // Insert the item in the list control
  333. if ((nNewIndex = m_lstHeader.InsertItem(m_lstHeader.GetItemCount(), csHeader)) == -1)
  334. return false;
  335. m_lstHeader.SetItemData(nNewIndex, nID);
  336. return true;
  337. }
  338. BOOL CQPasteWnd::OpenID( long lID )
  339. {
  340. if( theApp.EnterGroupID(lID) )
  341. return TRUE;
  342. // else, it is a clip, so paste it
  343. CProcessPaste paste;
  344. paste.GetClipIDs().Add( lID );
  345. paste.DoPaste();
  346. theApp.OnPasteCompleted();
  347. return TRUE;
  348. }
  349. BOOL CQPasteWnd::OpenSelection()
  350. {
  351. ARRAY IDs;
  352. m_lstHeader.GetSelectionItemData( IDs );
  353. int count = IDs.GetSize();
  354. if( count <= 0 )
  355. return FALSE;
  356. if( count == 1 )
  357. return OpenID( IDs[0] );
  358. // else count > 1
  359. CProcessPaste paste;
  360. paste.GetClipIDs().Copy( IDs );
  361. paste.DoPaste();
  362. theApp.OnPasteCompleted();
  363. return TRUE;
  364. }
  365. BOOL CQPasteWnd::OpenIndex( long nItem )
  366. {
  367. return OpenID( m_lstHeader.GetItemData(nItem) );
  368. }
  369. BOOL CQPasteWnd::NewGroup( bool bGroupSelection )
  370. {
  371. //Get the selected ids
  372. CClipIDs IDs;
  373. m_lstHeader.GetSelectionItemData( IDs );
  374. CGroupName Name;
  375. CString csName("");
  376. if(g_Opt.m_bPrompForNewGroupName)
  377. {
  378. m_bHideWnd = false;
  379. int nRet = Name.DoModal();
  380. m_bHideWnd = true;
  381. if(nRet == IDOK)
  382. csName = Name.m_csName;
  383. else
  384. return false;
  385. }
  386. long lID = NewGroupID(theApp.GetValidGroupID(), csName);
  387. if(lID <= 0)
  388. return FALSE;
  389. if(!bGroupSelection )
  390. {
  391. theApp.m_FocusID = lID; // focus on the new group
  392. FillList();
  393. return TRUE;
  394. }
  395. IDs.MoveTo( lID );
  396. theApp.EnterGroupID( lID );
  397. return TRUE;
  398. }
  399. BOOL CQPasteWnd::SetListID( long lID )
  400. {
  401. int index;
  402. if( !m_Recset.FindFirst( StrF("lID = %d",lID) ) )
  403. return FALSE;
  404. index = m_Recset.GetAbsolutePosition();
  405. m_lstHeader.SetListPos( index );
  406. return TRUE;
  407. }
  408. LRESULT CQPasteWnd::OnListSelect_DB_ID(WPARAM wParam, LPARAM lParam)
  409. {
  410. OpenID( wParam );
  411. return TRUE;
  412. }
  413. LRESULT CQPasteWnd::OnListSelect_Index(WPARAM wParam, LPARAM lParam)
  414. {
  415. if( (int) wParam >= m_lstHeader.GetItemCount() )
  416. return FALSE;
  417. OpenIndex( wParam );
  418. return TRUE;
  419. }
  420. LRESULT CQPasteWnd::OnListSelect(WPARAM wParam, LPARAM lParam)
  421. {
  422. int nCount = (int) wParam;
  423. long *pItems = (long*) lParam;
  424. OpenSelection();
  425. return TRUE;
  426. }
  427. LRESULT CQPasteWnd::OnListEnd(WPARAM wParam, LPARAM lParam)
  428. {
  429. HideQPasteWindow();
  430. return 0;
  431. }
  432. LRESULT CQPasteWnd::OnRefreshView(WPARAM wParam, LPARAM lParam)
  433. {
  434. MSG msg;
  435. // remove all additional refresh view messages from the queue
  436. while( ::PeekMessage( &msg, m_hWnd, WM_REFRESH_VIEW, WM_REFRESH_VIEW, PM_REMOVE ) )
  437. {
  438. }
  439. if( theApp.m_bShowingQuickPaste )
  440. {
  441. FillList();
  442. }
  443. return TRUE;
  444. }
  445. void CQPasteWnd::RefreshNc( bool bRepaintImmediately )
  446. {
  447. if( !theApp.m_bShowingQuickPaste )
  448. return;
  449. if( bRepaintImmediately && m_bAllowRepaintImmediately )
  450. OnNcPaint();
  451. else
  452. InvalidateNc();
  453. }
  454. void CQPasteWnd::UpdateStatus( bool bRepaintImmediately )
  455. {
  456. CString title = m_Title;
  457. CString prev;
  458. GetWindowText(prev);
  459. if(m_Recset.IsOpen())
  460. {
  461. CString cs;
  462. cs.Format(" - %d/%d", m_lstHeader.GetSelectedCount(), m_Recset.GetRecordCount());
  463. title += cs;
  464. }
  465. if( theApp.m_Status != "" )
  466. {
  467. title += " [ ";
  468. title += theApp.m_Status;
  469. title += " ] - ";
  470. }
  471. else
  472. title += " - ";
  473. if( theApp.m_IC_IDs.GetSize() > 0 )
  474. {
  475. if( theApp.m_IC_bCopy )
  476. title += "Copying";
  477. else
  478. title += "Moving";
  479. title += " - ";
  480. }
  481. if( ::IsWindow(theApp.m_hTargetWnd) )
  482. title += theApp.GetTargetName();
  483. else
  484. title += "NO TARGET!";
  485. if( title != prev )
  486. {
  487. SetWindowText( title );
  488. RefreshNc( bRepaintImmediately );
  489. }
  490. }
  491. BOOL CQPasteWnd::FillList(CString csSQLSearch/*=""*/)
  492. {
  493. CString strFilter;
  494. // History Group
  495. if( theApp.m_GroupID == 0 )
  496. {
  497. m_lstHeader.m_bStartTop = g_Opt.m_bHistoryStartTop;
  498. if( g_Opt.m_bHistoryStartTop )
  499. m_Recset.m_strSort = "bIsGroup DESC, lDate DESC";
  500. else
  501. m_Recset.m_strSort = "bIsGroup ASC, lDate ASC";
  502. strFilter = "((bIsGroup = TRUE AND lParentID = 0) OR bIsGroup = FALSE)";
  503. }
  504. else // it's some other group
  505. {
  506. m_lstHeader.m_bStartTop = true;
  507. if( g_Opt.m_bHistoryStartTop )
  508. m_Recset.m_strSort = "bIsGroup DESC, Left([mText],250) DESC";
  509. else
  510. m_Recset.m_strSort = "bIsGroup ASC, Left([mText],250) ASC";
  511. if( theApp.m_GroupID > 0 )
  512. strFilter.Format( "lParentID = %d", theApp.m_GroupID );
  513. else // All top-level groups
  514. strFilter = "bIsGroup = TRUE AND lParentID = 0";
  515. m_stGroup.SetWindowText(theApp.m_GroupText);
  516. }
  517. // maintain the previous position if theApp.m_FocusID == -1
  518. int nCaretPos = m_lstHeader.GetCaret();
  519. if( theApp.m_FocusID == -1 && nCaretPos >= 0 )
  520. theApp.m_FocusID = m_lstHeader.GetItemData( nCaretPos );
  521. m_lstHeader.DeleteAllItems();
  522. CRect crRect;
  523. GetClientRect(crRect);
  524. CString csSQL;
  525. if(csSQLSearch == "")
  526. {
  527. m_strSQLSearch = "";
  528. }
  529. else
  530. {
  531. //Replace all single ' with a double '
  532. csSQLSearch.Replace("'", "''");
  533. //Can't query using strings that have '|' in them
  534. //this should be removed later
  535. if(csSQLSearch.Find("|") >= 0)
  536. return FALSE;
  537. m_strSQLSearch.Format("mText LIKE \'*%s*\'", csSQLSearch);
  538. if( strFilter.IsEmpty() )
  539. strFilter = m_strSQLSearch;
  540. else
  541. strFilter += " AND " + m_strSQLSearch;
  542. }
  543. try
  544. {
  545. m_Recset.m_strFilter = strFilter;
  546. if(m_Recset.IsOpen())
  547. m_Recset.Requery();
  548. else
  549. m_Recset.Open("");
  550. if(!m_Recset.IsEOF())
  551. {
  552. m_Recset.MoveLast();
  553. m_lstHeader.SetItemCountEx(m_Recset.GetRecordCount());
  554. }
  555. else
  556. m_lstHeader.SetItemCountEx(0);
  557. }
  558. catch(CDaoException* e)
  559. {
  560. AfxMessageBox(e->m_pErrorInfo->m_strDescription);
  561. ASSERT(0);
  562. e->Delete();
  563. }
  564. // if the caret position can't be set to the focus ID requested
  565. if( theApp.m_FocusID <= 0 || !SetListID( theApp.m_FocusID ) )
  566. {
  567. // set the caret based upon which end we're starting from
  568. if( m_lstHeader.m_bStartTop )
  569. {
  570. m_lstHeader.SetListPos( 0 );
  571. }
  572. else
  573. {
  574. int idx = m_lstHeader.GetItemCount() - 1;
  575. // if there are elements
  576. if( idx >= 0 )
  577. m_lstHeader.SetListPos( idx );
  578. }
  579. }
  580. theApp.m_FocusID = -1; // maintain previous position from now on.
  581. theApp.SetStatus(NULL, true);
  582. MoveControls();
  583. RedrawWindow(0,0,RDW_INVALIDATE);
  584. return TRUE;
  585. }
  586. void CQPasteWnd::OnRclickQuickPaste(NMHDR* pNMHDR, LRESULT* pResult)
  587. {
  588. POINT pp;
  589. CMenu cmPopUp;
  590. CMenu *cmSubMenu = NULL;
  591. GetCursorPos(&pp);
  592. if(cmPopUp.LoadMenu(IDR_QUICK_PASTE) != 0)
  593. {
  594. cmSubMenu = cmPopUp.GetSubMenu(0);
  595. if(!cmSubMenu)
  596. return;
  597. SetMenuChecks(cmSubMenu);
  598. m_lstHeader.m_Popup.Hide();
  599. if(pNMHDR == NULL)
  600. {
  601. int nItem = m_lstHeader.GetCaret();
  602. CRect rc;
  603. m_lstHeader.GetItemRect(nItem, rc, LVIR_BOUNDS);
  604. ClientToScreen(rc);
  605. pp.x = rc.left;
  606. pp.y = rc.bottom;
  607. }
  608. cmSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON,
  609. pp.x, pp.y, this, NULL);
  610. }
  611. *pResult = 0;
  612. }
  613. void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
  614. {
  615. //Set the transparency Check
  616. if(!CGetSetOptions::GetEnableTransparency())
  617. {
  618. pMenu->CheckMenuItem(ID_MENU_TRANSPARENCY_NONE, MF_CHECKED);
  619. }
  620. else
  621. {
  622. int nTrans = CGetSetOptions::GetTransparencyPercent();
  623. int nCheckID = -1;
  624. switch(nTrans)
  625. {
  626. case 5:
  627. nCheckID = ID_MENU_TRANSPARENCY_5;
  628. break;
  629. case 10:
  630. nCheckID = ID_MENU_TRANSPARENCY_10;
  631. break;
  632. case 15:
  633. nCheckID = ID_MENU_TRANSPARENCY_15;
  634. break;
  635. case 20:
  636. nCheckID = ID_MENU_TRANSPARENCY_20;
  637. break;
  638. case 25:
  639. nCheckID = ID_MENU_TRANSPARENCY_25;
  640. break;
  641. case 30:
  642. nCheckID = ID_MENU_TRANSPARENCY_30;
  643. break;
  644. case 40:
  645. nCheckID = ID_MENU_TRANSPARENCY_40;
  646. break;
  647. }
  648. if(nCheckID >= 0)
  649. pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
  650. }
  651. //Set the lines per row check
  652. int nLinesPerRow = CGetSetOptions::GetLinesPerRow();
  653. int nCheckID = -1;
  654. switch(nLinesPerRow)
  655. {
  656. case 1:
  657. nCheckID = ID_MENU_LINESPERROW_1;
  658. break;
  659. case 2:
  660. nCheckID = ID_MENU_LINESPERROW_2;
  661. break;
  662. case 3:
  663. nCheckID = ID_MENU_LINESPERROW_3;
  664. break;
  665. case 4:
  666. nCheckID = ID_MENU_LINESPERROW_4;
  667. break;
  668. case 5:
  669. nCheckID = ID_MENU_LINESPERROW_5;
  670. break;
  671. }
  672. if(nCheckID >= 0)
  673. pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
  674. //Set the position check
  675. int nPosition = CGetSetOptions::GetQuickPastePosition();
  676. nCheckID = -1;
  677. switch(nPosition)
  678. {
  679. case POS_AT_CARET:
  680. nCheckID = ID_MENU_POSITIONING_ATCARET;
  681. break;
  682. case POS_AT_CURSOR:
  683. nCheckID = ID_MENU_POSITIONING_ATCURSOR;
  684. break;
  685. case POS_AT_PREVIOUS:
  686. nCheckID = ID_MENU_POSITIONING_ATPREVIOUSPOSITION;
  687. break;
  688. }
  689. if(nCheckID >= 0)
  690. pMenu->CheckMenuItem(nCheckID, MF_CHECKED);
  691. if(theApp.IsClipboardViewerConnected())
  692. pMenu->DeleteMenu(ID_MENU_RECONNECTTOCLIPBOARDCHAIN, MF_BYCOMMAND);
  693. if(CGetSetOptions::GetShowTextForFirstTenHotKeys())
  694. pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_SHOWHOTKEYTEXT, MF_CHECKED);
  695. if(CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys())
  696. pMenu->CheckMenuItem(ID_MENU_FIRSTTENHOTKEYS_USECTRLNUM, MF_CHECKED);
  697. if(g_Opt.m_bShowPersistent)
  698. pMenu->CheckMenuItem(ID_MENU_ALLWAYSONTOP, MF_CHECKED);
  699. if(CGetSetOptions::GetAutoHide())
  700. pMenu->CheckMenuItem(ID_MENU_AUTOHIDE, MF_CHECKED);
  701. if(g_Opt.m_bHistoryStartTop)
  702. pMenu->CheckMenuItem(ID_SORT_ASCENDING, MF_CHECKED);
  703. else
  704. pMenu->CheckMenuItem(ID_SORT_DESCENDING, MF_CHECKED);
  705. switch(CGetSetOptions::GetCaptionPos())
  706. {
  707. case 1:
  708. pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_RIGHT, MF_CHECKED);
  709. break;
  710. case 2:
  711. pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_BOTTOM, MF_CHECKED);
  712. break;
  713. case 3:
  714. pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_LEFT, MF_CHECKED);
  715. break;
  716. case 4:
  717. pMenu->CheckMenuItem(ID_VIEWCAPTIONBARON_TOP, MF_CHECKED);
  718. break;
  719. }
  720. if(CGetSetOptions::GetAllwaysShowDescription())
  721. {
  722. pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_ALLWAYSSHOWDESCRIPTION, MF_CHECKED);
  723. }
  724. switch(CGetSetOptions::GetDoubleClickingOnCaptionDoes())
  725. {
  726. case TOGGLES_ALLWAYS_ON_TOP:
  727. pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSONTOP, MF_CHECKED);
  728. break;
  729. case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
  730. pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_TOGGLESALWAYSSHOWDESCRIPTION, MF_CHECKED);
  731. break;
  732. case ROLLES_UP_WINDOW:
  733. pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_DOUBLECLICKINGONCAPTION_ROLLUPWINDOW, MF_CHECKED);
  734. break;
  735. }
  736. if(CGetSetOptions::m_bPrompForNewGroupName)
  737. {
  738. pMenu->CheckMenuItem(ID_MENU_QUICKOPTIONS_PROMPTFORNEWGROUPNAMES, MF_CHECKED);
  739. }
  740. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIENDONE, 0);
  741. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWO, 1);
  742. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THREE, 2);
  743. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORE, 3);
  744. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIVE, 4);
  745. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SIX, 5);
  746. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_SEVEN,6);
  747. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_EIGHT,7);
  748. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_NINE,8);
  749. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TEN,9);
  750. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_ELEVEN,10);
  751. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_TWELVE,11);
  752. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_THIRTEEN,12);
  753. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FORETEEN,13);
  754. SetSendToMenu(pMenu, ID_MENU_SENTTO_FRIEND_FIFTEEN,14);
  755. pMenu->DeleteMenu(ID_MENU_SENTTO_PROMPTFORIP, MF_BYCOMMAND);
  756. }
  757. void CQPasteWnd::SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos)
  758. {
  759. if(g_Opt.m_SendClients[nArrayPos].csIP.GetLength() > 0)
  760. {
  761. CString cs;
  762. cs.Format("(%s) - %s", g_Opt.m_SendClients[nArrayPos].csIP, g_Opt.m_SendClients[nArrayPos].csDescription);
  763. pMenu->ModifyMenu(nMenuID, MF_BYCOMMAND, nMenuID, cs);
  764. }
  765. else
  766. {
  767. pMenu->DeleteMenu(nMenuID, MF_BYCOMMAND);
  768. }
  769. }
  770. LRESULT CQPasteWnd::OnSearch(WPARAM wParam, LPARAM lParam)
  771. {
  772. CString csText;
  773. m_cbSearch.GetWindowText(csText);
  774. if(csText == "")
  775. return FALSE;
  776. FillList(csText);
  777. m_lstHeader.SetFocus();
  778. MoveControls();
  779. m_cbSearch.SetEditSel(-1, 0);
  780. return TRUE;
  781. }
  782. ///////////////////////////////////////////////////////////////////////
  783. //Menu Stuff
  784. ///////////////////////////////////////////////////////////////////////
  785. void CQPasteWnd::OnMenuLinesperrow1() { SetLinesPerRow(1); }
  786. void CQPasteWnd::OnMenuLinesperrow2() { SetLinesPerRow(2); }
  787. void CQPasteWnd::OnMenuLinesperrow3() { SetLinesPerRow(3); }
  788. void CQPasteWnd::OnMenuLinesperrow4() { SetLinesPerRow(4); }
  789. void CQPasteWnd::OnMenuLinesperrow5() { SetLinesPerRow(5); }
  790. void CQPasteWnd::SetLinesPerRow(long lLines)
  791. {
  792. CGetSetOptions::SetLinesPerRow(lLines);
  793. m_lstHeader.SetNumberOfLinesPerRow(lLines);
  794. FillList();
  795. }
  796. void CQPasteWnd::OnMenuTransparencyNone() { SetTransparency(0); }
  797. void CQPasteWnd::OnMenuTransparency5() { SetTransparency(5); }
  798. void CQPasteWnd::OnMenuTransparency10() { SetTransparency(10); }
  799. void CQPasteWnd::OnMenuTransparency15() { SetTransparency(15); }
  800. void CQPasteWnd::OnMenuTransparency20() { SetTransparency(20); }
  801. void CQPasteWnd::OnMenuTransparency25() { SetTransparency(25); }
  802. void CQPasteWnd::OnMenuTransparency30() { SetTransparency(25); }
  803. void CQPasteWnd::OnMenuTransparency40() { SetTransparency(40); }
  804. void CQPasteWnd::SetTransparency(long lPercent)
  805. {
  806. #ifdef AFTER_98
  807. if(lPercent)
  808. {
  809. CGetSetOptions::SetTransparencyPercent(lPercent);
  810. CGetSetOptions::SetEnableTransparency(TRUE);
  811. m_Alpha.SetTransparent(TRUE);
  812. float fPercent = lPercent / (float)100.0;
  813. m_Alpha.SetOpacity(OPACITY_MAX - (int)(fPercent * OPACITY_MAX));
  814. }
  815. else
  816. {
  817. CGetSetOptions::SetEnableTransparency(FALSE);
  818. m_Alpha.SetTransparent(FALSE);
  819. }
  820. #endif
  821. }
  822. void CQPasteWnd::OnMenuDelete()
  823. {
  824. DeleteSelectedRows();
  825. }
  826. void CQPasteWnd::OnMenuPositioningAtcaret()
  827. {
  828. CGetSetOptions::SetQuickPastePosition(POS_AT_CARET);
  829. }
  830. void CQPasteWnd::OnMenuPositioningAtcursor()
  831. {
  832. CGetSetOptions::SetQuickPastePosition(POS_AT_CURSOR);
  833. }
  834. void CQPasteWnd::OnMenuPositioningAtpreviousposition()
  835. {
  836. CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
  837. }
  838. void CQPasteWnd::OnMenuOptions()
  839. {
  840. m_bHideWnd = false;
  841. DoOptions(this);
  842. ShowQPasteWindow(TRUE);
  843. m_bHideWnd = true;
  844. m_lstHeader.SetFocus();
  845. }
  846. void CQPasteWnd::OnMenuExitprogram()
  847. {
  848. ::SendMessage(theApp.m_MainhWnd, WM_CLOSE, 0, 0);
  849. }
  850. void CQPasteWnd::OnMenuReconnecttoclipboardchain()
  851. {
  852. ::SendMessage(theApp.GetClipboardViewer(), WM_CV_RECONNECT, 0, 0);
  853. }
  854. #include "client.h"
  855. void CQPasteWnd::OnMenuProperties()
  856. {
  857. m_bHideWnd = false;
  858. ARRAY IDs, Indexes;
  859. m_lstHeader.GetSelectionItemData(IDs);
  860. m_lstHeader.GetSelectionIndexes(Indexes);
  861. int nSize = IDs.GetSize();
  862. if(nSize < 1)
  863. return;
  864. long lID = IDs[0];
  865. int nRow = Indexes[0];
  866. if(lID < 0)
  867. return;
  868. m_lstHeader.RemoveAllSelection();
  869. m_lstHeader.SetSelection(nRow);
  870. CCopyProperties props(lID, this);
  871. int nDo = props.DoModal();
  872. if(nDo == IDOK)
  873. {
  874. m_lstHeader.DestroyAndCreateAccelerator(TRUE);
  875. m_lstHeader.RefreshVisibleRows();
  876. if(props.m_lGroupChangedTo >= 0)
  877. {
  878. OpenID(props.m_lGroupChangedTo);
  879. }
  880. }
  881. SetFocus();
  882. m_bHideWnd = true;
  883. if(nDo == IDOK || nDo == IDCANCEL)
  884. {
  885. m_lstHeader.SetFocus();
  886. m_lstHeader.SetListPos(lID);
  887. }
  888. }
  889. void CQPasteWnd::OnMenuFirsttenhotkeysUsectrlnum()
  890. {
  891. CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(!CGetSetOptions::GetUseCtrlNumForFirstTenHotKeys());
  892. m_lstHeader.RefreshVisibleRows();
  893. }
  894. void CQPasteWnd::OnMenuFirsttenhotkeysShowhotkeytext()
  895. {
  896. CGetSetOptions::SetShowTextForFirstTenHotKeys(!CGetSetOptions::GetShowTextForFirstTenHotKeys());
  897. m_lstHeader.SetShowTextForFirstTenHotKeys(CGetSetOptions::GetShowTextForFirstTenHotKeys());
  898. m_lstHeader.RefreshVisibleRows();
  899. }
  900. void CQPasteWnd::OnViewcaptionbaronRight()
  901. {
  902. SetCaptionOn(CAPTION_RIGHT);
  903. CGetSetOptions::SetCaptionPos(CAPTION_RIGHT);
  904. }
  905. void CQPasteWnd::OnViewcaptionbaronBottom()
  906. {
  907. SetCaptionOn(CAPTION_BOTTOM);
  908. CGetSetOptions::SetCaptionPos(CAPTION_BOTTOM);
  909. }
  910. void CQPasteWnd::OnViewcaptionbaronLeft()
  911. {
  912. SetCaptionOn(CAPTION_LEFT);
  913. CGetSetOptions::SetCaptionPos(CAPTION_LEFT);
  914. }
  915. void CQPasteWnd::OnViewcaptionbaronTop()
  916. {
  917. SetCaptionOn(CAPTION_TOP);
  918. CGetSetOptions::SetCaptionPos(CAPTION_TOP);
  919. }
  920. void CQPasteWnd::OnMenuAutohide()
  921. {
  922. bool bAutoHide = !CGetSetOptions::GetAutoHide();
  923. CGetSetOptions::SetAutoHide(bAutoHide);
  924. SetAutoHide(bAutoHide);
  925. }
  926. void CQPasteWnd::OnMenuViewfulldescription()
  927. {
  928. m_lstHeader.ShowFullDescription();
  929. }
  930. void CQPasteWnd::OnMenuAllwaysontop()
  931. {
  932. theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
  933. }
  934. void CQPasteWnd::OnSortAscending()
  935. {
  936. g_Opt.SetHistoryStartTop(TRUE);
  937. FillList();
  938. }
  939. void CQPasteWnd::OnSortDescending()
  940. {
  941. g_Opt.SetHistoryStartTop(FALSE);
  942. FillList();
  943. }
  944. void CQPasteWnd::OnMenuNewGroup()
  945. {
  946. NewGroup( false );
  947. }
  948. void CQPasteWnd::OnMenuNewGroupSelection()
  949. {
  950. NewGroup( true );
  951. }
  952. void CQPasteWnd::OnMenuQuickoptionsAllwaysshowdescription()
  953. {
  954. CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
  955. }
  956. void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesalwaysontop()
  957. {
  958. CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_ON_TOP);
  959. }
  960. void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionRollupwindow()
  961. {
  962. CGetSetOptions::SetDoubleClickingOnCaptionDoes(ROLLES_UP_WINDOW);
  963. }
  964. void CQPasteWnd::OnMenuQuickoptionsDoubleclickingoncaptionTogglesshowdescription()
  965. {
  966. CGetSetOptions::SetDoubleClickingOnCaptionDoes(TOGGLES_ALLWAYS_SHOW_DESCRIPTION);
  967. }
  968. void CQPasteWnd::OnMenuQuickoptionsPromptfornewgroupnames()
  969. {
  970. g_Opt.SetPrompForNewGroupName( !g_Opt.m_bPrompForNewGroupName );
  971. }
  972. void CQPasteWnd::OnMenuViewgroups()
  973. {
  974. OnShowGroupsTop();
  975. }
  976. void CQPasteWnd::OnMenuQuickpropertiesSettoneverautodelete()
  977. {
  978. CWaitCursor wait;
  979. ARRAY IDs;
  980. m_lstHeader.GetSelectionItemData( IDs );
  981. int count = IDs.GetSize();
  982. for(int i = 0; i < count; i++)
  983. {
  984. try
  985. {
  986. CMainTable recset;
  987. recset.Open("SELECT * FROM Main WHERE lID = %d", IDs[i]);
  988. recset.Edit();
  989. recset.m_lDontAutoDelete = (long)CTime::GetCurrentTime().GetTime();
  990. recset.Update();
  991. }
  992. CATCHDAO
  993. }
  994. m_lstHeader.RefreshVisibleRows();
  995. }
  996. void CQPasteWnd::OnMenuQuickpropertiesAutodelete()
  997. {
  998. CWaitCursor wait;
  999. ARRAY IDs;
  1000. m_lstHeader.GetSelectionItemData( IDs );
  1001. int count = IDs.GetSize();
  1002. for(int i = 0; i < count; i++)
  1003. {
  1004. try
  1005. {
  1006. CMainTable recset;
  1007. recset.Open("SELECT * FROM Main WHERE lID = %d", IDs[i]);
  1008. recset.Edit();
  1009. recset.m_lDontAutoDelete = 0;
  1010. recset.Update();
  1011. }
  1012. CATCHDAO
  1013. }
  1014. m_lstHeader.RefreshVisibleRows();
  1015. }
  1016. void CQPasteWnd::OnMenuQuickpropertiesRemovehotkey()
  1017. {
  1018. CWaitCursor wait;
  1019. ARRAY IDs;
  1020. m_lstHeader.GetSelectionItemData( IDs );
  1021. int count = IDs.GetSize();
  1022. for(int i = 0; i < count; i++)
  1023. {
  1024. try
  1025. {
  1026. CMainTable recset;
  1027. recset.Open("SELECT * FROM Main WHERE lID = %d", IDs[i]);
  1028. recset.Edit();
  1029. recset.m_lShortCut = 0;
  1030. recset.Update();
  1031. }
  1032. CATCHDAO
  1033. }
  1034. m_lstHeader.RefreshVisibleRows();
  1035. }
  1036. void CQPasteWnd::OnUpdateMenuGroupsMovetothegroupBlank(CCmdUI* pCmdUI)
  1037. {
  1038. // TODO: Add your command update UI handler code here
  1039. }
  1040. void CQPasteWnd::OnMenuSenttoFriendFifteen()
  1041. {
  1042. SendToFriendbyPos(14);
  1043. }
  1044. void CQPasteWnd::OnMenuSenttoFriendForeteen()
  1045. {
  1046. SendToFriendbyPos(13);
  1047. }
  1048. void CQPasteWnd::OnMenuSenttoFriendThirteen()
  1049. {
  1050. SendToFriendbyPos(12);
  1051. }
  1052. void CQPasteWnd::OnMenuSenttoFriendTwelve()
  1053. {
  1054. SendToFriendbyPos(11);
  1055. }
  1056. void CQPasteWnd::OnMenuSenttoFriendEleven()
  1057. {
  1058. SendToFriendbyPos(10);
  1059. }
  1060. void CQPasteWnd::OnMenuSenttoFriendTen()
  1061. {
  1062. SendToFriendbyPos(9);
  1063. }
  1064. void CQPasteWnd::OnMenuSenttoFriendNine()
  1065. {
  1066. SendToFriendbyPos(8);
  1067. }
  1068. void CQPasteWnd::OnMenuSenttoFriendEight()
  1069. {
  1070. SendToFriendbyPos(7);
  1071. }
  1072. void CQPasteWnd::OnMenuSenttoFriendSeven()
  1073. {
  1074. SendToFriendbyPos(6);
  1075. }
  1076. void CQPasteWnd::OnMenuSenttoFriendSix()
  1077. {
  1078. SendToFriendbyPos(5);
  1079. }
  1080. void CQPasteWnd::OnMenuSenttoFriendFive()
  1081. {
  1082. SendToFriendbyPos(4);
  1083. }
  1084. void CQPasteWnd::OnMenuSenttoFriendFore()
  1085. {
  1086. SendToFriendbyPos(3);
  1087. }
  1088. void CQPasteWnd::OnMenuSenttoFriendThree()
  1089. {
  1090. SendToFriendbyPos(2);
  1091. }
  1092. void CQPasteWnd::OnMenuSenttoFriendTwo()
  1093. {
  1094. SendToFriendbyPos(1);
  1095. }
  1096. void CQPasteWnd::OnMenuSenttoFriendone()
  1097. {
  1098. SendToFriendbyPos(0);
  1099. }
  1100. void CQPasteWnd::OnMenuSenttoPromptforip()
  1101. {
  1102. // TODO: Add your command handler code here
  1103. }
  1104. ///////////////////////////////////////////////////////////////////////
  1105. //END END Menu Stuff
  1106. ///////////////////////////////////////////////////////////////////////
  1107. BOOL CQPasteWnd::SendToFriendbyPos(int nPos)
  1108. {
  1109. CWaitCursor wait;
  1110. m_bHideWnd = false;
  1111. CClipIDs IDs;
  1112. long lCount = m_lstHeader.GetSelectedCount();
  1113. if(lCount <= 0)
  1114. return FALSE;
  1115. m_lstHeader.GetSelectionIndexes(IDs);
  1116. CIDArray *pIDArray = new CIDArray;
  1117. pIDArray->pIDs = new CID[lCount];
  1118. pIDArray->lCount = lCount;
  1119. BOOL bRet = FALSE;
  1120. try
  1121. {
  1122. CPopup Popup(0, 0, m_hWnd);
  1123. Popup.Show(StrF("Sending clip to %s", g_Opt.m_SendClients[nPos].csIP));
  1124. for(int i = 0; i < lCount; i++)
  1125. {
  1126. m_Recset.SetAbsolutePosition(IDs[i]);
  1127. pIDArray->pIDs[i].lID = m_Recset.m_lID;
  1128. pIDArray->pIDs[i].m_csDesc = m_Recset.m_strText;
  1129. }
  1130. if(SendToFriend(pIDArray, nPos, "", &Popup) == FALSE)
  1131. {
  1132. MessageBox(StrF("Error Sending data to %s", g_Opt.m_SendClients[nPos].csIP), "Ditto");
  1133. }
  1134. else
  1135. {
  1136. bRet = TRUE;
  1137. }
  1138. }
  1139. catch(CDaoException* e)
  1140. {
  1141. e->ReportError();
  1142. ASSERT(0);
  1143. e->Delete();
  1144. }
  1145. delete [] pIDArray->pIDs;
  1146. pIDArray->pIDs = NULL;
  1147. delete pIDArray;
  1148. m_bHideWnd = true;
  1149. return bRet;
  1150. }
  1151. LRESULT CQPasteWnd::OnDelete(WPARAM wParam, LPARAM lParam)
  1152. {
  1153. DeleteSelectedRows();
  1154. return TRUE;
  1155. }
  1156. void CQPasteWnd::DeleteSelectedRows()
  1157. {
  1158. CClipIDs IDs;
  1159. long lCount = 0;
  1160. if( m_lstHeader.GetSelectedCount() == 0 )
  1161. return;
  1162. POSITION pos = m_lstHeader.GetFirstSelectedItemPosition();
  1163. int nFirstSel = m_lstHeader.GetNextSelectedItem( pos );
  1164. m_lstHeader.GetSelectionItemData( IDs );
  1165. IDs.DeleteIDs();
  1166. try
  1167. {
  1168. m_Recset.Requery();
  1169. // set lCount to current number of records
  1170. if( m_Recset.IsBOF() && m_Recset.IsEOF() )
  1171. lCount = 0;
  1172. else
  1173. {
  1174. m_Recset.MoveLast();
  1175. lCount = m_Recset.GetRecordCount();
  1176. }
  1177. }
  1178. CATCHDAO
  1179. m_lstHeader.SetItemCountEx(lCount);
  1180. if(lCount == 0)
  1181. m_lstHeader.Invalidate();
  1182. m_lstHeader.RemoveAllSelection();
  1183. // adjust new cursor position to the first item we deleted.
  1184. if( lCount > 0 )
  1185. {
  1186. // if there are no items after the one we deleted, then select the last one.
  1187. if( nFirstSel >= lCount )
  1188. nFirstSel = lCount - 1;
  1189. m_lstHeader.SetListPos(nFirstSel);
  1190. }
  1191. m_lstHeader.RefreshVisibleRows();
  1192. }
  1193. CString CQPasteWnd::LoadDescription( int nItem )
  1194. {
  1195. if( nItem < 0 || nItem >= m_lstHeader.GetItemCount() )
  1196. return "";
  1197. CString cs;
  1198. try
  1199. {
  1200. m_Recset.SetAbsolutePosition( nItem );
  1201. cs = m_Recset.m_strText;
  1202. }
  1203. CATCHDAO
  1204. return cs;
  1205. }
  1206. bool CQPasteWnd::SaveDescription( int nItem, CString text )
  1207. {
  1208. if( nItem < 0 || nItem >= m_lstHeader.GetItemCount() )
  1209. return false;
  1210. try
  1211. {
  1212. m_Recset.SetAbsolutePosition( nItem );
  1213. m_Recset.Edit();
  1214. m_Recset.m_strText = text;
  1215. m_Recset.Update();
  1216. }
  1217. CATCHDAO
  1218. return true;
  1219. }
  1220. BOOL CQPasteWnd::PreTranslateMessage(MSG* pMsg)
  1221. {
  1222. switch(pMsg->message)
  1223. {
  1224. case WM_KEYDOWN:
  1225. switch( pMsg->wParam )
  1226. {
  1227. case VK_APPS:
  1228. {
  1229. long lRet;
  1230. OnRclickQuickPaste(NULL, &lRet);
  1231. return 0;
  1232. }
  1233. case VK_F7:
  1234. if(pMsg->hwnd == m_lstHeader.m_hWnd)
  1235. {
  1236. if(GetKeyState(VK_CONTROL) & 0x8000)
  1237. NewGroup( false );
  1238. else
  1239. NewGroup( true );
  1240. return TRUE;
  1241. }
  1242. break;
  1243. case VK_ESCAPE:
  1244. {
  1245. if(m_strSQLSearch.IsEmpty() == FALSE)
  1246. {
  1247. OnCancelFilter();
  1248. return TRUE;
  1249. }
  1250. else
  1251. {
  1252. if(!m_cbSearch.GetShowingDropDown() &&
  1253. m_GroupTree.IsWindowVisible() == FALSE)
  1254. {
  1255. HideQPasteWindow();
  1256. return TRUE;
  1257. }
  1258. }
  1259. break;
  1260. }
  1261. case VK_TAB:
  1262. {
  1263. BOOL bPrev = FALSE;
  1264. if(GetKeyState(VK_SHIFT) & 0x8000)
  1265. bPrev = TRUE;
  1266. CWnd *pFocus = GetFocus();
  1267. if(pFocus)
  1268. {
  1269. CWnd *pNextWnd = GetNextDlgTabItem(pFocus, bPrev);
  1270. if(pNextWnd)
  1271. pNextWnd->SetFocus();
  1272. }
  1273. return TRUE;
  1274. }
  1275. case 'G':
  1276. {
  1277. if(GetKeyState(VK_CONTROL) & 0x8000)
  1278. {
  1279. OnShowGroupsTop();
  1280. }
  1281. }
  1282. } // end switch( pMsg->wParam )
  1283. break; // end case WM_KEYDOWN
  1284. case WM_SYSKEYDOWN: // ALT key is held down
  1285. switch( pMsg->wParam )
  1286. {
  1287. case 'C': // switch to the filter combobox
  1288. BYTE key[256];
  1289. GetKeyboardState((LPBYTE)(&key));
  1290. if(key[VK_MENU]&128)
  1291. {
  1292. OnCancelFilter();
  1293. }
  1294. return TRUE;
  1295. case VK_HOME:
  1296. theApp.EnterGroupID( 0 ); // History
  1297. return TRUE;
  1298. case VK_END:
  1299. theApp.EnterGroupID( -1 ); // All Groups
  1300. return TRUE;
  1301. } // end switch( pMsg->wParam )
  1302. break; // end case WM_SYSKEYDOWN
  1303. }
  1304. return CWndEx::PreTranslateMessage(pMsg);
  1305. }
  1306. void CQPasteWnd::OnCancelFilter()
  1307. {
  1308. FillList();
  1309. m_cbSearch.SetCurSel(-1);
  1310. MoveControls();
  1311. m_lstHeader.SetFocus();
  1312. }
  1313. LRESULT CQPasteWnd::OnProperties(WPARAM wParam, LPARAM lParam)
  1314. {
  1315. OnMenuProperties();
  1316. return TRUE;
  1317. }
  1318. void CQPasteWnd::OnClose()
  1319. {
  1320. HideQPasteWindow();
  1321. }
  1322. void CQPasteWnd::OnBegindrag(NMHDR* pNMHDR, LRESULT* pResult)
  1323. {
  1324. NM_LISTVIEW* pLV = (NM_LISTVIEW*)pNMHDR;
  1325. CProcessPaste paste;
  1326. CClipIDs& clips = paste.GetClipIDs();
  1327. m_lstHeader.GetSelectionItemData( clips );
  1328. if( clips.GetSize() <= 0 )
  1329. {
  1330. ASSERT(0); // does this ever happen ??
  1331. clips.Add( m_lstHeader.GetItemData(pLV->iItem) );
  1332. }
  1333. paste.DoDrag();
  1334. *pResult = 0;
  1335. }
  1336. void CQPasteWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  1337. {
  1338. CWndEx::OnSysKeyDown(nChar, nRepCnt, nFlags);
  1339. }
  1340. void CQPasteWnd::GetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
  1341. {
  1342. if(m_Recset.IsOpen() == FALSE)
  1343. return;
  1344. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
  1345. LV_ITEM* pItem= &(pDispInfo)->item;
  1346. if(pItem->mask & LVIF_TEXT) //valid text buffer?
  1347. {
  1348. switch(pItem->iSubItem)
  1349. {
  1350. case 0:
  1351. try
  1352. {
  1353. m_Recset.SetAbsolutePosition(pItem->iItem);
  1354. CString cs;
  1355. if(m_Recset.m_lDontAutoDelete)
  1356. cs += "*";
  1357. if(m_Recset.m_lShortCut > 0)
  1358. cs += "s";
  1359. if(m_Recset.m_bIsGroup)
  1360. cs += "G";
  1361. // attached to a group
  1362. if(m_Recset.m_lParentID > 0 )
  1363. cs += "!";
  1364. // pipe is the "end of symbols" marker
  1365. cs += "|" + m_Recset.GetDisplayText( g_Opt.m_nLinesPerRow );
  1366. lstrcpyn(pItem->pszText, cs, pItem->cchTextMax);
  1367. pItem->pszText[pItem->cchTextMax-1] = '\0';
  1368. }
  1369. catch(CDaoException *e)
  1370. {
  1371. ASSERT(FALSE);
  1372. e->Delete();
  1373. }
  1374. break;
  1375. }
  1376. }
  1377. if(pItem->mask & LVIF_PARAM)
  1378. {
  1379. switch(pItem->iSubItem)
  1380. {
  1381. case 0:
  1382. try
  1383. {
  1384. m_Recset.SetAbsolutePosition(pItem->iItem);
  1385. pItem->lParam = m_Recset.m_lID;
  1386. }
  1387. catch(CDaoException *e)
  1388. {
  1389. ASSERT(FALSE);
  1390. e->Delete();
  1391. }
  1392. break;
  1393. }
  1394. }
  1395. }
  1396. void CQPasteWnd::OnGetToolTipText(NMHDR* pNMHDR, LRESULT* pResult)
  1397. {
  1398. CQListToolTipText* pInfo = (CQListToolTipText*)pNMHDR;
  1399. if( !pInfo )
  1400. return;
  1401. if( pInfo->lItem < 0 )
  1402. {
  1403. CString cs("no item selected");
  1404. lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
  1405. if(cs.GetLength() > pInfo->cchTextMax)
  1406. pInfo->pszText[pInfo->cchTextMax-1] = 0;
  1407. return;
  1408. }
  1409. try
  1410. {
  1411. CString cs;
  1412. m_Recset.SetAbsolutePosition(pInfo->lItem);
  1413. cs = m_Recset.m_strText;
  1414. cs += "\n\n";
  1415. #ifdef _DEBUG
  1416. cs += StrF("(Index = %d) (DB ID = %d) (Size = %d)\n", pInfo->lItem, m_Recset.m_lID, m_Recset.m_strText.GetLength() );
  1417. #endif
  1418. CTime time(m_Recset.m_lDate);
  1419. cs += time.Format("%m/%d/%Y %I:%M:%S %p");
  1420. if(m_Recset.m_lDontAutoDelete)
  1421. {
  1422. cs += "\n";
  1423. cs += "Never Auto Delete";
  1424. }
  1425. if(m_Recset.m_lShortCut > 0)
  1426. {
  1427. cs += "\n";
  1428. if( HIBYTE(m_Recset.m_lShortCut) & HOTKEYF_CONTROL )
  1429. cs += "Ctrl + ";
  1430. if( HIBYTE(m_Recset.m_lShortCut) & HOTKEYF_SHIFT )
  1431. cs += "Shift + ";
  1432. if( HIBYTE(m_Recset.m_lShortCut) & HOTKEYF_ALT )
  1433. cs += "Alt + ";
  1434. cs += LOBYTE(m_Recset.m_lShortCut);
  1435. }
  1436. lstrcpyn(pInfo->pszText, cs, pInfo->cchTextMax);
  1437. pInfo->pszText[pInfo->cchTextMax-1] = '\0';
  1438. }
  1439. catch(CDaoException *e)
  1440. {
  1441. ASSERT(FALSE);
  1442. e->Delete();
  1443. }
  1444. }
  1445. void CQPasteWnd::OnFindItem(NMHDR* pNMHDR, LRESULT* pResult)
  1446. {
  1447. NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;
  1448. LVFINDINFO fndItem = pFindInfo->lvfi;
  1449. if(fndItem.flags & LVFI_STRING)
  1450. {
  1451. {
  1452. m_cbSearch.SetWindowText(fndItem.psz);
  1453. m_cbSearch.SetFocus();
  1454. m_cbSearch.SetEditSel(strlen(fndItem.psz), strlen(fndItem.psz));
  1455. *pResult = -1;
  1456. return;
  1457. }
  1458. int nLength = strlen(fndItem.psz);
  1459. long lArraySize = m_Recset.GetRecordCount();
  1460. m_Recset.SetAbsolutePosition(pFindInfo->iStart);
  1461. // Search to end.
  1462. for(int i = pFindInfo->iStart; i < lArraySize; i++ )
  1463. {
  1464. if(m_Recset.IsEOF() == FALSE)
  1465. {
  1466. if(_strnicmp(fndItem.psz, m_Recset.m_strText, nLength) == 0)
  1467. {
  1468. *pResult = i;
  1469. return;
  1470. }
  1471. m_Recset.MoveNext();
  1472. }
  1473. }
  1474. m_Recset.MoveFirst();
  1475. // Search from 0 to start.
  1476. for( i = 0; i < pFindInfo->iStart; i++ )
  1477. {
  1478. if(m_Recset.IsEOF() == FALSE)
  1479. {
  1480. if(_strnicmp(fndItem.psz, m_Recset.m_strText, nLength) == 0)
  1481. {
  1482. *pResult = i;
  1483. return;
  1484. }
  1485. m_Recset.MoveNext();
  1486. }
  1487. }
  1488. }
  1489. *pResult = -1; // Default action.
  1490. }
  1491. void CQPasteWnd::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
  1492. {
  1493. // toggle ShowPersistent when we double click the caption
  1494. if( nHitTest == HTCAPTION )
  1495. {
  1496. switch(g_Opt.m_bDoubleClickingOnCaptionDoes)
  1497. {
  1498. case TOGGLES_ALLWAYS_ON_TOP:
  1499. theApp.ShowPersistent( !g_Opt.m_bShowPersistent );
  1500. break;
  1501. case TOGGLES_ALLWAYS_SHOW_DESCRIPTION:
  1502. CGetSetOptions::SetAllwaysShowDescription(!g_Opt.m_bAllwaysShowDescription);
  1503. break;
  1504. case ROLLES_UP_WINDOW:
  1505. MinMaxWindow();
  1506. break;
  1507. }
  1508. }
  1509. CWndEx::OnNcLButtonDblClk(nHitTest, point);
  1510. }
  1511. #define WNDSNAP_ALLOWANCE 12
  1512. void CQPasteWnd::OnWindowPosChanging(WINDOWPOS* lpwndpos)
  1513. {
  1514. CWndEx::OnWindowPosChanging(lpwndpos);
  1515. if(m_lstHeader.m_Popup.m_bIsShowing)
  1516. m_lstHeader.m_Popup.Hide();
  1517. CRect rcScreen;
  1518. CRect cr(lpwndpos->x, lpwndpos->y, lpwndpos->x + lpwndpos->cx, lpwndpos->y + lpwndpos->cy);
  1519. int nMonitor = GetMonitorFromRect(&cr);
  1520. GetMonitorRect(nMonitor, &rcScreen);
  1521. // Snap X axis to left
  1522. if(abs(lpwndpos->x - rcScreen.left) <= WNDSNAP_ALLOWANCE)
  1523. {
  1524. lpwndpos->x = rcScreen.left;
  1525. }
  1526. // Snap X axis to right
  1527. if (abs(lpwndpos->x + lpwndpos->cx - rcScreen.right) <= WNDSNAP_ALLOWANCE)
  1528. {
  1529. lpwndpos->x = rcScreen.right - lpwndpos->cx;
  1530. }
  1531. // Snap Y axis to top
  1532. if (abs(lpwndpos->y - rcScreen.top) <= WNDSNAP_ALLOWANCE)
  1533. {
  1534. // Assign new cordinate
  1535. lpwndpos->y = rcScreen.top;
  1536. }
  1537. // Snap Y axis to bottom
  1538. if (abs(lpwndpos->y + lpwndpos->cy - rcScreen.bottom) <= WNDSNAP_ALLOWANCE)
  1539. {
  1540. lpwndpos->y = rcScreen.bottom - lpwndpos->cy;
  1541. }
  1542. }
  1543. void CQPasteWnd::OnShowGroupsTop()
  1544. {
  1545. OnShowGroupsBottom();
  1546. return;
  1547. m_GroupTree.m_bHide = false;
  1548. m_bHideWnd = false;
  1549. CRect crList;
  1550. m_lstHeader.GetWindowRect(crList);
  1551. CRect cr(crList.left, crList.top, crList.left + crList.Width(), crList.top + 200);
  1552. m_GroupTree.MoveWindow(cr);
  1553. m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
  1554. m_GroupTree.FillTree();
  1555. m_GroupTree.ShowWindow(SW_SHOW);
  1556. m_GroupTree.m_bHide = true;
  1557. m_bHideWnd = true;
  1558. }
  1559. void CQPasteWnd::OnShowGroupsBottom()
  1560. {
  1561. m_GroupTree.m_bHide = false;
  1562. m_bHideWnd = false;
  1563. CRect crWindow, crList;
  1564. m_lstHeader.GetWindowRect(crList);
  1565. GetWindowRect(crWindow);
  1566. CRect cr(crWindow.left, crWindow.bottom, crWindow.left + crWindow.Width(), crWindow.bottom + 200);
  1567. m_GroupTree.MoveWindow(cr);
  1568. m_GroupTree.m_lSelectedFolderID = theApp.m_GroupID;
  1569. m_GroupTree.FillTree();
  1570. m_GroupTree.ShowWindow(SW_SHOW);
  1571. m_GroupTree.m_bHide = true;
  1572. m_bHideWnd = true;
  1573. }
  1574. LRESULT CQPasteWnd::OnGroupTreeMessage(WPARAM wParam, LPARAM lParam)
  1575. {
  1576. m_bHideWnd = false;
  1577. long lID = (long)wParam;
  1578. m_GroupTree.ShowWindow(SW_HIDE);
  1579. m_cbSearch.SetCurSel(-1);
  1580. MoveControls();
  1581. if(lID >= 0)
  1582. {
  1583. //Set the app flag so it does a send message to refresh the list
  1584. //We need to do this because we set the list pos to 0 and with Post
  1585. //the list is not filled up yet
  1586. bool bItWas = theApp.m_bAsynchronousRefreshView;
  1587. theApp.m_bAsynchronousRefreshView = false;
  1588. OpenID(lID);
  1589. theApp.m_bAsynchronousRefreshView = bItWas;
  1590. m_lstHeader.SetListPos(0);
  1591. }
  1592. CWnd *p = GetFocus();
  1593. if(p == NULL)
  1594. {
  1595. HideQPasteWindow();
  1596. }
  1597. m_bHideWnd = true;
  1598. return TRUE;
  1599. }
  1600. void CQPasteWnd::OnBackButton()
  1601. {
  1602. theApp.EnterGroupID(theApp.m_GroupParentID);
  1603. }