Added PaginationTools class to greatly simplify sending multiple pages of data to a player.

This commit is contained in:
CoderCow 2013-06-27 10:48:18 +02:00
parent f7edbe55d6
commit 290b30f916
2 changed files with 450 additions and 196 deletions

View file

@ -0,0 +1,253 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TShockAPI {
public static class PaginationTools {
public delegate Tuple<string, Color> LineFormatterDelegate(object lineData, int lineIndex, int pageNumber);
#region [Nested: Settings Class]
public class Settings {
public bool IncludeHeader { get; set; }
private string headerFormat;
public string HeaderFormat
{
get { return this.headerFormat; }
set
{
if (value == null)
throw new ArgumentNullException();
this.headerFormat = value;
}
}
public Color HeaderTextColor { get; set; }
public bool IncludeFooter { get; set; }
private string footerFormat;
public string FooterFormat
{
get { return this.footerFormat; }
set
{
if (value == null)
throw new ArgumentNullException();
this.footerFormat = value;
}
}
public Color FooterTextColor { get; set; }
public string NothingToDisplayString { get; set; }
public LineFormatterDelegate LineFormatter { get; set; }
public Color LineTextColor { get; set; }
private int maxLinesPerPage;
public int MaxLinesPerPage
{
get { return this.maxLinesPerPage; }
set
{
if (value <= 0)
throw new ArgumentException("The value has to be greater than zero.");
this.maxLinesPerPage = value;
}
}
private int pageLimit;
public int PageLimit
{
get { return this.pageLimit; }
set
{
if (value < 0)
throw new ArgumentException("The value has to be greater than or equal to zero.");
this.pageLimit = value;
}
}
public Settings()
{
this.IncludeHeader = true;
this.headerFormat = "Page {0} of {1}";
this.HeaderTextColor = Color.Green;
this.IncludeFooter = true;
this.footerFormat = "Type /<command> {0} for more.";
this.FooterTextColor = Color.Yellow;
this.NothingToDisplayString = null;
this.LineFormatter = null;
this.LineTextColor = Color.White;
this.maxLinesPerPage = 4;
this.pageLimit = 0;
}
}
#endregion
public static void SendPage(
TSPlayer player, int pageNumber, IEnumerable dataToPaginate, int dataToPaginateCount, Settings settings = null)
{
if (settings == null)
settings = new Settings();
if (dataToPaginateCount == 0)
{
if (settings.NothingToDisplayString != null)
player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor);
return;
}
int pageCount = ((dataToPaginateCount - 1) / settings.MaxLinesPerPage) + 1;
if (settings.PageLimit > 0 && pageCount > settings.PageLimit)
pageCount = settings.PageLimit;
if (pageNumber > pageCount)
pageNumber = pageCount;
if (settings.IncludeHeader)
player.SendMessage(string.Format(settings.HeaderFormat, pageNumber, pageCount), settings.HeaderTextColor);
int listOffset = (pageNumber - 1) * settings.MaxLinesPerPage;
int offsetCounter = 0;
int lineCounter = 0;
foreach (object lineData in dataToPaginate)
{
if (lineData == null)
continue;
if (offsetCounter++ < listOffset)
continue;
if (lineCounter++ == settings.MaxLinesPerPage)
break;
string lineMessage;
Color lineColor = settings.LineTextColor;
if (lineData is Tuple<string, Color>)
{
var lineFormat = (Tuple<string, Color>)lineData;
lineMessage = lineFormat.Item1;
lineColor = lineFormat.Item2;
}
else if (settings.LineFormatter != null)
{
try
{
Tuple<string, Color> lineFormat = settings.LineFormatter(lineData, offsetCounter, pageNumber);
if (lineFormat == null)
continue;
lineMessage = lineFormat.Item1;
lineColor = lineFormat.Item2;
}
catch (Exception ex)
{
throw new InvalidOperationException(
"The method referenced by LineFormatter has thrown an exception. See inner exception for details.", ex);
}
}
else
{
lineMessage = lineData.ToString();
}
if (lineMessage != null)
player.SendMessage(lineMessage, lineColor);
}
if (lineCounter == 0)
{
if (settings.NothingToDisplayString != null)
player.SendMessage(settings.NothingToDisplayString, settings.HeaderTextColor);
}
else if (settings.IncludeFooter && pageNumber + 1 <= pageCount)
{
player.SendMessage(string.Format(settings.FooterFormat, pageNumber + 1, pageNumber, pageCount), settings.FooterTextColor);
}
}
public static void SendPage(TSPlayer player, int pageNumber, IList dataToPaginate, Settings settings = null)
{
PaginationTools.SendPage(player, pageNumber, dataToPaginate, dataToPaginate.Count, settings);
}
public static List<string> BuildLinesFromTerms(
IEnumerable terms, Func<object, string> termFormatter = null, string separator = ", ", int maxCharsPerLine = 80)
{
List<string> lines = new List<string>();
StringBuilder lineBuilder = new StringBuilder();
foreach (object term in terms)
{
if (term == null && termFormatter == null)
continue;
string termString;
if (termFormatter != null)
{
try {
termString = termFormatter(term);
if (termString == null)
continue;
} catch (Exception ex)
{
throw new ArgumentException(
"The method represented by termFormatter has thrown an exception. See inner exception for details.", ex);
}
}
else
{
termString = term.ToString();
}
bool goesOnNextLine = (lineBuilder.Length + termString.Length > maxCharsPerLine);
if (!goesOnNextLine)
{
if (lineBuilder.Length > 0) {
lineBuilder.Append(separator);
}
lineBuilder.Append(termString);
}
else
{
// A separator should always be at the end of a line as we know it is followed by another line.
lineBuilder.Append(separator);
lines.Add(lineBuilder.ToString());
lineBuilder.Clear();
lineBuilder.Append(termString);
}
}
if (lineBuilder.Length > 0)
lines.Add(lineBuilder.ToString());
return lines;
}
public static bool TryParsePageNumber(
List<string> commandParameters, int expectedParamterIndex, TSPlayer errorMessageReceiver, out int pageNumber)
{
pageNumber = 1;
if (commandParameters.Count <= expectedParamterIndex)
return true;
string pageNumberRaw = commandParameters[expectedParamterIndex];
if (!int.TryParse(pageNumberRaw, out pageNumber) || pageNumber < 1)
{
if (errorMessageReceiver != null)
errorMessageReceiver.SendErrorMessage(string.Format("\"{0}\" is not a valid page number.", pageNumberRaw));
pageNumber = 1;
return false;
}
return true;
}
}
}

