// Path: readline/src/main/java/org/aesh/extensions/util/FileParser.java
// public interface FileParser {
// 
//     List<String> loadPage(int columns) throws IOException;
// 
//     String getName();
// }
// 
// Path: readline/src/main/java/org/aesh/extensions/manual/TerminalPage.java
// public class TerminalPage {
//     private List<String> lines;
//     private FileParser fileParser;
// 
//     public TerminalPage(FileParser fileParser, int columns) throws IOException {
//         this.fileParser = fileParser;
//         lines = fileParser.loadPage(columns);
//     }
// 
//     public String getLine(int num) {
//         if(num < lines.size())
//             return lines.get(num);
//         else
//             return "";
//     }
// 
//     public List<Integer> findWord(String word) {
//         List<Integer> wordLines = new ArrayList<Integer>();
//         for(int i=0; i < lines.size();i++) {
//             if(lines.get(i).contains(word))
//                 wordLines.add(i);
//         }
//         return wordLines;
//     }
// 
//     public int size() {
//         return lines.size();
//     }
// 
//     public String getFileName() {
//         return fileParser.getName();
//     }
// 
//     public List<String> getLines() {
//         return lines;
//     }
// 
//     public boolean hasData() {
//         return !lines.isEmpty();
//     }
// 
//     public void clear() {
//         lines.clear();
//     }
// 
//     public static enum Search {
//         SEARCHING,
//         RESULT,
//         NOT_FOUND,
//         NO_SEARCH
//     }
// 
// }


import java.util.concurrent.CountDownLatch;
import java.util.logging.Logger;
import org.aesh.extensions.util.FileParser;
import org.aesh.extensions.manual.TerminalPage;
import org.aesh.readline.action.KeyAction;
import org.aesh.readline.completion.Completion;
import org.aesh.readline.terminal.Key;
import org.aesh.terminal.Attributes;
import org.aesh.terminal.Connection;
import org.aesh.readline.util.LoggerUtil;
import org.aesh.terminal.utils.ANSI;
import org.aesh.terminal.utils.Config;
import java.io.IOException;
import java.util.List;
                            connection.write(line);
                        connection.write(Config.getLineSeparator());
                    }
                }
                topVisibleRowCache = topVisibleRow;
            }
            else {
                for(int i=topVisibleRow; i < (topVisibleRow+rows-1); i++) {
                    if(i < page.size()) {
                        connection.write(page.getLine(i)+Config.getLineSeparator());
                    }
                }
                topVisibleRowCache = topVisibleRow;
            }
            displayBottom();
        }
    }

    /**
     * highlight the specific word thats found in the search
     */
    private void displaySearchLine(String line, String searchWord) throws IOException {
        int start = line.indexOf(searchWord);
        connection.write(line.substring(0,start));
        connection.write(ANSI.INVERT_BACKGROUND);
        connection.write(searchWord);
        connection.write(ANSI.RESET);
        connection.write(line.substring(start + searchWord.length(), line.length()));
    }

// Path: readline/src/main/java/org/aesh/extensions/util/FileParser.java
// public interface FileParser {
// 
//     List<String> loadPage(int columns) throws IOException;
// 
//     String getName();
// }
// 
// Path: readline/src/main/java/org/aesh/extensions/manual/TerminalPage.java
// public class TerminalPage {
//     private List<String> lines;
//     private FileParser fileParser;
// 
//     public TerminalPage(FileParser fileParser, int columns) throws IOException {
//         this.fileParser = fileParser;
//         lines = fileParser.loadPage(columns);
//     }
// 
//     public String getLine(int num) {
//         if(num < lines.size())
//             return lines.get(num);
//         else
//             return "";
//     }
// 
//     public List<Integer> findWord(String word) {
//         List<Integer> wordLines = new ArrayList<Integer>();
//         for(int i=0; i < lines.size();i++) {
//             if(lines.get(i).contains(word))
//                 wordLines.add(i);
//         }
//         return wordLines;
//     }
// 
//     public int size() {
//         return lines.size();
//     }
// 
//     public String getFileName() {
//         return fileParser.getName();
//     }
// 
//     public List<String> getLines() {
//         return lines;
//     }
// 
//     public boolean hasData() {
//         return !lines.isEmpty();
//     }
// 
//     public void clear() {
//         lines.clear();
//     }
// 
//     public static enum Search {
//         SEARCHING,
//         RESULT,
//         NOT_FOUND,
//         NO_SEARCH
//     }
// 
// }


// Path: readline/src/main/java/org/aesh/extensions/manual/page/FileDisplayer.java
import java.util.concurrent.CountDownLatch;
import java.util.logging.Logger;
import org.aesh.extensions.util.FileParser;
import org.aesh.extensions.manual.TerminalPage;
import org.aesh.readline.action.KeyAction;
import org.aesh.readline.completion.Completion;
import org.aesh.readline.terminal.Key;
import org.aesh.terminal.Attributes;
import org.aesh.terminal.Connection;
import org.aesh.readline.util.LoggerUtil;
import org.aesh.terminal.utils.ANSI;
import org.aesh.terminal.utils.Config;
import java.io.IOException;
import java.util.List;

                            connection.write(line);
                        connection.write(Config.getLineSeparator());
                    }
                }
                topVisibleRowCache = topVisibleRow;
            }
            else {
                for(int i=topVisibleRow; i < (topVisibleRow+rows-1); i++) {
                    if(i < page.size()) {
                        connection.write(page.getLine(i)+Config.getLineSeparator());
                    }
                }
                topVisibleRowCache = topVisibleRow;
            }
            displayBottom();
        }
    }

    /**
     * highlight the specific word thats found in the search
     */
    private void displaySearchLine(String line, String searchWord) throws IOException {
        int start = line.indexOf(searchWord);
        connection.write(line.substring(0,start));
        connection.write(ANSI.INVERT_BACKGROUND);
        connection.write(searchWord);
        connection.write(ANSI.RESET);
        connection.write(line.substring(start + searchWord.length(), line.length()));
    }

    public abstract FileParser getFileParser();