home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ool_main.zip / ool / source / xmle.cpp < prev    next >
C/C++ Source or Header  |  1998-03-27  |  13KB  |  525 lines

  1. #include "xmle.h"
  2. #include "xmlesear.h"
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #include "xstring.h"
  7.  
  8. /*@
  9. @class XMultiLineEdit
  10. @parent XControl
  11. @type overview
  12. @symbol _
  13. */
  14.  
  15. /*@
  16. @class XMLESearch
  17. @type overview
  18. @symbol _
  19. @remarks XMLESearch is a helping class for searching/replacing text in a XMultiLineEdit.
  20. */
  21.  
  22.  
  23. /*@ XMLESearch::GetSearchItem(XString * s)
  24. @remarks Query the item which is to search
  25. @parameters XString * buffer
  26. */
  27. void XMLESearch::GetSearchItem(XString * s)
  28. {
  29.    strcpy(s->GetBuffer(sStruct.cchFind), sStruct.pchFind);
  30.    s->ReleaseBuffer(sStruct.cchFind);
  31. }
  32.  
  33.  
  34. /*@ XMLESearch::GetReplaceItem(XString * s)
  35. @remarks Query the item which is to insert
  36. @parameters XString * buffer
  37. */
  38. void XMLESearch::GetReplaceItem(XString * s)
  39. {
  40.    strcpy(s->GetBuffer(sStruct.cchReplace + 1), sStruct.pchReplace);
  41.    s->ReleaseBuffer(sStruct.cchReplace);
  42. }
  43.  
  44.  
  45. XMLESearch :: XMLESearch()
  46. {
  47.    memset(&sStruct, 0, sizeof(sStruct));
  48.    mode = MLFSEARCH_SELECTMATCH;
  49.    sStruct.iptStop = -1;
  50.    sStruct.cb = sizeof(sStruct);
  51. }
  52.  
  53.  
  54. /*@ XMLESearch::GetStartPoint(void)
  55. @remarks Query the point where the search starts.
  56. @returns LONG startPoint
  57. */
  58. LONG XMLESearch::GetStartPoint(void)
  59. {
  60.    return sStruct.iptStart;
  61. }
  62.  
  63.  
  64. /*@ XMLESearch::SetCaseSensitive(BOOL set)
  65. @remarks Set if the search is case-sensitive
  66. @parameters BOOL case   TRUE=case sensitive, FALSE=not case sensitive
  67. */
  68. void XMLESearch::SetCaseSensitive(BOOL set)
  69. {
  70.    if (set)
  71.       mode |= MLFSEARCH_CASESENSITIVE;
  72.    else if (mode & MLFSEARCH_CASESENSITIVE)
  73.       mode ^= MLFSEARCH_CASESENSITIVE;
  74. }
  75.  
  76.  
  77. /*@ XMLESearch::SetReplaceAll(BOOL set)
  78. @remarks Set if replacing should be done for all found strings
  79. @parameters BOOL case   TRUE=replace all, FALSE=not for all
  80. */
  81. void XMLESearch::SetReplaceAll(BOOL set)
  82. {
  83.    if (set)
  84.       mode |= MLFSEARCH_CHANGEALL;
  85.    else if (mode & MLFSEARCH_CHANGEALL)
  86.       mode ^= MLFSEARCH_CHANGEALL;
  87. }
  88.  
  89.  
  90. /*@ XMLESearch::SetSearchItem(char *item)
  91. @remarks Set the string to search for
  92. @parameters char * item      the string to search
  93. */
  94. void XMLESearch::SetSearchItem(char *item)
  95. {
  96.    SHORT i = strlen(item) + 1;
  97.  
  98.    sStruct.pchFind = (char *) realloc(sStruct.pchFind, i);
  99.    memcpy(sStruct.pchFind, item, i);
  100.    sStruct.cchFind = i - 1;
  101. }
  102.  
  103.  
  104. /*@ XMLESearch::SetReplaceItem(char *item)
  105. @remarks Set the string to replace with
  106. @parameters char * item      the string to replace with
  107. */
  108. void XMLESearch::SetReplaceItem(char *item)
  109. {
  110.    SHORT i = strlen(item) + 1;
  111.  
  112.    sStruct.pchReplace = (char *) realloc(sStruct.pchReplace, i);
  113.    memcpy(sStruct.pchReplace, item, i);
  114.    sStruct.cchReplace = i - 1;
  115. }
  116.  
  117.  
  118. /*@ XMLESearch::SetStartPoint(LONG x)
  119. @remarks Set the point where to start
  120. @parameters LONG point
  121. */
  122. void XMLESearch::SetStartPoint(LONG x)
  123. {
  124.    sStruct.iptStart = x;
  125. }
  126.  
  127.  
  128. /*@ XMLESearch::SetSearchEndPoint(LONG x)
  129. @remarks Set the point where to end the search
  130. @parameters LONG point   where to stop search (-1=search overall)
  131. */
  132. void XMLESearch::SetSearchEndPoint(LONG x)
  133. {
  134.    sStruct.iptStop = x;
  135. }
  136.  
  137.  
  138. XMLESearch :: ~XMLESearch()
  139. {
  140.    free(sStruct.pchReplace);
  141.    free(sStruct.pchFind);
  142. }
  143.  
  144. #define IMPORTBUFFER 10000
  145.  
  146. void XMultiLineEdit::SetText(const char *text)
  147. {
  148.    XWindow::SetText("");
  149.  
  150.    ULONG size = strlen(text);
  151.  
  152.    ULONG i = 0, n = 0;
  153.    char *s = (char *) text;
  154.  
  155.    LONG insert = 0;
  156.  
  157.    do
  158.    {
  159.       i = size - n;
  160.       if (i > 0)
  161.       {
  162.          if (i > IMPORTBUFFER)
  163.             i = IMPORTBUFFER;
  164.          WinSendMsg(winhandle, MLM_SETIMPORTEXPORT, MPFROMP(s), MPFROMLONG(i));
  165.          WinSendMsg(winhandle, MLM_IMPORT, MPFROMP(&insert), (MPARAM) i);
  166.          n += i;
  167.          s += i;
  168.       }
  169.    } while (i > 0);
  170. }
  171.  
  172.  
  173.  
  174. void XMultiLineEdit::GetText(XString * buffer) const
  175. {
  176.    LONG insert = 0;
  177.  
  178.    char string[IMPORTBUFFER + 1];
  179.    ULONG i, n = 0;
  180.  
  181.    i = GetTextLength();
  182.  
  183.    WinSendMsg(winhandle, MLM_SETIMPORTEXPORT, MPFROMP(string), (MPARAM) IMPORTBUFFER);
  184.    *buffer = "";
  185.  
  186.    do
  187.    {
  188.       if (i > 0)
  189.       {
  190.          n = (LONG) WinSendMsg(winhandle, MLM_EXPORT, MPFROMP(&insert), MPFROMP(&i));
  191.          string[n] = 0;
  192.          *buffer += string;
  193.       }
  194.    } while (i > 0);
  195. }
  196.  
  197.  
  198. /*@ XMultiLineEdit::EnableRefresh(const BOOL refresh)
  199. @group misc
  200. @remarks Enable/disable window-refresh
  201. @parameters BOOL enable    TRUE=enable, FALSE=disable refresh
  202. */
  203. void XMultiLineEdit::EnableRefresh(const BOOL refresh) const
  204. {
  205.    if (refresh)
  206.       WinSendMsg(winhandle, MLM_ENABLEREFRESH, 0, 0);
  207.    else
  208.       WinSendMsg(winhandle, MLM_DISABLEREFRESH, 0, 0);
  209. }
  210.  
  211.  
  212. /*@ XMultiLineEdit::GetLineFromChar(const LONG point)
  213. @group line related functions
  214. @remarks Query the line number of the point given in parameter 1
  215. @parameters LONG index
  216. @returns LONG line-number
  217. */
  218. LONG XMultiLineEdit::GetLineFromChar(const LONG point) const
  219. {
  220.    return (LONG) WinSendMsg(winhandle, MLM_LINEFROMCHAR, (MPARAM) point, 0);
  221. }
  222.  
  223.  
  224. /*@ XMultiLineEdit::GetLineLength(const LONG point)
  225. @group line related functions
  226. @remarks Query the length of the line which contains the point given in parameter 1
  227. @parameters LONG index
  228. @returns LONG length of the line
  229. */
  230. LONG XMultiLineEdit::GetLineLength(const LONG point) const
  231. {
  232.    return (LONG) WinSendMsg(winhandle, MLM_QUERYLINELENGTH, (MPARAM) point, 0);
  233. }
  234.  
  235.  
  236. /*@ XMultiLineEdit::GetLineStart(const LONG line)
  237. @group line related functions
  238. @remarks Query the starting point of the line given in parameter 1
  239. @parameters LONG line-number
  240. @returns LONG point of begining
  241. */
  242. LONG XMultiLineEdit::GetLineStart(const LONG line) const
  243. {
  244.    return (LONG) WinSendMsg(winhandle, MLM_CHARFROMLINE, (MPARAM) line, 0);
  245. }
  246.  
  247.  
  248. /*@ XMultiLineEdit::GetLineCount(void)
  249. @group line related functions
  250. @remarks Query the number of lines
  251. @returns LONG lines
  252. */
  253. LONG XMultiLineEdit::GetLineCount(void) const
  254. {
  255.    return (LONG) WinSendMsg(winhandle, MLM_QUERYLINECOUNT, 0, 0);
  256. }
  257.  
  258.  
  259. /*@ XMultiLineEdit::ResetUndo(void)
  260. @group undo
  261. @remarks Reset the undo-buffer
  262. */
  263. void XMultiLineEdit::ResetUndo(void) const
  264. {
  265.    WinSendMsg(winhandle, MLM_RESETUNDO, 0, 0);
  266. }
  267.  
  268.  
  269. /*@ XMultiLineEdit::EnableWrap(const BOOL wrap)
  270. @group wrap
  271. @remarks Enable/disable word-wrap
  272. @parameters BOOL wrap      TRUE=enable, FALSE=disable word-wrap
  273. */
  274. void XMultiLineEdit::EnableWrap(const BOOL wrap) const
  275. {
  276.    WinSendMsg(winhandle, MLM_SETWRAP, MPFROMSHORT(wrap), 0);
  277. }
  278.  
  279.  
  280. /*@ XMultiLineEdit::IsWrap(void)
  281. @group wrap
  282. @remarks Query if word-wrap is active
  283. @returns BOOL result
  284. */
  285. BOOL XMultiLineEdit::IsWrap(void) const
  286. {
  287.    return (BOOL) WinSendMsg(winhandle, MLM_QUERYWRAP, 0, 0);
  288. }
  289.  
  290.  
  291. /*@ XMultiLineEdit::IsReadOnly(void)
  292. @group misc
  293. @remarks Query if readonly-mode is active
  294. @returns BOOL result
  295. */
  296. BOOL XMultiLineEdit::IsReadOnly(void) const
  297. {
  298.    return (BOOL) WinSendMsg(winhandle, MLM_QUERYREADONLY, 0, 0);
  299. }
  300.  
  301.  
  302. /*@ XMultiLineEdit::SetReadOnly(const BOOL readOnly)
  303. @group misc
  304. @remarks Enable/disable readonly-mode
  305. @parameters BOOL readOnly     TRUE=enable, FALSE=disable readonly-mode
  306. */
  307. void XMultiLineEdit::SetReadOnly(const BOOL readOnly) const
  308. {
  309.    WinSendMsg(winhandle, MLM_SETREADONLY, MPFROMSHORT(readOnly), 0);
  310. }
  311.  
  312.  
  313. /*@ XMultiLineEdit::GetFirstChar(void)
  314. @group misc
  315. @remarks Query the number of the first visible char
  316. @returns LONG number
  317. */
  318. LONG XMultiLineEdit::GetFirstChar(void) const
  319. {
  320.    return SHORT1FROMMR(WinSendMsg(winhandle, MLM_QUERYFIRSTCHAR, 0, 0));
  321. }
  322.  
  323.  
  324. /*@ XMultiLineEdit :: XMultiLineEdit(const XWindow * owner, const XRect& rec, const USHORT id, const ULONG style, const char *string, const char *font)
  325. @group constructors/destructors
  326. @remarks Constructs an XMultiLineEdit
  327. @parameters <t '°' c=2>
  328.             °XWindow * owner      °the owner of the XMultiLineEdit
  329.             °XRect& rect         °the rectangle
  330.             °USHORT id            °id of the window
  331.             °ULONG style          °style, valid values are:
  332.                                  <t '°' c=1>
  333.                                     °MLE_BORDER
  334.                                     °MLE_READONLY
  335.                                     °MLE_WORDWRAP
  336.                                     °MLE_HORZSCROLL
  337.                                     °MLE_VERTSCROLL
  338.                                     °MLE_IGNORETAB
  339.                                     °MLE_DISABLEUNDO
  340.                                  </t>
  341.                                  (can be or-ed)
  342.             °const char * string  °text to display
  343.             </t>
  344. */
  345. XMultiLineEdit :: XMultiLineEdit(const XWindow * owner, const XRect& rec, const USHORT id, const ULONG style, const char *string, const char *font):XControl(&rec, style, owner, string, WC_MLE, id, font)
  346. {
  347. }
  348.  
  349.  
  350. /*@ XMultiLineEdit::GetSelection(LONG & start, LONG & end)
  351. @group clipboard functions and selection
  352. @remarks Query the boundarys of the current selection
  353. @parameters
  354. <t '°' c=2>
  355. °LONG& °starting point of selection
  356. °LONG& °end point
  357. </t>
  358. */
  359. void XMultiLineEdit::GetSelection(LONG & start, LONG & end)
  360. {
  361.    MRESULT mr = WinSendMsg(winhandle, MLM_QUERYSEL, (MPARAM) MLFQS_MINMAXSEL, 0);
  362.  
  363.    start = SHORT1FROMMR(mr);
  364.    end = SHORT2FROMMR(mr);
  365. }
  366.  
  367.  
  368. /*@ XMultiLineEdit::SetLimit(const LONG limit)
  369. @group misc
  370. @remarks Set maximum number of charakters
  371. @parameters LONG maximum size
  372. */
  373. void XMultiLineEdit::SetLimit(const LONG limit) const
  374. {
  375.    WinSendMsg(winhandle, MLM_SETTEXTLIMIT, (MPARAM) limit, 0);
  376. }
  377.  
  378.  
  379. /*@ XMultiLineEdit::EnableOverWrite(const BOOL overWrite)
  380. @group misc
  381. @remarks Enables/disables overwrite-mode
  382. @parameters BOOL overwrite    TRUE=overWrite, FALSE=disable overWrite
  383. */
  384. void XMultiLineEdit::EnableOverWrite(const BOOL overWrite) const
  385. {
  386.    BOOL o = FALSE;
  387.  
  388.    if (overWrite == FALSE)
  389.       o = TRUE;
  390.    WinSendMsg(winhandle, EM_SETINSERTMODE, MPFROMSHORT(o), 0);
  391. }
  392.  
  393.  
  394. /*@ XMultiLineEdit::CanUndo(void)
  395. @group undo
  396. @remarks Query if an undo-operation is possible
  397. @returns BOOL result
  398. */
  399. BOOL XMultiLineEdit::CanUndo(void) const
  400. {
  401.    return SHORT1FROMMR(WinSendMsg(winhandle, MLM_QUERYUNDO, 0, 0));
  402. }
  403.  
  404.  
  405. /*@ XMultiLineEdit::InsertString(const char *p)
  406. @group misc
  407. @remarks Insert a string at the current cursor-position
  408. @parameters const char * text to insert
  409. */
  410. void XMultiLineEdit::InsertString(const char *p) const
  411. {
  412.    WinSendMsg(winhandle, MLM_INSERT, MPFROMP(p), 0);
  413. }
  414.  
  415.  
  416. /*@ XMultiLineEdit::IsChanged(void)
  417. @group misc
  418. @remarks Query if the content has changed
  419. @returns BOOL result
  420. */
  421. BOOL XMultiLineEdit::IsChanged(void) const
  422. {
  423.    return (BOOL) WinSendMsg(winhandle, MLM_QUERYCHANGED, 0, 0);
  424. }
  425.  
  426.  
  427. /*@ XMultiLineEdit::GetTextLength(void)
  428. @group misc
  429. @remarks Returns the length of the text in the MLE including linebreaks (\n)
  430. @returns LONG length
  431. */
  432. LONG XMultiLineEdit::GetTextLength(void) const
  433. {
  434.    return (LONG) WinSendMsg(winhandle, MLM_QUERYTEXTLENGTH, 0, 0) + (LONG) WinSendMsg(winhandle, MLM_QUERYLINECOUNT, 0, 0);
  435. }
  436.  
  437.  
  438. /*@ XMultiLineEdit::SelectText(const LONG start, const LONG end)
  439. @group clipboard functions and selection
  440. @remarks Marks an area of text
  441. @parameters
  442. <t '°' c=2>
  443. °LONG °begin of marking-area
  444. °LONG °end of marking-area
  445. </t>
  446. */
  447. void XMultiLineEdit::SelectText(const LONG start, const LONG end) const
  448. {
  449.    WinSendMsg(winhandle, MLM_SETSEL, (MPARAM) start, (MPARAM) end);
  450. }
  451.  
  452.  
  453. /*@ XMultiLineEdit::ShowFirstChar(const LONG firstChar)
  454. @group misc
  455. @remarks Select the point of the text to start displaying
  456. @parameters LONG the first char to display
  457. */
  458. void XMultiLineEdit::ShowFirstChar(const LONG firstChar) const
  459. {
  460.    WinSendMsg(winhandle, MLM_SETFIRSTCHAR, MPFROMSHORT(firstChar), 0);
  461. }
  462.  
  463.  
  464. /*@ XMultiLineEdit::Undo(void)
  465. @group undo
  466. @remarks Undo the last action
  467. @returns BOOL result
  468. */
  469. BOOL XMultiLineEdit::Undo(void) const
  470. {
  471.    return SHORT1FROMMR(WinSendMsg(winhandle, MLM_UNDO, 0, 0));
  472. }
  473.  
  474.  
  475. /*@ XMultiLineEdit::Search(const XMLESearch * s)
  476. @group misc
  477. @remarks Search and/or replace strings in the text (see XMLESearch for details)
  478. @parameters XMLESearch *  searchClass  pointer to an initialized instance of XMLESearch
  479. @returns    BOOL result
  480. */
  481. BOOL XMultiLineEdit::Search(const XMLESearch * s) const
  482. {
  483.    return SHORT1FROMMR(WinSendMsg(winhandle, MLM_SEARCH, (MPARAM) s->mode, MPFROMP(&s->sStruct)));
  484. }
  485.  
  486.  
  487. /*@ XMultiLineEdit::Clear(void)
  488. @group clipboard functions and selection
  489. @remarks Clears marked text
  490. */
  491. void XMultiLineEdit::Clear(void) const
  492. {
  493.    WinSendMsg(winhandle, MLM_CLEAR, 0, 0);
  494. }
  495.  
  496.  
  497. /*@ XMultiLineEdit::Copy(void)
  498. @group clipboard functions and selection
  499. @remarks Copy marked text
  500. */
  501. void XMultiLineEdit::Copy(void) const
  502. {
  503.    WinSendMsg(winhandle, MLM_COPY, 0, 0);
  504. }
  505.  
  506.  
  507. /*@ XMultiLineEdit::Paste(void)
  508. @group clipboard functions and selection
  509. @remarks Paste text from the clipboard
  510. */
  511. void XMultiLineEdit::Paste(void) const
  512. {
  513.    WinSendMsg(winhandle, MLM_PASTE, 0, 0);
  514. }
  515.  
  516.  
  517. /*@ XMultiLineEdit::Cut(void)
  518. @group clipboard functions and selection
  519. @remarks Cut marked text
  520. */
  521. void XMultiLineEdit::Cut(void) const
  522. {
  523.    WinSendMsg(winhandle, MLM_CUT, 0, 0);
  524. }
  525.