|
1
|
1 #include "stdafx.h"
|
|
|
2 #include "wtl-pp.h"
|
|
|
3
|
|
|
4 void CEditPPHooks::DeleteLastWord( CEdit wnd, bool bForward ) {
|
|
|
5 if ( wnd.GetWindowLong(GWL_STYLE) & ES_READONLY ) return;
|
|
|
6 CString buffer;
|
|
|
7 if ( wnd.GetWindowText(buffer) <= 0 ) return;
|
|
|
8 const int len = buffer.GetLength();
|
|
|
9 int selStart = len, selEnd = len;
|
|
|
10 wnd.GetSel(selStart, selEnd);
|
|
|
11 if ( selStart < 0 || selStart > len ) selStart = len; // sanity
|
|
|
12 if ( selEnd < selStart ) selEnd = selStart; // sanity
|
|
|
13 int work = selStart;
|
|
|
14 if ( work == selEnd ) {
|
|
|
15 // Only do our stuff if there is nothing yet selected. Otherwise first delete selection.
|
|
|
16 if (bForward) {
|
|
|
17 // go forward (ctrl+del)
|
|
|
18 if (work < len && isSpecial(buffer[work])) { // linebreaks etc?
|
|
|
19 do ++ work; while( work < len && isSpecial(buffer[work]));
|
|
|
20 } else {
|
|
|
21 // delete apparent spacing
|
|
|
22 while ( work < len && isWordDelimiter(buffer[work])) ++ work;
|
|
|
23 // delete apparent word
|
|
|
24 while ( work < len && (!isWordDelimiter(buffer[work]) && !isSpecial(buffer[work]))) ++ work;
|
|
|
25 }
|
|
|
26
|
|
|
27 if ( selEnd < work ) {
|
|
|
28 wnd.SetSel(selEnd, work, TRUE );
|
|
|
29 wnd.ReplaceSel( TEXT(""), TRUE );
|
|
|
30 }
|
|
|
31 } else {
|
|
|
32 // go backward (ctrl+backspace)
|
|
|
33 if ( work > 0 && isSpecial(buffer[work-1])) { // linebreaks etc?
|
|
|
34 do --work; while( work > 0 && isSpecial(buffer[work-1]));
|
|
|
35 } else {
|
|
|
36 // delete apparent spacing
|
|
|
37 while( work > 0 && isWordDelimiter(buffer[work-1]) ) --work;
|
|
|
38 // delete apparent word
|
|
|
39 while( work > 0 && (!isWordDelimiter(buffer[work-1]) && !isSpecial(buffer[work-1]))) --work;
|
|
|
40 }
|
|
|
41 if ( selEnd > work ) {
|
|
|
42 wnd.SetSel(work, selEnd, TRUE );
|
|
|
43 wnd.ReplaceSel( TEXT(""), TRUE );
|
|
|
44 }
|
|
|
45 }
|
|
|
46 }
|
|
|
47 }
|