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 { }
        }
Beispiel #2
0
        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());
                }
            }
        }
Beispiel #3
0
        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);
            }
        }