private void SetDeploymentPath(DTE dte, Project project, ProjectItem CreatedProjectItem, SPFileType sPFileType, string evaluatedDeploymentPath) { //set to content if ((sPFileType != SPFileType.CustomCode)) { CreatedProjectItem.Properties.Item("BuildAction").Value = 2; } //ok, file is placed, but we need set the deployment path ISharePointProjectService projectService = Helpers2.GetSharePointProjectService(dte); ISharePointProject sharePointProject = projectService.Convert <EnvDTE.Project, ISharePointProject>(project); sharePointProject.Synchronize(); if (CreatedProjectItem.Collection.Parent is ProjectItem) { ProjectItem parentItem = CreatedProjectItem.Collection.Parent as ProjectItem; string name = parentItem.Name; //is the parent element a feature? try { ISharePointProjectFeature parentIsFeature = projectService.Convert <EnvDTE.ProjectItem, ISharePointProjectFeature>(parentItem); if (parentIsFeature != null) { ISharePointProjectItem addedSharePointItem = projectService.Convert <EnvDTE.ProjectItem, ISharePointProjectItem>(CreatedProjectItem); if (addedSharePointItem != null) { parentIsFeature.ProjectItems.Add(addedSharePointItem); } } } catch { } } try { //sometimes property deploymentpath is readonly //1. new added items need to be validated before ISharePointProjectItemFile newaddedSharePointItem = projectService.Convert <EnvDTE.ProjectItem, ISharePointProjectItemFile>(CreatedProjectItem); newaddedSharePointItem.DeploymentType = Helpers2.GetDeploymentTypeFromFileType(this.DeploymentType); if (!string.IsNullOrEmpty(evaluatedDeploymentPath)) { newaddedSharePointItem.DeploymentPath = evaluatedDeploymentPath; } } catch { } }
public override void Execute() { DTE dte = (DTE)this.GetService(typeof(DTE)); Project Project = this.GetTargetProject(dte); string evaluatedTemplateFileName = EvaluateParameterAsString(dte, TemplateFileName); string evaluatedParentFeatureName = EvaluateParameterAsString(dte, ParentFeatureName); string evaluatedAssemblyName = EvaluateParameterAsString(dte, AssemblyName); string evaluatedNamespace = EvaluateParameterAsString(dte, Namespace); string xmlContent = GenerateContent(evaluatedTemplateFileName, "ReceiverCode.xml"); try { //feature name consists of application name + SPSFConstants.NameSeparator + featurename, but we need to strip off the feature name from that string appName = Helpers.GetSaveApplicationName(dte); string featureName = evaluatedParentFeatureName; if (featureName.StartsWith(appName, StringComparison.InvariantCultureIgnoreCase)) { featureName = featureName.Substring(appName.Length + 1); } string FeatureReceiverClass = featureName + "EventReceiver"; if (Helpers2.IsSharePointVSTemplate(dte, Project)) { //can we cast the project to ISharePointSolution ISharePointProjectService projectService = Helpers2.GetSharePointProjectService(Project.DTE); ISharePointProject sharePointProject = projectService.Convert <EnvDTE.Project, ISharePointProject>(Project); sharePointProject.Synchronize(); ISharePointProjectFeature parentfeature = null; foreach (ISharePointProjectFeature feature in sharePointProject.Features) { if (feature.Name == evaluatedParentFeatureName) { parentfeature = feature; } } if (parentfeature != null) { if (string.IsNullOrEmpty(parentfeature.Model.ReceiverClass)) { if (dte.SuppressUI || (MessageBox.Show("Feature '" + evaluatedParentFeatureName + "' contains no feature receiver. Add feature receiver?", "Add Feature Receiver?", MessageBoxButtons.YesNo) == DialogResult.Yes)) { ProjectItem projectItem = projectService.Convert <ISharePointProjectFeature, EnvDTE.ProjectItem>(parentfeature); ProjectItem featureXmlFile = projectService.Convert <ISharePointProjectMember, EnvDTE.ProjectItem>(parentfeature.FeatureFile); //no feature receiver there, we create one ProjectItem createdFeatureReceiverItem = CreateNewFeatureReceiver(featureName, projectItem, featureXmlFile); parentfeature.Model.ReceiverAssembly = evaluatedAssemblyName; parentfeature.Model.ReceiverClass = evaluatedNamespace + "." + FeatureReceiverClass; this.MergeNewCodeWithClass(createdFeatureReceiverItem, FeatureReceiverClass, xmlContent); sharePointProject.Synchronize(); //is test run save file if (dte.SuppressUI) { featureXmlFile.Save(); //createdFeatureReceiverItem.Save(); } } else { return; } } else { //1. we check if there is a filename with .generated in it //we need the class name of the featurereceiver, but in VS-Feature the name contains a ID string className = parentfeature.Model.ReceiverClass; if (className.StartsWith("$SharePoint.Type")) { //not supported??? if (parentfeature.EventReceiverFile != null) { ProjectItem existingCode = projectService.Convert <ISharePointProjectMember, EnvDTE.ProjectItem>(parentfeature.EventReceiverFile); this.MergeNewCodeWithClass(existingCode, "", xmlContent); } } else { string foundReceiverClassName = parentfeature.Model.ReceiverClass; string receiverNamespace = foundReceiverClassName.Substring(0, foundReceiverClassName.LastIndexOf(".") - 1); string receiverClassName = foundReceiverClassName.Substring(foundReceiverClassName.LastIndexOf(".") + 1); //ok, class name found //yes, there is a feature receiver, but we need to find the class in the project //find any .cs item which contains the name of the featureclass and namespace List <string> patterns = new List <string>(); patterns.Add(receiverNamespace); patterns.Add(receiverClassName); patterns.Add(" FeatureActivated("); //to ensure that we get the correct partial class ProjectItem existingCode = Helpers.FindItem(Project, ".cs", patterns); if (existingCode != null) { this.MergeNewCodeWithClass(existingCode, receiverClassName, xmlContent); } } } } } else { //find the feature receiver code ProjectItem featureXMLFile = Helpers.GetFeatureXML(Project, evaluatedParentFeatureName); ProjectItem featureFolder = Helpers2.GetFeature(Project.DTE, Project, evaluatedParentFeatureName); //check if feature already contains feature receiver if (featureXMLFile != null) { string receiverClassName = Helpers.GetFeatureReceiverClass(featureXMLFile); string receiverNamespace = Helpers.GetFeatureReceiverNamespace(featureXMLFile); if (receiverClassName == "") { if (dte.SuppressUI || (MessageBox.Show("Feature '" + evaluatedParentFeatureName + "' contains no feature receiver. Add feature receiver?", "Add Feature Receiver?", MessageBoxButtons.YesNo) == DialogResult.Yes)) { //there is no feature receiver, we need to create one :-( string path = Helpers.GetFullPathOfProjectItem(featureXMLFile); XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/sharepoint/"); XmlNode node = doc.SelectSingleNode("/ns:Feature", nsmgr); if (node != null) { ProjectItem createdFeatureReceiverItem = CreateNewFeatureReceiver(featureName, featureFolder, featureXMLFile); XmlAttribute receiverAssemblyAttrib = doc.CreateAttribute("ReceiverAssembly"); receiverAssemblyAttrib.Value = evaluatedAssemblyName; node.Attributes.Append(receiverAssemblyAttrib); XmlAttribute receiverClassAttrib = doc.CreateAttribute("ReceiverClass"); receiverClassAttrib.Value = evaluatedNamespace + "." + FeatureReceiverClass; node.Attributes.Append(receiverClassAttrib); Helpers.EnsureCheckout(dte, path); XmlWriter xw = XmlWriter.Create(path, Helpers.GetXmlWriterSettings(path)); doc.Save(xw); xw.Flush(); xw.Close(); this.MergeNewCodeWithClass(createdFeatureReceiverItem, FeatureReceiverClass, xmlContent); } } else { return; } } else { //yes, there is a feature receiver, but we need to find the class in the project //find any .cs item which contains the name of the featureclass and namespace List <string> patterns = new List <string>(); patterns.Add(receiverClassName); patterns.Add(receiverNamespace); patterns.Add(" FeatureActivated("); //to ensure that we get the correct partial class ProjectItem existingCode = Helpers.FindItem(Project, ".cs", patterns); if (existingCode != null) { //find the activated Function string featureFilename = Helpers.GetFullPathOfProjectItem(existingCode); this.MergeNewCodeWithClass(existingCode, receiverClassName, xmlContent); } } } if (featureXMLFile != null) { CreatedProjectItem = featureXMLFile; } else { CreatedProjectItem = Helpers.GetFeatureXML(Project, evaluatedParentFeatureName); } if (featureFolder != null) { CreatedProjectFolder = featureFolder; } else { CreatedProjectFolder = Helpers2.GetFeature(Project.DTE, Project, evaluatedParentFeatureName); } } } catch (Exception ex) { if (dte.SuppressUI) { throw new Exception(ex.ToString()); } else { MessageBox.Show(ex.ToString()); } } }
public override void RunWizardFinished() { base.RunWizardFinished(); // required to push changes from DTE.Project to ISharePointProject ISharePointProject spProject = DTEManager.ActiveSharePointProject; spProject.Synchronize(); string projectPath = Path.GetDirectoryName(spProject.FullPath); ISharePointProjectItem webTemplate = DTEManager.FindSPIItemByName(projectItemName, spProject); ISharePointProjectItem webTemplateStamp = DTEManager.FindSPIItemByName(String.Format("{0}Stamp", projectItemName), spProject); ISharePointProjectItem publishingPage = DTEManager.FindSPIItemByName(String.Format("{0}PublishingPage", projectItemName), spProject); ISharePointProjectItem wikiPage = DTEManager.FindSPIItemByName(String.Format("{0}WikiPage", projectItemName), spProject); ISharePointProjectItem webPartPage = DTEManager.FindSPIItemByName(String.Format("{0}WebPartPage", projectItemName), spProject); ISharePointProjectFeature webTemplateFeature = spProject.Features[projectItemName]; ISharePointProjectFeature webTemplateStampFeature = spProject.Features[String.Format("{0}Stamp", projectItemName)]; ISharePointProjectFeature webTemplateWelcomePageFeature = spProject.Features[String.Format("{0}WelcomePage", projectItemName)]; // remove automatically added feature associations foreach (ISharePointProjectFeature feature in spProject.Features) { feature.ProjectItems.Remove(webTemplate); feature.ProjectItems.Remove(webTemplateStamp); feature.ProjectItems.Remove(publishingPage); feature.ProjectItems.Remove(wikiPage); feature.ProjectItems.Remove(webPartPage); } // add standard spis to own features webTemplateFeature.ProjectItems.Add(webTemplate); webTemplateStampFeature.ProjectItems.Add(webTemplateStamp); webTemplateWelcomePageFeature.ProjectItems.Add(publishingPage); webTemplateWelcomePageFeature.ProjectItems.Add(wikiPage); webTemplateWelcomePageFeature.ProjectItems.Add(webPartPage); ProjectItem pagesFolder = DTEManager.FindItemByName(DTEManager.ActiveProject.ProjectItems, "Pages", true); ProjectItem defaultPageProjectItem = null; switch (welcomePageType) { case WelcomePageType.WebPartPage: DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WikiPage", projectItemName), true)); DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}PublishingPage", projectItemName), true)); defaultPageProjectItem = DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WebPartPage", projectItemName), true); break; case WelcomePageType.WikiPage: DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WebPartPage", projectItemName), true)); DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}PublishingPage", projectItemName), true)); defaultPageProjectItem = DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WikiPage", projectItemName), true); break; case WelcomePageType.PublishingPage: DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WikiPage", projectItemName), true)); DTEManager.SafeDeleteProjectItem(DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}WebPartPage", projectItemName), true)); defaultPageProjectItem = DTEManager.FindItemByName(pagesFolder.ProjectItems, String.Format("{0}PublishingPage", projectItemName), true); break; } if (defaultPageProjectItem != null) { defaultPageProjectItem.Name = String.Format("{0}Default", projectItemName); } }