Suivez et participez au développement du nouvel OpenCellar : PLOC.co
Page d'accueil
 
Français  English  
Open Cellar Home Edition - 1.2 - Le logiciel gratuit pour gérér efficacement votre cave à vins sous Windows. Open Cellar Mobile Edition - Beta 2 - La gestion de cave à vins a enfin sa solution Mobile sur Pocket PC. Open Cellar Cross Platform - Beta 1 - La gestion gratuite de vins disponible sous Mac OSX et Linux. Mon Open Cellar Les forums d'Open Cellar Place des vins
Rechercher : Bienvenue (se connecter - créer un compte)
Options de page

Nuage de tags
Implémentation de statistiques dynamiques
Le volet de statisques dynamiques affiche les données en rapport avec la fenêtre active. Dans cet article nous verrons comment implémenter de nouvelles statistiques sur ce volet et en liaison avec la fenêtre "Ma cave - mode tableur avancé".

1) Présentation des classes et interfaces utilisées


2) Développement du projet
Squelette de notre AddIn

public void OnInitialize(IApplication application)
{
	this.application = application;
	this.application.ApplicationStartUp+=new EventHandler(OnStartUp);
}

private ILiveStatsWindow statsWindow; // Référence fenetre stats dynamiques

private void OnStartUp(object sender, EventArgs e)
{
	// Récupere la réference à la fenetre statistique.
	statsWindow = (ILiveStatsWindow)this.application.GetWindow(WindowType.LiveStats);
	statsWindow.Update+=new EventHandler(OnUpdate);
}

private void OnUpdate(object sender, EventArgs e)
{
	CreateDummyChart();
}
Dans le bout de code ci dessous nous récupérons une référence vers la fenêtre de statistiques dynamiques (ILiveStatsWindow) puis nous nous abonnons à l'événement Update. Cet évenement est déclenché chaque fois qu'une fenêtre est activée ou que le touche F5 est préssée.
Voyons maintenant la méthode CreateDummyChart()

private void CreateDummyChart()
{
	Chart chart = new Chart("DummyChart", ChartType.Pie);

	ChartItemCollection serie1 = new ChartItemCollection("France", System.Drawing.Color.AliceBlue);
	serie1.Add(30);
	chart.Data.Add(serie1);

	ChartItemCollection serie2 = new ChartItemCollection("Italie", System.Drawing.Color.Red);
	serie2.Add(60);
	chart.Data.Add(serie2);
	
	ChartItemCollection serie3 = new ChartItemCollection("Autres", System.Drawing.Color.Yellow);
	serie3.Add(60);
	chart.Data.Add(serie3);

	this.statsWindow.Charts.Add(chart);
}
Cette méthode instancie un objet Chart de type Pie et ajoute 3 séries de couleurs différentes. Enfin elle ajoute l'objet à la liste des statistiques de la fenêtre.
Compilez le projet puis copiez la dll dans le répertoire AddIns d'OC. Ouvrez OC et affichez le volet de statistiques (ctrl+d) à chaque changement de fenêtre notre objet Chart est rendu.


Fig1. Aperçu du graphique

Comme notre complément doit intéragir uniquement avec la fenêtre Ma cave - mode tableur avancé, nous devons modifier la méthode OnUpdate comme ceci

private void OnUpdate(object sender, EventArgs e)
{
	if((this.application.ActiveWindow != null)
		&& (this.application.ActiveWindow.Type == WindowType.Table))
	{
		CreateDummyChart();
	}
}
Maitenant supposons que notre statistique n'interesse pas l'utilisateur, ce dernier doit pouvoir la désactiver (via la commande Personnaliser vos statistiques).
Toutes les préférences de statistiques sont gérées via l'objet SmartItemManager (cf Diagramme).
Modifions les méthodes OnStartUp() et OnUpdate() comme suit :

private void OnStartUp(object sender, EventArgs e)
{
	// Récupere la réference à la fenetre statistique.
	statsWindow = (ILiveStatsWindow)this.application.GetWindow(WindowType.LiveStats);
	statsWindow.Update+=new EventHandler(OnUpdate);

	// Crée un SmartItem
	SmartItem dummyChart = new SmartItem("DummyChartId", "DummyChart");
	dummyChart.Enabled = true; // Par défaut active

	// Si notre élément n'est pas présent --> enregistrement
	if(!this.application.SmartItemManager.SmartItems.Contains(dummyChart.SystemId))
	{
		this.application.SmartItemManager.SmartItems.Add(dummyChart);
	}
}

private void OnUpdate(object sender, EventArgs e)
{
	if((this.application.ActiveWindow != null)
		&& (this.application.ActiveWindow.Type == WindowType.Table)
		&& (this.application.SmartItemManager.SmartItems["DummyChartId"].Enabled))
	{
		// Vérifie si l'utilisateur a activé notre stat
		CreateDummyChart();
	}
}

