/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc.

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/

#ifndef cmCPackComponentGroup_h
#define cmCPackComponentGroup_h

#include "cmStandardIncludes.h"

class cmCPackComponentGroup;

/** \class cmCPackInstallationType
 * \brief A certain type of installation, which encompasses a
 * set of components.
 */
class cmCPackInstallationType
{
public:
  /// The name of the installation type (used to reference this
  /// installation type).
  std::string Name;

  /// The name of the installation type as displayed to the user.
  std::string DisplayName;

  /// The index number of the installation type. This is an arbitrary
  /// numbering from 1 to the number of installation types.
  unsigned Index;
};

/** \class cmCPackComponent
 * \brief A single component to be installed by CPack.
 */
class cmCPackComponent
{
public:
 cmCPackComponent() : Group(0), IsRequired(true), IsHidden(false),
                      IsDisabledByDefault(false), IsDownloaded(false),
                      TotalSize(0) { }

  /// The name of the component (used to reference the component).
  std::string Name;

  /// The name of the component as displayed to the user.
  std::string DisplayName;

  /// The component group that contains this component (if any).
  cmCPackComponentGroup *Group;

  /// Whether this component group must always be installed.
  bool IsRequired : 1;

  /// Whether this component group is hidden. A hidden component group
  /// is always installed. However, it may still be shown to the user.
  bool IsHidden : 1;

  /// Whether this component defaults to "disabled".
  bool IsDisabledByDefault : 1;

  /// Whether this component should be downloaded on-the-fly. If false,
  /// the component will be a part of the installation package.
  bool IsDownloaded : 1;

  /// A description of this component.
  std::string Description;

  /// The installation types that this component is a part of.
  std::vector<cmCPackInstallationType *> InstallationTypes;

  /// If IsDownloaded is true, the name of the archive file that
  /// contains the files that are part of this component.
  std::string ArchiveFile;

  /// The components that this component depends on.
  std::vector<cmCPackComponent *> Dependencies;

  /// The components that depend on this component.
  std::vector<cmCPackComponent *> ReverseDependencies;

  /// The list of installed files that are part of this component.
  std::vector<std::string> Files;

  /// The list of installed directories that are part of this component.
  std::vector<std::string> Directories;

  /// Get the total installed size of all of the files in this
  /// component, in bytes. installDir is the directory into which the
  /// component was installed.
  unsigned long GetInstalledSize(const std::string& installDir) const;

  /// Identical to GetInstalledSize, but returns the result in
  /// kilobytes.
  unsigned long GetInstalledSizeInKbytes(const std::string& installDir) const;

 private:
  mutable unsigned long TotalSize;
};

/** \class cmCPackComponentGroup
 * \brief A component group to be installed by CPack.
 */
class cmCPackComponentGroup
{
public:
 cmCPackComponentGroup() : ParentGroup(0) { }

  /// The name of the group (used to reference the group).
  std::string Name;

  /// The name of the component as displayed to the user.
  std::string DisplayName;

  /// The description of this component group.
  std::string Description;

  /// Whether the name of the component will be shown in bold.
  bool IsBold : 1;

  /// Whether the section should be expanded by default
  bool IsExpandedByDefault : 1;

  /// The components within this group.
  std::vector<cmCPackComponent*> Components;

  /// The parent group of this component group (if any).
  cmCPackComponentGroup *ParentGroup;

  /// The subgroups of this group.
  std::vector<cmCPackComponentGroup*> Subgroups;
};

#endif
