Browse Source

* OK, now _this_ is the originally meant version with the fixed
selection handling ;)

sg 25 years ago
parent
commit
266ea77c74
1 changed files with 34 additions and 15 deletions
  1. 34 15
      fcl/shedit/shedit.pp

+ 34 - 15
fcl/shedit/shedit.pp

@@ -416,36 +416,51 @@ begin
 end;
 end;
 
 
 procedure TSHTextEdit.EndSelectionChange;
 procedure TSHTextEdit.EndSelectionChange;
+
+  procedure RedrawArea(x1, y1, x2, y2: Integer);
+  begin
+    // WriteLn('Redraw: ', x1, '/', y1, ' - ', x2, '/', y2);
+    if y1 = y2 then
+      FWidget.InvalidateRect(x1, y1, x2, y2)
+    else begin
+      FWidget.InvalidateRect(x1, y1, x1 + FWidget.PageWidth, y1);
+      if y1 < y2 - 1 then
+        FWidget.InvalidateRect(0, y1+1, FWidget.PageWidth, y2 - 1);
+      FWidget.InvalidateRect(0, y2, x2, y2+1);
+    end;
+  end;
+
 begin
 begin
   if not OldSelValid then begin
   if not OldSelValid then begin
     if FSel.IsValid then
     if FSel.IsValid then
-      FWidget.InvalidateRect(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
+      RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
   end else begin
   end else begin
     if not FSel.IsValid then
     if not FSel.IsValid then
-      FWidget.InvalidateRect(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY)
+      RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY)
     else begin
     else begin
       // Do OldSel and FSel intersect?
       // Do OldSel and FSel intersect?
       if (OldSelEndY < FSel.OStartY) or (OldSelStartY > FSel.OEndY) or
       if (OldSelEndY < FSel.OStartY) or (OldSelStartY > FSel.OEndY) or
          ((OldSelEndY = FSel.OStartY) and (OldSelEndX <= FSel.OStartX)) or
          ((OldSelEndY = FSel.OStartY) and (OldSelEndX <= FSel.OStartX)) or
-         ((OldSelStartY = FSel.OEndY) and (OldSelStartX >= FSel.OEndX)) then begin
-         FWidget.InvalidateRect(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY);
-         FWidget.InvalidateRect(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
+         ((OldSelStartY = FSel.OEndY) and (OldSelStartX >= FSel.OEndX)) then
+      begin
+        RedrawArea(OldSelStartX, OldSelStartY, OldSelEndX, OldSelEndY);
+        RedrawArea(FSel.OStartX, FSel.OStartY, FSel.OEndX, FSel.OEndY);
       end else begin
       end else begin
         // Intersection => determine smallest possible area(s) to redraw
         // Intersection => determine smallest possible area(s) to redraw
         // 1. Check if the start position has changed
         // 1. Check if the start position has changed
         if (OldSelStartX <> FSel.OStartX) or (OldSelStartY <> FSel.OStartY) then
         if (OldSelStartX <> FSel.OStartX) or (OldSelStartY <> FSel.OStartY) then
           if (OldSelStartY < FSel.OStartY) or ((OldSelStartY = FSel.OStartY) and
           if (OldSelStartY < FSel.OStartY) or ((OldSelStartY = FSel.OStartY) and
              (OldSelStartX < FSel.OStartX)) then
              (OldSelStartX < FSel.OStartX)) then
-            FWidget.InvalidateRect(OldSelStartX, OldSelStartY, FSel.OStartX, FSel.OStartY)
-          else
-            FWidget.InvalidateRect(FSel.OStartX, FSel.OStartY, OldSelStartX, OldSelStartY);
-        // 2. Check if end position has changed
-        if (OldSelEndX <> FSel.OEndX) or (OldSelEndY <> FSel.OEndY) then
-          if (OldSelEndY < FSel.OEndY) or ((OldSelEndY = FSel.OEndY) and
-             (OldSelEndX < FSel.OEndX)) then
-            FWidget.InvalidateRect(OldSelEndX, OldSelEndY, FSel.OEndX, FSel.OEndY)
+            RedrawArea(OldSelStartX, OldSelStartY, FSel.OStartX, FSel.OStartY)
           else
           else
-            FWidget.InvalidateRect(FSel.OEndX, FSel.OEndY, OldSelEndX, OldSelEndY);
+            RedrawArea(FSel.OStartX, FSel.OStartY, OldSelStartX, OldSelStartY);
+          // 2. Check if end position has changed
+          if (OldSelEndX <> FSel.OEndX) or (OldSelEndY <> FSel.OEndY) then
+            if (OldSelEndY < FSel.OEndY) or ((OldSelEndY = FSel.OEndY) and
+               (OldSelEndX < FSel.OEndX)) then
+              RedrawArea(OldSelEndX, OldSelEndY, FSel.OEndX, FSel.OEndY)
+            else
+              RedrawArea(FSel.OEndX, FSel.OEndY, OldSelEndX, OldSelEndY);
       end;
       end;
     end;
     end;
   end;
   end;
@@ -458,7 +473,11 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.12  2000-01-07 01:24:34  peter
+  Revision 1.13  2000-01-07 13:24:31  sg
+  * OK, now _this_ is the originally meant version with the fixed
+    selection handling ;)
+
+  Revision 1.12  2000/01/07 01:24:34  peter
     * updated copyright to 2000
     * updated copyright to 2000
 
 
   Revision 1.11  2000/01/06 16:43:35  sg
   Revision 1.11  2000/01/06 16:43:35  sg