/* Copyright 2009 Fog Creek Software, Inc. */ using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Data; /* FogBugz namespaces-- make sure you add the neccesary assembly references to * the following DLL files contained in C:\Program Files\FogBugz\Website\bin\ * FogBugz.dll, FogCreek.Plugins.dll, FogCreek.Plugins.InterfaceEvents.dll */ using FogCreek.FogBugz.Plugins; using FogCreek.FogBugz.Plugins.Api; using FogCreek.FogBugz.Plugins.Entity; using FogCreek.FogBugz.Plugins.Interfaces; using FogCreek.FogBugz; using FogCreek.FogBugz.UI; using FogCreek.FogBugz.UI.Dialog; using FogCreek.FogBugz.Database; namespace IPluginTimeIntervalJoin_Commit_Example { /* Class Declaration: Inherit from Plugin, expose IPluginTimeIntervalJoin, IPluginTimeIntervalDisplay, * IPluginTimeIntervalCommit */ public class IPluginTimeIntervalJoin_Commit_Example : Plugin, IPluginTimeIntervalJoin, IPluginTimeIntervalCommit, IPluginDatabase { /* The plugin Id is a required argument for CTimeInterval.SetPluginField and * CTimeInterval.GetPluginField */ protected const string sPluginId = "IPluginTimeIntervalJoin_Commit_Example@fogcreek.com"; /* We'll need this member variable to store the "CodeName" value in the * pre-commit phase, so that if we need to roll back we can replace the original * value. */ int preCommitAwesomenessLevel = 1; /* Constructor: We'll just initialize the inherited Plugin class, which * takes the passed instance of CPluginApi and sets its "api" member variable. */ public IPluginTimeIntervalJoin_Commit_Example(CPluginApi api) : base(api) { } #region IPluginTimeIntervalJoin Members public string[] TimeIntervalJoinTables() { /* All tables specified here must have an integer ixInterval column so FogBugz can * perform the necessary join. */ return new string[] { "TimeIntervalAwesomeness" }; } #endregion #region IPluginTimeIntervalCommit Members public void TimeIntervalCommitAfter(CTimeInterval TimeInterval) { api.Notifications.AddMessage(@"""Awesomeness"" plugin TimeIntervalCommitAfter called"); } public bool TimeIntervalCommitBefore(CTimeInterval TimeInterval) { /* Set a member variable with the previous value in case of rollback */ preCommitAwesomenessLevel = Convert.ToInt32( TimeInterval.GetPluginField(sPluginId, "ixAwesomeness")); /* Assign the TimeInterval an "Extreme" level of awesomeness */ TimeInterval.SetPluginField(sPluginId, "ixAwesomeness", 5); api.Notifications.AddMessage( @"""Awesomeness"" plugin returning TRUE from TimeIntervalCommitBefore"); return true; } public void TimeIntervalCommitRollback(CTimeInterval TimeInterval) { /* Roll back to pre-commit value */ TimeInterval.SetPluginField(sPluginId, "ixAwesomeness", preCommitAwesomenessLevel); api.Notifications.AddMessage(@"""Awesomeness"" plugin TimeIntervalCommitRollback called"); } #endregion #region IPluginDatabase Members public CTable[] DatabaseSchema() { /* for this plugin, we'll need a table repesenting the possible levels of * Awesomeness, and a TimeInterval-to-Awesomeness table to allow for a join */ CTable Awesomeness = api.Database.NewTable(api.Database.PluginTableName("Awesomeness")); Awesomeness.sDesc = "Levels of Awesomeness"; Awesomeness.AddAutoIncrementPrimaryKey("ixAwesomeness"); Awesomeness.AddTextColumn("sAwesomenessLevel", "Level of Awesomeness"); CTable TimeIntervalAwesomeness = api.Database.NewTable(api.Database.PluginTableName("TimeIntervalAwesomeness")); TimeIntervalAwesomeness.sDesc = "Assigns TimeIntervals to levels of Awesomeness"; TimeIntervalAwesomeness.AddAutoIncrementPrimaryKey("ixTimeIntervalAwesomeness"); TimeIntervalAwesomeness.AddIntColumn("ixInterval", true, 1); TimeIntervalAwesomeness.AddIntColumn("ixAwesomeness", true, 2); return new CTable[] { Awesomeness, TimeIntervalAwesomeness }; } public int DatabaseSchemaVersion() { return 1; } public void DatabaseUpgradeAfter(int ixVersionFrom, int ixVersionTo, CDatabaseUpgradeApi apiUpgrade) { /* Create 5 different awesomeness levels. Note that we'll have a "None * specified" level, which our plugin will treat the same as NULL. */ string[] AwesomenessLevels = { "-- None specified --", "Low", "Moderate", "High", "Extreme" }; for (int i = 0; i < AwesomenessLevels.Length; i++) { CInsertQuery iq = api.Database.NewInsertQuery( api.Database.PluginTableName("Awesomeness")); iq.InsertString("sAwesomenessLevel", AwesomenessLevels[i]); iq.Execute(); } } public void DatabaseUpgradeBefore(int ixVersionFrom, int ixVersionTo, CDatabaseUpgradeApi apiUpgrade) { } #endregion } }