Suivez et participez au développement du nouvel OpenCellar : PLOC.co
Home Page
 
Français  English  
Open Cellar Home Edition - 1.2 - Windows 98, Me, 2000, XP and Vista. The free Windows wine cellar management software. Open Cellar Mobile Edition - Beta 2 (French version) - Pocket PC. The free Pocket PC wine cellar management software. Open Cellar Cross Platform - Beta 1 (French version) - Mac OSX and Linux. The free MacOS/Linux wine cellar management software. My Open Cellar Open Cellar Forums Place des vins
Search: Welcome (connect - create an account )
Page settings

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

 

Comments
 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
Write a comment

Security code


© 2006-2014 Matthieu DUCROCQ  Open Cellar official blog - All rights reserved - Last update: january 2014 | twitter