/* * ==================================================================== * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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.apache.poi.xssf.usermodel; import org.apache.poi.ss.usermodel.*; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTUnderlineProperty; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STUnderlineValues; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBooleanProperty; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFontSize; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTVerticalAlignFontProperty; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STVerticalAlignRun; /** * @author Yegor Kozlov */ public class XSSFFontFormatting implements FontFormatting { CTFont _font; /*package*/ XSSFFontFormatting(CTFont font){ _font = font; } /** * get the type of super or subscript for the font * * @return super or subscript option * @see #SS_NONE * @see #SS_SUPER * @see #SS_SUB */ @Override public short getEscapementType(){ if(_font.sizeOfVertAlignArray() == 0) return SS_NONE; CTVerticalAlignFontProperty prop = _font.getVertAlignArray(0); return (short)(prop.getVal().intValue() - 1); } /** * set the escapement type for the font * * @param escapementType super or subscript option * @see #SS_NONE * @see #SS_SUPER * @see #SS_SUB */ @Override public void setEscapementType(short escapementType){ _font.setVertAlignArray(null); if(escapementType != SS_NONE){ _font.addNewVertAlign().setVal(STVerticalAlignRun.Enum.forInt(escapementType + 1)); } } /** * XMLBeans and the XSD make this look like it can have multiple values, but it is maxOccurrs=1. * Use get*Array(), it is much faster than get*List(). * * @see org.apache.poi.ss.usermodel.FontFormatting#isStruckout() */ @Override public boolean isStruckout() { for (CTBooleanProperty bProp : _font.getStrikeArray()) return bProp.getVal(); return false; } /** * @return font color index */ @Override public short getFontColorIndex(){ if(_font.sizeOfColorArray() == 0) return -1; int idx = 0; CTColor color = _font.getColorArray(0); if(color.isSetIndexed()) idx = (int)color.getIndexed(); return (short)idx; } /** * @param color font color index */ @Override public void setFontColorIndex(short color){ _font.setColorArray(null); if(color != -1){ _font.addNewColor().setIndexed(color); } } @Override public XSSFColor getFontColor() { if(_font.sizeOfColorArray() == 0) return null; return new XSSFColor(_font.getColorArray(0)); } @Override public void setFontColor(Color color) { XSSFColor xcolor = XSSFColor.toXSSFColor(color); if (xcolor == null) { _font.getColorList().clear(); } else { _font.setColorArray(0, xcolor.getCTColor()); } } /** * gets the height of the font in 1/20th point units * * @return fontheight (in points/20); or -1 if not modified */ @Override public int getFontHeight(){ if(_font.sizeOfSzArray() == 0) return -1; CTFontSize sz = _font.getSzArray(0); return (short)(20*sz.getVal()); } /** * Sets the height of the font in 1/20th point units * * @param height the height in twips (in points/20) */ @Override public void setFontHeight(int height){ _font.setSzArray(null); if(height != -1){ _font.addNewSz().setVal((double)height / 20); } } /** * get the type of underlining for the font * * @return font underlining type * * @see #U_NONE * @see #U_SINGLE * @see #U_DOUBLE * @see #U_SINGLE_ACCOUNTING * @see #U_DOUBLE_ACCOUNTING */ @Override public short getUnderlineType(){ if(_font.sizeOfUArray() == 0) return U_NONE; CTUnderlineProperty u = _font.getUArray(0); switch(u.getVal().intValue()){ case STUnderlineValues.INT_SINGLE: return U_SINGLE; case STUnderlineValues.INT_DOUBLE: return U_DOUBLE; case STUnderlineValues.INT_SINGLE_ACCOUNTING: return U_SINGLE_ACCOUNTING; case STUnderlineValues.INT_DOUBLE_ACCOUNTING: return U_DOUBLE_ACCOUNTING; default: return U_NONE; } } /** * set the type of underlining type for the font * * @param underlineType super or subscript option * * @see #U_NONE * @see #U_SINGLE * @see #U_DOUBLE * @see #U_SINGLE_ACCOUNTING * @see #U_DOUBLE_ACCOUNTING */ @Override public void setUnderlineType(short underlineType){ _font.setUArray(null); if(underlineType != U_NONE){ FontUnderline fenum = FontUnderline.valueOf(underlineType); STUnderlineValues.Enum val = STUnderlineValues.Enum.forInt(fenum.getValue()); _font.addNewU().setVal(val); } } /** * get whether the font weight is set to bold or not * * @return bold - whether the font is bold or not */ @Override public boolean isBold(){ return _font.sizeOfBArray() == 1 && _font.getBArray(0).getVal(); } /** * @return true if font style was set to <i>italic</i> */ @Override public boolean isItalic(){ return _font.sizeOfIArray() == 1 && _font.getIArray(0).getVal(); } /** * set font style options. * * @param italic - if true, set posture style to italic, otherwise to normal * @param bold if true, set font weight to bold, otherwise to normal */ @Override public void setFontStyle(boolean italic, boolean bold){ _font.setIArray(null); _font.setBArray(null); if(italic) _font.addNewI().setVal(true); if(bold) _font.addNewB().setVal(true); } /** * set font style options to default values (non-italic, non-bold) */ @Override public void resetFontStyle(){ _font.set(CTFont.Factory.newInstance()); } }