cleanup
authorAlexey Kudravtsev <cdr@intellij.com>
Tue, 18 Oct 2016 11:56:29 +0000 (14:56 +0300)
committerAlexey Kudravtsev <cdr@intellij.com>
Tue, 18 Oct 2016 12:01:21 +0000 (15:01 +0300)
platform/editor-ui-api/src/com/intellij/openapi/editor/FoldingModel.java
platform/editor-ui-api/src/com/intellij/openapi/editor/GutterMarkPreprocessor.java
platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java
platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionsTree.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingAnchorsOverlayStrategy.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java

index 9102bc216779c04867cafc88d20f4d7cc286d995..09c25b917c7faad57f63a10913da56299fb31431 100644 (file)
@@ -27,13 +27,13 @@ import org.jetbrains.annotations.Nullable;
 public interface FoldingModel {
   /**
    * Adds a fold region for the specified range of the document. This method must be called
-   * from the <code>Runnable</code> passed to {@link #runBatchFoldingOperation(Runnable)}.
+   * from the {@code Runnable} passed to {@link #runBatchFoldingOperation(Runnable)}.
    * The region is initially not folded.
    *
    * @param startOffset     the start offset of the region to fold.
    * @param endOffset       the end offset of the region to fold.
    * @param placeholderText the text to display instead of the region contents when the region is folded.
-   * @return the fold region, or <code>null</code> if folding is currently disabled or corresponding region cannot be added (e.g. if it
+   * @return the fold region, or {@code null} if folding is currently disabled or corresponding region cannot be added (e.g. if it
    * intersects with another existing region)
    */
   @Nullable
@@ -41,16 +41,16 @@ public interface FoldingModel {
 
   /**
    * Tries to add given region to the folding model. This method must be called
-   * from the <code>Runnable</code> passed to {@link #runBatchFoldingOperation(Runnable)}.
+   * from the {@code Runnable} passed to {@link #runBatchFoldingOperation(Runnable)}.
    *
-   * @return <code>true</code>, if region was added successfully, <code>false</code> if the region cannot be added, e.g. if it
+   * @return {@code true}, if region was added successfully, {@code false} if the region cannot be added, e.g. if it
    * intersects with another existing region
    */
   boolean addFoldRegion(@NotNull FoldRegion region);
 
   /**
    * Removes the specified fold region. This method must be called
-   * from the <code>Runnable</code> passed to {@link #runBatchFoldingOperation(Runnable)}.
+   * from the {@code Runnable} passed to {@link #runBatchFoldingOperation(Runnable)}.
    *
    * @param region the region to remove.
    */
@@ -79,7 +79,7 @@ public interface FoldingModel {
   boolean isOffsetCollapsed(int offset);
 
   /**
-   * Returns collapsed folded region at a given offset or <code>null</code> if there's no such region. Returned region will satisfy the
+   * Returns collapsed folded region at a given offset or {@code null} if there's no such region. Returned region will satisfy the
    * following condition: region.getStartOffset() <= offset < region.getEndOffset()
    * <br>
    * This method can return incorrect data if it's invoked in the context of {@link #runBatchFoldingOperation(Runnable)} invocation.
@@ -90,7 +90,7 @@ public interface FoldingModel {
   FoldRegion getCollapsedRegionAtOffset(int offset);
 
   /**
-   * Returns fold region with given boundaries, if it exists, or <code>null</code> otherwise. 
+   * Returns fold region with given boundaries, if it exists, or {@code null} otherwise.
    */
   @Nullable
   FoldRegion getFoldRegion(int startOffset, int endOffset);
index 8a93eceed3f5fd2ca2e2f426f1b6dc2b1d067779..b6f714938491e8b3b753c4b29e85b9d40ee2c9b8 100644 (file)
@@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 
+@FunctionalInterface
 public interface GutterMarkPreprocessor {
   ExtensionPointName<GutterMarkPreprocessor> EP_NAME = ExtensionPointName.create("com.intellij.gutterMarkPreprocessor");
 
index 2c319b2280b113f3ebfd914b80b13468b181af28..4f210a41330aa3b45dbfb898741fa2053cf44ec2 100644 (file)
@@ -56,7 +56,7 @@ class FoldingModelWindow implements FoldingModelEx{
   }
 
   @Override
-  public FoldRegion getFoldingPlaceholderAt(Point p) {
+  public FoldRegion getFoldingPlaceholderAt(@NotNull Point p) {
     return myDelegate.getFoldingPlaceholderAt(p);
   }
 
index 3dafa995d687c05ac8afbbe11bd14a6c8e11a3f6..d0af884eb9ce09f4bef543632ce9b2096a313934 100644 (file)
@@ -33,7 +33,7 @@ public interface FoldingModelEx extends FoldingModel {
   void setFoldingEnabled(boolean isEnabled);
   boolean isFoldingEnabled();
 
-  FoldRegion getFoldingPlaceholderAt(Point p);
+  FoldRegion getFoldingPlaceholderAt(@NotNull Point p);
 
   boolean intersectsRegion(int startOffset, int endOffset);
 
index 3b9b000b88faddfea46e50b9ff5d7a3c49cefe6d..38f2b48d7c9734e965c3d47c3ff921aa20c42089 100644 (file)
@@ -119,43 +119,35 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
   private static final int GAP_BETWEEN_AREAS = JBUI.scale(5);
   private static final int GAP_BETWEEN_ANNOTATIONS = JBUI.scale(5);
   private static final TooltipGroup GUTTER_TOOLTIP_GROUP = new TooltipGroup("GUTTER_TOOLTIP_GROUP", 0);
-  public static final TIntFunction ID = new TIntFunction() {
-    @Override
-    public int execute(int value) {
-      return value;
-    }
-  };
 
   private final EditorImpl myEditor;
   private final FoldingAnchorsOverlayStrategy myAnchorsDisplayStrategy;
   @Nullable private TIntObjectHashMap<List<GutterMark>> myLineToGutterRenderers;
-  private int myIconsAreaWidth = 0;
-  private int myLineNumberAreaWidth = 0;
-  private int myAdditionalLineNumberAreaWidth = 0;
+  private int myIconsAreaWidth;
+  private int myLineNumberAreaWidth;
+  private int myAdditionalLineNumberAreaWidth;
   private FoldRegion myActiveFoldRegion;
-  private int myTextAnnotationGuttersSize = 0;
-  private int myTextAnnotationExtraSize = 0;
+  private int myTextAnnotationGuttersSize;
+  private int myTextAnnotationExtraSize;
   private TIntArrayList myTextAnnotationGutterSizes = new TIntArrayList();
   private ArrayList<TextAnnotationGutterProvider> myTextAnnotationGutters = new ArrayList<>();
   private final Map<TextAnnotationGutterProvider, EditorGutterAction> myProviderToListener = new HashMap<>();
-  private String myLastGutterToolTip = null;
-  @NotNull private TIntFunction myLineNumberConvertor;
+  private String myLastGutterToolTip;
+  @NotNull private TIntFunction myLineNumberConvertor = value -> value;
   @Nullable private TIntFunction myAdditionalLineNumberConvertor;
   private boolean myShowDefaultGutterPopup = true;
   @Nullable private ActionGroup myCustomGutterPopupGroup;
-  private TIntObjectHashMap<Color> myTextFgColors = new TIntObjectHashMap<>();
+  private final TIntObjectHashMap<Color> myTextFgColors = new TIntObjectHashMap<>();
   private boolean myPaintBackground = true;
   private boolean myLeftFreePaintersAreaShown;
   private boolean myRightFreePaintersAreaShown;
-  private boolean myForceLeftFreePaintersAreaShown = false;
-  private boolean myForceRightFreePaintersAreaShown = false;
-  private int myLastNonDumbModeIconAreaWidth = 0;
+  private boolean myForceLeftFreePaintersAreaShown;
+  private boolean myForceRightFreePaintersAreaShown;
+  private int myLastNonDumbModeIconAreaWidth;
   boolean myDnDInProgress;
 
-  @SuppressWarnings("unchecked")
-  public EditorGutterComponentImpl(EditorImpl editor) {
+  EditorGutterComponentImpl(@NotNull EditorImpl editor) {
     myEditor = editor;
-    myLineNumberConvertor = ID;
     if (!ApplicationManager.getApplication().isHeadlessEnvironment()) {
       installDnD();
     }
@@ -177,7 +169,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     }
   }
 
-  @SuppressWarnings({"ConstantConditions"})
+  @SuppressWarnings("ConstantConditions")
   private void installDnD() {
     DnDSupport.createBuilder(this)
       .setBeanProvider(info -> {
@@ -190,54 +182,48 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
         }
         return null;
       })
-      .setDropHandler(new DnDDropHandler() {
-        @Override
-        public void drop(DnDEvent e) {
-          final Object attachedObject = e.getAttachedObject();
-          if (attachedObject instanceof GutterIconRenderer && checkDumbAware(attachedObject)) {
-            final GutterDraggableObject draggableObject = ((GutterIconRenderer)attachedObject).getDraggableObject();
-            if (draggableObject != null) {
-              final int line = convertPointToLineNumber(e.getPoint());
-              if (line != -1) {
-                draggableObject.copy(line, myEditor.getVirtualFile());
-              }
+      .setDropHandler(e -> {
+        final Object attachedObject = e.getAttachedObject();
+        if (attachedObject instanceof GutterIconRenderer && checkDumbAware(attachedObject)) {
+          final GutterDraggableObject draggableObject = ((GutterIconRenderer)attachedObject).getDraggableObject();
+          if (draggableObject != null) {
+            final int line = convertPointToLineNumber(e.getPoint());
+            if (line != -1) {
+              draggableObject.copy(line, myEditor.getVirtualFile());
             }
           }
-          else if (attachedObject instanceof DnDNativeTarget.EventInfo && myEditor.getSettings().isDndEnabled()) {
-            Transferable transferable = ((DnDNativeTarget.EventInfo)attachedObject).getTransferable();
-            if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-              EditorImpl.handleDrop(myEditor, transferable);
-            }
+        }
+        else if (attachedObject instanceof DnDNativeTarget.EventInfo && myEditor.getSettings().isDndEnabled()) {
+          Transferable transferable = ((DnDNativeTarget.EventInfo)attachedObject).getTransferable();
+          if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+            EditorImpl.handleDrop(myEditor, transferable);
           }
-          myDnDInProgress = false;
         }
+        myDnDInProgress = false;
       })
-      .setTargetChecker(new DnDTargetChecker() {
-        @Override
-        public boolean update(DnDEvent e) {
-          final Object attachedObject = e.getAttachedObject();
-          if (attachedObject instanceof GutterIconRenderer && checkDumbAware(attachedObject)) {
-            final GutterDraggableObject draggableObject = ((GutterIconRenderer)attachedObject).getDraggableObject();
-            if (draggableObject != null) {
-              final int line = convertPointToLineNumber(e.getPoint());
-              if (line != -1) {
-                e.setDropPossible(true);
-                e.setCursor(draggableObject.getCursor(line));
-              }
+      .setTargetChecker(e -> {
+        final Object attachedObject = e.getAttachedObject();
+        if (attachedObject instanceof GutterIconRenderer && checkDumbAware(attachedObject)) {
+          final GutterDraggableObject draggableObject = ((GutterIconRenderer)attachedObject).getDraggableObject();
+          if (draggableObject != null) {
+            final int line = convertPointToLineNumber(e.getPoint());
+            if (line != -1) {
+              e.setDropPossible(true);
+              e.setCursor(draggableObject.getCursor(line));
             }
           }
-          else if (attachedObject instanceof DnDNativeTarget.EventInfo && myEditor.getSettings().isDndEnabled()) {
-            Transferable transferable = ((DnDNativeTarget.EventInfo)attachedObject).getTransferable();
-            if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
-              final int line = convertPointToLineNumber(e.getPoint());
-              if (line != -1) {
-                e.setDropPossible(true);
-                myEditor.getCaretModel().moveToOffset(myEditor.getDocument().getLineStartOffset(line));
-              }
+        }
+        else if (attachedObject instanceof DnDNativeTarget.EventInfo && myEditor.getSettings().isDndEnabled()) {
+          Transferable transferable = ((DnDNativeTarget.EventInfo)attachedObject).getTransferable();
+          if (transferable != null && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+            final int line = convertPointToLineNumber(e.getPoint());
+            if (line != -1) {
+              e.setDropPossible(true);
+              myEditor.getCaretModel().moveToOffset(myEditor.getDocument().getLineStartOffset(line));
             }
           }
-          return true;
         }
+        return true;
       })
       .setImageProvider((NullableFunction<DnDActionInfo, DnDImage>)info -> {
         Image image = IconUtil.toImage(scaleIcon(getGutterRenderer(info.getPoint()).getIcon()));
@@ -565,15 +551,15 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
         if (EditorUtil.getSoftWrapCountAfterLineStart(myEditor, logicalPosition) <= 0) {
           int logLine = convertor.execute(visLinesIterator.getStartLogicalLine());
           if (logLine >= 0) {
-            String s = String.valueOf(logLine + 1);
             int startY = visLinesIterator.getY();
             if (myEditor.isInDistractionFreeMode()) {
               Color fgColor = myTextFgColors.get(visLinesIterator.getVisualLine());
               g.setColor(fgColor != null ? fgColor : color != null ? color : JBColor.blue);
             }
 
+            String s = String.valueOf(logLine + 1);
             int textOffset = isMirrored() ?
-                             offset - getLineNumberAreaWidth() - 1:
+                             offset - getLineNumberAreaWidth() - 1 :
                              offset - g.getFontMetrics().stringWidth(s);
 
             g.drawString(s,
@@ -601,12 +587,13 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     if (EditorGutter.KEY.is(dataId)) {
       return this;
     }
-    else if (CommonDataKeys.EDITOR.is(dataId)) {
+    if (CommonDataKeys.EDITOR.is(dataId)) {
       return myEditor;
     }
     return null;
   }
 
+  @FunctionalInterface
   private interface RangeHighlighterProcessor {
     void process(@NotNull RangeHighlighter highlighter);
   }
@@ -767,48 +754,42 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     }
   }
 
-  public void clearLineToGutterRenderersCache() {
+  void clearLineToGutterRenderersCache() {
     myLineToGutterRenderers = null;
   }
 
   private void buildGutterRenderersCache() {
     myLineToGutterRenderers = new TIntObjectHashMap<>();
-    processRangeHighlighters(0, myEditor.getDocument().getTextLength(), new RangeHighlighterProcessor() {
-      @Override
-      public void process(@NotNull RangeHighlighter highlighter) {
-        GutterMark renderer = highlighter.getGutterIconRenderer();
-        if (renderer == null) {
-          return;
-        }
-        if (!isHighlighterVisible(highlighter)) {
-          return;
-        }
-        int lineStartOffset = EditorUtil.getNotFoldedLineStartOffset(myEditor, highlighter.getStartOffset());
-        int line = myEditor.getDocument().getLineNumber(lineStartOffset);
-        List<GutterMark> renderers = myLineToGutterRenderers.get(line);
-        if (renderers == null) {
-          renderers = new SmartList<>();
-          myLineToGutterRenderers.put(line, renderers);
-        }
-
-        renderers.add(renderer);
+    processRangeHighlighters(0, myEditor.getDocument().getTextLength(), highlighter -> {
+      GutterMark renderer = highlighter.getGutterIconRenderer();
+      if (renderer == null) {
+        return;
+      }
+      if (!isHighlighterVisible(highlighter)) {
+        return;
+      }
+      int lineStartOffset = EditorUtil.getNotFoldedLineStartOffset(myEditor, highlighter.getStartOffset());
+      int line = myEditor.getDocument().getLineNumber(lineStartOffset);
+      List<GutterMark> renderers = myLineToGutterRenderers.get(line);
+      if (renderers == null) {
+        renderers = new SmartList<>();
+        myLineToGutterRenderers.put(line, renderers);
       }
-    });
 
-    myLineToGutterRenderers.transformValues(new TObjectFunction<List<GutterMark>, List<GutterMark>>() {
-      @Override
-      public List<GutterMark> execute(List<GutterMark> value) {
-        List<GutterMark> newValue = value;
-        for (GutterMarkPreprocessor preprocessor : GutterMarkPreprocessor.EP_NAME.getExtensions()) {
-          newValue = preprocessor.processMarkers(value);
-        }
+      renderers.add(renderer);
+    });
 
-        if (newValue.size() >= 5) { // Don't allow more than 5 icons per line
-          newValue = newValue.subList(0, 4);
-        }
+    myLineToGutterRenderers.transformValues(value -> {
+      List<GutterMark> newValue = value;
+      for (GutterMarkPreprocessor preprocessor : GutterMarkPreprocessor.EP_NAME.getExtensions()) {
+        newValue = preprocessor.processMarkers(value);
+      }
 
-        return newValue;
+      if (newValue.size() >= 5) { // Don't allow more than 5 icons per line
+        newValue = newValue.subList(0, 4);
       }
+
+      return newValue;
     });
   }
 
@@ -816,15 +797,12 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     myLeftFreePaintersAreaShown = myForceLeftFreePaintersAreaShown;
     myRightFreePaintersAreaShown = myForceRightFreePaintersAreaShown;
 
-    processRangeHighlighters(0, myEditor.getDocument().getTextLength(), new RangeHighlighterProcessor() {
-      @Override
-      public void process(@NotNull RangeHighlighter highlighter) {
-        LineMarkerRenderer lineMarkerRenderer = highlighter.getLineMarkerRenderer();
-        if (lineMarkerRenderer != null) {
-          LineMarkerRendererEx.Position position = getLineMarkerPosition(lineMarkerRenderer);
-          if (position == LineMarkerRendererEx.Position.LEFT && isLineMarkerVisible(highlighter)) myLeftFreePaintersAreaShown = true;
-          if (position == LineMarkerRendererEx.Position.RIGHT && isLineMarkerVisible(highlighter)) myRightFreePaintersAreaShown = true;
-        }
+    processRangeHighlighters(0, myEditor.getDocument().getTextLength(), highlighter -> {
+      LineMarkerRenderer lineMarkerRenderer = highlighter.getLineMarkerRenderer();
+      if (lineMarkerRenderer != null) {
+        LineMarkerRendererEx.Position position = getLineMarkerPosition(lineMarkerRenderer);
+        if (position == LineMarkerRendererEx.Position.LEFT && isLineMarkerVisible(highlighter)) myLeftFreePaintersAreaShown = true;
+        if (position == LineMarkerRendererEx.Position.RIGHT && isLineMarkerVisible(highlighter)) myRightFreePaintersAreaShown = true;
       }
     });
 
@@ -835,11 +813,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     }
 
     int minWidth = (int)(START_ICON_AREA_WIDTH * myEditor.getScale());
-    if (canShrink) {
-      myIconsAreaWidth = minWidth;
-    } else {
-      myIconsAreaWidth = Math.max(myIconsAreaWidth, minWidth);
-    }
+    myIconsAreaWidth = canShrink ? minWidth : Math.max(myIconsAreaWidth, minWidth);
 
     processGutterRenderers((line, renderers) -> {
       int width = 1;
@@ -894,12 +868,9 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
     try {
       List<RangeHighlighter> highlighters = new ArrayList<>();
-      processRangeHighlighters(firstVisibleOffset, lastVisibleOffset, new RangeHighlighterProcessor() {
-        @Override
-        public void process(@NotNull RangeHighlighter highlighter) {
-          LineMarkerRenderer renderer = highlighter.getLineMarkerRenderer();
-          if (renderer != null) highlighters.add(highlighter);
-        }
+      processRangeHighlighters(firstVisibleOffset, lastVisibleOffset, highlighter -> {
+        LineMarkerRenderer renderer = highlighter.getLineMarkerRenderer();
+        if (renderer != null) highlighters.add(highlighter);
       });
 
       ContainerUtil.sort(highlighters, Comparator.comparingInt(RangeHighlighter::getLayer));
@@ -927,18 +898,15 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
   }
 
   private void paintIconRow(int line, List<GutterMark> row, final Graphics2D g) {
-    processIconsRow(line, row, new LineGutterIconRendererProcessor() {
-      @Override
-      public void process(int x, int y, GutterMark renderer) {
-        Icon icon = scaleIcon(renderer.getIcon());
-
-        AffineTransform old = setMirrorTransformIfNeeded(g, x, icon.getIconWidth());
-        try {
-          icon.paintIcon(EditorGutterComponentImpl.this, g, x, y);
-        }
-        finally {
-          if (old != null) g.setTransform(old);
-        }
+    processIconsRow(line, row, (x, y, renderer) -> {
+      Icon icon = scaleIcon(renderer.getIcon());
+
+      AffineTransform old = setMirrorTransformIfNeeded(g, x, icon.getIconWidth());
+      try {
+        icon.paintIcon(this, g, x, y);
+      }
+      finally {
+        if (old != null) g.setTransform(old);
       }
     });
   }
@@ -1006,8 +974,9 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return new Rectangle(x, startY, w, height);
   }
 
+  @FunctionalInterface
   private interface LineGutterIconRendererProcessor {
-    void process(int x, int y, GutterMark renderer);
+    void process(int x, int y, @NotNull GutterMark renderer);
   }
 
   private Icon scaleIcon(Icon icon) {
@@ -1020,7 +989,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return icon;
   }
 
-  private void processIconsRow(int line, List<GutterMark> row, LineGutterIconRendererProcessor processor) {
+  private void processIconsRow(int line, @NotNull List<GutterMark> row, @NotNull LineGutterIconRendererProcessor processor) {
     if (!areIconsShown()) return;
 
     int middleCount = 0;
@@ -1077,7 +1046,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return Math.max(centerRelative, baselineRelative);
   }
 
-  public Color getOutlineColor(boolean isActive) {
+  private Color getOutlineColor(boolean isActive) {
     ColorKey key = isActive ? EditorColors.SELECTED_TEARLINE_COLOR : EditorColors.TEARLINE_COLOR;
     Color color = myEditor.getColorsScheme().getColor(key);
     return color != null ? color : JBColor.black;
@@ -1128,9 +1097,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
       int endY = getLineCenterY(foldEnd);
 
       if (startY <= clip.y + clip.height && endY + 1 + myEditor.getDescent() >= clip.y) {
-        int lineX = anchorX + width / 2;
-
         g.setColor(getOutlineColor(true));
+        int lineX = anchorX + width / 2;
         UIUtil.drawLine(g, lineX, startY, lineX, endY);
       }
     }
@@ -1141,7 +1109,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return getFoldingAreaOffset() + getFoldingAnchorWidth() / 2;
   }
 
-  public void setActiveFoldRegion(FoldRegion activeFoldRegion) {
+  void setActiveFoldRegion(FoldRegion activeFoldRegion) {
     if (myActiveFoldRegion != activeFoldRegion) {
       myActiveFoldRegion = activeFoldRegion;
       repaint();
@@ -1207,10 +1175,10 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
 
     try {
       int off = getSquareInnerOffset(width);
-      int[] xPoints = {anchorX, anchorX + width, anchorX + width, anchorX + width / 2, anchorX};
-      int[] yPoints = {y, y, y + baseHeight, y + height, y + baseHeight};
 
       g.setColor(myEditor.getBackgroundColor());
+      int[] xPoints = {anchorX, anchorX + width, anchorX + width, anchorX + width / 2, anchorX};
+      int[] yPoints = {y, y, y + baseHeight, y + height, y + baseHeight};
       g.fillPolygon(xPoints, yPoints, 5);
 
       g.setColor(getOutlineColor(active));
@@ -1272,16 +1240,16 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return lower > 0 ? lower - 1 : 0; // lower == upper == f
   }
 
-  public int getFoldingAreaOffset() {
+  private int getFoldingAreaOffset() {
     return getLineMarkerAreaOffset() + getLineMarkerAreaWidth();
   }
 
-  public int getFoldingAreaWidth() {
+  private int getFoldingAreaWidth() {
     return isFoldingOutlineShown() ? getFoldingAnchorWidth() + JBUI.scale(2) :
-           (isRealEditor() ? getFoldingAnchorWidth() : 0);
+           isRealEditor() ? getFoldingAnchorWidth() : 0;
   }
 
-  public boolean isRealEditor() {
+  private boolean isRealEditor() {
     return EditorUtil.isRealFileEditor(myEditor);
   }
 
@@ -1315,11 +1283,11 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return 0;
   }
 
-  public int getLineNumberAreaWidth() {
+  private int getLineNumberAreaWidth() {
     return isLineNumbersShown() ? myLineNumberAreaWidth + getAreaWidthWithGap(myAdditionalLineNumberAreaWidth) : 0;
   }
 
-  public int getLineMarkerAreaWidth() {
+  private int getLineMarkerAreaWidth() {
     return isLineMarkersShown() ? getLeftFreePaintersAreaWidth() + myIconsAreaWidth +
                                   getGapAfterIconsArea() + getRightFreePaintersAreaWidth() : 0;
   }
@@ -1348,7 +1316,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
   }
 
   @Nullable
-  public EditorMouseEventArea getEditorMouseAreaByOffset(int offset) {
+  EditorMouseEventArea getEditorMouseAreaByOffset(int offset) {
     if (isLineNumbersShown() && offset < getLineNumberAreaOffset() + getLineNumberAreaWidth()) {
       return EditorMouseEventArea.LINE_NUMBERS_AREA;
     }
@@ -1368,16 +1336,14 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return null;
   }
 
-  public int getLineNumberAreaOffset() {
+  private int getLineNumberAreaOffset() {
     if (getLineNumberAreaWidth() == 0 && getAnnotationsAreaWidthEx() == 0 && getLineMarkerAreaWidth() == 0) {
       return getFoldingAreaWidth() == 0 ? 0 : 1;
     }
-    else if (getLineNumberAreaWidth() == 0 && getAnnotationsAreaWidthEx() > 0) {
+    if (getLineNumberAreaWidth() == 0 && getAnnotationsAreaWidthEx() > 0) {
       return 0; // no gap if annotations area is the first visible
     }
-    else {
-      return GAP_BETWEEN_AREAS;
-    }
+    return GAP_BETWEEN_AREAS;
   }
 
   @Override
@@ -1390,7 +1356,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return myTextAnnotationGuttersSize;
   }
 
-  public int getAnnotationsAreaWidthEx() {
+  private int getAnnotationsAreaWidthEx() {
     return myTextAnnotationGuttersSize + myTextAnnotationExtraSize;
   }
 
@@ -1404,7 +1370,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return getLineMarkerAreaOffset() + getLeftFreePaintersAreaWidth();
   }
 
-  public int getLeftFreePaintersAreaOffset() {
+  private int getLeftFreePaintersAreaOffset() {
     return getLineMarkerAreaOffset();
   }
 
@@ -1413,11 +1379,11 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return getIconAreaOffset() + myIconsAreaWidth + getGapAfterIconsArea();
   }
 
-  public int getLeftFreePaintersAreaWidth() {
+  private int getLeftFreePaintersAreaWidth() {
     return myLeftFreePaintersAreaShown ? FREE_PAINTERS_LEFT_AREA_WIDTH : 0;
   }
 
-  public int getRightFreePaintersAreaWidth() {
+  private int getRightFreePaintersAreaWidth() {
     return myRightFreePaintersAreaShown ? FREE_PAINTERS_RIGHT_AREA_WIDTH : 0;
   }
 
@@ -1426,7 +1392,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return myIconsAreaWidth;
   }
 
-  public int getGapAfterIconsArea() {
+  private int getGapAfterIconsArea() {
     return isRealEditor() && areIconsShown() ? GAP_BETWEEN_AREAS : 0;
   }
 
@@ -1521,15 +1487,12 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
       if (row != null) {
         final TreeMap<Integer, GutterMark> xPos = new TreeMap<>();
         final int[] currentPos = {0};
-        processIconsRow(line, row, new LineGutterIconRendererProcessor() {
-          @Override
-          public void process(int x, int y, GutterMark r) {
-            xPos.put(x, r);
-            if (renderer == r && r != null) {
-              currentPos[0] = x;
-              Icon icon = scaleIcon(r.getIcon());
-              t.set(new Point(x + icon.getIconWidth() / 2, y + icon.getIconHeight() / 2));
-            }
+        processIconsRow(line, row, (x, y, r) -> {
+          xPos.put(x, r);
+          if (renderer == r) {
+            currentPos[0] = x;
+            Icon icon = scaleIcon(r.getIcon());
+            t.set(new Point(x + icon.getIconWidth() / 2, y + icon.getIconHeight() / 2));
           }
         });
 
@@ -1553,9 +1516,9 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
   void validateMousePointer(@NotNull MouseEvent e) {
     if (IdeGlassPaneImpl.hasPreProcessedCursor(this)) return;
 
-    Cursor cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
     FoldRegion foldingAtCursor = findFoldingAnchorAt(e.getX(), e.getY());
     setActiveFoldRegion(foldingAtCursor);
+    Cursor cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
     if (foldingAtCursor != null) {
       cursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
     }
@@ -1718,26 +1681,23 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     int lastVisibleOffset = myEditor.logicalPositionToOffset(
       myEditor.xyToLogicalPosition(new Point(0, clip.y + clip.height + myEditor.getLineHeight())));
 
-    processRangeHighlighters(firstVisibleOffset, lastVisibleOffset, new RangeHighlighterProcessor() {
-      @Override
-      public void process(@NotNull RangeHighlighter highlighter) {
-        LineMarkerRenderer renderer = highlighter.getLineMarkerRenderer();
-        if (renderer == null) return;
-        if (gutterRenderer[0] != null && layer[0] >= highlighter.getLayer()) return;
-        Rectangle rectangle = getLineRendererRectangle(highlighter);
-        if (rectangle == null) return;
-
-        int startY = rectangle.y;
-        int endY = startY + rectangle.height;
-        if (startY == endY) {
-          endY += myEditor.getLineHeight();
-        }
+    processRangeHighlighters(firstVisibleOffset, lastVisibleOffset, highlighter -> {
+      LineMarkerRenderer renderer = highlighter.getLineMarkerRenderer();
+      if (renderer == null) return;
+      if (gutterRenderer[0] != null && layer[0] >= highlighter.getLayer()) return;
+      Rectangle rectangle = getLineRendererRectangle(highlighter);
+      if (rectangle == null) return;
 
-        if (startY < e.getY() && e.getY() <= endY) {
-          if (renderer instanceof ActiveGutterRenderer && ((ActiveGutterRenderer)renderer).canDoAction(e)) {
-            gutterRenderer[0] = (ActiveGutterRenderer)renderer;
-            layer[0] = highlighter.getLayer();
-          }
+      int startY = rectangle.y;
+      int endY = startY + rectangle.height;
+      if (startY == endY) {
+        endY += myEditor.getLineHeight();
+      }
+
+      if (startY < e.getY() && e.getY() <= endY) {
+        if (renderer instanceof ActiveGutterRenderer && ((ActiveGutterRenderer)renderer).canDoAction(e)) {
+          gutterRenderer[0] = (ActiveGutterRenderer)renderer;
+          layer[0] = highlighter.getLayer();
         }
       }
     });
@@ -1760,7 +1720,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
   }
 
   private class CloseAnnotationsAction extends DumbAwareAction {
-    public CloseAnnotationsAction() {
+    CloseAnnotationsAction() {
       super(EditorBundle.message("close.editor.annotations.action.name"));
     }
 
@@ -1929,15 +1889,12 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     }
 
     final GutterMark[] result = {null};
-    processIconsRow(line, renderers, new LineGutterIconRendererProcessor() {
-      @Override
-      public void process(int x, int y, GutterMark renderer) {
-        final int ex = convertX((int)p.getX());
-        Icon icon = scaleIcon(renderer.getIcon());
-        // Do not check y to extend the area where users could click
-        if (x <= ex && ex <= x + icon.getIconWidth()) {
-          result[0] = renderer;
-        }
+    processIconsRow(line, renderers, (x, y, renderer) -> {
+      final int ex = convertX((int)p.getX());
+      Icon icon = scaleIcon(renderer.getIcon());
+      // Do not check y to extend the area where users could click
+      if (x <= ex && ex <= x + icon.getIconWidth()) {
+        result[0] = renderer;
       }
     });
 
@@ -1957,7 +1914,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse
     return LineMarkerRendererEx.Position.RIGHT;
   }
 
-  public int convertX(int x) {
+  int convertX(int x) {
     if (!isMirrored()) return x;
     return getWidth() - x;
   }
index 12c49e333fb99e33005d2aabfb5304544b604fbe..8e9afbe75b7fedb8c5c818ab8086d42ff5a31821 100644 (file)
@@ -281,7 +281,8 @@ abstract class FoldRegionsTree {
     return region.getStartOffset() < offset && region.getEndOffset() > offset;
   }
 
-  public FoldRegion[] fetchCollapsedAt(int offset) {
+  @NotNull
+  FoldRegion[] fetchCollapsedAt(int offset) {
     if (myCachedData.isUnavailable()) return FoldRegion.EMPTY_ARRAY;
     ArrayList<FoldRegion> allCollapsed = new ArrayList<>();
     for (FoldRegion region : myRegions) {
@@ -329,7 +330,7 @@ abstract class FoldRegionsTree {
     return foldedLines[foldedLines.length - 1];
   }
 
-  public int getLastTopLevelIndexBefore(int offset) {
+  int getLastTopLevelIndexBefore(int offset) {
     return getLastTopLevelIndexBefore(myCachedData, offset);
   }
   
@@ -357,7 +358,7 @@ abstract class FoldRegionsTree {
   }
 
   @Nullable
-  public FoldRegion getRegionAt(int startOffset, int endOffset) {
+  FoldRegion getRegionAt(int startOffset, int endOffset) {
     int index = Collections.binarySearch(myRegions, new DummyFoldRegion(startOffset, endOffset), RangeMarker.BY_START_OFFSET);
     return index < 0 ? null : myRegions.get(index);
   }
@@ -378,14 +379,18 @@ abstract class FoldRegionsTree {
     private final int[] foldedLines;
 
     private CachedData() {
-      this.visibleRegions = null;
-      this.topLevelRegions = null;
-      this.startOffsets = null;
-      this.endOffsets = null;
-      this.foldedLines = null;
-    }
-
-    private CachedData(FoldRegion[] visibleRegions, FoldRegion[] topLevelRegions, int[] startOffsets, int[] endOffsets, int[] foldedLines) {
+      visibleRegions = null;
+      topLevelRegions = null;
+      startOffsets = null;
+      endOffsets = null;
+      foldedLines = null;
+    }
+
+    private CachedData(@NotNull FoldRegion[] visibleRegions,
+                       @NotNull FoldRegion[] topLevelRegions,
+                       @NotNull int[] startOffsets,
+                       @NotNull int[] endOffsets,
+                       @NotNull int[] foldedLines) {
       this.visibleRegions = visibleRegions;
       this.topLevelRegions = topLevelRegions;
       this.startOffsets = startOffsets;
index 3656664fb69e1495c39dbef111c3452b4b1d00b3..57df0bf24e64ce0aee29a5d32586aff985ad2f54 100644 (file)
@@ -19,6 +19,7 @@ import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.editor.FoldRegion;
 import com.intellij.openapi.editor.FoldingGroup;
 import com.intellij.util.containers.hash.HashMap;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
 import java.util.Map;
@@ -26,11 +27,12 @@ import java.util.Map;
 class FoldingAnchorsOverlayStrategy {
   private final EditorImpl myEditor;
 
-  public FoldingAnchorsOverlayStrategy(EditorImpl editor) {
+  FoldingAnchorsOverlayStrategy(EditorImpl editor) {
     myEditor = editor;
   }
 
-  public Collection<DisplayedFoldingAnchor> getAnchorsToDisplay(int firstVisibleOffset, int lastVisibleOffset, FoldRegion activeFoldRegion) {
+  @NotNull
+  Collection<DisplayedFoldingAnchor> getAnchorsToDisplay(int firstVisibleOffset, int lastVisibleOffset, FoldRegion activeFoldRegion) {
     Map<Integer, DisplayedFoldingAnchor> result = new HashMap<>();
     FoldRegion[] visibleFoldRegions = myEditor.getFoldingModel().fetchVisible();
     for (FoldRegion region : visibleFoldRegions) {
@@ -60,12 +62,12 @@ class FoldingAnchorsOverlayStrategy {
     return result.values();
   }
 
-  private static void tryAdding(Map<Integer, DisplayedFoldingAnchor> resultsMap,
-                         FoldRegion region,
-                         int visualLine,
-                         int visualHeight,
-                         DisplayedFoldingAnchor.Type type,
-                         FoldRegion activeRegion) {
+  private static void tryAdding(@NotNull Map<Integer, DisplayedFoldingAnchor> resultsMap,
+                                @NotNull FoldRegion region,
+                                int visualLine,
+                                int visualHeight,
+                                @NotNull DisplayedFoldingAnchor.Type type,
+                                FoldRegion activeRegion) {
     DisplayedFoldingAnchor prev = resultsMap.get(visualLine);
     if (prev != null) {
       if (prev.foldRegion == activeRegion) {
@@ -78,7 +80,7 @@ class FoldingAnchorsOverlayStrategy {
     resultsMap.put(visualLine, new DisplayedFoldingAnchor(region, visualLine, visualHeight, type));
   }
 
-  private int getEndOffset(FoldRegion foldRange) {
+  private int getEndOffset(@NotNull FoldRegion foldRange) {
     FoldingGroup group = foldRange.getGroup();
     return group == null ? foldRange.getEndOffset() : myEditor.getFoldingModel().getEndOffset(group);
   }
@@ -90,7 +92,6 @@ class FoldingAnchorsOverlayStrategy {
    *
    * @param startOffset   start offset of the target region to check
    * @param endOffset     end offset of the target region to check
-   * @return
    */
   private boolean isFoldingPossible(int startOffset, int endOffset) {
     Document document = myEditor.getDocument();
@@ -109,5 +110,4 @@ class FoldingAnchorsOverlayStrategy {
     return myEditor.getSettings().isAllowSingleLogicalLineFolding()
            && !myEditor.getSoftWrapModel().getSoftWrapsForRange(startOffset, endOffsetToUse).isEmpty();
   }
-
 }
index 6a482d6c16f4e4bc5dbbbbf2ce93e8bdc78ced3c..821cfa92ac51d25483fa548041acda9757301cfe 100644 (file)
@@ -26,12 +26,15 @@ package com.intellij.openapi.editor.impl;
 
 import com.intellij.diagnostic.Dumpable;
 import com.intellij.openapi.Disposable;
-import com.intellij.openapi.application.ex.ApplicationManagerEx;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.*;
 import com.intellij.openapi.editor.colors.EditorColors;
 import com.intellij.openapi.editor.event.DocumentEvent;
-import com.intellij.openapi.editor.ex.*;
+import com.intellij.openapi.editor.ex.DocumentEx;
+import com.intellij.openapi.editor.ex.FoldingListener;
+import com.intellij.openapi.editor.ex.FoldingModelEx;
+import com.intellij.openapi.editor.ex.PrioritizedInternalDocumentListener;
 import com.intellij.openapi.editor.markup.TextAttributes;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Key;
@@ -67,7 +70,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
   private boolean myDocumentChangeProcessed = true;
   private final AtomicLong myExpansionCounter = new AtomicLong();
 
-  public FoldingModelImpl(EditorImpl editor) {
+  public FoldingModelImpl(@NotNull EditorImpl editor) {
     myEditor = editor;
     myIsFoldingEnabled = true;
     myIsBatchFoldingProcessing = false;
@@ -82,6 +85,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     refreshSettings();
   }
 
+  @Override
   @NotNull
   public List<FoldRegion> getGroupedRegions(@NotNull FoldingGroup group) {
     return (List<FoldRegion>)myGroups.get(group);
@@ -100,7 +104,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
   }
 
   @NotNull
-  public FoldRegion getFirstRegion(@NotNull FoldingGroup group, FoldRegion child) {
+  FoldRegion getFirstRegion(@NotNull FoldingGroup group, @NotNull FoldRegion child) {
     final List<FoldRegion> regions = getGroupedRegions(group);
     if (regions.isEmpty()) {
       final boolean inAll = Arrays.asList(getAllFoldRegions()).contains(child);
@@ -128,7 +132,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     return endOffset;
   }
 
-  public void refreshSettings() {
+  void refreshSettings() {
     myFoldTextAttributes = myEditor.getColorsScheme().getAttributes(EditorColors.FOLDED_TEXT_ATTRIBUTES);
   }
 
@@ -150,10 +154,10 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
   }
 
   private static void assertIsDispatchThreadForEditor() {
-    ApplicationManagerEx.getApplicationEx().assertIsDispatchThread();
+    ApplicationManager.getApplication().assertIsDispatchThread();
   }
   private static void assertReadAccess() {
-    ApplicationManagerEx.getApplicationEx().assertReadAccessAllowed();
+    ApplicationManager.getApplication().assertReadAccessAllowed();
   }
 
   @Override
@@ -210,7 +214,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     runBatchFoldingOperation(operation, false, moveCaret);
   }
 
-  private void runBatchFoldingOperation(final Runnable operation, final boolean dontCollapseCaret, final boolean moveCaret) {
+  private void runBatchFoldingOperation(@NotNull Runnable operation, final boolean dontCollapseCaret, final boolean moveCaret) {
     assertIsDispatchThreadForEditor();
     boolean oldDontCollapseCaret = myDoNotCollapseCaret;
     myDoNotCollapseCaret |= dontCollapseCaret;
@@ -223,7 +227,8 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     myIsBatchFoldingProcessing = true;
     try {
       operation.run();
-    } finally {
+    }
+    finally {
       if (!oldBatchFlag) {
         if (myFoldRegionsProcessed) {
           notifyBatchFoldingProcessingDone(moveCaret);
@@ -244,7 +249,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
    * Disables caret position adjustment after batch folding operation is finished.
    * Should be called from inside batch operation runnable.
    */
-  public void flushCaretShift() {
+  void flushCaretShift() {
     mySavedCaretShift = -1;
   }
 
@@ -270,7 +275,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
 
   @Override
   @Nullable
-  public FoldRegion getFoldingPlaceholderAt(Point p) {
+  public FoldRegion getFoldingPlaceholderAt(@NotNull Point p) {
     assertReadAccess();
     LogicalPosition pos = myEditor.xyToLogicalPosition(p);
     int line = pos.line;
@@ -323,12 +328,12 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     doClearFoldRegions();
   }
 
-  public void doClearFoldRegions() {
+  private void doClearFoldRegions() {
     myGroups.clear();
     myFoldTree.clear();
   }
 
-  public void expandFoldRegion(FoldRegion region) {
+  void expandFoldRegion(@NotNull FoldRegion region) {
     assertIsDispatchThreadForEditor();
     if (region.isExpanded() || region.shouldNeverExpand()) return;
 
@@ -354,7 +359,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     notifyListenersOnFoldRegionStateChange(region);
   }
 
-  public void collapseFoldRegion(FoldRegion region) {
+  void collapseFoldRegion(@NotNull FoldRegion region) {
     assertIsDispatchThreadForEditor();
     if (!region.isExpanded()) return;
 
@@ -485,7 +490,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     return myFoldTree.getFoldedLinesCountBefore(offset);
   }
 
-  public int getTotalNumberOfFoldedLines() {
+  int getTotalNumberOfFoldedLines() {
     if (!myDocumentChangeProcessed && myEditor.getDocument().isInEventsHandling()) {
       // There is a possible case that this method is called on document update before fold regions are recalculated.
       // We return zero in such situations then.
@@ -500,6 +505,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
     return myFoldTree.fetchTopLevel();
   }
 
+  @NotNull
   public FoldRegion[] fetchCollapsedAt(int offset) {
     return myFoldTree.fetchCollapsedAt(offset);
   }
@@ -578,12 +584,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
   @Override
   public void addListener(@NotNull final FoldingListener listener, @NotNull Disposable parentDisposable) {
     myListeners.add(listener);
-    Disposer.register(parentDisposable, new Disposable() {
-      @Override
-      public void dispose() {
-        myListeners.remove(listener);
-      }
-    });
+    Disposer.register(parentDisposable, () -> myListeners.remove(listener));
   }
 
   private void notifyListenersOnFoldRegionStateChange(@NotNull FoldRegion foldRegion) {