View file

@ -1,203 +1,204 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.30703</ProductVersion> <ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion> <SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{49606449-072B-4CF5-8088-AA49DA586694}</ProjectGuid> <ProjectGuid>{49606449-072B-4CF5-8088-AA49DA586694}</ProjectGuid>
<OutputType>Library</OutputType> <OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder> <AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TShockAPI</RootNamespace> <RootNamespace>TShockAPI</RootNamespace>
<AssemblyName>TShockAPI</AssemblyName> <AssemblyName>TShockAPI</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<IsWebBootstrapper>false</IsWebBootstrapper> <IsWebBootstrapper>false</IsWebBootstrapper>
<PublishUrl>publish\</PublishUrl> <PublishUrl>publish\</PublishUrl>
<Install>true</Install> <Install>true</Install>
<InstallFrom>Disk</InstallFrom> <InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled> <UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode> <UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval> <UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits> <UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically> <UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired> <UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions> <MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision> <ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> <ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled> <BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DocumentationFile>bin\Debug\TShockAPI.XML</DocumentationFile> <DocumentationFile>bin\Debug\TShockAPI.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType> <DebugType>pdbonly</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath> <OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE;COMPAT_SIGS</DefineConstants> <DefineConstants>TRACE;COMPAT_SIGS</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<DocumentationFile>bin\Release\TShockAPI.XML</DocumentationFile> <DocumentationFile>bin\Release\TShockAPI.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="HttpServer"> <Reference Include="HttpServer">
<HintPath>..\HttpBins\HttpServer.dll</HintPath> <HintPath>..\HttpBins\HttpServer.dll</HintPath>
</Reference> </Reference>
<Reference Include="Mono.Data.Sqlite"> <Reference Include="Mono.Data.Sqlite">
<HintPath>..\SqlBins\Mono.Data.Sqlite.dll</HintPath> <HintPath>..\SqlBins\Mono.Data.Sqlite.dll</HintPath>
</Reference> </Reference>
<Reference Include="MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> <Reference Include="MySql.Data, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\SqlBins\MySql.Data.dll</HintPath> <HintPath>..\SqlBins\MySql.Data.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL"> <Reference Include="MySql.Web, Version=6.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\SqlBins\MySql.Web.dll</HintPath> <HintPath>..\SqlBins\MySql.Web.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Newtonsoft.Json"> <Reference Include="Newtonsoft.Json">
<HintPath>.\Newtonsoft.Json.dll</HintPath> <HintPath>.\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="TerrariaServer"> <Reference Include="TerrariaServer">
<HintPath>..\TerrariaServerBins\TerrariaServer.exe</HintPath> <HintPath>..\TerrariaServerBins\TerrariaServer.exe</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="BackupManager.cs" /> <Compile Include="BackupManager.cs" />
<Compile Include="DB\RegionManager.cs" /> <Compile Include="DB\RegionManager.cs" />
<Compile Include="Hooks\GeneralHooks.cs" /> <Compile Include="Hooks\GeneralHooks.cs" />
<Compile Include="Hooks\PlayerHooks.cs" /> <Compile Include="Hooks\PlayerHooks.cs" />
<Compile Include="PluginUpdater\PluginUpdaterThread.cs" /> <Compile Include="PaginationTools.cs" />
<Compile Include="PluginUpdater\PluginVersionCheck.cs" /> <Compile Include="PluginUpdater\PluginUpdaterThread.cs" />
<Compile Include="PluginUpdater\VersionInfo.cs" /> <Compile Include="PluginUpdater\PluginVersionCheck.cs" />
<Compile Include="SaveManager.cs" /> <Compile Include="PluginUpdater\VersionInfo.cs" />
<Compile Include="DB\BanManager.cs" /> <Compile Include="SaveManager.cs" />
<Compile Include="DB\InventoryManager.cs" /> <Compile Include="DB\BanManager.cs" />
<Compile Include="DB\IQueryBuilder.cs" /> <Compile Include="DB\InventoryManager.cs" />
<Compile Include="DB\ItemManager.cs" /> <Compile Include="DB\IQueryBuilder.cs" />
<Compile Include="DB\SqlColumn.cs" /> <Compile Include="DB\ItemManager.cs" />
<Compile Include="DB\SqlTable.cs" /> <Compile Include="DB\SqlColumn.cs" />
<Compile Include="DB\SqlValue.cs" /> <Compile Include="DB\SqlTable.cs" />
<Compile Include="Extensions\DbExt.cs" /> <Compile Include="DB\SqlValue.cs" />
<Compile Include="DB\GroupManager.cs" /> <Compile Include="Extensions\DbExt.cs" />
<Compile Include="DB\UserManager.cs" /> <Compile Include="DB\GroupManager.cs" />
<Compile Include="Extensions\RandomExt.cs" /> <Compile Include="DB\UserManager.cs" />
<Compile Include="Extensions\StringExt.cs" /> <Compile Include="Extensions\RandomExt.cs" />
<Compile Include="GeoIPCountry.cs" /> <Compile Include="Extensions\StringExt.cs" />
<Compile Include="HandlerList.cs" /> <Compile Include="GeoIPCountry.cs" />
<Compile Include="IPackable.cs" /> <Compile Include="HandlerList.cs" />
<Compile Include="Commands.cs" /> <Compile Include="IPackable.cs" />
<Compile Include="ConfigFile.cs" /> <Compile Include="Commands.cs" />
<Compile Include="FileTools.cs" /> <Compile Include="ConfigFile.cs" />
<Compile Include="GetDataHandlers.cs" /> <Compile Include="FileTools.cs" />
<Compile Include="Group.cs" /> <Compile Include="GetDataHandlers.cs" />
<Compile Include="Extensions\LinqExt.cs" /> <Compile Include="Group.cs" />
<Compile Include="Log.cs" /> <Compile Include="Extensions\LinqExt.cs" />
<Compile Include="Net\BaseMsg.cs" /> <Compile Include="Log.cs" />
<Compile Include="Net\DisconnectMsg.cs" /> <Compile Include="Net\BaseMsg.cs" />
<Compile Include="Net\NetTile.cs" /> <Compile Include="Net\DisconnectMsg.cs" />
<Compile Include="Net\ProjectileRemoveMsg.cs" /> <Compile Include="Net\NetTile.cs" />
<Compile Include="Net\SpawnMsg.cs" /> <Compile Include="Net\ProjectileRemoveMsg.cs" />
<Compile Include="Net\WorldInfoMsg.cs" /> <Compile Include="Net\SpawnMsg.cs" />
<Compile Include="PacketBufferer.cs" /> <Compile Include="Net\WorldInfoMsg.cs" />
<Compile Include="Permissions.cs" /> <Compile Include="PacketBufferer.cs" />
<Compile Include="RconHandler.cs" /> <Compile Include="Permissions.cs" />
<Compile Include="DB\RememberedPosManager.cs" /> <Compile Include="RconHandler.cs" />
<Compile Include="Resources.Designer.cs"> <Compile Include="DB\RememberedPosManager.cs" />
<AutoGen>True</AutoGen> <Compile Include="Resources.Designer.cs">
<DesignTime>True</DesignTime> <AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon> <DesignTime>True</DesignTime>
</Compile> <DependentUpon>Resources.resx</DependentUpon>
<Compile Include="Rest\Rest.cs" /> </Compile>
<Compile Include="Rest\RestCommand.cs" /> <Compile Include="Rest\Rest.cs" />
<Compile Include="Rest\RestManager.cs" /> <Compile Include="Rest\RestCommand.cs" />
<Compile Include="Rest\RestObject.cs" /> <Compile Include="Rest\RestManager.cs" />
<Compile Include="Rest\RestVerbs.cs" /> <Compile Include="Rest\RestObject.cs" />
<Compile Include="Rest\SecureRest.cs" /> <Compile Include="Rest\RestVerbs.cs" />
<Compile Include="StatTracker.cs" /> <Compile Include="Rest\SecureRest.cs" />
<Compile Include="Utils.cs" /> <Compile Include="StatTracker.cs" />
<Compile Include="TShock.cs" /> <Compile Include="Utils.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="TShock.cs" />
<Compile Include="TSPlayer.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UpdateManager.cs" /> <Compile Include="TSPlayer.cs" />
<Compile Include="DB\WarpsManager.cs" /> <Compile Include="UpdateManager.cs" />
</ItemGroup> <Compile Include="DB\WarpsManager.cs" />
<ItemGroup> </ItemGroup>
<None Include="config\groups.txt" /> <ItemGroup>
<None Include="TShockAPI.licenseheader" /> <None Include="config\groups.txt" />
</ItemGroup> <None Include="TShockAPI.licenseheader" />
<ItemGroup> </ItemGroup>
<None Include="config\users.txt" /> <ItemGroup>
</ItemGroup> <None Include="config\users.txt" />
<ItemGroup> </ItemGroup>
<EmbeddedResource Include="Resources.resx"> <ItemGroup>
<Generator>ResXFileCodeGenerator</Generator> <EmbeddedResource Include="Resources.resx">
<SubType>Designer</SubType> <Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput> <SubType>Designer</SubType>
</EmbeddedResource> <LastGenOutput>Resources.Designer.cs</LastGenOutput>
</ItemGroup> </EmbeddedResource>
<ItemGroup> </ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0"> <ItemGroup>
<Visible>False</Visible> <BootstrapperPackage Include=".NETFramework,Version=v4.0">
<ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName> <Visible>False</Visible>
<Install>true</Install> <ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
</BootstrapperPackage> <Install>true</Install>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5"> </BootstrapperPackage>
<Visible>False</Visible> <BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName> <Visible>False</Visible>
<Install>false</Install> <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
</BootstrapperPackage> <Install>false</Install>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> </BootstrapperPackage>
<Visible>False</Visible> <BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<ProductName>.NET Framework 3.5 SP1</ProductName> <Visible>False</Visible>
<Install>false</Install> <ProductName>.NET Framework 3.5 SP1</ProductName>
</BootstrapperPackage> <Install>false</Install>
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1"> </BootstrapperPackage>
<Visible>False</Visible> <BootstrapperPackage Include="Microsoft.Windows.Installer.3.1">
<ProductName>Windows Installer 3.1</ProductName> <Visible>False</Visible>
<Install>true</Install> <ProductName>Windows Installer 3.1</ProductName>
</BootstrapperPackage> <Install>true</Install>
</ItemGroup> </BootstrapperPackage>
<ItemGroup> </ItemGroup>
<Content Include="config\itembans.txt" /> <ItemGroup>
</ItemGroup> <Content Include="config\itembans.txt" />
<ItemGroup /> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ItemGroup />
<PropertyGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PreBuildEvent> <PropertyGroup>
</PreBuildEvent> <PreBuildEvent>
</PropertyGroup> </PreBuildEvent>
<PropertyGroup> </PropertyGroup>
<PostBuildEvent>"$(ProjectDir)postbuild.bat"</PostBuildEvent> <PropertyGroup>
</PropertyGroup> <PostBuildEvent>"$(ProjectDir)postbuild.bat"</PostBuildEvent>
<ProjectExtensions> </PropertyGroup>
<VisualStudio> <ProjectExtensions>
<UserProperties BuildVersion_UpdateAssemblyVersion="True" BuildVersion_UpdateFileVersion="True" BuildVersion_BuildAction="Both" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_StartDate="2011/6/17" BuildVersion_IncrementBeforeBuild="False" /> <VisualStudio>
</VisualStudio> <UserProperties BuildVersion_IncrementBeforeBuild="False" BuildVersion_StartDate="2011/6/17" BuildVersion_BuildVersioningStyle="None.None.None.MonthAndDayStamp" BuildVersion_BuildAction="Both" BuildVersion_UpdateFileVersion="True" BuildVersion_UpdateAssemblyVersion="True" />
</ProjectExtensions> </VisualStudio>
</ProjectExtensions>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
</Target> </Target>
<Target Name="AfterBuild"> <Target Name="AfterBuild">
</Target> </Target>
--> -->
</Project> </Project>