All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.mpxj.mpp.GanttChartView14 Maven / Gradle / Ivy

Go to download

Library that provides facilities to allow project information to be manipulated in Java and .Net. Supports a range of data formats: Microsoft Project Exchange (MPX), Microsoft Project (MPP,MPT), Microsoft Project Data Interchange (MSPDI XML), Microsoft Project Database (MPD), Planner (XML), Primavera (PM XML, XER, and database), Asta Powerproject (PP, MDB), Asta Easyplan (PP), Phoenix Project Manager (PPX), FastTrack Schedule (FTS), and the Standard Data Exchange Format (SDEF).

There is a newer version: 13.8.0
Show newest version
/*
 * file:       GanttChartView14.java
 * author:     Jon Iles
 * copyright:  (c) Packwood Software 2010
 * date:       16/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 java.awt.Color;
import java.io.IOException;
import java.util.Date;
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;
import net.sf.mpxj.common.FieldTypeHelper;
import net.sf.mpxj.common.MPPTaskField14;

/**
 * This class represents the set of properties used to define the appearance
 * of a Gantt chart view in MS Project.
 */
public final class GanttChartView14 extends GanttChartView
{
   /**
    * {@inheritDoc}
    */
   @Override protected Integer getPropertiesID()
   {
      return (PROPERTIES);
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processDefaultBarStyles(Props props)
   {
      GanttBarStyleFactory f = new GanttBarStyleFactory14();
      m_barStyles = f.processDefaultStyles(props);
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processExceptionBarStyles(Props props)
   {
      GanttBarStyleFactory f = new GanttBarStyleFactory14();
      m_barStyleExceptions = f.processExceptionStyles(props);
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processAutoFilters(byte[] data)
   {
      //System.out.println(ByteArrayHelper.hexdump(data, true, 16, ""));

      //
      // 16 byte block header containing the filter count
      //
      int filterCount = MPPUtility.getShort(data, 8);
      int offset = 16;
      CriteriaReader criteria = new FilterCriteriaReader14();

      //
      // 16 byte header
      // followed by 4 bytes = field type
      // followed by 2 byte block size
      for (int loop = 0; loop < filterCount; loop++)
      {
         //
         // Invalid filter definition?
         //
         if (offset + 6 > data.length)
         {
            break;
         }

         FieldType field = getFieldType(data, offset);
         int blockSize = MPPUtility.getShort(data, offset + 4);

         //
         // Steelray 12335: the block size may be zero
         //
         if (blockSize == 0)
         {
            break;
         }

         //System.out.println(ByteArrayHelper.hexdump(data, offset, 32, false));

         // may need to sort this out
         GenericCriteria c = criteria.process(m_properties, data, offset + 12, -1, null, null, null);
         //System.out.println(c);

         Filter filter = new Filter();
         filter.setCriteria(c);
         m_autoFilters.add(filter);
         m_autoFiltersByType.put(field, filter);

         //
         // Move to the next filter
         //
         offset += blockSize;
      }
   }

   /**
    * Retrieves a field type from a location in a data block.
    *
    * @param data data block
    * @param offset offset into data block
    * @return field type
    */
   private FieldType getFieldType(byte[] data, int offset)
   {
      int fieldIndex = MPPUtility.getInt(data, offset);
      return FieldTypeHelper.mapTextFields(FieldTypeHelper.getInstance14(fieldIndex));
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processViewProperties(Map fontBases, Props props)
   {
      byte[] viewPropertyData = props.getByteArray(VIEW_PROPERTIES);
      if (viewPropertyData != null && viewPropertyData.length > 41360)
      {
         //MPPUtility.fileDump("c:\\temp\\props.txt", ByteArrayHelper.hexdump(viewPropertyData, false, 16, "").getBytes());

         m_highlightedTasksFontStyle = getFontStyle(viewPropertyData, 26, fontBases, false);
         m_rowAndColumnFontStyle = getFontStyle(viewPropertyData, 58, fontBases, false);
         m_nonCriticalTasksFontStyle = getFontStyle(viewPropertyData, 90, fontBases, false);
         m_criticalTasksFontStyle = getFontStyle(viewPropertyData, 122, fontBases, false);
         m_summaryTasksFontStyle = getFontStyle(viewPropertyData, 154, fontBases, false);
         m_milestoneTasksFontStyle = getFontStyle(viewPropertyData, 186, fontBases, false);
         m_middleTimescaleFontStyle = getFontStyle(viewPropertyData, 218, fontBases, false);
         m_bottomTimescaleFontStyle = getFontStyle(viewPropertyData, 250, fontBases, false);
         m_barTextLeftFontStyle = getFontStyle(viewPropertyData, 282, fontBases, false);
         m_barTextRightFontStyle = getFontStyle(viewPropertyData, 314, fontBases, false);
         m_barTextTopFontStyle = getFontStyle(viewPropertyData, 346, fontBases, false);
         m_barTextBottomFontStyle = getFontStyle(viewPropertyData, 378, fontBases, false);
         m_barTextInsideFontStyle = getFontStyle(viewPropertyData, 410, fontBases, false);
         m_markedTasksFontStyle = getFontStyle(viewPropertyData, 442, fontBases, false);
         m_projectSummaryTasksFontStyle = getFontStyle(viewPropertyData, 474, fontBases, false);
         m_externalTasksFontStyle = getFontStyle(viewPropertyData, 506, fontBases, false);
         m_topTimescaleFontStyle = getFontStyle(viewPropertyData, 538, fontBases, false);

         m_sheetRowsGridLines = getGridLines(viewPropertyData, 667);
         m_sheetColumnsGridLines = getGridLines(viewPropertyData, 697);
         m_titleVerticalGridLines = getGridLines(viewPropertyData, 727);
         m_titleHorizontalGridLines = getGridLines(viewPropertyData, 757);
         m_middleTierColumnGridLines = getGridLines(viewPropertyData, 787);
         m_bottomTierColumnGridLines = getGridLines(viewPropertyData, 817);
         m_ganttRowsGridLines = getGridLines(viewPropertyData, 847);
         m_barRowsGridLines = getGridLines(viewPropertyData, 877);
         m_currentDateGridLines = getGridLines(viewPropertyData, 907);
         m_pageBreakGridLines = getGridLines(viewPropertyData, 937);
         m_projectStartGridLines = getGridLines(viewPropertyData, 967);
         m_projectFinishGridLines = getGridLines(viewPropertyData, 997);
         m_statusDateGridLines = getGridLines(viewPropertyData, 1027);
         m_topTierColumnGridLines = getGridLines(viewPropertyData, 1057);

         m_nonWorkingDaysCalendarName = MPPUtility.getUnicodeString(viewPropertyData, 1422);
         m_nonWorkingColor = MPPUtility.getColor(viewPropertyData, 2223);
         m_nonWorkingPattern = ChartPattern.getInstance(viewPropertyData[2235]);
         m_nonWorkingStyle = NonWorkingTimeStyle.getInstance(viewPropertyData[2222]);

         m_timescaleShowTiers = viewPropertyData[41255];
         m_timescaleSize = viewPropertyData[1180];

         int flags = viewPropertyData[1086];
         m_timescaleScaleSeparator = (flags & 0x04) != 0;

         m_timescaleTopTier = new TimescaleTier();

         m_timescaleTopTier.setTickLines(viewPropertyData[41349] != 0);
         m_timescaleTopTier.setUsesFiscalYear((viewPropertyData[41361] & 0x01) != 0);
         m_timescaleTopTier.setUnits(TimescaleUnits.getInstance(viewPropertyData[41311]));
         m_timescaleTopTier.setCount(viewPropertyData[41313]);
         m_timescaleTopTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(viewPropertyData, 41315)));
         m_timescaleTopTier.setAlignment(TimescaleAlignment.getInstance(viewPropertyData[41317]));

         m_timescaleMiddleTier = new TimescaleTier();
         m_timescaleMiddleTier.setTickLines((flags & 0x01) != 0);
         m_timescaleMiddleTier.setUsesFiscalYear((flags & 0x08) != 0);
         m_timescaleMiddleTier.setUnits(TimescaleUnits.getInstance(viewPropertyData[1152]));
         m_timescaleMiddleTier.setCount(viewPropertyData[1156]);
         m_timescaleMiddleTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(viewPropertyData, 1160)));
         m_timescaleMiddleTier.setAlignment(TimescaleAlignment.getInstance(viewPropertyData[1166]));

         m_timescaleBottomTier = new TimescaleTier();
         m_timescaleBottomTier.setTickLines((flags & 0x02) != 0);
         m_timescaleBottomTier.setUsesFiscalYear((flags & 0x10) != 0);
         m_timescaleBottomTier.setUnits(TimescaleUnits.getInstance(viewPropertyData[1154]));
         m_timescaleBottomTier.setCount(viewPropertyData[1158]);
         m_timescaleBottomTier.setFormat(TimescaleFormat.getInstance(MPPUtility.getShort(viewPropertyData, 1162)));
         m_timescaleBottomTier.setAlignment(TimescaleAlignment.getInstance(viewPropertyData[1164]));

         m_showDrawings = (viewPropertyData[2237] != 0);
         m_roundBarsToWholeDays = (viewPropertyData[2239] != 0);
         m_showBarSplits = (viewPropertyData[2241] != 0);
         m_alwaysRollupGanttBars = (viewPropertyData[2251] != 0);
         m_hideRollupBarsWhenSummaryExpanded = (viewPropertyData[2253] != 0);
         m_ganttBarHeight = mapGanttBarHeight(MPPUtility.getByte(viewPropertyData, 2244));

         m_barDateFormat = GanttBarDateFormat.getInstance(viewPropertyData[2247] + 1);
         m_linkStyle = LinkStyle.getInstance(viewPropertyData[2236]);
      }
   }

