148 lines
5.3 KiB
C#
148 lines
5.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
using Foo.DataAccessLayer.DataTypes;
|
|
|
|
namespace Foo.WorkspaceMgr
|
|
{
|
|
internal static class HelperFunc
|
|
{
|
|
internal const int DEFAULT_SHOWNHIDE_SLEEP_TIME = 250;
|
|
internal const int DEFAULT_CLOSE_SLEEP_TIME = 500;
|
|
internal const int DEFAULT_LAUNCH_SLEEP_TIME = 1000;
|
|
|
|
/// <summary>
|
|
/// Depending on the Quality of the Index Optimizations,
|
|
/// Return what the best type of action is afterward
|
|
/// </summary>
|
|
internal enum IndexOptimizationQuality
|
|
{
|
|
Good,
|
|
Average,
|
|
Poor
|
|
}
|
|
|
|
// Helper Class for OptimalLaunchIndexesForFileArtifacts
|
|
internal class OptimalIndexes
|
|
{
|
|
public int Index;
|
|
public string FileName;
|
|
internal OptimalIndexes(int Index, string FileName)
|
|
{
|
|
this.Index = Index;
|
|
this.FileName = FileName;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="quality"></param>
|
|
/// <returns></returns>
|
|
internal static int GetSleepTimeForQuality(IndexOptimizationQuality quality)
|
|
{
|
|
int nSleepTime = 1350;
|
|
switch (quality)
|
|
{
|
|
case HelperFunc.IndexOptimizationQuality.Good:
|
|
nSleepTime = 1350;
|
|
break;
|
|
|
|
case HelperFunc.IndexOptimizationQuality.Average:
|
|
nSleepTime = 1675;
|
|
break;
|
|
|
|
case HelperFunc.IndexOptimizationQuality.Poor:
|
|
nSleepTime = 2000;
|
|
break;
|
|
}
|
|
return nSleepTime;
|
|
}
|
|
|
|
/// <summary>
|
|
/// For Launching of File Artifacts we must make sure that artifacts are in an order that allows us
|
|
/// to properly resolve them dynamically. When files with the same name get launched too close together,
|
|
/// window resolution will become increasingly difficult.
|
|
/// </summary>
|
|
/// <param name="artifactItems">a group of artifacts (Only file Artifacts will be processed)</param>
|
|
/// <returns>an array of indexes that specifies the launch order of all the files in this group</returns>
|
|
internal static IndexOptimizationQuality OptimalLaunchIndexesForFileArtifacts(ArtifactItem[] artifactItems, out int[] optimalIndexes)
|
|
{
|
|
|
|
// Step One - If it is a file type, then we get the file name and it's index to put into a list
|
|
List<OptimalIndexes> optIndex = new List<OptimalIndexes>();
|
|
for (int i = 0; i < artifactItems.Length; ++i)
|
|
{
|
|
if(artifactItems[i].IsFile)
|
|
optIndex.Add(new OptimalIndexes(i, artifactItems[i].FileName));
|
|
}
|
|
|
|
// Step Two - Sort the List by FileName
|
|
optIndex.Sort(delegate(OptimalIndexes o1, OptimalIndexes o2) { return o1.FileName.CompareTo(o2.FileName); });
|
|
|
|
// Step Three - Go thru sorted list and get out all the Singles
|
|
List<int> singlesList = new List<int>();
|
|
for (int i = 0; i < optIndex.Count; ++i)
|
|
{
|
|
bool bIsSingle = true;
|
|
bool bCompareUp = ((i > 0) && (i < optIndex.Count));
|
|
bool bCompareDown = (i < (optIndex.Count - 1));
|
|
|
|
if (bIsSingle && bCompareUp)
|
|
bIsSingle = (String.Compare(optIndex[i].FileName, optIndex[i - 1].FileName, true) != 0);
|
|
|
|
if (bIsSingle && bCompareDown)
|
|
bIsSingle = (String.Compare(optIndex[i].FileName, optIndex[i + 1].FileName, true) != 0);
|
|
|
|
// If Single - Add To Singles List
|
|
if (bIsSingle)
|
|
singlesList.Add(i);
|
|
}
|
|
|
|
// If all items in the List were singles then we are really good to go
|
|
// and can exit out of here
|
|
if (singlesList.Count == optIndex.Count)
|
|
{
|
|
// Pass out the Indexes of the Array To The Caller
|
|
optimalIndexes = new int[optIndex.Count];
|
|
for (int i = 0; i < optIndex.Count; ++i)
|
|
optimalIndexes[i] = optIndex[i].Index;
|
|
|
|
// Since there are no doubles - this is a low risk / high quality optimization
|
|
return IndexOptimizationQuality.Good;
|
|
}
|
|
|
|
// Step Four - There are doubles and/or no singles
|
|
// ~remove all singles from optIndex
|
|
foreach (int index in singlesList)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2) we make a list of all filenames in sorted order (with an index to which artifact it belongs)
|
|
|
|
|
|
// 3) we then generate the most optimal list of indexes that we pass out for the caller to use
|
|
|
|
foreach (ArtifactItem artifact in artifactItems)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
optimalIndexes = new int[1];
|
|
|
|
return IndexOptimizationQuality.Average;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|