diff --git a/src/ce_editor.lfm b/src/ce_editor.lfm index 7038176d..3b502f15 100644 --- a/src/ce_editor.lfm +++ b/src/ce_editor.lfm @@ -115,11 +115,11 @@ inherited CEEditorWidget: TCEEditorWidget Caption = '-' end object mnuedUpcase: TMenuItem - Caption = 'Upper case selection' + Caption = 'Upper case' OnClick = mnuedUpcaseClick end object mnuedLowcase: TMenuItem - Caption = 'Lower case selection' + Caption = 'Lower case' OnClick = mnuedLowcaseClick end object MenuItem7: TMenuItem @@ -137,7 +137,7 @@ inherited CEEditorWidget: TCEEditorWidget Caption = 'Invert version all none' OnClick = mnuedInvAllNoneClick end - object MenuItem1: TMenuItem + object MenuItem12: TMenuItem Caption = '-' end object mnuedRename: TMenuItem diff --git a/src/ce_editor.pas b/src/ce_editor.pas index 6e50eb77..5606b385 100644 --- a/src/ce_editor.pas +++ b/src/ce_editor.pas @@ -52,9 +52,9 @@ type { TCEEditorWidget } TCEEditorWidget = class(TCEWidget, ICEDocumentObserver, ICEMultiDocHandler, ICEProjectObserver) - MenuItem1: TMenuItem; MenuItem10: TMenuItem; MenuItem11: TMenuItem; + MenuItem12: TMenuItem; mnuedNextCarea: TMenuItem; mnuedPrevCarea: TMenuItem; mnuedLowcase: TMenuItem; @@ -831,15 +831,14 @@ end; procedure TCEEditorWidget.mnuedUpcaseClick(Sender: TObject); begin - //TODO-ceditor: case-related commands are not implemented in synedit if fDoc.isNotNil then - fDoc.ExecuteCommand(ecLowerCaseBlock, #0, nil); + fDoc.CommandProcessor(ecUpperCaseWordOrSel, #0, nil); end; procedure TCEEditorWidget.mnuedLowcaseClick(Sender: TObject); begin if fDoc.isNotNil then - fDoc.ExecuteCommand(ecUpperCaseBlock, #0, nil); + fDoc.CommandProcessor(ecLowerCaseWordOrSel, #0, nil); end; procedure TCEEditorWidget.mnuedNextCareaClick(Sender: TObject); diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index 0edff12e..462f2494 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -9,7 +9,7 @@ uses SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView, SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs, - fpjson, jsonparser, + fpjson, jsonparser, LazUTF8, ce_common, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs, ce_sharedres, ce_dlang, ce_stringrange; @@ -195,6 +195,7 @@ type procedure handleStatusChanged(Sender: TObject; Changes: TSynStatusChanges); procedure gotoToChangedArea(next: boolean); procedure autoClosePair(value: TAutoClosedPair); + procedure setSelectionOrWordCase(upper: boolean); protected procedure DoEnter; override; procedure DoExit; override; @@ -289,6 +290,8 @@ const ecShowPhobosDoc = ecUserFirst + 14; ecPreviousChangedArea = ecUserFirst + 15; ecNextChangedArea = ecUserFirst + 16; + ecUpperCaseWordOrSel = ecUserFirst + 17; + ecLowerCaseWordOrSel = ecUserFirst + 18; var D2Syn: TSynD2Syn; // used as model to set the options when no editor exists. @@ -787,6 +790,8 @@ begin AddKey(ecShowPhobosDoc, VK_F1, [], 0, []); AddKey(ecPreviousChangedArea, VK_UP, [ssAlt], 0, []); AddKey(ecNextChangedArea, VK_DOWN, [ssAlt], 0, []); + addKey(ecLowerCaseWordOrSel, 0, [], 0, []); + addKey(ecUpperCaseWordOrSel, 0, [], 0, []); end; end; @@ -809,6 +814,8 @@ begin 'ecShowPhobosDoc': begin Int := ecShowPhobosDoc; exit(true); end; 'ecNextChangedArea': begin Int := ecNextChangedArea; 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); end; end; @@ -832,6 +839,8 @@ begin ecShowPhobosDoc: begin Ident := 'ecShowPhobosDoc'; exit(true); end; ecNextChangedArea: begin Ident := 'ecNextChangedArea'; 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); end; end; @@ -885,6 +894,10 @@ begin gotoToChangedArea(true); ecPreviousChangedArea: gotoToChangedArea(false); + ecUpperCaseWordOrSel: + setSelectionOrWordCase(true); + ecLowerCaseWordOrSel: + setSelectionOrWordCase(false); end; if fOverrideColMode and not SelAvail then begin @@ -1402,6 +1415,44 @@ begin ExecuteCommand(ecLeft, #0, nil); EndUndoBlock; 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} {$REGION DDoc & CallTip --------------------------------------------------------}