docs: @Override
    public void paintComponent(Graphics g) {
      super.paintComponent(g);
  
      // Determine the width of the space available to draw the line number
  
      FontMetrics fontMetrics = component.getFontMetrics(component.getFont());
      Insets insets = getInsets();
      int availableWidth = getSize().width - insets.left - insets.right;
  
      // Determine the rows to draw within the clipped bounds.
  
      Rectangle clip = g.getClipBounds();
      int rowStartOffset = component.viewToModel(new Point(0, clip.y));
      int endOffset = component.viewToModel(new Point(0, clip.y + clip.height));
  
      while (rowStartOffset <= endOffset) {
        try {
          if (isCurrentLine(rowStartOffset))
            g.setColor(getCurrentLineForeground());
          else
            g.setColor(getForeground());
  
          // Get the line number as a string and then determine the
          // "X" and "Y" offsets for drawing the string.
  
          String lineNumber = getTextLineNumber(rowStartOffset);
          int stringWidth = fontMetrics.stringWidth(lineNumber);
          int x = getOffsetX(availableWidth, stringWidth) + insets.left;
          int y = getOffsetY(rowStartOffset, fontMetrics);
          g.drawString(lineNumber, x, y);
  
          // Move to the next row
  
          rowStartOffset = Utilities.getRowEnd(component, rowStartOffset) + 1;
        } catch (Exception e) {
          break;
        }
      }
    }