using System;
using System.Collections.Generic;
using System.Text;
using DaveSexton.DocProject;
using DaveSexton.DocProject.Engine;
namespace SandcastleDocumentation
{
///
/// Hooks into the DocProject build process for the project in which it's defined.
///
///
///
/// This class must be registered with the DocSite in the Active Projects
/// tools options page in order for DocProject to instantiate it during a help build.
///
///
/// The add-in will create an instance of this class in its own AppDomain instead
/// of Visual Studio's default AppDomain. Therefore, it's important to use the
/// method overloads to marshal calls back to the
/// UI thread when using Visual Studio automation. The automation methods inherited from
/// , such as
/// and
/// , marshal calls to Visual Studio's
/// AppDomain automatically.
///
///
/// To cancel the build at any time call the
/// method. The build process will end after the current step is executed,
/// unless the step is being executed in the background. In that case, it may
/// end immediately.
///
///
/// Note: Do not cache instances of the class and do
/// not invoke its members asynchronously. is not
/// thread-safe and is recreated each time the project is built.
///
///
public class BuildProcess : BuildProcessComponent
{
DateTime buildStart, stepStart;
///
/// Called by the add-in before the project's help build actually starts.
///
/// Provides information about the build process.
public override void BuildStarting(BuildContext context)
{
// Uncomment the following line to break into the debugger:
//System.Diagnostics.Debugger.Break();
buildStart = DateTime.Now;
}
///
/// Called by the add-in immediately before a is executed
/// during a help build.
///
/// implementation to be executed.
/// Provides information about the build process.
/// true indicates that the process should continue; otherwise,
/// false indicates that the process should skip this step.
public override bool BeforeExecuteStep(IBuildStep step, BuildContext context)
{
stepStart = DateTime.Now;
if (step.Name.Equals("Compile Help 1.x"))
ProcessHelpCustomTopics(context, "Html");
else if (step.Name.Equals("Compile Help 2.x"))
ProcessHelp2CustomTopics(context, "Html2");
return true;
}
private void ProcessHelp2CustomTopics(BuildContext context, string target)
{
TraceLine();
TraceLine("Importing custom topics...");
TraceLine("Target: {0}", target);
int topicsMerged = CustomTopics.ImportHelp2(context, target);
TraceLine("{0} topic(s) imported.", topicsMerged);
}
private void ProcessHelpCustomTopics(BuildContext context, string target)
{
TraceLine();
TraceLine("Importing custom topics...");
TraceLine("Target: {0}", target);
int topicsMerged = CustomTopics.Import(context, target);
TraceLine("{0} topic(s) imported.", topicsMerged);
}
///
/// Called by the add-in immediately after a has been
/// executed during a help build.
///
/// implementation to be executed.
/// Provides information about the build process.
public override void AfterExecuteStep(IBuildStep step, BuildContext context)
{
TraceLine();
TraceLine("Step {0} Time Elapsed: {1}", context.CurrentStepIndex + 1, DateTime.Now - stepStart);
}
///
/// Called by the add-in after the project's help build has finished.
///
///
/// The method has no affect at this
/// point in the build process. This method is the final step before the
/// add-in displays the build statistics.
///
/// This method is always invoked if is invoked,
/// regardless of whether an exception is thrown in any of the other methods,
/// has been called, or an exeception has
/// been thrown by the build engine.
///
///
/// To determine whether a help build failed or succeeded, examine the value of the
/// property.
///
///
/// Provides information about the build process.
public override void BuildCompleted(BuildContext context)
{
TraceLine();
TraceLine("Total Time Elapsed: {0}", DateTime.Now - buildStart);
}
}
}