diff --git a/icons/other/case.png b/icons/other/case.png new file mode 100644 index 00000000..4b3f39ec Binary files /dev/null and b/icons/other/case.png differ diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi index ae1a21a0..47c740d1 100644 --- a/lazproj/coedit.lpi +++ b/lazproj/coedit.lpi @@ -13,7 +13,7 @@ - + @@ -97,6 +97,7 @@ + diff --git a/src/ce_editor.lfm b/src/ce_editor.lfm index c92e7841..7038176d 100644 --- a/src/ce_editor.lfm +++ b/src/ce_editor.lfm @@ -12,14 +12,14 @@ inherited CEEditorWidget: TCEEditorWidget ClientHeight = 434 ClientWidth = 465 inherited Content: TPanel - Height = 434 + Height = 398 Width = 465 - ClientHeight = 434 + ClientHeight = 398 ClientWidth = 465 object editorStatus: TStatusBar[0] Left = 0 Height = 20 - Top = 412 + Top = 376 Width = 465 AutoSize = False BorderSpacing.Bottom = 2 @@ -45,6 +45,9 @@ inherited CEEditorWidget: TCEEditorWidget UseSystemFont = False end end + inherited toolbar: TCEToolBar + Width = 457 + end end inherited contextMenu: TPopupMenu left = 24 @@ -86,6 +89,9 @@ inherited CEEditorWidget: TCEEditorWidget Caption = 'Redo' OnClick = mnuedRedoClick end + object MenuItem11: TMenuItem + Caption = '-' + end object mnuedPrev: TMenuItem Caption = 'Previous location' OnClick = mnuedPrevClick @@ -94,6 +100,28 @@ inherited CEEditorWidget: TCEEditorWidget Caption = 'Next location' OnClick = mnuedNextClick end + object MenuItem10: TMenuItem + Caption = '-' + end + object mnuedPrevCarea: TMenuItem + Caption = 'Previous changed area' + OnClick = mnuedPrevCareaClick + end + object mnuedNextCarea: TMenuItem + Caption = 'Next changed area' + OnClick = mnuedNextCareaClick + end + object MenuItem9: TMenuItem + Caption = '-' + end + object mnuedUpcase: TMenuItem + Caption = 'Upper case selection' + OnClick = mnuedUpcaseClick + end + object mnuedLowcase: TMenuItem + Caption = 'Lower case selection' + OnClick = mnuedLowcaseClick + end object MenuItem7: TMenuItem Caption = '-' end diff --git a/src/ce_editor.pas b/src/ce_editor.pas index ecde1887..6a0cbee4 100644 --- a/src/ce_editor.pas +++ b/src/ce_editor.pas @@ -9,7 +9,7 @@ uses ComCtrls, SynEditHighlighter, ExtCtrls, Menus, SynMacroRecorder, dialogs, SynPluginSyncroEdit, SynEdit, SynHighlighterMulti, ce_dialogs, ce_widget, ce_interfaces, ce_synmemo, ce_dlang, ce_common, ce_dcd, ce_observer, - ce_sharedres, ce_controls, ce_writableComponent; + ce_sharedres, ce_controls, ce_writableComponent, ce_dsgncontrols; type @@ -53,11 +53,18 @@ type TCEEditorWidget = class(TCEWidget, ICEMultiDocObserver, ICEMultiDocHandler, ICEProjectObserver) MenuItem1: TMenuItem; + MenuItem10: TMenuItem; + MenuItem11: TMenuItem; + mnuedNextCarea: TMenuItem; + mnuedPrevCarea: TMenuItem; + mnuedLowcase: TMenuItem; + mnuedUpcase: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; MenuItem5: TMenuItem; MenuItem6: TMenuItem; MenuItem8: TMenuItem; + MenuItem9: TMenuItem; mnuedRename: TMenuItem; mnuedInvAllNone: TMenuItem; mnuedComm: TMenuItem; @@ -76,6 +83,10 @@ type macRecorder: TSynMacroRecorder; editorStatus: TStatusBar; mnuEditor: TPopupMenu; + procedure mnuedNextCareaClick(Sender: TObject); + procedure mnuedPrevCareaClick(Sender: TObject); + procedure mnuedLowcaseClick(Sender: TObject); + procedure mnuedUpcaseClick(Sender: TObject); procedure MenuItem5Click(Sender: TObject); procedure MenuItem6Click(Sender: TObject); procedure MenuItem8Click(Sender: TObject); @@ -299,6 +310,10 @@ begin AssignPng(mnuedNext.Bitmap, 'GO_NEXT'); AssignPng(mnuedPrev.Bitmap, 'GO_PREVIOUS'); AssignPng(mnuedRename.Bitmap, 'PENCIL'); + AssignPng(mnuedUpcase.Bitmap, 'CASE'); + AssignPng(mnuedLowcase.Bitmap, 'CASE'); + AssignPng(mnuedNextCarea.Bitmap, 'GO_NEXT'); + AssignPng(mnuedPrevCarea.Bitmap, 'GO_PREVIOUS'); // EntitiesConnector.addObserver(self); EntitiesConnector.addSingleService(self); @@ -814,6 +829,31 @@ begin end; 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); +end; + +procedure TCEEditorWidget.mnuedLowcaseClick(Sender: TObject); +begin + if fDoc.isNotNil then + fDoc.ExecuteCommand(ecUpperCaseBlock, #0, nil); +end; + +procedure TCEEditorWidget.mnuedNextCareaClick(Sender: TObject); +begin + if fDoc.isNotNil then + fDoc.nextChangedArea; +end; + +procedure TCEEditorWidget.mnuedPrevCareaClick(Sender: TObject); +begin + if fDoc.isNotNil then + fDoc.previousChangedArea; +end; + procedure TCEEditorWidget.MenuItem8Click(Sender: TObject); var str: TStringList; diff --git a/src/ce_messages.pas b/src/ce_messages.pas index 13854809..753ac3e8 100644 --- a/src/ce_messages.pas +++ b/src/ce_messages.pas @@ -313,6 +313,8 @@ begin fBtns[amcMisc]:= btnSelMisc; fBtns[amcProj]:= btnSelProj; // + // reminder: a tollbar button can be used here because it would have the + // same size as the buttons used to select a category. btnClearCat.OnClick := @actClearCurCatExecute; AssignPng(btnClearCat, 'CLEAN'); // diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index 018f67c4..6b36f46f 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -175,6 +175,7 @@ type procedure showCallTips(const tips: string); function lexCanCloseBrace: boolean; procedure handleStatusChanged(Sender: TObject; Changes: TSynStatusChanges); + procedure gotoToChangedArea(next: boolean); protected procedure DoEnter; override; procedure DoExit; override; @@ -211,6 +212,8 @@ type procedure showDDocs; procedure hideDDocs; procedure ShowPhobosDoc; + procedure nextChangedArea; + procedure previousChangedArea; procedure copy; // function breakPointsCount: integer; @@ -263,6 +266,8 @@ const ecRenameIdentifier = ecUserFirst + 12; ecCommentIdentifier = ecUserFirst + 13; ecShowPhobosDoc = ecUserFirst + 14; + ecPreviousChangedArea = ecUserFirst + 15; + ecNextChangedArea = ecUserFirst + 16; var D2Syn: TSynD2Syn; // used as model to set the options when no editor exists. @@ -753,6 +758,8 @@ begin AddKey(ecRenameIdentifier, VK_F2, [], 0, []); AddKey(ecCommentIdentifier, 0, [], 0, []); AddKey(ecShowPhobosDoc, VK_F1, [], 0, []); + AddKey(ecPreviousChangedArea, VK_UP, [ssAlt], 0, []); + AddKey(ecNextChangedArea, VK_DOWN, [ssAlt], 0, []); end; end; @@ -773,6 +780,8 @@ begin 'ecRenameIdentifier': begin Int := ecRenameIdentifier; exit(true); end; 'ecCommentIdentifier': begin Int := ecCommentIdentifier; exit(true); end; 'ecShowPhobosDoc': begin Int := ecShowPhobosDoc; exit(true); end; + 'ecNextChangedArea': begin Int := ecNextChangedArea; exit(true); end; + 'ecPreviousChangedArea':begin Int := ecPreviousChangedArea; exit(true); end; else exit(false); end; end; @@ -794,6 +803,8 @@ begin ecRenameIdentifier: begin Ident := 'ecRenameIdentifier'; exit(true); end; ecCommentIdentifier: begin Ident := 'ecCommentIdentifier'; exit(true); end; ecShowPhobosDoc: begin Ident := 'ecShowPhobosDoc'; exit(true); end; + ecNextChangedArea: begin Ident := 'ecNextChangedArea'; exit(true); end; + ecPreviousChangedArea:begin Ident := 'ecPreviousChangedArea'; exit(true); end; else exit(false); end; end; @@ -843,6 +854,10 @@ begin commentIdentifier; ecShowPhobosDoc: ShowPhobosDoc; + ecNextChangedArea: + gotoToChangedArea(true); + ecPreviousChangedArea: + gotoToChangedArea(false); end; if fOverrideColMode and not SelAvail then begin @@ -1223,6 +1238,56 @@ begin {$ENDIF} end; +procedure TCESynMemo.nextChangedArea; +begin + gotoToChangedArea(true); +end; + +procedure TCESynMemo.previousChangedArea; +begin + gotoToChangedArea(false); +end; + +procedure TCESynMemo.gotoToChangedArea(next: boolean); +var + i: integer; + s: TSynLineState; + d: integer; + b: integer = 0; + p: TPoint; +begin + i := CaretY - 1; + s := GetLineState(i); + case next of + true: begin d := 1; b := lines.count-1; end; + false:d := -1; + end; + if i = b then + exit; + // exit the current area if it's modified + while s <> slsNone do + begin + s := GetLineState(i); + if i = b then + exit; + i += d; + end; + // find next modified area + while s = slsNone do + begin + s := GetLineState(i); + if i = b then + break; + i += d; + end; + // goto area beg/end + if (s <> slsNone) and (i <> CaretY + 1) then + begin + p.X:= 1; + p.Y:= i + 1 - d; + ExecuteCommand(ecGotoXY, #0, @p); + end; +end; {$ENDREGION} {$REGION DDoc & CallTip --------------------------------------------------------}