Search code examples
highlightingindexofstyleddocument

StyledDocument adding extra count to indexof for each line of file


I have a strange problem (at least it appears that way) that when searching for a string in a textPane, I get an extra index for each line number that is searched and returned when using StyledDoc verses just getting the text from a textPane. I get the same text from the same pane, it's just that one is from the plain text the other is from the styled doc. Am I missing something here. I'll try to list as many of the changes between the two versions I am working with.

The plain text version:

public int displayXMLFile(String path, int target){
    InputStreamReader inputStream;
    FileInputStream fileStream;
    BufferedReader buffReader;

    if(target == 1){

        try{                
            File file = new File(path);
            fileStream = new FileInputStream(file);
            inputStream = new InputStreamReader(fileStream,"UTF-8");
            buffReader = new BufferedReader(inputStream);
            StringBuffer content = new StringBuffer("");
            String line = "";
            while((line = buffReader.readLine())!=null){
                content.append(line+"\n");
            }
            buffReader.close();
            xhw.txtDisplay_1.setText(content.toString());
        }
        catch(Exception e){
            e.printStackTrace();
            return -1;
        }
    }
}

verses the Styled Doc (without the styles applied)

    protected void openFile(String path, StyledDocument sDoc, int target) 
                throws BadLocationException {

    FileInputStream fileStream;
    String file;
    if(target == 1){
        file = "Openning First File";
    } else {
        file = "Openning Second File";
    }


    try {
        fileStream = new FileInputStream(path);

        // Get the object of DataInputStream
        //DataInputStream in = new DataInputStream(fileStream);

        ProgressMonitorInputStream in = new ProgressMonitorInputStream(
                xw.getContentPane(), file, fileStream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        //Read File Line By Line
        while ((strLine = br.readLine()) != null)   {                   
            sDoc.insertString(sDoc.getLength(), strLine + "\n", sDoc.getStyle("regular"));
        xw.updateProgress(target);
        } 

        //Close the input stream
        in.close();
    } catch (Exception e){//Catch exception if any
        System.err.println("Error: " + e.getMessage());
    }

This is how I search:

    public int searchText(int sPos, int target) throws BadLocationException{

    String search = xhw.textSearch.getText();
    String contents;
    JTextPane searchPane;

    if(target == 1){
        searchPane = xhw.txtDisplay_1;              
    } else {
        searchPane = xhw.txtDisplay_2;
    }

    if(xhw.textSearch.getText().isEmpty()){
        xhw.displayDialog("Nothing to search for");
        highlight(searchPane, null, 0,0);
    } else {


        contents = searchPane.getText();

        // Search for the desired string starting at cursor position
        int newPos = contents.indexOf( search, sPos );

        // cycle cursor to beginning of doc window
        if (newPos == -1 && sPos > 0){
            sPos = 0;
            newPos = contents.indexOf( search, sPos );
        } 

        if ( newPos >= 0 ) {
            // Select occurrence if found

            highlight(searchPane, contents, newPos, target);

            sPos = newPos + search.length()+1;
        } else {
            xhw.displayDialog("\"" + search + "\"" + " was not found in File " + target);
        }
    } 
    return sPos;
}

The sample file:

<?xml version="1.0" encoding="UTF-8"?>
<AlternateDepartureRoutes>
  <AlternateDepartureRoute>
    <AdrName>BOIRR</AdrName>
    <AdrRouteAlpha>..BROPH..</AdrRouteAlpha>
    <TransitionFix>
      <FixName>BROPH</FixName>
    </TransitionFix>
  </AlternateDepartureRoute>
  <AlternateDepartureRoute>
</AlternateDepartureRoutes>

And my highlighter:

    public void highlight(JTextPane tPane, String text, int position, int target) throws BadLocationException {
    Highlighter highlighter =  new DefaultHighlighter();
    Highlighter.HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.LIGHT_GRAY);
    tPane.setHighlighter(highlighter);

    String searchText = xhw.textSearch.getText();
    String document = tPane.getText();
    int startOfSString = document.indexOf(searchText,position);

    if(startOfSString >= 0){
        int endOfSString = startOfSString + searchText.length();
        highlighter.addHighlight(startOfSString, endOfSString, painter);
        tPane.setCaretPosition(endOfSString);
        int caretPos = tPane.getCaretPosition();
        javax.swing.text.Element root = tPane.getDocument().getDefaultRootElement();
        int lineNum = root.getElementIndex(caretPos) +1;
        if (target == 1){
            xhw.txtLineNum1.setText(Integer.toString(lineNum));
        } else if (target == 2){
            xhw.txtLineNum2.setText(Integer.toString(lineNum));
        } else {
            xhw.txtLineNum1.setText(null);
            xhw.txtLineNum2.setText(null);
        }

    } else {
        highlighter.removeAllHighlights();
    }

}

When I do a search for Alt with the indexof() I get 40 for the plain text (which is what it should return) and 41 when searching with the styled doc. And for each additional line that Alt appears on I get and extra index (so that the indexof() call returns 2 more then needed in line 3). This happens for every additional line that it finds. Am I missing something obvious? (If I need to push this to a smaller single class to make it easier to check I can do this later when I have some more time).

Thanks in advance...


Solution

  • OK I have found a solution (basicly). I approached this from the aspect that I am getting text from the same text componet in two different ways...

        String search = xw.textSearch.getText();
        String contents;
        String contentsS;
        JTextPane searchPane;
        StyledDocument sSearchPane;
    
        searchPane = xw.txtDisplay_left;
        sSearchPane = xw.txtDisplay_left.getStyledDocument();
    
    
        contents = searchPane.getText();
        contentsS = sSearchPane.getText(0, sSearchPane.getLength());
    
        // Search for the desired string starting at cursor position
        int newPos = contents.indexOf( search, sPos );
        int newPosS = contentsS.indexOf(search, sPos);
    

    So when comparing the two variables "newPos" & "newPosS", newPos retruned 1 more then newPosS for each line that the search string was found on. So when looking at the sample file and searching for "Alt" the first instance is found on line 2. "newPos" returns 41 and "newPosS returns 40 (which then highlights the correct text). The next occurance (which is found in line 3) "newPos" returns 71 and "newPosS" returns 69. As you can see, every new line increases the count by the line number the occurance begins in. I would suspect that there is an extra character being added in for each new line from the textPane that is not present in the StyledDoc.

    I'm sure there is a reasonable explaination but I don't have it at this time.