From 9a24ab6b6386efbfa2ea9a07a3fe10f6f013fe8c Mon Sep 17 00:00:00 2001
From: Konstantin Podsvirov <konstantin@podsvirov.pro>
Date: Thu, 21 Sep 2017 21:34:33 +0300
Subject: CPackIFW: Add some options

The `CPackIFW` module `cpack_ifw_configure_component` and
`cpack_ifw_configure_component_group` commands gained a new
`REPLACES` and `CHECKABLE` options.
---
 Help/release/dev/cpackifw-options.rst  |  6 ++++++
 Modules/CPackIFW.cmake                 | 34 +++++++++++++++++++++++++------
 Source/CPack/IFW/cmCPackIFWPackage.cxx | 37 ++++++++++++++++++++++++++++++++++
 Source/CPack/IFW/cmCPackIFWPackage.h   |  6 ++++++
 4 files changed, 77 insertions(+), 6 deletions(-)
 create mode 100644 Help/release/dev/cpackifw-options.rst

diff --git a/Help/release/dev/cpackifw-options.rst b/Help/release/dev/cpackifw-options.rst
new file mode 100644
index 0000000..7c471f4
--- /dev/null
+++ b/Help/release/dev/cpackifw-options.rst
@@ -0,0 +1,6 @@
+cpackifw-options
+----------------
+
+* The :module:`CPackIFW` module :command:`cpack_ifw_configure_component` and
+  :command:`cpack_ifw_configure_component_group` commands gained a new
+  ``REPLACES`` and ``CHECKABLE`` options.
diff --git a/Modules/CPackIFW.cmake b/Modules/CPackIFW.cmake
index 0b42c83..8d8b070 100644
--- a/Modules/CPackIFW.cmake
+++ b/Modules/CPackIFW.cmake
@@ -323,7 +323,9 @@
 #                         [LICENSES <display_name> <file_path> ...]
 #                         [DEFAULT <value>]
 #                         [USER_INTERFACES <file_path> <file_path> ...]
-#                         [TRANSLATIONS <file_path> <file_path> ...])
+#                         [TRANSLATIONS <file_path> <file_path> ...]
+#                         [REPLACES <comp_id> ...]
+#                         [CHECKABLE <value>])
 #
 #   This command should be called after :command:`cpack_add_component` command.
 #
@@ -404,6 +406,15 @@
 #   ``TRANSLATIONS``
 #     is a list of <file_path> ('.qm' files) representing translations to load.
 #
+#   ``REPLACES``
+#     list of identifiers of component or component group to replace.
+#
+#   ``CHECKABLE``
+#     Possible values are: TRUE, FALSE.
+#     Set to FALSE if you want to hide the checkbox for an item.
+#     This is useful when only a few subcomponents should be selected
+#     instead of all.
+#
 #
 # .. command:: cpack_ifw_configure_component_group
 #
@@ -426,7 +437,9 @@
 #                         [LICENSES <display_name> <file_path> ...]
 #                         [DEFAULT <value>]
 #                         [USER_INTERFACES <file_path> <file_path> ...]
-#                         [TRANSLATIONS <file_path> <file_path> ...])
+#                         [TRANSLATIONS <file_path> <file_path> ...]
+#                         [REPLACES <comp_id> ...]
+#                         [CHECKABLE <value>])
 #
 #   This command should be called after :command:`cpack_add_component_group`
 #   command.
@@ -499,6 +512,15 @@
 #   ``TRANSLATIONS``
 #     is a list of <file_path> ('.qm' files) representing translations to load.
 #
+#   ``REPLACES``
+#     list of identifiers of component or component group to replace.
+#
+#   ``CHECKABLE``
+#     Possible values are: TRUE, FALSE.
+#     Set to FALSE if you want to hide the checkbox for an item.
+#     This is useful when only a few subcomponents should be selected
+#     instead of all.
+#
 #
 # .. command:: cpack_ifw_add_repository
 #
@@ -882,8 +904,8 @@ macro(cpack_ifw_configure_component compname)
   string(TOUPPER ${compname} _CPACK_IFWCOMP_UNAME)
 
   set(_IFW_OPT COMMON ESSENTIAL VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
-  set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT)
-  set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS)
+  set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
+  set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
   cmake_parse_arguments(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
 
   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_${_CPACK_IFWCOMP_UNAME}_SCRIPT)