Fig2. notre statistique (DummyChart) est intégrée dans les préférences utilisateurs.

3) Implémentation de nos statistiques
Nous allons afficher à l'utilisateur la répartition par millésime de ses vins.

public class CellarStat
{
	/// 
	/// Initialise une instance de classe CellarStat.
	/// 
	public CellarStat(){}

	private ArrayList m_wines = new ArrayList();

	/// 
	/// Ajoute un vin à la liste.
	/// 
	/// 
	public void Add(Wine wine)
	{
		//
		// Verifie le parametre
		//
		if(wine == null)
		{
			throw new ArgumentNullException("wine");
		}

		m_wines.Add(wine);
	}

	/// 
	/// Efface la liste des vins.
	/// 
	public void Clear()
	{
		m_wines.Clear();
	}

	/// 
	/// Obtient la stat par millésime et bouteilles.
	/// 
	/// 
	public StatBaseItem GetBottlesStatYearItem()
	{
		StatBaseItem baseItem = new StatBaseItem();

		for (int wcount = 0; wcount < m_wines.Count; wcount++)
		{
			Wine wine = (Wine)m_wines[wcount];
			//
			// Selon la gestion (manuelle / automatique);
			//
			if(wine.ManualManagement)
			{
				baseItem.Increment(wine.Year.ToString("0000"), wine.Bottles);
			}
			else
			{
				baseItem.Increment(wine.Year.ToString("0000"), wine.RackItems.Count);
			}
		}
		return(baseItem);
	}

	/// 
	/// Obtient la stat par millésime et vins.
	/// 
	/// 
	public StatBaseItem GetWinesStatYearItem()
	{
		StatBaseItem baseItem = new StatBaseItem();

		for (int wcount = 0; wcount < m_wines.Count; wcount++)
		{
			Wine wine = (Wine)m_wines[wcount];
			
			baseItem.Increment(wine.Year.ToString("0000"), 1);
		}
		return(baseItem);
	}
}

Pour alimenter la classe CellarStats ajoutons cette méthode :

private void BuildCellarStat(CellarStat stat)
{
	ObjectCollection wines = this.application.ActiveCellar.GetCollection((ushort)ObjectType.Wine);
	TableManager manager = ((ITableWindow)this.application.ActiveWindow).Table;
	if(!manager.DataSource.Columns.Contains("SysId"))
	{
		return;
	}

	for (int i = 0; i < manager.DataSource.DefaultView.Count; i++)
	{
		string wineId = manager.DataSource.DefaultView[i]["SysId"].ToString();
		Wine w = (Wine)wines.Get(wineId);
		if(w != null)
		{
			stat.Add(w);
		}				
	}
}

Enfin modifions OnUpdate et CreateDummyChart comme ceci :

private void OnUpdate(object sender, EventArgs e)
{
	if((this.application.ActiveWindow != null)
		&& (this.application.ActiveWindow.Type == WindowType.Table)
		&& (this.application.SmartItemManager.SmartItems["DummyChartId"].Enabled))
	{
		// Vérifie si l'utilisateur a activé notre stat
		CellarStat cellarStat = new CellarStat();
		BuildCellarStat(cellarStat);

		CreateDummyChart("Répartition par millésime et bouteilles", cellarStat.GetBottlesStatYearItem());
		CreateDummyChart("Répartition par millésime et vins", cellarStat.GetWinesStatYearItem());
	}
}
private void CreateDummyChart(string chartName, StatBaseItem baseItem)
{
	// Vérifie qu'il y a des données.
	if(!baseItem.Filled)
	{
		return;
	}

	Chart chart = new Chart(chartName, ChartType.Pie);

	ChartItemCollection data = null;
	StatBaseItemObjectCollection items = baseItem.GetTop(5);

	for (int i = 0; i < items.Count; i++)
	{
		data = new ChartItemCollection(items[i].Name, 
			ColorMap.Get(i));
		data.Add(items[i].Count);
		chart.Data.Add(data);
	}

	this.statsWindow.Charts.Add(chart);
}

Fig3. Résultat ! :-)

4) A vous de continuer
Nos stats ne sont pas entierement terminées, actuellement si vous ajoutez/supprimez un filtre, elles ne rafraichissent pas.
Pret ? A vos claviers :-)

Télécharger les sources du projet

 

Commentaires
 30/11/2015 21:27 - Anonyme
No more s***. All posts of this qutilay from now on
 30/11/2015 21:27 - Anonyme
No more s***. All posts of this qutilay from now on
 30/11/2015 21:27 - Anonyme
No more s***. All posts of this qutilay from now on
Ecrire un commentaire

Code de sécurité


© 2006-2014 Matthieu DUCROCQ Blog officiel d'Open Cellar - Tous droits réservés - Dernière mise à jour : janvier 2014 | twitter | facebook