Exemplo n.º 1
0
 int getVisualLineWidth(
     VisualLinesIterator visualLinesIterator, @Nullable Runnable quickEvaluationListener) {
   assert !visualLinesIterator.atEnd();
   int visualLine = visualLinesIterator.getVisualLine();
   FoldRegion[] topLevelRegions = myEditor.getFoldingModel().fetchTopLevel();
   if (quickEvaluationListener != null
       && (topLevelRegions == null || topLevelRegions.length == 0)
       && myEditor.getSoftWrapModel().getRegisteredSoftWraps().isEmpty()
       && !myView.getTextLayoutCache().hasCachedLayoutFor(visualLine)) {
     // fast path - speeds up editor opening
     quickEvaluationListener.run();
     return myView
             .getLogicalPositionCache()
             .offsetToLogicalColumn(
                 visualLine,
                 myDocument.getLineEndOffset(visualLine)
                     - myDocument.getLineStartOffset(visualLine))
         * myView.getMaxCharWidth();
   }
   float x = 0;
   int maxOffset = visualLinesIterator.getVisualLineStartOffset();
   for (VisualLineFragmentsIterator.Fragment fragment :
       VisualLineFragmentsIterator.create(myView, visualLinesIterator, quickEvaluationListener)) {
     x = fragment.getEndX();
     maxOffset = Math.max(maxOffset, fragment.getMaxOffset());
   }
   if (myEditor.getSoftWrapModel().getSoftWrap(maxOffset) != null) {
     x +=
         myEditor
             .getSoftWrapModel()
             .getMinDrawingWidthInPixels(SoftWrapDrawingType.BEFORE_SOFT_WRAP_LINE_FEED);
   }
   return (int) x;
 }
Exemplo n.º 2
0
 private int calculatePreferredWidth() {
   if (checkDirty()) return 1;
   assertValidState();
   VisualLinesIterator iterator = new VisualLinesIterator(myView, 0);
   int maxWidth = 0;
   while (!iterator.atEnd()) {
     int visualLine = iterator.getVisualLine();
     int width = myLineWidths.get(visualLine);
     if (width == UNKNOWN_WIDTH) {
       final Ref<Boolean> approximateValue = new Ref<Boolean>(Boolean.FALSE);
       width = getVisualLineWidth(iterator, () -> approximateValue.set(Boolean.TRUE));
       if (approximateValue.get()) width = -width;
       myLineWidths.set(visualLine, width);
     }
     maxWidth = Math.max(maxWidth, Math.abs(width));
     iterator.advance();
   }
   return maxWidth;
 }
  public void testWrapAfterFolding() throws IOException {
    initText("abcdefghij");
    addCollapsedFoldRegion(1, 8, "...");
    configureSoftWraps(4);

    verifySoftWrapPositions(8);

    VisualLinesIterator it = createIterator(0);
    assertFalse(it.atEnd());
    assertEquals(0, it.getVisualLineStartOffset());
    assertEquals(0, it.getStartFoldingIndex());
    it.advance();
    assertFalse(it.atEnd());
    assertEquals(8, it.getVisualLineStartOffset());
    assertEquals(1, it.getStartFoldingIndex());
  }
  public void testWrapAtFoldedLineBreak() throws IOException {
    initText("abc\ndef");
    addCollapsedFoldRegion(3, 4, "...");
    configureSoftWraps(6);

    verifySoftWrapPositions(4);
    VisualLinesIterator it = createIterator(0);
    assertFalse(it.atEnd());
    it.advance();
    assertFalse(it.atEnd());
    it.advance();
    assertTrue(it.atEnd());
  }