/* * file: GanttChartView9.java * author: Jon Iles * copyright: (c) Packwood Software 2005 * date: Apr 7, 2005 */ /* * 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 java.awt.Color; import java.io.IOException; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.sf.mpxj.Day; import net.sf.mpxj.FieldType; import net.sf.mpxj.Filter; import net.sf.mpxj.GenericCriteria; import net.sf.mpxj.ProjectFile; /** * This class represents the set of properties used to define the appearance * of a Gantt chart view in MS Project. */ public final class GanttChartView9 extends GanttChartView { /** * {@inheritDoc} */ @Override protected Integer getPropertiesID() { return (PROPERTIES); } /** * {@inheritDoc} */ @Override protected void processDefaultBarStyles(Props props) { GanttBarStyleFactory f = new GanttBarStyleFactoryCommon(); m_barStyles = f.processDefaultStyles(props); } /** * {@inheritDoc} */ @Override protected void processExceptionBarStyles(Props props) { GanttBarStyleFactory f = new GanttBarStyleFactoryCommon(); m_barStyleExceptions = f.processExceptionStyles(props); } /** * {@inheritDoc} */ @Override protected void processAutoFilters(byte[] data) { //System.out.println(MPPUtility.hexdump(data, true, 16, "")); // // 16 byte block header containing the filter count // int filterCount = MPPUtility.getShort(data, 8); int offset = 16; CriteriaReader criteria = new FilterCriteriaReader9(); List<FieldType> fields = new LinkedList<FieldType>(); // // Filter data: 24 byte header, plus 80 byte criteria blocks, // plus var data. Total block size is specified at the start of the // block. // for (int loop = 0; loop < filterCount; loop++) { int blockSize = MPPUtility.getShort(data, offset); // // Steelray 12335: the block size may be zero // if (blockSize == 0) { break; } //System.out.println(MPPUtility.hexdump(data, offset, blockSize, true, 16, "")); int entryOffset = MPPUtility.getShort(data, offset + 12); fields.clear(); GenericCriteria c = criteria.process(m_properties, data, offset + 4, entryOffset, null, fields, null); //System.out.println(c); if (!fields.isEmpty()) { Filter filter = new Filter(); filter.setCriteria(c); m_autoFilters.add(filter); m_autoFiltersByType.put(fields.get(0), filter); } // // Move to the next filter // offset += blockSize; } } /** * {@inheritDoc} */ @Override protected void processViewProperties(Map<Integer, FontBase> fontBases, Props props) { //MPPUtility.fileDump("c:\\temp\\props.txt", props.toString().getBytes()); byte[] viewPropertyData = props.getByteArray(VIEW_PROPERTIES); if (viewPropertyData != null) { //MPPUtility.fileDump("c:\\temp\\props.txt", MPPUtility.hexdump(viewPropertyData, false, 16, "").getBytes()); m_highlightedTasksFontStyle = getFontStyle(viewPropertyData, 26, fontBases); m_rowAndColumnFontStyle = getFontStyle(viewPropertyData, 30, fontBases); m_nonCriticalTasksFontStyle = getFontStyle(viewPropertyData, 34, fontBases); m_criticalTasksFontStyle = getFontStyle(viewPropertyData, 38, fontBases); m_summaryTasksFontStyle = getFontStyle(viewPropertyData, 42, fontBases); m_milestoneTasksFontStyle = getFontStyle(viewPropertyData, 46, fontBases); m_middleTimescaleFontStyle = getFontStyle(viewPropertyData, 50, fontBases); m_bottomTimescaleFontStyle = getFontStyle(viewPropertyData, 54, fontBases); m_barTextLeftFontStyle = getFontStyle(viewPropertyData, 58, fontBases); m_barTextRightFontStyle = getFontStyle(viewPropertyData, 62, fontBases); m_barTextTopFontStyle = getFontStyle(viewPropertyData, 66, fontBases); m_barTextBottomFontStyle = getFontStyle(viewPropertyData, 70, fontBases); m_barTextInsideFontStyle = getFontStyle(viewPropertyData, 74, fontBases); m_markedTasksFontStyle = getFontStyle(viewPropertyData, 78, fontBases); m_projectSummaryTasksFontStyle = getFontStyle(viewPropertyData, 82, fontBases); m_externalTasksFontStyle = getFontStyle(viewPropertyData, 86, fontBases); m_topTimescaleFontStyle = getFontStyle(viewPropertyData, 90, fontBases); m_sheetRowsGridLines = getGridLines(viewPropertyData, 99); m_sheetColumnsGridLines = getGridLines(viewPropertyData, 109); m_titleVerticalGridLines = getGridLines(viewPropertyData, 119); m_titleHorizontalGridLines = getGridLines(viewPropertyData, 129); m_middleTierColumnGridLines = getGridLines(viewPropertyData, 139); m_bottomTierColumnGridLines = getGridLines(viewPropertyData, 149); m_ganttRowsGridLines = getGridLines(viewPropertyData, 159); m_barRowsGridLines = getGridLines(viewPropertyData, 169); m_currentDateGridLines = getGridLines(viewPropertyData, 179); m_pageBreakGridLines = getGridLines(viewPropertyData, 189); m_projectStartGridLines = getGridLines(viewPropertyData, 199); m_projectFinishGridLines = getGridLines(viewPropertyData, 209); m_statusDateGridLines = getGridLines(viewPropertyData, 219); m_nonWorkingDaysCalendarName = MPPUtility.getUnicodeString(viewPropertyData, 352); m_nonWorkingColor = ColorType.getInstance(viewPropertyData[1153]).getColor(); m_nonWorkingPattern = ChartPattern.getInstance(viewPropertyData[1154]); m_nonWorkingStyle = NonWorkingTimeStyle.getInstance(viewPropertyData[1152]); m_ganttBarHeight = mapGanttBarHeight(MPPUtility.getByte(viewPropertyData, 1163)); byte flags = viewPropertyData[228]; m_timescaleMiddleTier = new TimescaleTier(); m_timescaleMiddleTier.setTickLines((flags & 0x01) != 0); m_timescaleMiddleTier.setUsesFiscalYear((flags & 0x08) != 0); m_timescaleMiddleTier.setUnits(TimescaleUnits.getInstance(viewPropertyData[242])); m_timescaleMiddleTier.setCount(viewPropertyData[246]); m_timescaleMiddleTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(viewPropertyData, 250))); m_timescaleMiddleTier.setAlignment(TimescaleAlignment.getInstance(viewPropertyData[256] - 32)); m_timescaleBottomTier = new TimescaleTier(); m_timescaleBottomTier.setTickLines((flags & 0x02) != 0); m_timescaleBottomTier.setUsesFiscalYear((flags & 0x10) != 0); m_timescaleBottomTier.setUnits(TimescaleUnits.getInstance(viewPropertyData[244])); m_timescaleBottomTier.setCount(viewPropertyData[248]); m_timescaleBottomTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(viewPropertyData, 252))); m_timescaleBottomTier.setAlignment(TimescaleAlignment.getInstance(viewPropertyData[254] - 32)); m_timescaleScaleSeparator = (flags & 0x04) != 0; m_timescaleSize = viewPropertyData[268]; m_showDrawings = (viewPropertyData[1156] != 0); m_roundBarsToWholeDays = (viewPropertyData[1158] != 0); m_showBarSplits = (viewPropertyData[1160] != 0); m_alwaysRollupGanttBars = (viewPropertyData[1186] != 0); m_hideRollupBarsWhenSummaryExpanded = (viewPropertyData[1188] != 0); m_barDateFormat = GanttBarDateFormat.getInstance(viewPropertyData[1182] + 1); m_linkStyle = LinkStyle.getInstance(viewPropertyData[1155]); } byte[] timescaleData = props.getByteArray(TIMESCALE_PROPERTIES); if (timescaleData != null) { m_timescaleTopTier = new TimescaleTier(); m_timescaleTopTier.setTickLines(timescaleData[48] != 0); m_timescaleTopTier.setUsesFiscalYear(timescaleData[60] != 0); m_timescaleTopTier.setUnits(TimescaleUnits.getInstance(timescaleData[30])); m_timescaleTopTier.setCount(timescaleData[32]); m_timescaleTopTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(timescaleData, 34))); m_timescaleTopTier.setAlignment(TimescaleAlignment.getInstance(timescaleData[36] - 20)); m_topTierColumnGridLines = getGridLines(timescaleData, 39); m_timescaleShowTiers = timescaleData[0]; } } /** * Creates a new GridLines instance. * * @param data data block * @param offset offset into data block * @return new GridLines instance */ private GridLines getGridLines(byte[] data, int offset) { Color normalLineColor = ColorType.getInstance(data[offset]).getColor(); LineStyle normalLineStyle = LineStyle.getInstance(data[offset + 3]); int intervalNumber = data[offset + 4]; LineStyle intervalLineStyle = LineStyle.getInstance(data[offset + 5]); Color intervalLineColor = ColorType.getInstance(data[offset + 6]).getColor(); return new GridLines(normalLineColor, normalLineStyle, intervalNumber, intervalLineStyle, intervalLineColor); } /** * {@inheritDoc} */ @Override protected void processTableFontStyles(Map<Integer, FontBase> fontBases, byte[] columnData) { m_tableFontStyles = new TableFontStyle[columnData.length / 16]; int offset = 0; for (int loop = 0; loop < m_tableFontStyles.length; loop++) { m_tableFontStyles[loop] = getColumnFontStyle(columnData, offset, fontBases); offset += 16; } } /** * {@inheritDoc} */ @Override protected void processProgressLines(Map<Integer, FontBase> fontBases, byte[] progressLineData) { //MPPUtility.fileDump("c:\\temp\\props.txt", MPPUtility.hexdump(progressLineData, false, 16, "").getBytes()); m_progressLinesEnabled = (progressLineData[0] != 0); m_progressLinesAtCurrentDate = (progressLineData[2] != 0); m_progressLinesAtRecurringIntervals = (progressLineData[4] != 0); m_progressLinesInterval = Interval.getInstance(progressLineData[6]); m_progressLinesIntervalDailyDayNumber = progressLineData[8]; m_progressLinesIntervalDailyWorkday = (progressLineData[10] != 0); m_progressLinesIntervalWeeklyDay[Day.SUNDAY.getValue()] = (progressLineData[14] != 0); m_progressLinesIntervalWeeklyDay[Day.MONDAY.getValue()] = (progressLineData[16] != 0); m_progressLinesIntervalWeeklyDay[Day.TUESDAY.getValue()] = (progressLineData[18] != 0); m_progressLinesIntervalWeeklyDay[Day.WEDNESDAY.getValue()] = (progressLineData[20] != 0); m_progressLinesIntervalWeeklyDay[Day.THURSDAY.getValue()] = (progressLineData[22] != 0); m_progressLinesIntervalWeeklyDay[Day.FRIDAY.getValue()] = (progressLineData[24] != 0); m_progressLinesIntervalWeeklyDay[Day.SATURDAY.getValue()] = (progressLineData[26] != 0); m_progressLinesIntervalWeekleyWeekNumber = progressLineData[30]; m_progressLinesIntervalMonthlyDay = (progressLineData[32] != 0); m_progressLinesIntervalMonthlyDayDayNumber = progressLineData[34]; m_progressLinesIntervalMonthlyDayMonthNumber = progressLineData[28]; m_progressLinesIntervalMonthlyFirstLastDay = ProgressLineDay.getInstance(progressLineData[36]); m_progressLinesIntervalMonthlyFirstLast = (progressLineData[40] == 1); m_progressLinesIntervalMonthlyFirstLastMonthNumber = progressLineData[30]; m_progressLinesBeginAtProjectStart = (progressLineData[44] != 0); m_progressLinesBeginAtDate = MPPUtility.getDate(progressLineData, 46); m_progressLinesDisplaySelected = (progressLineData[48] != 0); m_progressLinesActualPlan = (progressLineData[52] != 0); m_progressLinesDisplayType = MPPUtility.getShort(progressLineData, 54); m_progressLinesShowDate = (progressLineData[56] != 0); m_progressLinesDateFormat = MPPUtility.getShort(progressLineData, 58); m_progressLinesFontStyle = getFontStyle(progressLineData, 60, fontBases); m_progressLinesCurrentLineColor = ColorType.getInstance(progressLineData[64]).getColor(); m_progressLinesCurrentLineStyle = LineStyle.getInstance(progressLineData[65]); m_progressLinesCurrentProgressPointColor = ColorType.getInstance(progressLineData[66]).getColor(); m_progressLinesCurrentProgressPointShape = progressLineData[67]; m_progressLinesOtherLineColor = ColorType.getInstance(progressLineData[68]).getColor(); m_progressLinesOtherLineStyle = LineStyle.getInstance(progressLineData[69]); m_progressLinesOtherProgressPointColor = ColorType.getInstance(progressLineData[70]).getColor(); m_progressLinesOtherProgressPointShape = progressLineData[71]; int dateCount = MPPUtility.getShort(progressLineData, 50); if (dateCount != 0) { m_progressLinesDisplaySelectedDates = new Date[dateCount]; int offset = 72; int count = 0; while (count < dateCount && offset < progressLineData.length) { m_progressLinesDisplaySelectedDates[count] = MPPUtility.getDate(progressLineData, offset); offset += 2; ++count; } } } /** * Create a GanttChartView from the fixed and var data blocks associated * with a view. * * @param parent parent MPP file * @param fixedMeta fixed meta data block * @param fixedData fixed data block * @param varData var data block * @param fontBases map of font bases * @throws IOException */ GanttChartView9(ProjectFile parent, byte[] fixedMeta, byte[] fixedData, Var2Data varData, Map<Integer, FontBase> fontBases) throws IOException { super(parent, fixedMeta, fixedData, varData, fontBases); } private static final Integer PROPERTIES = Integer.valueOf(1); }