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