   /**
    * 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)
   {
      //System.out.println(offset+ ": " + ByteArrayHelper.hexdump(data, offset, 30, false));
      Color normalLineColor = MPPUtility.getColor(data, offset);
      LineStyle normalLineStyle = LineStyle.getInstance(data[offset + 13]);
      int intervalNumber = data[offset + 14];
      LineStyle intervalLineStyle = LineStyle.getInstance(data[offset + 15]);
      Color intervalLineColor = MPPUtility.getColor(data, offset + 16);
      return new GridLines(normalLineColor, normalLineStyle, intervalNumber, intervalLineStyle, intervalLineColor);
   }

   /**
    * Retrieve font details from a block of property data.
    *
    * @param data property data
    * @param offset offset into property data
    * @param fontBases map of font bases
    * @param ignoreBackground set background to default values
    * @return FontStyle instance
    */
   protected FontStyle getFontStyle(byte[] data, int offset, Map fontBases, boolean ignoreBackground)
   {
      //System.out.println(ByteArrayHelper.hexdump(data, offset, 32, false));

      Integer index = Integer.valueOf(MPPUtility.getByte(data, offset));
      FontBase fontBase = fontBases.get(index);
      int style = MPPUtility.getByte(data, offset + 3);
      Color color = MPPUtility.getColor(data, offset + 4);
      Color backgroundColor;
      BackgroundPattern backgroundPattern;

      if (ignoreBackground)
      {
         backgroundColor = null;
         backgroundPattern = BackgroundPattern.SOLID;
      }
      else
      {
         backgroundColor = MPPUtility.getColor(data, offset + 16);
         backgroundPattern = BackgroundPattern.getInstance(MPPUtility.getShort(data, offset + 28));
      }

      boolean bold = ((style & 0x01) != 0);
      boolean italic = ((style & 0x02) != 0);
      boolean underline = ((style & 0x04) != 0);
      boolean strikethrough = ((style & 0x08) != 0);

      FontStyle fontStyle = new FontStyle(fontBase, italic, bold, underline, strikethrough, color, backgroundColor, backgroundPattern);
      //System.out.println(fontStyle);
      return fontStyle;
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processTableFontStyles(Map fontBases, byte[] columnData)
   {
      //MPPUtility.fileDump("c:\\temp\\props.txt", ByteArrayHelper.hexdump(columnData, false, 44, "").getBytes());

      m_tableFontStyles = new TableFontStyle[columnData.length / 44];
      int offset = 0;
      for (int loop = 0; loop < m_tableFontStyles.length; loop++)
      {
         m_tableFontStyles[loop] = getColumnFontStyle(columnData, offset, fontBases);
         offset += 44;
      }
   }

   @Override protected TableFontStyle getColumnFontStyle(byte[] data, int offset, Map fontBases)
   {
      int uniqueID = MPPUtility.getInt(data, offset);
      FieldType fieldType = MPPTaskField14.getInstance(MPPUtility.getShort(data, offset + 4));
      Integer index = Integer.valueOf(MPPUtility.getByte(data, offset + 8));
      int style = MPPUtility.getByte(data, offset + 11);
      Color color = MPPUtility.getColor(data, offset + 12);
      int change = MPPUtility.getShort(data, offset + 40);
      Color backgroundColor = MPPUtility.getColor(data, offset + 24);
      BackgroundPattern backgroundPattern = BackgroundPattern.getInstance(MPPUtility.getShort(data, offset + 36));

      FontBase fontBase = fontBases.get(index);

      boolean bold = ((style & 0x01) != 0);
      boolean italic = ((style & 0x02) != 0);
      boolean underline = ((style & 0x04) != 0);
      boolean strikethrough = ((style & 0x08) != 0);

      boolean boldChanged = ((change & 0x01) != 0);
      boolean underlineChanged = ((change & 0x02) != 0);
      boolean italicChanged = ((change & 0x04) != 0);
      boolean colorChanged = ((change & 0x08) != 0);
      boolean fontChanged = ((change & 0x10) != 0);
      boolean backgroundColorChanged = ((change & 0x40) != 0);
      boolean backgroundPatternChanged = ((change & 0x80) != 0);
      boolean strikethroughChanged = ((change & 0x100) != 0);

      TableFontStyle tfs = new TableFontStyle(uniqueID, fieldType, fontBase, italic, bold, underline, strikethrough, color, backgroundColor, backgroundPattern, italicChanged, boldChanged, underlineChanged, strikethroughChanged, colorChanged, fontChanged, backgroundColorChanged, backgroundPatternChanged);
      //System.out.println(tfs);
      return tfs;
   }

   /**
    * {@inheritDoc}
    */
   @Override protected void processProgressLines(Map fontBases, byte[] progressLineData)
   {
      //MPPUtility.fileDump("c:\\temp\\props.txt", ByteArrayHelper.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_progressLinesIntervalWeekleyWeekNumber = progressLineData[12];
      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_progressLinesIntervalMonthlyDay = (progressLineData[32] != 0);
      m_progressLinesIntervalMonthlyDayDayNumber = progressLineData[34];
      m_progressLinesIntervalMonthlyDayMonthNumber = progressLineData[28];
      m_progressLinesIntervalMonthlyFirstLast = (progressLineData[40] == 1);
      m_progressLinesIntervalMonthlyFirstLastDay = ProgressLineDay.getInstance(progressLineData[36]);
      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, true);
      m_progressLinesCurrentLineColor = MPPUtility.getColor(progressLineData, 92);
      m_progressLinesCurrentLineStyle = LineStyle.getInstance(progressLineData[104]);
      m_progressLinesCurrentProgressPointColor = MPPUtility.getColor(progressLineData, 105);
      m_progressLinesCurrentProgressPointShape = progressLineData[117];
      m_progressLinesOtherLineColor = MPPUtility.getColor(progressLineData, 118);
      m_progressLinesOtherLineStyle = LineStyle.getInstance(progressLineData[130]);
      m_progressLinesOtherProgressPointColor = MPPUtility.getColor(progressLineData, 131);
      m_progressLinesOtherProgressPointShape = progressLineData[143];

      int dateCount = MPPUtility.getShort(progressLineData, 50);
      if (dateCount != 0)
      {
         m_progressLinesDisplaySelectedDates = new Date[dateCount];
         int offset = 144;
         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
    */
   GanttChartView14(ProjectFile parent, byte[] fixedMeta, byte[] fixedData, Var2Data varData, Map fontBases)
      throws IOException
   {
      super(parent, fixedMeta, fixedData, varData, fontBases);
   }

   private static final Integer PROPERTIES = Integer.valueOf(6);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy