add editor commands to change sel/word case, close #87

This commit is contained in:
Basile Burg 2016-07-11 02:35:13 +02:00
parent 51b70a8d76
commit 0d767dd129
3 changed files with 58 additions and 8 deletions

View File

@ -115,11 +115,11 @@ inherited CEEditorWidget: TCEEditorWidget
Caption = '-' Caption = '-'
end end
object mnuedUpcase: TMenuItem object mnuedUpcase: TMenuItem
Caption = 'Upper case selection' Caption = 'Upper case'
OnClick = mnuedUpcaseClick OnClick = mnuedUpcaseClick
end end
object mnuedLowcase: TMenuItem object mnuedLowcase: TMenuItem
Caption = 'Lower case selection' Caption = 'Lower case'
OnClick = mnuedLowcaseClick OnClick = mnuedLowcaseClick
end end
object MenuItem7: TMenuItem object MenuItem7: TMenuItem
@ -137,7 +137,7 @@ inherited CEEditorWidget: TCEEditorWidget
Caption = 'Invert version all none' Caption = 'Invert version all none'
OnClick = mnuedInvAllNoneClick OnClick = mnuedInvAllNoneClick
end end
object MenuItem1: TMenuItem object MenuItem12: TMenuItem
Caption = '-' Caption = '-'
end end
object mnuedRename: TMenuItem object mnuedRename: TMenuItem

View File