@@ -923,8 +945,8 @@ macro(cpack_ifw_configure_component_group grpname)
   string(TOUPPER ${grpname} _CPACK_IFWGRP_UNAME)
 
   set(_IFW_OPT VIRTUAL FORCED_INSTALLATION REQUIRES_ADMIN_RIGHTS)
-  set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT)
-  set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS)
+  set(_IFW_ARGS NAME VERSION RELEASE_DATE SCRIPT PRIORITY SORTING_PRIORITY UPDATE_TEXT DEFAULT CHECKABLE)
+  set(_IFW_MULTI_ARGS DISPLAY_NAME DESCRIPTION DEPENDS DEPENDENCIES AUTO_DEPEND_ON LICENSES USER_INTERFACES TRANSLATIONS REPLACES)
   cmake_parse_arguments(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME} "${_IFW_OPT}" "${_IFW_ARGS}" "${_IFW_MULTI_ARGS}" ${ARGN})
 
   _cpack_ifw_resolve_script(CPACK_IFW_COMPONENT_GROUP_${_CPACK_IFWGRP_UNAME}_SCRIPT)
diff --git a/Source/CPack/IFW/cmCPackIFWPackage.cxx b/Source/CPack/IFW/cmCPackIFWPackage.cxx
index 7b23005..d3ce15c 100644
--- a/Source/CPack/IFW/cmCPackIFWPackage.cxx
+++ b/Source/CPack/IFW/cmCPackIFWPackage.cxx
@@ -482,6 +482,15 @@ int cmCPackIFWPackage::ConfigureFromPrefix(const std::string& prefix)
     this->ForcedInstallation = "false";
   }
 
+  // Replaces
+  option = prefix + "REPLACES";
+  if (this->IsSetToEmpty(option)) {
+    this->Replaces.clear();
+  } else if (const char* value = this->GetOption(option)) {
+    this->Replaces.clear();
+    cmSystemTools::ExpandListArgument(value, this->Replaces);
+  }
+
   // Requires admin rights
   option = prefix + "REQUIRES_ADMIN_RIGHTS";
   if (this->IsSetToEmpty(option)) {
@@ -492,6 +501,16 @@ int cmCPackIFWPackage::ConfigureFromPrefix(const std::string& prefix)
     this->RequiresAdminRights = "false";
   }
 
+  // Checkable
+  option = prefix + "CHECKABLE";
+  if (this->IsSetToEmpty(option)) {
+    this->Checkable.clear();
+  } else if (this->IsOn(option)) {
+    this->Checkable = "true";
+  } else if (this->IsSetToOff(option)) {
+    this->Checkable = "false";
+  }
+
   return 1;
 }
 
@@ -652,6 +671,19 @@ void cmCPackIFWPackage::GeneratePackageFile()
     xout.Element("ForcedInstallation", this->ForcedInstallation);
   }
 
+  // Replaces
+  if (!this->Replaces.empty()) {
+    std::ostringstream replaces;
+    std::vector<std::string>::iterator it = this->Replaces.begin();
+    replaces << *it;
+    ++it;
+    while (it != this->Replaces.end()) {
+      replaces << "," << *it;
+      ++it;
+    }
+    xout.Element("Replaces", replaces.str());
+  }
+
   if (!this->RequiresAdminRights.empty()) {
     xout.Element("RequiresAdminRights", this->RequiresAdminRights);
   }
@@ -672,6 +704,11 @@ void cmCPackIFWPackage::GeneratePackageFile()
     xout.Element("SortingPriority", this->SortingPriority);
   }
 
+  // Checkable
+  if (!this->Checkable.empty()) {
+    xout.Element("Checkable", this->Checkable);
+  }
+
   xout.EndElement();
   xout.EndDocument();
 }
diff --git a/Source/CPack/IFW/cmCPackIFWPackage.h b/Source/CPack/IFW/cmCPackIFWPackage.h
index cec59b0..ae41146 100644
--- a/Source/CPack/IFW/cmCPackIFWPackage.h
+++ b/Source/CPack/IFW/cmCPackIFWPackage.h
@@ -114,9 +114,15 @@ public:
   /// Determines that the package must always be installed
   std::string ForcedInstallation;
 
+  /// List of components to replace
+  std::vector<std::string> Replaces;
+
   /// Package needs to be installed with elevated permissions
   std::string RequiresAdminRights;
 
+  /// Set to false if you want to hide the checkbox for an item
+  std::string Checkable;
+
 public:
   // Internal implementation
 
-- 
cgit v0.12