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;
250fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    // String resource names array; indexed by {@link #CurrentIndex} and
260fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    // {@link #mStartIndexOfBuffer}.
270fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    private final String[] mResourceNames;
282be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
292be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private int mCurrentIndex = 0;
300fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    private String mLastElement;
312be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private final StringBuilder mBuffer = new StringBuilder();
322be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    private int mBufferedLen;
330fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    private int mStartIndexOfBuffer = Integer.MIN_VALUE;
342be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
350fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka    public ArrayInitializerFormatter(final PrintStream out, final int width, final String indent,
360fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            final String[] resourceNames) {
372be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mOut = out;
382be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mMaxWidth = width - indent.length();
392be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mIndent = indent;
400fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        mResourceNames = resourceNames;
412be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
422be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
43ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka    public int getCurrentIndex() {
44ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka        return mCurrentIndex;
45ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka    }
46ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka
472be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    public void flush() {
482be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (mBuffer.length() == 0) {
492be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            return;
502be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
512be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        final int lastIndex = mCurrentIndex - 1;
520fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        if (mStartIndexOfBuffer == lastIndex) {
530fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            mOut.format("%s/* %s */ %s\n",
540fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    mIndent, mResourceNames[mStartIndexOfBuffer], mBuffer);
550fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        } else if (mStartIndexOfBuffer == lastIndex - 1) {
560fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            final String startElement = mBuffer.toString()
570fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    .substring(0, mBuffer.length() - mLastElement.length())
580fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    .trim();
590fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            mOut.format("%s/* %s */ %s\n"
600fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    + "%s/* %s */ %s\n",
610fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    mIndent, mResourceNames[mStartIndexOfBuffer], startElement,
620fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    mIndent, mResourceNames[lastIndex], mLastElement);
632be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        } else {
640fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            mOut.format("%s/* %s ~ */\n"
652be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    + "%s%s\n"
660fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    + "%s/* ~ %s */\n",
670fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    mIndent, mResourceNames[mStartIndexOfBuffer],
682be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                    mIndent, mBuffer,
690fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka                    mIndent, mResourceNames[lastIndex]);
702be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
712be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mBuffer.setLength(0);
722be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mBufferedLen = 0;
732be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
742be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
75ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka    public void outCommentLines(final String lines) {
762be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        flush();
772be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mOut.print(lines);
780fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        mLastElement = null;
792be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
802be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka
81ed509695a42455874aa9c047ed4343f636ef527bTadashi G. Takaoka    public void outElement(final String element) {
820fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        if (!element.equals(mLastElement)) {
832be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            flush();
840fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            mStartIndexOfBuffer = mCurrentIndex;
852be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
862be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        final int nextLen = mBufferedLen + " ".length() + element.length();
872be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        if (mBufferedLen != 0 && nextLen < mMaxWidth) {
880fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            // Element can fit in the current line.
892be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(' ');
902be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(element);
912be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBufferedLen = nextLen;
922be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        } else {
930fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka            // Element should be on the next line.
942be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            if (mBufferedLen != 0) {
952be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mBuffer.append('\n');
962be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka                mBuffer.append(mIndent);
972be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            }
982be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBuffer.append(element);
992be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka            mBufferedLen = element.length();
1002be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        }
1012be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka        mCurrentIndex++;
1020fe4d00068fb9ea85bfab083aa595082dd24e59cTadashi G. Takaoka        mLastElement = element;
1032be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka    }
1042be51f4fd0c5cd70c7a2757558ffe45e703700cfTadashi G. Takaoka}
105