/* * file: GanttarStyleFactory14.java * author: Jon Iles * copyright: (c) Packwood Software 2010 * date: 19/04/2010 */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package net.sf.mpxj.mpp; import net.sf.mpxj.TaskField; import net.sf.mpxj.common.MPPTaskField14; /** * Reads Gantt bar styles from an MPP14 file. */ public class GanttBarStyleFactory14 implements GanttBarStyleFactory { /** * {@inheritDoc} */ @Override public GanttBarStyle[] processDefaultStyles(Props props) { GanttBarStyle[] barStyles = null; byte[] barStyleData = props.getByteArray(DEFAULT_PROPERTIES); if (barStyleData != null) { int barStyleCount = MPPUtility.getByte(barStyleData, 2243); if (barStyleCount > 0 && barStyleCount < 65535) { barStyles = new GanttBarStyle[barStyleCount]; int styleOffset = 2255; for (int loop = 0; loop < barStyleCount; loop++) { GanttBarStyle style = new GanttBarStyle(); barStyles[loop] = style; style.setName(MPPUtility.getUnicodeString(barStyleData, styleOffset + 91)); style.setLeftText(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 67))); style.setRightText(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 71))); style.setTopText(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 75))); style.setBottomText(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 79))); style.setInsideText(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 83))); style.setStartShape(GanttBarStartEndShape.getInstance(barStyleData[styleOffset + 15] % 25)); style.setStartType(GanttBarStartEndType.getInstance(barStyleData[styleOffset + 15] / 25)); style.setStartColor(MPPUtility.getColor(barStyleData, styleOffset + 16)); style.setMiddleShape(GanttBarMiddleShape.getInstance(barStyleData[styleOffset])); style.setMiddlePattern(ChartPattern.getInstance(barStyleData[styleOffset + 1])); style.setMiddleColor(MPPUtility.getColor(barStyleData, styleOffset + 2)); style.setEndShape(GanttBarStartEndShape.getInstance(barStyleData[styleOffset + 28] % 25)); style.setEndType(GanttBarStartEndType.getInstance(barStyleData[styleOffset + 28] / 25)); style.setEndColor(MPPUtility.getColor(barStyleData, styleOffset + 29)); style.setFromField(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 41))); style.setToField(getTaskField(MPPUtility.getShort(barStyleData, styleOffset + 45))); extractFlags(style, GanttBarShowForTasks.NORMAL, MPPUtility.getLong(barStyleData, styleOffset + 49)); extractFlags(style, GanttBarShowForTasks.NOT_NORMAL, MPPUtility.getLong(barStyleData, styleOffset + 57)); style.setRow((MPPUtility.getShort(barStyleData, styleOffset + 65) + 1)); styleOffset += 195; } } } return barStyles; } /** * {@inheritDoc} */ @Override public GanttBarStyleException[] processExceptionStyles(Props props) { GanttBarStyleException[] barStyle = null; byte[] barData = props.getByteArray(EXCEPTION_PROPERTIES); if (barData != null) { //System.out.println(MPPUtility.hexdump(barData, false, 71, "")); barStyle = new GanttBarStyleException[barData.length / 71]; int offset = 0; for (int loop = 0; loop < barStyle.length; loop++) { GanttBarStyleException style = new GanttBarStyleException(); barStyle[loop] = style; style.setTaskUniqueID(MPPUtility.getInt(barData, offset)); style.setBarStyleIndex(MPPUtility.getShort(barData, offset + 4) - 1); style.setStartShape(GanttBarStartEndShape.getInstance(barData[offset + 20] % 25)); style.setStartType(GanttBarStartEndType.getInstance(barData[offset + 20] / 25)); style.setStartColor(MPPUtility.getColor(barData, offset + 21)); style.setMiddleShape(GanttBarMiddleShape.getInstance(barData[offset + 6])); style.setMiddlePattern(ChartPattern.getInstance(barData[offset + 7])); style.setMiddleColor(MPPUtility.getColor(barData, offset + 8)); style.setEndShape(GanttBarStartEndShape.getInstance(barData[offset + 33] % 25)); style.setEndType(GanttBarStartEndType.getInstance(barData[offset + 33] / 25)); style.setEndColor(MPPUtility.getColor(barData, offset + 34)); style.setLeftText(getTaskField(MPPUtility.getShort(barData, offset + 49))); style.setRightText(getTaskField(MPPUtility.getShort(barData, offset + 53))); style.setTopText(getTaskField(MPPUtility.getShort(barData, offset + 57))); style.setBottomText(getTaskField(MPPUtility.getShort(barData, offset + 61))); style.setInsideText(getTaskField(MPPUtility.getShort(barData, offset + 65))); //System.out.println(style); offset += 71; } } return barStyle; } /** * Extract the flags indicating which task types this bar style * is relevant for. Note that this work for the "normal" task types * and the "negated" task types (e.g. Normal Task, Not Normal task). * The set of values used is determined by the baseCriteria argument. * * @param style parent bar style * @param baseCriteria determines if the normal or negated enums are used * @param flagValue flag data */ private void extractFlags(GanttBarStyle style, GanttBarShowForTasks baseCriteria, long flagValue) { int index = 0; long flag = 0x0001; while (index < 64) { if ((flagValue & flag) != 0) { GanttBarShowForTasks enumValue = GanttBarShowForTasks.getInstance(baseCriteria.getValue() + index); if (enumValue != null) { style.addShowForTasks(enumValue); } } flag = flag << 1; index++; } } /** * Maps an integer field ID to a field type. * * @param field field ID * @return field type */ private TaskField getTaskField(int field) { TaskField result = MPPTaskField14.getInstance(field); if (result != null) { switch (result) { case START_TEXT: { result = TaskField.START; break; } case FINISH_TEXT: { result = TaskField.FINISH; break; } case DURATION_TEXT: { result = TaskField.DURATION; break; } default: { break; } } } return result; } private static final Integer DEFAULT_PROPERTIES = Integer.valueOf(574619656); private static final Integer EXCEPTION_PROPERTIES = Integer.valueOf(574619661); }