MainFrm.cpp 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307
  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "icrEdit.h"
  5. #include "MainFrm.h"
  6. #include "IcrEditView.h"
  7. #include "resource.h"
  8. #include "..\include\kernel.h"
  9. #include "Const.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. DWORD CALLBACK EditStreamCallbackWriteToFile(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
  16. DWORD CALLBACK EditStreamCallbackOut(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb);
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CMainFrame
  19. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  20. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  21. //{{AFX_MSG_MAP(CMainFrame)
  22. ON_WM_CREATE()
  23. ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeComboFind)
  24. ON_COMMAND(ID_EDITPASTE, OnEditPaste)
  25. ON_COMMAND(ID_EDITCUT, OnEditcut)
  26. ON_UPDATE_COMMAND_UI(ID_EDITCUT, OnUpdateEditcut)
  27. ON_COMMAND(ID_EDITCOPY, OnEditcopy)
  28. ON_UPDATE_COMMAND_UI(ID_EDITCOPY, OnUpdateEditcopy)
  29. ON_UPDATE_COMMAND_UI(ID_EDITPASTE, OnUpdateEditpaste)
  30. ON_COMMAND(ID_EDITUNDO, OnEditundo)
  31. ON_UPDATE_COMMAND_UI(ID_EDITUNDO, OnUpdateEditundo)
  32. ON_COMMAND(ID_EDITREDO, OnEditredo)
  33. ON_UPDATE_COMMAND_UI(ID_EDITREDO, OnUpdateEditredo)
  34. ON_COMMAND(ID_EDITSELECTALL, OnEditselectall)
  35. ON_COMMAND(ID_EDITREPEAT, OnEditrepeat)
  36. ON_COMMAND(ID_EDITREPEATNEXT, OnEditrepeatnext)
  37. ON_UPDATE_COMMAND_UI(ID_EDITREPEAT, OnUpdateEditrepeat)
  38. ON_UPDATE_COMMAND_UI(ID_EDITREPEATNEXT, OnUpdateEditrepeatnext)
  39. ON_COMMAND(ID_VIEW_FONT, OnViewFont)
  40. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  41. ON_COMMAND(ID_EDIT_TRIMTRAILLINGSPACE, OnEditTrimtraillingspace)
  42. ON_COMMAND(ID_EDIT_TRIMTRAILLINGTAB, OnEditTrimtraillingtab)
  43. ON_COMMAND(ID_EDIT_TABTOSPACE, OnEditTabtospace)
  44. ON_COMMAND(ID_EDIT_SPACETOTAB, OnEditSpacetotab)
  45. ON_COMMAND(ID_EDIT_LEADINGSPACETOTAB, OnEditLeadingspacetotab)
  46. ON_COMMAND(ID_EDIT_MOVERIGHT, OnEditMoveright)
  47. ON_COMMAND(ID_EDIT_UNCOMMENT, OnEditUncomment)
  48. ON_COMMAND(ID_EDIT_MOVELEFT, OnEditMoveleft)
  49. ON_COMMAND(ID_EDIT_COMMENT, OnEditComment)
  50. ON_COMMAND(ID_EDIT_LCASE, OnEditLcase)
  51. ON_COMMAND(ID_EDIT_UCASE, OnEditUcase)
  52. ON_COMMAND(ID_EDIT_INVERT, OnEditInvert)
  53. ON_COMMAND(ID_EDIT_CAPITALIZE, OnEditCapitalize)
  54. ON_COMMAND(ID_EDIT_SENTANCECASE, OnEditSentancecase)
  55. ON_UPDATE_COMMAND_UI(ID_EDIT_LCASE, OnUpdateEditLcase)
  56. ON_UPDATE_COMMAND_UI(ID_EDIT_INVERT, OnUpdateEditInvert)
  57. ON_UPDATE_COMMAND_UI(ID_EDIT_SENTANCECASE, OnUpdateEditSentancecase)
  58. ON_UPDATE_COMMAND_UI(ID_EDIT_UCASE, OnUpdateEditUcase)
  59. ON_COMMAND(ID_FILE_NEW, OnFileNew)
  60. ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
  61. ON_COMMAND(ID_FILESAVE, OnFilesave)
  62. ON_UPDATE_COMMAND_UI(ID_EDIT_CAPITALIZE, OnUpdateEditCapitalize)
  63. ON_WM_CLOSE()
  64. ON_COMMAND(ID_FILE_SAVE_AS_, OnFileSaveAs)
  65. //}}AFX_MSG_MAP
  66. ON_WM_GETMINMAXINFO()
  67. END_MESSAGE_MAP()
  68. static UINT indicators[] =
  69. {
  70. ID_SEPARATOR, // status line indicator
  71. ID_INDICATOR_CAPS,
  72. ID_INDICATOR_NUM,
  73. };
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CMainFrame construction/destruction
  76. CMainFrame::CMainFrame()
  77. {
  78. m_strFileName = "";
  79. }
  80. CMainFrame::~CMainFrame()
  81. {
  82. }
  83. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  84. {
  85. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  86. return -1;
  87. if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  88. | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  89. !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  90. {
  91. TRACE0("Failed to create toolbar\n");
  92. return -1; // fail to create
  93. }
  94. // TODO: Delete these three lines if you don't want the toolbar to
  95. // be dockable
  96. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  97. EnableDocking(CBRS_ALIGN_ANY);
  98. DockControlBar(&m_wndToolBar);
  99. if (!m_wndStatusBar.Create(this) ||
  100. !m_wndStatusBar.SetIndicators(indicators,
  101. sizeof(indicators)/sizeof(UINT)))
  102. {
  103. TRACE0("Failed to create status bar\n");
  104. return -1; // fail to create
  105. }
  106. m_wndStatusBar.SetPaneInfo(1, ID_INDICATOR_CAPS, CBRS_BOTTOM,100);
  107. m_bAutoMenuEnable = FALSE;
  108. if(-1 == LoadToolbarCombo())
  109. return FALSE;
  110. // 调用kernal动态库初始化SOCKET库;
  111. CreateSystem();
  112. CHAR strDirectory[MAX_PATH_LENGTH + 1]; // 软件所在路径
  113. CHAR strAppName[MAX_PATH_LENGTH + 1] = {0}; // 软件名称
  114. CHAR strFile[MAX_FILE_LENGTH + 1] = "";
  115. CHAR strValue[MAX_VALUE_LENGTH + 1] = "";
  116. int iPosFile = 0;
  117. int iLenghtFile = 0;
  118. ////////////////////////////////////////////////////////////////////////////
  119. //获取应用名
  120. GetModuleFileName(AfxGetApp()->m_hInstance, strDirectory, MAX_PATH_LENGTH);
  121. iLenghtFile = strlen(strDirectory);
  122. for (iPosFile = iLenghtFile - 1; iPosFile >= 0; iPosFile--)
  123. {
  124. if (strDirectory[iPosFile] == '\\')
  125. {
  126. memset(strAppName, 0, sizeof(strAppName));
  127. memcpy(strAppName, strDirectory + iPosFile + 1, iLenghtFile - iPosFile - 1);
  128. break;
  129. }
  130. }
  131. //获取系统路径
  132. #ifdef _DEBUG
  133. GetCurrentDirectory(MAX_PATH_LENGTH, strDirectory);
  134. #else
  135. GetModuleFileName(AfxGetApp()->m_hInstance, strDirectory, MAX_PATH_LENGTH);
  136. iLenghtFile = strlen(strDirectory);
  137. for (iPosFile = iLenghtFile - 1; iPosFile >= 0; iPosFile--)
  138. {
  139. if (strDirectory[iPosFile] == '\\')
  140. {
  141. strDirectory[iPosFile] = '\0';
  142. break;
  143. }
  144. }
  145. #endif
  146. if( pVariantsManager != NULL )
  147. {
  148. pVariantsManager->Load(strDirectory);
  149. }
  150. return 0;
  151. }
  152. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  153. {
  154. if( !CFrameWnd::PreCreateWindow(cs) )
  155. return FALSE;
  156. // TODO: Modify the Window class or styles here by modifying
  157. // the CREATESTRUCT cs
  158. return TRUE;
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. // CMainFrame diagnostics
  162. #ifdef _DEBUG
  163. void CMainFrame::AssertValid() const
  164. {
  165. CFrameWnd::AssertValid();
  166. }
  167. void CMainFrame::Dump(CDumpContext& dc) const
  168. {
  169. CFrameWnd::Dump(dc);
  170. }
  171. #endif //_DEBUG
  172. /////////////////////////////////////////////////////////////////////////////
  173. // CMainFrame message handlers
  174. int CMainFrame::LoadToolbarCombo()
  175. {
  176. return 0;
  177. }
  178. void CMainFrame::OnEditPaste()
  179. {
  180. char * buffer;
  181. if(!OpenClipboard())
  182. return;
  183. buffer = (char*)::GetClipboardData(CF_TEXT);
  184. CloseClipboard();
  185. CString str = buffer;
  186. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  187. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  188. CWnd *pWnd = GetFocus();
  189. if(pWnd->m_hWnd!=edit.m_hWnd)
  190. {
  191. pWnd->SendMessage(WM_PASTE, 0, 0);
  192. return;
  193. }
  194. CHARRANGE cr;
  195. edit.GetSel(cr);
  196. icrEditView->SetParseCookieZeroFromGivenLine(edit.LineFromChar(cr.cpMin)); //粘贴时需重置解析缓冲区
  197. edit.ReplaceSel(str, TRUE);
  198. if(cr.cpMax != cr.cpMin)
  199. {
  200. icrEditView->ReCalcCursorPostion();
  201. }
  202. }
  203. void CMainFrame::OnEditcut()
  204. {
  205. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  206. CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
  207. CWnd *pWnd = GetFocus();
  208. if(pWnd->m_hWnd != SynCtrl.m_hWnd)
  209. {
  210. pWnd->SendMessage(WM_CUT, 0, 0);
  211. return;
  212. }
  213. CHARRANGE cr;
  214. SynCtrl.GetSel( cr );
  215. icrEditView->GetRichEditCtrl().Cut();
  216. if(cr.cpMax != cr.cpMin)
  217. {
  218. icrEditView->ReCalcCursorPostion();
  219. }
  220. else
  221. {
  222. SCROLLINFO si;
  223. si.cbSize = sizeof(si);
  224. icrEditView->GetScrollInfo(SB_HORZ, &si);
  225. icrEditView->m_nHorzMaxOld = si.nMax;
  226. }
  227. }
  228. void CMainFrame::OnUpdateEditcut(CCmdUI* pCmdUI)
  229. {
  230. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  231. CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl();
  232. CHARRANGE cr;
  233. editctrl.GetSel(cr);
  234. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  235. }
  236. void CMainFrame::OnEditcopy()
  237. {
  238. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  239. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  240. CWnd *pWnd = GetFocus();
  241. if(pWnd->m_hWnd != edit.m_hWnd)
  242. {
  243. pWnd->SendMessage(WM_COPY, 0, 0);
  244. }
  245. else
  246. {
  247. edit.Copy();
  248. }
  249. }
  250. void CMainFrame::OnUpdateEditcopy(CCmdUI* pCmdUI)
  251. {
  252. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  253. CRichEditCtrl& editctrl = icrEditView->GetRichEditCtrl();
  254. CHARRANGE cr;
  255. editctrl.GetSel(cr);
  256. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  257. }
  258. void CMainFrame::OnUpdateEditpaste(CCmdUI* pCmdUI)
  259. {
  260. OpenClipboard();
  261. if(::GetClipboardData(CF_TEXT)==FALSE)
  262. pCmdUI->Enable(FALSE);
  263. else
  264. pCmdUI->Enable(TRUE);
  265. CloseClipboard();
  266. }
  267. void CMainFrame::OnEditundo()
  268. {
  269. GetFocus()->SendMessage(EM_UNDO, 0, 0);
  270. }
  271. void CMainFrame::OnUpdateEditundo(CCmdUI* pCmdUI)
  272. {
  273. CWnd *pWnd = GetFocus();
  274. if(!pWnd)
  275. return;
  276. BOOL bCanUndo = pWnd->SendMessage(EM_CANUNDO, 0, 0);
  277. pCmdUI->Enable(bCanUndo);
  278. }
  279. void CMainFrame::OnEditredo()
  280. {
  281. GetFocus()->SendMessage(EM_REDO, 0, 0);
  282. }
  283. void CMainFrame::OnUpdateEditredo(CCmdUI* pCmdUI)
  284. {
  285. CWnd *pWnd = GetFocus();
  286. if(!pWnd)
  287. return;
  288. BOOL bCanRedo = pWnd->SendMessage(EM_CANREDO, 0, 0);
  289. pCmdUI->Enable(bCanRedo);
  290. }
  291. void CMainFrame::OnEditselectall()
  292. {
  293. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  294. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  295. CWnd *pWnd = GetFocus();
  296. if(pWnd->m_hWnd != editctrl.m_hWnd)
  297. {
  298. CString str;
  299. pWnd->GetWindowText(str);
  300. CHARRANGE ichCharRange;
  301. ichCharRange.cpMax = str.GetLength();
  302. ichCharRange.cpMin = 0;
  303. pWnd->SendMessage(EM_EXSETSEL, 0, (LPARAM)&ichCharRange);
  304. return;
  305. }
  306. editctrl.SetSel(0, -1);
  307. editctrl.SetFocus();
  308. editctrl.PostMessage( WM_PAINT, 0, 0 );
  309. }
  310. void CMainFrame::OnEditrepeat()
  311. {
  312. CWinApp *app = AfxGetApp();
  313. CMainFrame *mainfrm = (CMainFrame *)AfxGetMainWnd();
  314. CIcrEditView *icrEditView=(CIcrEditView *)GetActiveView();
  315. CString strEdit;
  316. BOOL bWholeWord = app->GetProfileInt(_T("CFind"), _T("WholeWord"), 0);
  317. BOOL bCase = app->GetProfileInt(_T("CFind"), _T("Case"), 0);
  318. if(strEdit.IsEmpty())
  319. return;
  320. int dwFlags = 0;
  321. if(bCase)
  322. dwFlags|=FR_MATCHCASE;
  323. if(bWholeWord)
  324. dwFlags|=FR_WHOLEWORD;
  325. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  326. CHARRANGE cr;
  327. edit.GetSel(cr);
  328. FINDTEXTEX *ft = new FINDTEXTEX[1];
  329. ft->chrg.cpMin = cr.cpMin-1;
  330. ft->chrg.cpMax = -1;// search through end of the text
  331. TCHAR *t = new TCHAR[strEdit.GetLength()+1];
  332. strcpy(t, strEdit);
  333. ft->lpstrText = t;
  334. icrEditView->ShowWindow(SW_HIDE);
  335. int nPos = edit.SendMessage(EM_FINDTEXTEX, dwFlags, (LPARAM)ft);
  336. if(nPos!=-1) {
  337. edit.SetSel(ft->chrgText.cpMin, ft->chrgText.cpMax);
  338. icrEditView->SetFocus();
  339. SetFocus();
  340. icrEditView->ShowWindow(SW_SHOW);
  341. }
  342. else {
  343. icrEditView->ShowWindow(SW_SHOW);
  344. CString strShow;
  345. strShow.Format(_T("Cannot find the string: \"%s\", search again from the end?"), strEdit);
  346. if(MessageBox(strShow,_T("Find"), MB_ICONINFORMATION|MB_YESNO)==IDYES)
  347. {
  348. icrEditView->ShowWindow(SW_HIDE);
  349. edit.SetSel(0, -1);
  350. icrEditView->ShowWindow(SW_SHOW);
  351. CHARRANGE cr;
  352. edit.GetSel(cr);
  353. edit.SetSel(cr.cpMax, cr.cpMax);
  354. OnEditrepeat();
  355. if(t)
  356. delete t;
  357. if(ft)
  358. delete ft;
  359. return;
  360. }
  361. }
  362. if(t)
  363. delete t;
  364. if(ft)
  365. delete ft;
  366. }
  367. void CMainFrame::OnEditrepeatnext()
  368. {
  369. CWinApp *app = AfxGetApp();
  370. CMainFrame *mainfrm = (CMainFrame *)AfxGetMainWnd();
  371. CIcrEditView *icrEditView=(CIcrEditView *)GetActiveView();
  372. CString strEdit;
  373. BOOL bWholeWord = app->GetProfileInt(_T("CFind"), _T("WholeWord"), 0);
  374. BOOL bCase = app->GetProfileInt(_T("CFind"), _T("Case"), 0);
  375. if(strEdit.IsEmpty())
  376. return;
  377. int dwFlags = 0;
  378. if(bCase)
  379. dwFlags|=FR_MATCHCASE;
  380. if(bWholeWord)
  381. dwFlags|=FR_WHOLEWORD;
  382. dwFlags|=FR_DOWN;;
  383. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  384. CHARRANGE cr;
  385. edit.GetSel(cr);
  386. FINDTEXTEX *ft = new FINDTEXTEX[1];
  387. ft->chrg.cpMin = cr.cpMin+1;
  388. ft->chrg.cpMax = -1;// search through end of the text
  389. TCHAR *t = new TCHAR[strEdit.GetLength()+1];
  390. strcpy(t, strEdit);
  391. ft->lpstrText = t;
  392. icrEditView->ShowWindow(SW_HIDE);
  393. int nPos = edit.SendMessage(EM_FINDTEXTEX, dwFlags, (LPARAM)ft);
  394. if(nPos!=-1) {
  395. edit.SetSel(ft->chrgText.cpMin, ft->chrgText.cpMax);
  396. icrEditView->SetFocus();
  397. SetFocus();
  398. icrEditView->ShowWindow(SW_SHOW);
  399. }
  400. else {
  401. icrEditView->ShowWindow(SW_SHOW);
  402. CString strShow;
  403. strShow.Format(_T("Cannot find the string: \"%s\", search again from the beginning?"), strEdit);
  404. if(MessageBox(strShow, _T("Find"), MB_ICONINFORMATION|MB_YESNO)==IDYES)
  405. {
  406. edit.SetSel(0, 0);
  407. OnEditrepeatnext();
  408. if(t)
  409. delete t;
  410. if(ft)
  411. delete ft;
  412. return;
  413. }
  414. }
  415. if(t)
  416. delete t;
  417. if(ft)
  418. delete ft;
  419. }
  420. void CMainFrame::OnUpdateEditrepeat(CCmdUI* pCmdUI)
  421. {
  422. }
  423. void CMainFrame::OnUpdateEditrepeatnext(CCmdUI* pCmdUI)
  424. {
  425. }
  426. void CMainFrame::OnViewFont()
  427. {
  428. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  429. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  430. BOOL bModify = edit.GetModify();
  431. edit.ShowWindow(SW_HIDE);
  432. CString strText;
  433. EDITSTREAM stream;
  434. stream.dwCookie = (DWORD)&strText;
  435. stream.pfnCallback = EditStreamCallbackOut;
  436. edit.StreamOut(SF_TEXT, stream);
  437. CHARFORMAT cr;
  438. if(strText.IsEmpty())
  439. {
  440. strText = _T(" ");
  441. edit.SetSel(0, 1);
  442. cr = icrEditView->GetCharFormatSelection();
  443. edit.SetSel(0, 0);
  444. }
  445. else
  446. {
  447. CHARRANGE range;
  448. edit.GetSel(range);
  449. int ntemp;
  450. if(range.cpMax < range.cpMin)
  451. {
  452. ntemp = range.cpMax;
  453. range.cpMax = range.cpMin;
  454. range.cpMin = ntemp;
  455. }
  456. if(range.cpMax == range.cpMin)
  457. {
  458. if(range.cpMin == 0)
  459. {
  460. edit.SetSel(0, 1);
  461. }
  462. else
  463. {
  464. edit.SetSel(range.cpMin-1, range.cpMin);
  465. }
  466. cr = icrEditView->GetCharFormatSelection();
  467. edit.SetSel(range.cpMin, range.cpMin);
  468. }
  469. else
  470. {
  471. cr = icrEditView->GetCharFormatSelection();
  472. }
  473. }
  474. edit.ShowWindow(SW_SHOW);
  475. CFontDialog dlg(cr, CF_BOTH|CF_NOOEMFONTS);
  476. if (dlg.DoModal() == IDOK)
  477. {
  478. CHARFORMAT cr;
  479. dlg.GetCharFormat(cr);
  480. LockWindowUpdate();
  481. icrEditView->SetWindowText(_T(""));
  482. icrEditView->SetSynEditViewFont(*dlg.m_cf.lpLogFont);
  483. icrEditView->SetWindowText(strText);
  484. edit.SetModify(bModify);
  485. UnlockWindowUpdate();
  486. }
  487. }
  488. void CMainFrame::SaveTheContext()
  489. {
  490. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  491. CRichEditCtrl &richctrl=icrEditView->GetRichEditCtrl();
  492. if(0 == m_strFileName.GetLength())
  493. return;
  494. CFile cFile(m_strFileName, CFile::modeCreate|CFile::modeWrite);
  495. EDITSTREAM es;
  496. es.dwCookie = (DWORD) &cFile;
  497. es.pfnCallback = EditStreamCallbackWriteToFile;
  498. richctrl.StreamOut(SF_TEXT, es);
  499. richctrl.SetModify(FALSE);
  500. }
  501. void CMainFrame::OnFileOpen()
  502. {
  503. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  504. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  505. if(edit.GetModify())
  506. {
  507. if(MessageBox("文件已经修改,需要保存吗??", "", MB_YESNO|MB_ICONQUESTION)==IDNO)
  508. ;
  509. else //保存
  510. {
  511. OnFilesave();
  512. }
  513. }
  514. CFileDialog fd (TRUE, _T(""), NULL, OFN_HIDEREADONLY|OFN_EXPLORER, "*.srp|*.srp||");
  515. if(IDCANCEL == fd.DoModal())
  516. {
  517. return;
  518. }
  519. m_strFileName = fd.GetPathName();
  520. icrEditView->LoadFile(m_strFileName);
  521. }
  522. void CMainFrame::OnEditTrimtraillingspace()
  523. {
  524. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  525. CWaitCursor wc;
  526. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  527. int nfirstline = edit.GetFirstVisibleLine();
  528. CHARRANGE cr;
  529. edit.GetSel(cr);
  530. int nline = edit.LineFromChar(cr.cpMin);
  531. CString strtext;
  532. EDITSTREAM stream;
  533. stream.dwCookie = (DWORD)&strtext;
  534. stream.pfnCallback = EditStreamCallbackOut;
  535. edit.StreamOut(SF_TEXT, stream);
  536. CString strnewtext = _T(""), strline;
  537. int npos = strtext.Find('\n');
  538. while(npos!=-1) {
  539. strline = strtext.Left(npos-1);
  540. strline.TrimRight(0x20);
  541. strline += '\n';
  542. strtext = strtext.Right(strtext.GetLength()-npos-1);
  543. strnewtext += strline;
  544. npos = strtext.Find('\n');
  545. }
  546. icrEditView->LoadText(strnewtext);
  547. icrEditView->GotoLine(nfirstline+1);
  548. int nlineindex = edit.LineIndex(nline);
  549. edit.SetSel(nlineindex, nlineindex);
  550. icrEditView->ShowCursorPosition();
  551. icrEditView->SetFocus();
  552. SaveTheContext();
  553. }
  554. void CMainFrame::OnEditTrimtraillingtab()
  555. {
  556. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  557. CWaitCursor wc;
  558. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  559. int nfirstline = edit.GetFirstVisibleLine();
  560. CHARRANGE cr;
  561. edit.GetSel(cr);
  562. int nline = edit.LineFromChar(cr.cpMin);
  563. CString strtext;
  564. EDITSTREAM stream;
  565. stream.dwCookie = (DWORD)&strtext;
  566. stream.pfnCallback = EditStreamCallbackOut;
  567. edit.StreamOut(SF_TEXT, stream);
  568. CString strnewtext = _T(""), strline;
  569. int npos = strtext.Find('\n');
  570. while(npos!=-1) {
  571. strline = strtext.Left(npos-1);
  572. strline.TrimRight(0x9);
  573. strline += '\n';
  574. strtext = strtext.Right(strtext.GetLength()-npos-1);
  575. strnewtext += strline;
  576. npos = strtext.Find('\n');
  577. }
  578. icrEditView->LoadText(strnewtext);
  579. icrEditView->GotoLine(nfirstline+1);
  580. int nlineindex = edit.LineIndex(nline);
  581. edit.SetSel(nlineindex, nlineindex);
  582. icrEditView->ShowCursorPosition();
  583. icrEditView->SetFocus();
  584. SaveTheContext();
  585. }
  586. void CMainFrame::OnEditTabtospace()
  587. {
  588. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  589. CWaitCursor wc;
  590. TCHAR chr = 0x9;
  591. CString strtab = chr;
  592. int ntabsize = icrEditView->GetTabSize();
  593. CString strspace((char)0x20, ntabsize);
  594. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  595. int nfirstline = edit.GetFirstVisibleLine();
  596. CHARRANGE cr;
  597. edit.GetSel(cr);
  598. int nline = edit.LineFromChar(cr.cpMin);
  599. CString strtext;
  600. EDITSTREAM stream;
  601. stream.dwCookie = (DWORD)&strtext;
  602. stream.pfnCallback = EditStreamCallbackOut;
  603. edit.StreamOut(SF_TEXT, stream);
  604. strtext.Replace(strtab, strspace);
  605. icrEditView->LoadText(strtext);
  606. icrEditView->GotoLine(nfirstline+1);
  607. int nlineindex = edit.LineIndex(nline);
  608. edit.SetSel(nlineindex, nlineindex);
  609. icrEditView->ShowCursorPosition();
  610. icrEditView->SetFocus();
  611. SaveTheContext();
  612. }
  613. void CMainFrame::OnEditSpacetotab()
  614. {
  615. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  616. CWaitCursor wc;
  617. TCHAR chr = 0x9;
  618. CString strtab = chr;
  619. int ntabsize = icrEditView->GetTabSize();
  620. CString strspace((char)0x20, ntabsize);
  621. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  622. int nfirstline = edit.GetFirstVisibleLine();
  623. CHARRANGE cr;
  624. edit.GetSel(cr);
  625. int nline = edit.LineFromChar(cr.cpMin);
  626. CString strtext;
  627. EDITSTREAM stream;
  628. stream.dwCookie = (DWORD)&strtext;
  629. stream.pfnCallback = EditStreamCallbackOut;
  630. edit.StreamOut(SF_TEXT, stream);
  631. strtext.Replace(strspace, strtab);
  632. icrEditView->LoadText(strtext);
  633. icrEditView->GotoLine(nfirstline+1);
  634. int nlineindex = edit.LineIndex(nline);
  635. edit.SetSel(nlineindex, nlineindex);
  636. icrEditView->ShowCursorPosition();
  637. icrEditView->SetFocus();
  638. SaveTheContext();
  639. }
  640. void CMainFrame::OnEditLeadingspacetotab()
  641. {
  642. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  643. CWaitCursor wc;
  644. int ntabsize = icrEditView->GetTabSize();
  645. CString strspace((char)0x20, ntabsize);
  646. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  647. int nfirstline = edit.GetFirstVisibleLine();
  648. CHARRANGE cr;
  649. edit.GetSel(cr);
  650. int nline = edit.LineFromChar(cr.cpMin);
  651. CString strtext;
  652. EDITSTREAM stream;
  653. stream.dwCookie = (DWORD)&strtext;
  654. stream.pfnCallback = EditStreamCallbackOut;
  655. edit.StreamOut(SF_TEXT, stream);
  656. CString strnewtext = _T(""), strline;
  657. int npos = strtext.Find('\n');
  658. while(npos!=-1) {
  659. int i=0;
  660. strline = strtext.Left(npos);
  661. while(strline[i]==0x20 || strline[i]==0x9)
  662. i++;
  663. CString strtmp = strline.Left(i);
  664. strtmp.Replace( strspace, _T("\t"));
  665. strline = strtmp + strline.Right(strline.GetLength()-i);
  666. strline += '\n';
  667. strtext = strtext.Right(strtext.GetLength()-npos-1);
  668. strnewtext += strline;
  669. npos = strtext.Find('\n');
  670. }
  671. icrEditView->LoadText(strnewtext);
  672. icrEditView->GotoLine(nfirstline+1);
  673. int nlineindex = edit.LineIndex(nline);
  674. edit.SetSel(nlineindex, nlineindex);
  675. icrEditView->ShowCursorPosition();
  676. icrEditView->SetFocus();
  677. SaveTheContext();
  678. }
  679. void CMainFrame::OnEditMoveright()
  680. {
  681. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  682. CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
  683. icrEditView->ShowWindow(SW_HIDE);
  684. int nfirstline, nendline;
  685. icrEditView->GetSelLine(nfirstline, nendline);
  686. CString strtext=_T(""), strline;
  687. BOOL bpriorlinerealreturn;
  688. int linenumber = nendline - nfirstline + 1;
  689. for(int i=0; i<linenumber; i++) {
  690. if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
  691. bpriorlinerealreturn = TRUE;
  692. else
  693. bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
  694. icrEditView->GetLineString(nfirstline+i, strline);
  695. if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
  696. int nselstart = SynCtrl.LineIndex(nfirstline+i);
  697. SynCtrl.SetSel(nselstart, nselstart);
  698. int noldlinecount = SynCtrl.GetLineCount();
  699. SynCtrl.ReplaceSel(_T("\t"), TRUE); //替换后可能引总行数增加
  700. int nnewlinecount = SynCtrl.GetLineCount();
  701. linenumber+=nnewlinecount-noldlinecount;
  702. }
  703. }
  704. int nselstart = SynCtrl.LineIndex(nfirstline);
  705. int nselend = SynCtrl.LineIndex(nfirstline+linenumber);
  706. SynCtrl.SetSel(nselstart, nselend);
  707. icrEditView->ShowWindow(SW_SHOW);
  708. }
  709. void CMainFrame::OnEditMoveleft()
  710. {
  711. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  712. CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
  713. icrEditView->ShowWindow(SW_HIDE);
  714. int nfirstline, nendline;
  715. icrEditView->GetSelLine(nfirstline, nendline);
  716. CString strtext=_T(""), strline;
  717. BOOL bpriorlinerealreturn;
  718. int linenumber = nendline - nfirstline + 1;
  719. for(int i=0; i<linenumber; i++) {
  720. if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
  721. bpriorlinerealreturn = TRUE;
  722. else
  723. bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
  724. icrEditView->GetLineString(nfirstline+i, strline);
  725. if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
  726. int nselstart = SynCtrl.LineIndex(nfirstline+i);
  727. SynCtrl.SetSel(nselstart, nselstart);
  728. if(strline.Left(1)==_T("\t")) {
  729. SynCtrl.SetSel(nselstart, nselstart+1);
  730. SynCtrl.ReplaceSel(_T(""), TRUE); //替换后可能引总行数减少
  731. }
  732. else {
  733. if(strline!=_T(" ")) { //之所以有此判断是因为如果是空行icrEditView->GetLineString会返回一个空格
  734. int ncount = (strline.GetLength()>icrEditView->GetTabSize()? strline.GetLength():icrEditView->GetTabSize());
  735. for(int j=0; j<ncount; j++) {
  736. if(strline[j]!=0x20)
  737. break;
  738. }
  739. SynCtrl.SetSel(nselstart, nselstart+j);
  740. SynCtrl.ReplaceSel(_T(""), TRUE); //替换后可能引总行数减少
  741. }
  742. }
  743. int noldlinecount = SynCtrl.GetLineCount();
  744. int nnewlinecount = SynCtrl.GetLineCount();
  745. linenumber+=nnewlinecount-noldlinecount;
  746. }
  747. }
  748. int nselstart = SynCtrl.LineIndex(nfirstline);
  749. int nselend = SynCtrl.LineIndex(nfirstline+linenumber);
  750. SynCtrl.SetSel(nselstart, nselend);
  751. icrEditView->ShowWindow(SW_SHOW);
  752. }
  753. void CMainFrame::OnEditUncomment()
  754. {
  755. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  756. CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
  757. int nfirstline, nendline;
  758. icrEditView->GetSelLine(nfirstline, nendline);
  759. //取当前语言对应的单行注释字符串
  760. CString strsinglecomment=icrEditView->GetSingleCommentString(icrEditView->GetLanguage());
  761. if(strsinglecomment.IsEmpty()) //若为空串表示当前没有进行语法关键字显示
  762. return;
  763. CString strtext=_T(""), strline;
  764. icrEditView->ShowWindow(SW_HIDE);
  765. BOOL bpriorlinerealreturn;
  766. int linenumber = nendline - nfirstline + 1;
  767. for(int i=0; i<linenumber; i++) {
  768. if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
  769. bpriorlinerealreturn = TRUE;
  770. else
  771. bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
  772. icrEditView->GetLineString(nfirstline+i, strline);
  773. if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
  774. int nselstart = SynCtrl.LineIndex(nfirstline+i);
  775. SynCtrl.SetSel(nselstart, nselstart);
  776. if(strline!=_T(" ")) {
  777. if(strline.Left(strsinglecomment.GetLength())==strsinglecomment)
  778. SynCtrl.SetSel(nselstart, nselstart+strsinglecomment.GetLength());
  779. else {
  780. CString strtmp = strline;
  781. if(strtmp.GetLength()!=0) {
  782. while(strtmp.GetAt(0)==0x20 || strtmp.GetAt(0)=='\t') {
  783. strtmp.TrimLeft(0x20);
  784. strtmp.TrimLeft('\t');
  785. if(strtmp.GetLength()==0)
  786. break;
  787. }
  788. if(strtmp.GetLength()>=strsinglecomment.GetLength() ) {
  789. if(strtmp.Left(strsinglecomment.GetLength())==strsinglecomment) {
  790. int npos = strline.Find(strsinglecomment);
  791. SynCtrl.SetSel( nselstart+npos, nselstart+npos+strsinglecomment.GetLength());
  792. }
  793. }
  794. }
  795. }
  796. }
  797. int noldlinecount=SynCtrl.GetLineCount();
  798. SynCtrl.ReplaceSel(_T(""), TRUE); //此行可能引起总的行数减少
  799. int nnewlinecount=SynCtrl.GetLineCount();
  800. linenumber+=nnewlinecount-noldlinecount;
  801. }
  802. }
  803. int nselstart = SynCtrl.LineIndex(nfirstline);
  804. int nselend = SynCtrl.LineIndex(nfirstline+linenumber);
  805. SynCtrl.SetSel(nselstart, nselend);
  806. icrEditView->ShowWindow(SW_SHOW);
  807. }
  808. void CMainFrame::OnEditComment()
  809. {
  810. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  811. CRichEditCtrl &SynCtrl = icrEditView->GetRichEditCtrl();
  812. int nfirstline, nendline;
  813. icrEditView->GetSelLine(nfirstline, nendline);
  814. //取当前语言对应的单行注释字符串
  815. CString strsinglecomment=icrEditView->GetSingleCommentString(icrEditView->GetLanguage());
  816. if(strsinglecomment.IsEmpty()) //若为空串表示当前没有进行语法关键字显示
  817. return;
  818. icrEditView->ShowWindow(SW_HIDE);
  819. CString strtext=_T(""), strline;
  820. BOOL bpriorlinerealreturn;
  821. int linenumber = nendline - nfirstline + 1;
  822. for(int i=0; i<linenumber; i++) {
  823. if(nfirstline+i-1<0)//判断前一行行末是否是硬回车
  824. bpriorlinerealreturn = TRUE;
  825. else
  826. bpriorlinerealreturn = icrEditView->GetLineString(nfirstline+i-1, strline);
  827. icrEditView->GetLineString(nfirstline+i, strline);
  828. if(bpriorlinerealreturn || nfirstline==nendline) { //如果上一行是真的换行
  829. int nselstart = SynCtrl.LineIndex(nfirstline+i);
  830. SynCtrl.SetSel(nselstart, nselstart);
  831. int noldlinecount = SynCtrl.GetLineCount();
  832. SynCtrl.ReplaceSel(strsinglecomment, TRUE);
  833. int nnewlinecount = SynCtrl.GetLineCount();
  834. linenumber+=nnewlinecount-noldlinecount;
  835. }
  836. }
  837. int nselstart = SynCtrl.LineIndex(nfirstline);
  838. int nselend = SynCtrl.LineIndex(nfirstline+linenumber);
  839. SynCtrl.SetSel(nselstart, nselend);
  840. icrEditView->ShowWindow(SW_SHOW);
  841. }
  842. void CMainFrame::OnEditLcase()
  843. {
  844. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  845. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  846. CHARRANGE cr;
  847. edit.GetSel(cr);
  848. CString strsel;
  849. EDITSTREAM stream;
  850. stream.dwCookie = (DWORD)&strsel;
  851. stream.pfnCallback = EditStreamCallbackOut;
  852. edit.StreamOut(SF_TEXT|SFF_SELECTION, stream);
  853. strsel.MakeLower();
  854. edit.ReplaceSel(strsel, TRUE);
  855. edit.SetSel(cr);
  856. }
  857. void CMainFrame::OnEditUcase()
  858. {
  859. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  860. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  861. CHARRANGE cr;
  862. edit.GetSel(cr);
  863. CString strsel;
  864. EDITSTREAM stream;
  865. stream.dwCookie = (DWORD)&strsel;
  866. stream.pfnCallback = EditStreamCallbackOut;
  867. edit.StreamOut(SF_TEXT|SFF_SELECTION, stream);
  868. strsel.MakeUpper();
  869. edit.ReplaceSel(strsel, TRUE);
  870. edit.SetSel(cr);
  871. }
  872. void CMainFrame::OnEditInvert()
  873. {
  874. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  875. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  876. CHARRANGE cr;
  877. edit.GetSel(cr);
  878. CString strsel;
  879. EDITSTREAM stream;
  880. stream.dwCookie = (DWORD)&strsel;
  881. stream.pfnCallback = EditStreamCallbackOut;
  882. edit.StreamOut(SF_TEXT|SFF_SELECTION, stream);
  883. for(int i=0; i<strsel.GetLength(); i++) {
  884. TCHAR ch = strsel[i];
  885. if( ch >='A' && ch <='Z' )
  886. strsel.SetAt(i, ch + 'a' - 'A');
  887. else if( ch >='a' && ch <='z' )
  888. strsel.SetAt(i, ch + 'A' - 'a');
  889. }
  890. edit.ReplaceSel(strsel, TRUE);
  891. edit.SetSel(cr);
  892. }
  893. void CMainFrame::OnEditCapitalize()
  894. {
  895. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  896. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  897. CHARRANGE cr;
  898. edit.GetSel(cr);
  899. CString strsel;
  900. EDITSTREAM stream;
  901. stream.dwCookie = (DWORD)&strsel;
  902. stream.pfnCallback = EditStreamCallbackOut;
  903. edit.StreamOut(SF_TEXT|SFF_SELECTION, stream);
  904. strsel.MakeLower();
  905. BOOL bIsChar = FALSE, bInString=FALSE;
  906. for(int i=0; i<strsel.GetLength(); i++) {
  907. TCHAR ch = strsel[i];
  908. if( ch >='a' && ch <='z' && !bIsChar) {
  909. strsel.SetAt(i, ch + 'A' - 'a');
  910. }
  911. if( (ch >='a' && ch <='z') || (ch >='A' && ch <='Z') )
  912. bIsChar = TRUE;
  913. else
  914. bIsChar = FALSE;
  915. }
  916. edit.ReplaceSel(strsel, TRUE);
  917. edit.SetSel(cr);
  918. }
  919. void CMainFrame::OnEditSentancecase()
  920. {
  921. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  922. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  923. CHARRANGE cr;
  924. edit.GetSel(cr);
  925. CString strsel;
  926. EDITSTREAM stream;
  927. stream.dwCookie = (DWORD)&strsel;
  928. stream.pfnCallback = EditStreamCallbackOut;
  929. edit.StreamOut(SF_TEXT|SFF_SELECTION, stream);
  930. BOOL bDo = TRUE;
  931. for(int i=0; i<strsel.GetLength(); i++) {
  932. TCHAR ch = strsel[i];
  933. if(ch == 0xa)
  934. bDo = TRUE;
  935. if( ((ch >='a' && ch <='z') || (ch >='A' && ch <='Z')) && bDo) {
  936. if( ch >='A' && ch <='Z' )
  937. strsel.SetAt(i, ch + 'a' - 'A');
  938. else
  939. strsel.SetAt(i, ch + 'A' - 'a');
  940. bDo = FALSE;
  941. }
  942. }
  943. edit.ReplaceSel(strsel, TRUE);
  944. edit.SetSel(cr);
  945. }
  946. CString CMainFrame::GetFileContext(CString strfile)
  947. {
  948. CString str=_T("");;
  949. CFileException fe;
  950. CFile file;
  951. file.Open(strfile, CFile::modeRead, &fe);
  952. if(fe.m_cause != CFileException::none) {
  953. fe.ReportError();
  954. return _T("");
  955. }
  956. DWORD dwSize=(DWORD)file.GetLength();
  957. if(dwSize==0)
  958. return _T("");
  959. try {
  960. LPSTR lpszContext=new TCHAR[1];
  961. file.Read(lpszContext, 1);
  962. if(*lpszContext==-1) {
  963. if(lpszContext!=NULL)
  964. delete lpszContext;
  965. LPWSTR lpsztext= new WCHAR[1];
  966. file.Read(lpsztext, 1);
  967. if(lpsztext!=NULL)
  968. delete lpsztext;
  969. lpsztext= new WCHAR[dwSize-1];
  970. DWORD dwRead=file.Read(lpsztext, dwSize-2);
  971. lpsztext[dwRead/2]=0;
  972. str=lpsztext;
  973. if(lpsztext!=NULL)
  974. delete lpsztext;
  975. }
  976. else {
  977. if(lpszContext!=NULL)
  978. delete lpszContext;
  979. lpszContext=new TCHAR[dwSize+2];
  980. file.Seek(0, CFile::begin);
  981. DWORD dwRead=file.Read(lpszContext, dwSize);
  982. file.Close();
  983. lpszContext[dwRead]='\0';
  984. str=lpszContext;
  985. if(lpszContext!=NULL)
  986. delete lpszContext;
  987. }
  988. }
  989. catch(...){}
  990. return str;
  991. }
  992. void CMainFrame::OnSelchangeComboFind()
  993. {
  994. }
  995. void CMainFrame::OnUpdateEditLcase(CCmdUI* pCmdUI)
  996. {
  997. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  998. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  999. CHARRANGE cr;
  1000. editctrl.GetSel(cr);
  1001. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  1002. }
  1003. void CMainFrame::OnUpdateEditInvert(CCmdUI* pCmdUI)
  1004. {
  1005. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1006. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  1007. CHARRANGE cr;
  1008. editctrl.GetSel(cr);
  1009. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  1010. }
  1011. void CMainFrame::OnUpdateEditSentancecase(CCmdUI* pCmdUI)
  1012. {
  1013. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1014. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  1015. CHARRANGE cr;
  1016. editctrl.GetSel(cr);
  1017. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  1018. }
  1019. void CMainFrame::OnUpdateEditUcase(CCmdUI* pCmdUI)
  1020. {
  1021. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1022. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  1023. CHARRANGE cr;
  1024. editctrl.GetSel(cr);
  1025. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  1026. }
  1027. void CMainFrame::OnFileNew()
  1028. {
  1029. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1030. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  1031. if(!m_strFileName.IsEmpty())
  1032. {
  1033. if(edit.GetModify())
  1034. {
  1035. if(MessageBox("文件已经修改,需要保存吗?", "", MB_YESNO|MB_ICONQUESTION)==IDYES)
  1036. {
  1037. SaveTheContext();
  1038. }
  1039. }
  1040. }
  1041. edit.SetWindowText("");
  1042. m_strFileName = "";
  1043. icrEditView->SetSynEditViewFont(icrEditView->GetSynEditViewFont());
  1044. }
  1045. void CMainFrame::OnFileSaveAs()
  1046. {
  1047. if(m_strFileName.IsEmpty())
  1048. {
  1049. CFileDialog fd ( FALSE, _T(""), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("*.srp|*.srp||"));
  1050. if(fd.DoModal()==IDCANCEL)
  1051. return;
  1052. m_strFileName = fd.GetPathName();
  1053. }
  1054. else
  1055. {
  1056. CString strFileName = m_strFileName;
  1057. int nPos= strFileName.ReverseFind('\\');
  1058. strFileName = strFileName.Right(strFileName.GetLength()-nPos-1);
  1059. CFileDialog fd ( FALSE, "", NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("*.srp|*.srp||"));
  1060. wsprintf(fd.m_ofn.lpstrFile, strFileName);
  1061. if(fd.DoModal()==IDCANCEL)
  1062. return;
  1063. m_strFileName = fd.GetPathName();
  1064. }
  1065. SaveTheContext();
  1066. }
  1067. void CMainFrame::OnFilesave()
  1068. {
  1069. if(m_strFileName.IsEmpty())
  1070. {
  1071. CFileDialog fd ( FALSE, _T(""), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("*.srp|*.srp||"));
  1072. if(fd.DoModal()==IDCANCEL)
  1073. return;
  1074. m_strFileName = fd.GetPathName();
  1075. }
  1076. SaveTheContext();
  1077. }
  1078. void CMainFrame::OnUpdateEditCapitalize(CCmdUI* pCmdUI)
  1079. {
  1080. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1081. CRichEditCtrl &editctrl=icrEditView->GetRichEditCtrl();
  1082. CHARRANGE cr;
  1083. editctrl.GetSel(cr);
  1084. pCmdUI->Enable(cr.cpMin!=cr.cpMax);
  1085. }
  1086. void CMainFrame::OnClose()
  1087. {
  1088. CIcrEditView *icrEditView = (CIcrEditView *)GetActiveView();
  1089. CRichEditCtrl &edit = icrEditView->GetRichEditCtrl();
  1090. if(edit.GetModify())
  1091. {
  1092. int nRet = MessageBox("文件已经修改,需要保存吗?", "", MB_YESNOCANCEL|MB_ICONQUESTION);
  1093. if(nRet==IDYES)
  1094. {
  1095. if(!m_strFileName.IsEmpty())
  1096. {
  1097. SaveTheContext();
  1098. }
  1099. else
  1100. {
  1101. CFileDialog fd ( FALSE, _T(""), NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("*.*|*.*||"));
  1102. if(fd.DoModal()==IDCANCEL)
  1103. return;
  1104. m_strFileName = fd.GetPathName();
  1105. SaveTheContext();
  1106. }
  1107. }
  1108. else if(nRet==IDCANCEL)
  1109. {
  1110. return;
  1111. }
  1112. }
  1113. CFrameWnd::OnClose();
  1114. }