You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-dev@xmlgraphics.apache.org by bu...@apache.org on 2004/03/24 12:50:38 UTC

DO NOT REPLY [Bug 27901] New: - TextCharIterator.remove() does not work properly

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=27901>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=27901

TextCharIterator.remove() does not work properly

           Summary: TextCharIterator.remove() does not work properly
           Product: Fop
           Version: 1.0dev
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: page-master/layout
        AssignedTo: fop-dev@xml.apache.org
        ReportedBy: lfurini@cs.unibo.it


The method remove() of the TextCharIterator class, defined private in the file 
fo/FOText.java, should remove the current character, pointed to by curIndex, 
but its effect is to remove the one pointed to by the start index.

The fo file I am going to attach can be used to see the problem; there are two 
block with the same text, but in the second one there are some extra spaces 
that should be removed as white-space-collapse default value is true; instead 
of the extra spaces, the first character are removed.

Now, the code is:

  public void remove() {
      if (start < ca.length) {
          start++;
      }
  }

A simple solution could be shifting the whole array of character every time 
remove is called, but that would not be very efficient, especially with big 
arrays:

  public void remove() {
      if (start < ca.length) {
          for (int i = curIndex - 1;
               i > start;
               ca[i] = ca[--i]) {
              // nothing
          }
          start++;
      }
  }

Maybe a better idea would be to store the indexes of the character to remove 
(a kind of "black list"), and to actually remove them when creating the 
TextLayouyManager.
Instead of calling a single System.arraycopy, the TextLayoutManager 
constructor should call a method of the FOText class, which would copy sub-
array of consecutive "good" indexes between  two indexes in the black list (or 
between the array start and the first black index, or between the last black 
index and the array end).