public int _offsetToX(int line, int offset)
  {
    TokenMarker tokenMarker = getTokenMarker();

    /* Use painter's cached info for speed */
    FontMetrics fm = painter.getFontMetrics();

    getLineText(line,lineSegment);

    int segmentOffset = lineSegment.offset;
    int x = horizontalOffset;

    /* If syntax coloring is disabled, do simple translation */
    if(tokenMarker == null)
      {
        lineSegment.count = offset;
        return x + Utilities.getTabbedTextWidth(lineSegment,
                                                fm,x,painter,0);
      }
    /* If syntax coloring is enabled, we have to do this because
     * tokens can vary in width */
    else
      {
        Token tokens;
        if(painter.currentLineIndex == line
           && painter.currentLineTokens != null)
          tokens = painter.currentLineTokens;
        else
          {
            painter.currentLineIndex = line;
            tokens = painter.currentLineTokens
              = tokenMarker.markTokens(lineSegment,line);
          }

        //Toolkit toolkit = painter.getToolkit();
        Font defaultFont = painter.getFont();
        SyntaxStyle[] styles = painter.getStyles();

        for(;;)
          {
            byte id = tokens.id;
            if(id == Token.END)
              {
                return x;
              }

            if(id == Token.NULL)
              fm = painter.getFontMetrics();
            else
              fm = styles[id].getFontMetrics(defaultFont, this);

            int length = tokens.length;

            if(offset + segmentOffset < lineSegment.offset + length)
              {
                lineSegment.count = offset - (lineSegment.offset - segmentOffset);
                return x + Utilities.getTabbedTextWidth(
                                                        lineSegment,fm,x,painter,0);
              }
            else
              {
                lineSegment.count = length;
                x += Utilities.getTabbedTextWidth(
                                                  lineSegment,fm,x,painter,0);
                lineSegment.offset += length;
              }
            tokens = tokens.next;
          }
      }
  }