@ -52,9 +52,9 @@ type
{ TCEEditorWidget } { TCEEditorWidget }
TCEEditorWidget = class(TCEWidget, ICEDocumentObserver, ICEMultiDocHandler, ICEProjectObserver) TCEEditorWidget = class(TCEWidget, ICEDocumentObserver, ICEMultiDocHandler, ICEProjectObserver)
MenuItem1: TMenuItem;
MenuItem10: TMenuItem; MenuItem10: TMenuItem;
MenuItem11: TMenuItem; MenuItem11: TMenuItem;
MenuItem12: TMenuItem;
mnuedNextCarea: TMenuItem; mnuedNextCarea: TMenuItem;
mnuedPrevCarea: TMenuItem; mnuedPrevCarea: TMenuItem;
mnuedLowcase: TMenuItem; mnuedLowcase: TMenuItem;
@ -831,15 +831,14 @@ end;
procedure TCEEditorWidget.mnuedUpcaseClick(Sender: TObject); procedure TCEEditorWidget.mnuedUpcaseClick(Sender: TObject);
begin begin
//TODO-ceditor: case-related commands are not implemented in synedit
if fDoc.isNotNil then if fDoc.isNotNil then
fDoc.ExecuteCommand(ecLowerCaseBlock, #0, nil); fDoc.CommandProcessor(ecUpperCaseWordOrSel, #0, nil);
end; end;
procedure TCEEditorWidget.mnuedLowcaseClick(Sender: TObject); procedure TCEEditorWidget.mnuedLowcaseClick(Sender: TObject);
begin begin
if fDoc.isNotNil then if fDoc.isNotNil then
fDoc.ExecuteCommand(ecUpperCaseBlock, #0, nil); fDoc.CommandProcessor(ecLowerCaseWordOrSel, #0, nil);
end; end;
procedure TCEEditorWidget.mnuedNextCareaClick(Sender: TObject); procedure TCEEditorWidget.mnuedNextCareaClick(Sender: TObject);

View File

@ -9,7 +9,7 @@ uses
SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText,
SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView,
SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs, SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs,
fpjson, jsonparser, fpjson, jsonparser, LazUTF8,
ce_common, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs, ce_common, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs,
ce_sharedres, ce_dlang, ce_stringrange; ce_sharedres, ce_dlang, ce_stringrange;
@ -195,6 +195,7 @@ type
procedure handleStatusChanged(Sender: TObject; Changes: TSynStatusChanges); procedure handleStatusChanged(Sender: TObject; Changes: TSynStatusChanges);
procedure gotoToChangedArea(next: boolean); procedure gotoToChangedArea(next: boolean);
procedure autoClosePair(value: TAutoClosedPair); procedure autoClosePair(value: TAutoClosedPair);
procedure setSelectionOrWordCase(upper: boolean);
protected protected
procedure DoEnter; override; procedure DoEnter; override;
procedure DoExit; override; procedure DoExit; override;
@ -289,6 +290,8 @@ const
ecShowPhobosDoc = ecUserFirst + 14; ecShowPhobosDoc = ecUserFirst + 14;
ecPreviousChangedArea = ecUserFirst + 15; ecPreviousChangedArea = ecUserFirst + 15;
ecNextChangedArea = ecUserFirst + 16; ecNextChangedArea = ecUserFirst + 16;
ecUpperCaseWordOrSel = ecUserFirst + 17;
ecLowerCaseWordOrSel = ecUserFirst + 18;
var var
D2Syn: TSynD2Syn; // used as model to set the options when no editor exists. D2Syn: TSynD2Syn; // used as model to set the options when no editor exists.
@ -787,6 +790,8 @@ begin
AddKey(ecShowPhobosDoc, VK_F1, [], 0, []); AddKey(ecShowPhobosDoc, VK_F1, [], 0, []);
AddKey(ecPreviousChangedArea, VK_UP, [ssAlt], 0, []); AddKey(ecPreviousChangedArea, VK_UP, [ssAlt], 0, []);
AddKey(ecNextChangedArea, VK_DOWN, [ssAlt], 0, []); AddKey(ecNextChangedArea, VK_DOWN, [ssAlt], 0, []);
addKey(ecLowerCaseWordOrSel, 0, [], 0, []);
addKey(ecUpperCaseWordOrSel, 0, [], 0, []);
end; end;
end; end;
@ -809,6 +814,8 @@ begin
'ecShowPhobosDoc': begin Int := ecShowPhobosDoc; exit(true); end; 'ecShowPhobosDoc': begin Int := ecShowPhobosDoc; exit(true); end;
'ecNextChangedArea': begin Int := ecNextChangedArea; exit(true); end; 'ecNextChangedArea': begin Int := ecNextChangedArea; exit(true); end;
'ecPreviousChangedArea':begin Int := ecPreviousChangedArea; exit(true); end; 'ecPreviousChangedArea':begin Int := ecPreviousChangedArea; exit(true); end;
'ecUpperCaseWordOrSel': begin Int := ecUpperCaseWordOrSel; exit(true); end;
'ecLowerCaseWordOrSel': begin Int := ecLowerCaseWordOrSel; exit(true); end;
else exit(false); else exit(false);
end; end;
end; end;
@ -832,6 +839,8 @@ begin
ecShowPhobosDoc: begin Ident := 'ecShowPhobosDoc'; exit(true); end; ecShowPhobosDoc: begin Ident := 'ecShowPhobosDoc'; exit(true); end;
ecNextChangedArea: begin Ident := 'ecNextChangedArea'; exit(true); end; ecNextChangedArea: begin Ident := 'ecNextChangedArea'; exit(true); end;
ecPreviousChangedArea:begin Ident := 'ecPreviousChangedArea'; exit(true); end; ecPreviousChangedArea:begin Ident := 'ecPreviousChangedArea'; exit(true); end;
ecUpperCaseWordOrSel: begin Ident := 'ecUpperCaseWordOrSel'; exit(true); end;
ecLowerCaseWordOrSel: begin Ident := 'ecLowerCaseWordOrSel'; exit(true); end;
else exit(false); else exit(false);
end; end;
end; end;
@ -885,6 +894,10 @@ begin
gotoToChangedArea(true); gotoToChangedArea(true);
ecPreviousChangedArea: ecPreviousChangedArea:
gotoToChangedArea(false); gotoToChangedArea(false);
ecUpperCaseWordOrSel:
setSelectionOrWordCase(true);
ecLowerCaseWordOrSel:
setSelectionOrWordCase(false);
end; end;
if fOverrideColMode and not SelAvail then if fOverrideColMode and not SelAvail then
begin begin
@ -1402,6 +1415,44 @@ begin
ExecuteCommand(ecLeft, #0, nil); ExecuteCommand(ecLeft, #0, nil);
EndUndoBlock; EndUndoBlock;
end; end;
procedure TCESynMemo.setSelectionOrWordCase(upper: boolean);
var
i: integer;
txt: string;
begin
if SelAvail then
begin
BeginUndoBlock;
case upper of
false: txt := UTF8LowerString(SelText);
true: txt := UTF8UpperString(SelText);
end;
ExecuteCommand(ecBlockDelete, #0, nil);
for i:= 1 to txt.length do
case txt[i] of
#13: continue;
#10: ExecuteCommand(ecLineBreak, #0, nil);
else ExecuteCommand(ecChar, txt[i], nil);
end;
EndUndoBlock;
end else
begin
txt := GetWordAtRowCol(LogicalCaretXY);
if txt.isBlank then
exit;
BeginUndoBlock;
ExecuteCommand(ecWordLeft, #0, nil);
case upper of
false: txt := UTF8LowerString(txt);
true: txt := UTF8UpperString(txt);
end;
ExecuteCommand(ecDeleteWord, #0, nil);
for i:= 1 to txt.length do
ExecuteCommand(ecChar, txt[i], nil);
EndUndoBlock;
end;
end;
{$ENDREGION} {$ENDREGION}
{$REGION DDoc & CallTip --------------------------------------------------------} {$REGION DDoc & CallTip --------------------------------------------------------}