All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.groovy.tools.shell.PatchedConsoleReader.groovy Maven / Gradle / Ivy

There is a newer version: 3.0.23
Show newest version
/*
 * Copyright 2003-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.codehaus.groovy.tools.shell

import groovy.transform.CompileStatic
import jline.console.ConsoleReader
import jline.internal.Log
import org.codehaus.groovy.tools.shell.util.JAnsiHelper
import org.fusesource.jansi.AnsiOutputStream

@CompileStatic
class PatchedConsoleReader extends ConsoleReader {


    public PatchedConsoleReader(final InputStream inStream, final OutputStream out) throws IOException {
        super(inStream, out);
    }

    /**
     * copied from jline2.0 and modified to invoke stripAnsi() for length calculations
     * Output the specified {@link Collection} in proper columns.
     * See https://github.com/jline/jline2/issues/132
     */
    public void printColumns(final Collection items) throws IOException {
        if (items == null || items.isEmpty()) {
            return;
        }

        int width = getTerminal().getWidth();
        int height = getTerminal().getHeight();

        int maxWidth = 0;
        for (CharSequence item : items) {
            maxWidth = Math.max(maxWidth, JAnsiHelper.stripAnsi(item).length());
        }
        maxWidth = maxWidth + 3;
        Log.debug("Max width: ", maxWidth);

        int showLines;
        if (isPaginationEnabled()) {
            showLines = height - 1; // page limit
        }
        else {
            showLines = Integer.MAX_VALUE;
        }

        StringBuilder buff = new StringBuilder();
        int realLength = 0;
        for (CharSequence item : items) {
            if ((realLength + maxWidth) > width) {
                println(buff);
                buff.setLength(0);
                realLength = 0;

                if (--showLines == 0) {
                    // Overflow
                    print(resources.getString("DISPLAY_MORE"));
                    flush();
                    int c = readCharacter();
                    if (c == '\r' || c == '\n') {
                        // one step forward
                        showLines = 1;
                    }
                    else if (c != 'q') {
                        // page forward
                        showLines = height - 1;
                    }

                    back(resources.getString("DISPLAY_MORE").length());
                    if (c == 'q') {
                        // cancel
                        break;
                    }
                }
            }

            // NOTE: toString() is important here due to AnsiString being retarded
            buff.append(item.toString());
            int strippedItemLength = JAnsiHelper.stripAnsi(item).length()
            realLength += strippedItemLength
            for (int i = 0; i < (maxWidth - strippedItemLength); i++) {
                buff.append(' ');
            }
            realLength += maxWidth - strippedItemLength;
        }

        if (buff.length() > 0) {
            println(buff);
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy