/// <summary> /// The environment calls this to set the currently selected objects that the property page should show. /// </summary> /// <param name="count">The count of elements in <paramref name="punk"/>.</param> /// <param name="punk">An array of <b>IUnknown</b> objects to show in the property page.</param> /// <remarks> /// We are supposed to cache these objects until we get another call with <paramref name="count"/> = 0. /// Also, the environment is supposed to call this before calling <see cref="IPropertyPage2.Activate"/>, /// but like all things when interacting with Visual Studio, don't trust that and code defensively. /// </remarks> void IPropertyPage.SetObjects(uint count, object[] punk) { if (count == 0) { if (this.project != null) { this.project.OutputTypeChanged -= this.HandleOutputTypeChanged; this.project = null; } return; } if (punk[0] is ProjectConfig) { List <ProjectConfig> configs = new List <ProjectConfig>(); for (int i = 0; i < count; i++) { ProjectConfig config = (ProjectConfig)punk[i]; if (this.project == null) { this.project = config.ProjectMgr as WixProjectNode; this.project.OutputTypeChanged += this.HandleOutputTypeChanged; } configs.Add(config); } this.projectConfigs = configs.ToArray(); } else if (punk[0] is NodeProperties) { if (this.project == null) { this.project = (punk[0] as NodeProperties).Node.ProjectMgr as WixProjectNode; this.project.OutputTypeChanged += this.HandleOutputTypeChanged; } Dictionary <string, ProjectConfig> configsMap = new Dictionary <string, ProjectConfig>(); for (int i = 0; i < count; i++) { NodeProperties property = (NodeProperties)punk[i]; IVsCfgProvider provider; ErrorHandler.ThrowOnFailure(property.Node.ProjectMgr.GetCfgProvider(out provider)); uint[] expected = new uint[1]; ErrorHandler.ThrowOnFailure(provider.GetCfgs(0, null, expected, null)); if (expected[0] > 0) { ProjectConfig[] configs = new ProjectConfig[expected[0]]; uint[] actual = new uint[1]; int hr = provider.GetCfgs(expected[0], configs, actual, null); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } foreach (ProjectConfig config in configs) { if (!configsMap.ContainsKey(config.ConfigName)) { configsMap.Add(config.ConfigName, config); } } } } if (configsMap.Count > 0) { if (this.projectConfigs == null) { this.projectConfigs = new ProjectConfig[configsMap.Keys.Count]; } configsMap.Values.CopyTo(this.projectConfigs, 0); } } if (this.active && this.project != null) { this.PropertyPagePanel.BindProperties(); this.IsDirty = false; } }
public void Initialize(WixProjectNode project, WixBuildEventEditorForm editorForm) { this.project = project; this.editorForm = editorForm; }
/// <summary> /// The environment calls this to set the currently selected objects that the property page should show. /// </summary> /// <param name="count">The count of elements in <paramref name="punk"/>.</param> /// <param name="punk">An array of <b>IUnknown</b> objects to show in the property page.</param> /// <remarks> /// We are supposed to cache these objects until we get another call with <paramref name="count"/> = 0. /// Also, the environment is supposed to call this before calling <see cref="IPropertyPage2.Activate"/>, /// but like all things when interacting with Visual Studio, don't trust that and code defensively. /// </remarks> void IPropertyPage.SetObjects(uint count, object[] punk) { if (count == 0) { if (this.project != null) { this.project.OutputTypeChanged -= this.HandleOutputTypeChanged; this.project = null; } return; } if (punk[0] is ProjectConfig) { List<ProjectConfig> configs = new List<ProjectConfig>(); for (int i = 0; i < count; i++) { ProjectConfig config = (ProjectConfig)punk[i]; if (this.project == null) { this.project = config.ProjectMgr as WixProjectNode; this.project.OutputTypeChanged += this.HandleOutputTypeChanged; } configs.Add(config); } this.projectConfigs = configs.ToArray(); } else if (punk[0] is NodeProperties) { if (this.project == null) { this.project = (punk[0] as NodeProperties).Node.ProjectMgr as WixProjectNode; this.project.OutputTypeChanged += this.HandleOutputTypeChanged; } Dictionary<string, ProjectConfig> configsMap = new Dictionary<string, ProjectConfig>(); for (int i = 0; i < count; i++) { NodeProperties property = (NodeProperties)punk[i]; IVsCfgProvider provider; ErrorHandler.ThrowOnFailure(property.Node.ProjectMgr.GetCfgProvider(out provider)); uint[] expected = new uint[1]; ErrorHandler.ThrowOnFailure(provider.GetCfgs(0, null, expected, null)); if (expected[0] > 0) { ProjectConfig[] configs = new ProjectConfig[expected[0]]; uint[] actual = new uint[1]; int hr = provider.GetCfgs(expected[0], configs, actual, null); if (hr != 0) { Marshal.ThrowExceptionForHR(hr); } foreach (ProjectConfig config in configs) { if (!configsMap.ContainsKey(config.ConfigName)) { configsMap.Add(config.ConfigName, config); } } } } if (configsMap.Count > 0) { if (this.projectConfigs == null) { this.projectConfigs = new ProjectConfig[configsMap.Keys.Count]; } configsMap.Values.CopyTo(this.projectConfigs, 0); } } if (this.active && this.project != null) { this.PropertyPagePanel.BindProperties(); this.IsDirty = false; } }