ArrayInitializerFormatter.java revision ca6acfdd6b3400ad6e29d45c29b0ec40ea92a968
12be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka/*
22be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Copyright (C) 2012 The Android Open Source Project
32be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka *
42be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Licensed under the Apache License, Version 2.0 (the "License");
52be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * you may not use this file except in compliance with the License.
62be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * You may obtain a copy of the License at
72be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka *
82be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka *      http://www.apache.org/licenses/LICENSE-2.0
92be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka *
102be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * Unless required by applicable law or agreed to in writing, software
112be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * distributed under the License is distributed on an "AS IS" BASIS,
122be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * See the License for the specific language governing permissions and
142be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka * limitations under the License.
152be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka */
162be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
17ca6acfdd6b3400ad6e29d45c29b0ec40ea92a968Tadashi G. Takaokapackage com.android.inputmethod.keyboard.tools;
182be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
192be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokaimport java.io.PrintStream;
202be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
212be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaokapublic class ArrayInitializerFormatter {
222be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final PrintStream mOut;
232be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final int mMaxWidth;
242be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final String mIndent;
252be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
262be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private int mCurrentIndex = 0;
272be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private String mFixedElement;
282be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final StringBuilder mBuffer = new StringBuilder();
292be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private int mBufferedLen;
302be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private int mBufferedIndex = Integer.MIN_VALUE;
312be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
322be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    public ArrayInitializerFormatter(PrintStream out, int width, String indent) {
332be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mOut = out;
342be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mMaxWidth = width - indent.length();
352be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mIndent = indent;
362be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
372be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
382be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    public void flush() {
392be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (mBuffer.length() == 0) {
402be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return;
412be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
422be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        final int lastIndex = mCurrentIndex - 1;
432be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (mBufferedIndex == lastIndex) {
442be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mOut.format("%s/* %d */ %s\n", mIndent, mBufferedIndex, mBuffer);
452be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        } else if (mBufferedIndex == lastIndex - 1) {
462be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            final String[] elements = mBuffer.toString().split(" ");
472be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mOut.format("%s/* %d */ %s\n"
482be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    + "%s/* %d */ %s\n",
492be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    mIndent, mBufferedIndex, elements[0],
502be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    mIndent, lastIndex, elements[1]);
512be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        } else {
522be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mOut.format("%s/* %d~ */\n"
532be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    + "%s%s\n"
542be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    + "%s/* ~%d */\n", mIndent, mBufferedIndex,
552be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    mIndent, mBuffer,
562be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    mIndent, lastIndex);
572be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
582be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mBuffer.setLength(0);
592be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mBufferedLen = 0;
602be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
612be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
622be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    public void outCommentLines(String lines) {
632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        flush();
642be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mOut.print(lines);
652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mFixedElement = null;
662be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
672be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
682be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    public void outElement(String element) {
692be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (!element.equals(mFixedElement)) {
702be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            flush();
712be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBufferedIndex = mCurrentIndex;
722be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
732be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        final int nextLen = mBufferedLen + " ".length() + element.length();
742be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (mBufferedLen != 0 && nextLen < mMaxWidth) {
752be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(' ');
762be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(element);
772be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBufferedLen = nextLen;
782be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        } else {
792be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            if (mBufferedLen != 0) {
802be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mBuffer.append('\n');
812be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mBuffer.append(mIndent);
822be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            }
832be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(element);
842be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBufferedLen = element.length();
852be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
862be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mCurrentIndex++;
872be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mFixedElement = element;
882be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
892be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka}
90