/// <summary> /// Runs custom wizard logic when a project has finished generating. /// </summary> /// <param name="project"></param> public void ProjectFinishedGenerating(Project project) { // Iterate through the project items and // remove any files that begin with the word "Placeholder". // and the Rates class unless it's the Telescope class // done this way to avoid removing items from inside a foreach loop List <string> rems = new List <string>(); foreach (ProjectItem item in project.ProjectItems) { if (item.Name.StartsWith("Placeholder", StringComparison.OrdinalIgnoreCase) || item.Name.StartsWith("Rate", StringComparison.OrdinalIgnoreCase) && !this.DeviceClass.Equals("Telescope", StringComparison.OrdinalIgnoreCase)) { //MessageBox.Show("adding " + item.Name); rems.Add(item.Name); } } foreach (string item in rems) { //MessageBox.Show("Deleting " + item); project.ProjectItems.Item(item).Delete(); } // Special handling for VB and C# driver template projects to add the interface implementation to the core driver code try { // Check the name of each item in the project and execute if this is a driver template project (contains Driver.vb or Driver.cs) foreach (ProjectItem projectItem in project.ProjectItems) { TL.LogMessage("ProjectFinishedGenerating", "Item name: " + projectItem.Name); if ((projectItem.Name.ToUpperInvariant() == "DRIVER.CS") | (projectItem.Name.ToUpperInvariant() == "DRIVER.VB")) { driverTemplate = projectItem; // Save the driver item // This is a driver template // Get the filename and directory of the Driver.xx file string directory = Path.GetDirectoryName(projectItem.FileNames[1].ToString()); TL.LogMessage("ProjectFinishedGenerating", "File name: " + projectItem.FileNames[1].ToString() + ", Directory: " + directory); TL.LogMessage("ProjectFinishedGenerating", "Found " + projectItem.Name); projectItem.Open(); // Open the item for editing TL.LogMessage("ProjectFinishedGenerating", "Done Open"); Document itemDocument = projectItem.Document; // Get the open file's document object TL.LogMessage("ProjectFinishedGenerating", "Created Document"); itemDocument.Activate(); // Make this the current document TL.LogMessage("ProjectFinishedGenerating", "Activated Document"); TextSelection documentSelection = (TextSelection)itemDocument.Selection; // Create a document selection TL.LogMessage("ProjectFinishedGenerating", "Created Selection object"); const string insertionPoint = "//INTERFACECODEINSERTIONPOINT"; // Find the insertion point in the Driver.xx item documentSelection.FindText(insertionPoint, (int)vsFindOptions.vsFindOptionsMatchWholeWord); TL.LogMessage("ProjectFinishedGenerating", "Done INTERFACECODEINSERTIONPOINT FindText:" + documentSelection.Text); // Create the name of the device interface file to be inserted string insertFile = directory + "\\Device" + this.DeviceClass + Path.GetExtension(projectItem.Name); TL.LogMessage("ProjectFinishedGenerating", "Opening file: " + insertFile); documentSelection.InsertFromFile(insertFile); // Insert the required file at the current selection point TL.LogMessage("ProjectFinishedGenerating", "Done InsertFromFile"); // Remove the top lines of the inserted file until we get to #Region // These lines are only there to make the file error free in the template develpment project and are not required here documentSelection.SelectLine(); // Select the current line TL.LogMessage("ProjectFinishedGenerating", "Selected initial line: " + documentSelection.Text); while (!documentSelection.Text.ToUpperInvariant().Contains("#REGION")) { TL.LogMessage("ProjectFinishedGenerating", "Deleting start line: " + documentSelection.Text); documentSelection.Delete(); // Delete the current line documentSelection.SelectLine(); // Select the new current line ready to test on the next loop } // Find the end of file marker that came from the inserted file const string endOfInsertFile = "//ENDOFINSERTEDFILE"; documentSelection.FindText(endOfInsertFile, (int)vsFindOptions.vsFindOptionsMatchWholeWord); TL.LogMessage("ProjectFinishedGenerating", "Done ENDOFINSERTEDFILE FindText:" + documentSelection.Text); // Delete the marker line and the last 2 lines from the inserted file documentSelection.SelectLine(); TL.LogMessage("ProjectFinishedGenerating", "Found end line: " + documentSelection.Text); while (!documentSelection.Text.ToUpperInvariant().Contains("#REGION")) { TL.LogMessage("ProjectFinishedGenerating", "Deleting end line: " + documentSelection.Text); documentSelection.Delete(); // Delete the current line documentSelection.SelectLine(); // Select the new current line ready to test on the next loop TL.LogMessage("ProjectFinishedGenerating", "Found end line: " + documentSelection.Text); } // Reformat the document to make it look pretty documentSelection.SelectAll(); TL.LogMessage("ProjectFinishedGenerating", "Done SelectAll"); documentSelection.SmartFormat(); TL.LogMessage("ProjectFinishedGenerating", "Done SmartFormat"); itemDocument.Save(); // Save the edited file readyfor use! TL.LogMessage("ProjectFinishedGenerating", "Done Save"); itemDocument.Close(vsSaveChanges.vsSaveChangesYes); TL.LogMessage("ProjectFinishedGenerating", "Done Close"); } } // Iterate through the project items and remove any files that begin with the word "Device". // These are the partial device implementations that are merged in to create a complete device driver template by the code above // They are not required in the final project // Done this way to avoid removing items from inside a foreach loop rems = new List <string>(); foreach (ProjectItem item in project.ProjectItems) { if (item.Name.StartsWith("Device", StringComparison.OrdinalIgnoreCase)) { //MessageBox.Show("adding " + item.Name); rems.Add(item.Name); } } foreach (string item in rems) { TL.LogMessage("ProjectFinishedGenerating", "Deleting file: " + item); project.ProjectItems.Item(item).Delete(); } } catch (Exception ex) { TL.LogMessageCrLf("ProjectFinishedGenerating Exception", ex.ToString()); // Log any error message MessageBox.Show(ex.ToString(), "ProjectFinishedGenerating Wizard Error", MessageBoxButtons.OK, MessageBoxIcon.Error); // Show an error message } TL.LogMessage("ProjectFinishedGenerating", "End"); TL.Enabled = false; }