diff --git a/components/customdrawn/customdrawn_common.pas b/components/customdrawn/customdrawn_common.pas index 25181bb596..f53446036d 100644 --- a/components/customdrawn/customdrawn_common.pas +++ b/components/customdrawn/customdrawn_common.pas @@ -322,7 +322,7 @@ begin lCaptionHeight := GetMeasuresEx(ADest, TCDCONTROL_CAPTION_HEIGHT, AState, AStateEx); lTextTopSpacing := GetMeasures(TCDEDIT_TOP_TEXT_SPACING); - lTmpText := UTF8Copy(lControlText, 1, AStateEx.CaretPos-AStateEx.VisibleTextStart+1); + lTmpText := UTF8Copy(lControlText, 1, AStateEx.CaretPos.X-AStateEx.VisibleTextStart.X+1); lCaretPixelPos := ADest.TextWidth(lTmpText) + 3; ADest.Pen.Color := clBlack; ADest.Line(lCaretPixelPos, lTextTopSpacing, lCaretPixelPos, lTextTopSpacing+lCaptionHeight); @@ -352,21 +352,21 @@ begin // The text without selection if AStateEx.SelLength = 0 then begin - lVisibleText := UTF8Copy(lControlText, AStateEx.VisibleTextStart, lControlTextLen); + lVisibleText := UTF8Copy(lControlText, AStateEx.VisibleTextStart.X, lControlTextLen); ADest.TextOut(lTextLeftSpacing, lTextTopSpacing, lVisibleText); end // Text and Selection else begin - lSelLeftPos := AStateEx.SelStart; + lSelLeftPos := AStateEx.SelStart.X; if AStateEx.SelLength < 0 then lSelLeftPos := lSelLeftPos + AStateEx.SelLength; - lSelRightPos := AStateEx.SelStart; + lSelRightPos := AStateEx.SelStart.X; if AStateEx.SelLength > 0 then lSelRightPos := lSelRightPos + AStateEx.SelLength; lSelLength := AStateEx.SelLength; if lSelLength < 0 then lSelLength := lSelLength * -1; // Text left of the selection - lVisibleText := UTF8Copy(lControlText, AStateEx.VisibleTextStart, lSelLeftPos-AStateEx.VisibleTextStart+1); + lVisibleText := UTF8Copy(lControlText, AStateEx.VisibleTextStart.X, lSelLeftPos-AStateEx.VisibleTextStart.X+1); ADest.TextOut(4, lTextTopSpacing, lVisibleText); lSelLeftPixelPos := ADest.TextWidth(lVisibleText)+lTextLeftSpacing; diff --git a/components/customdrawn/customdrawn_wince.pas b/components/customdrawn/customdrawn_wince.pas index 17cbb78bcd..690b9b46bc 100644 --- a/components/customdrawn/customdrawn_wince.pas +++ b/components/customdrawn/customdrawn_wince.pas @@ -124,7 +124,7 @@ begin lCaptionHeight := GetMeasuresEx(ADest, TCDCONTROL_CAPTION_HEIGHT, AState, AStateEx); lTextTopSpacing := GetMeasures(TCDEDIT_TOP_TEXT_SPACING); - lTmpText := UTF8Copy(lControlText, 1, AStateEx.CaretPos-AStateEx.VisibleTextStart+1); + lTmpText := UTF8Copy(lControlText, 1, AStateEx.CaretPos.X-AStateEx.VisibleTextStart.X+1); lCaretPixelPos := ADest.TextWidth(lTmpText) + 3; ADest.Pen.Color := clBlack; ADest.Line(lCaretPixelPos, lTextTopSpacing, lCaretPixelPos, lTextTopSpacing+lCaptionHeight); diff --git a/components/customdrawn/customdrawncontrols.pas b/components/customdrawn/customdrawncontrols.pas index 1537002459..6e4401d581 100644 --- a/components/customdrawn/customdrawncontrols.pas +++ b/components/customdrawn/customdrawncontrols.pas @@ -151,7 +151,7 @@ type procedure DoManageVisibleTextStart; function GetText: string; procedure SetText(AValue: string); - function MousePosToCaretPos(X, Y: Integer): Integer; + function MousePosToCaretPos(X, Y: Integer): TPoint; protected // keyboard procedure DoEnter; override; @@ -455,7 +455,7 @@ end; procedure TCDEdit.DoDeleteSelection; begin - FEditState.SelStart := 1; + FEditState.SelStart.X := 1; FEditState.SelLength := 0; end; @@ -466,15 +466,15 @@ var lAvailableWidth: Integer; begin // Moved to the left and we need to adjust the text start - FEditState.VisibleTextStart := Min(FEditState.CaretPos+1, FEditState.VisibleTextStart); + FEditState.VisibleTextStart.X := Min(FEditState.CaretPos.X+1, FEditState.VisibleTextStart.X); // Moved to the right and we need to adjust the text start - lText := UTF8Copy(Text, FEditState.VisibleTextStart, Length(Text)); + lText := UTF8Copy(Text, FEditState.VisibleTextStart.X, Length(Text)); lAvailableWidth := Width - FDrawer.GetMeasures(TCDEDIT_LEFT_TEXT_SPACING) - FDrawer.GetMeasures(TCDEDIT_RIGHT_TEXT_SPACING); lVisibleTextCharCount := Canvas.TextFitInfo(lText, lAvailableWidth); - FEditState.VisibleTextStart := Max(FEditState.CaretPos-lVisibleTextCharCount, FEditState.VisibleTextStart); + FEditState.VisibleTextStart.X := Max(FEditState.CaretPos.X-lVisibleTextCharCount, FEditState.VisibleTextStart.X); end; procedure TCDEdit.SetText(AValue: string); @@ -482,8 +482,8 @@ begin Caption := AValue; end; -// returns a zero-based position of the caret -function TCDEdit.MousePosToCaretPos(X, Y: Integer): Integer; +// Result.X -> returns a zero-based position of the caret +function TCDEdit.MousePosToCaretPos(X, Y: Integer): TPoint; var lStrLen, i: PtrInt; lVisibleStr, lCurChar: String; @@ -493,7 +493,7 @@ var lCurDiff, lBestMatch: Integer; begin Canvas.Font := Font; - lVisibleStr := UTF8Copy(Text, FEditState.VisibleTextStart, Length(Text)); + lVisibleStr := UTF8Copy(Text, FEditState.VisibleTextStart.X, Length(Text)); lStrLen := UTF8Length(lVisibleStr); lPos := FDrawer.GetMeasures(TCDEDIT_LEFT_TEXT_SPACING); for i := 0 to lStrLen do @@ -508,7 +508,7 @@ begin end; // When the diff starts to grow we already found the caret pos, so exit - if lCurDiff > lLastDiff then Exit(lBestMatch) + if lCurDiff > lLastDiff then Break else lLastDiff := lCurDiff; if i <> lStrLen then @@ -519,7 +519,7 @@ begin end; end; - Exit(lBestMatch); + Result.X := lBestMatch; end; procedure TCDEdit.DoEnter; @@ -559,12 +559,12 @@ begin if FEditState.SelLength > 0 then DoDeleteSelection() // Normal backspace - else if FEditState.CaretPos > 0 then + else if FEditState.CaretPos.X > 0 then begin - lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos-1); - lRightText := UTF8Copy(lOldText, FEditState.CaretPos+1, lOldTextLength); + lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos.X-1); + lRightText := UTF8Copy(lOldText, FEditState.CaretPos.X+1, lOldTextLength); Text := lLeftText + lRightText; - Dec(FEditState.CaretPos); + Dec(FEditState.CaretPos.X); DoManageVisibleTextStart(); Invalidate; end; @@ -576,28 +576,28 @@ begin if FEditState.SelLength > 0 then DoDeleteSelection() // Normal delete - else if FEditState.CaretPos < lOldTextLength then + else if FEditState.CaretPos.X < lOldTextLength then begin - lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos); - lRightText := UTF8Copy(lOldText, FEditState.CaretPos+2, lOldTextLength); + lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos.X); + lRightText := UTF8Copy(lOldText, FEditState.CaretPos.X+2, lOldTextLength); Text := lLeftText + lRightText; Invalidate; end; end; VK_LEFT: begin - if (FEditState.CaretPos > 0) then + if (FEditState.CaretPos.X > 0) then begin // Selecting to the left if [ssShift] = Shift then begin - if FEditState.SelLength = 0 then FEditState.SelStart := FEditState.CaretPos; + if FEditState.SelLength = 0 then FEditState.SelStart.X := FEditState.CaretPos.X; Dec(FEditState.SelLength); end // Normal move to the left else FEditState.SelLength := 0; - Dec(FEditState.CaretPos); + Dec(FEditState.CaretPos.X); DoManageVisibleTextStart(); FEditState.CaretIsVisible := True; Invalidate; @@ -605,18 +605,18 @@ begin end; VK_RIGHT: begin - if FEditState.CaretPos < lOldTextLength then + if FEditState.CaretPos.X < lOldTextLength then begin // Selecting to the right if [ssShift] = Shift then begin - if FEditState.SelLength = 0 then FEditState.SelStart := FEditState.CaretPos; + if FEditState.SelLength = 0 then FEditState.SelStart.X := FEditState.CaretPos.X; Inc(FEditState.SelLength); end // Normal move to the right else FEditState.SelLength := 0; - Inc(FEditState.CaretPos); + Inc(FEditState.CaretPos.X); DoManageVisibleTextStart(); FEditState.CaretIsVisible := True; Invalidate; @@ -633,6 +633,16 @@ end; procedure TCDEdit.KeyUp(var Key: word; Shift: TShiftState); begin inherited KeyUp(Key, Shift); + + // copy, paste, cut, etc + if Shift = [ssCtrl] then + begin + case Key of + VK_C: + begin + end; + end; + end; end; procedure TCDEdit.UTF8KeyPress(var UTF8Key: TUTF8Char); @@ -649,10 +659,11 @@ begin // Normal characters lOldText := Text; - lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos); - lRightText := UTF8Copy(lOldText, FEditState.CaretPos+1, UTF8Length(lOldText)); + lLeftText := UTF8Copy(lOldText, 1, FEditState.CaretPos.X); + lRightText := UTF8Copy(lOldText, FEditState.CaretPos.X+1, UTF8Length(lOldText)); Text := lLeftText + UTF8Key + lRightText; - Inc(FEditState.CaretPos); + Inc(FEditState.CaretPos.X); + DoManageVisibleTextStart(); FEditState.EventArrived := True; FEditState.CaretIsVisible := True; Invalidate; @@ -667,7 +678,7 @@ begin // Caret positioning FEditState.CaretPos := MousePosToCaretPos(X, Y); FEditState.SelLength := 0; - FEditState.SelStart := FEditState.CaretPos; + FEditState.SelStart.X := FEditState.CaretPos.X; FEditState.EventArrived := True; FEditState.CaretIsVisible := True; Invalidate; @@ -681,7 +692,7 @@ begin if DragDropStarted then begin FEditState.CaretPos := MousePosToCaretPos(X, Y); - FEditState.SelLength := FEditState.CaretPos - FEditState.SelStart; + FEditState.SelLength := FEditState.CaretPos.X - FEditState.SelStart.X; FEditState.EventArrived := True; FEditState.CaretIsVisible := True; Invalidate; @@ -714,7 +725,7 @@ begin ControlStyle := ControlStyle - [csAcceptsControls]; // State information - FEditState.VisibleTextStart := 1; + FEditState.VisibleTextStart := Point(1, 1); // Caret code FCaretTimer := TTimer.Create(Self); diff --git a/components/customdrawn/customdrawndrawers.pas b/components/customdrawn/customdrawndrawers.pas index 46e6aa372f..1ec2a32c11 100644 --- a/components/customdrawn/customdrawndrawers.pas +++ b/components/customdrawn/customdrawndrawers.pas @@ -104,10 +104,10 @@ type TCDEditStateEx = class(TCDControlStateEx) public CaretIsVisible: Boolean; - CaretPos: Integer; // zero-based position - SelStart: Integer; // zero-based position + CaretPos: TPoint; // X is a zero-based position + SelStart: TPoint; // X is a zero-based position SelLength: Integer; // zero means no selection. Negative numbers selection to the left from the start and positive ones to the right - VisibleTextStart: Integer; // 1-based + VisibleTextStart: TPoint; // X is 1-based EventArrived: Boolean; // Added by event handlers and used by the caret so that it stops blinking while events are incoming end;