//Nepotřebné USING
//using System.Collections;
//using System.Linq;
//using System.Text;
//using System.Windows.Data;
//using System.Windows.Documents;
//using System.Windows.Input;
//using System.Windows.Navigation;
//using System.Windows.Shapes;
//using System.Windows.Media.Animation;
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Data;
using System.Data.SqlClient;
////prvky pro graf
using System.Windows.Controls.DataVisualization.Charting;
////pro export do Excelu
using ExcelLibrary.SpreadSheet;
////prvky Ribbon
using Microsoft.Windows.Controls.Ribbon;
////pro export do png
using System.IO;
namespace PM_view
{
///
/// Definuje třídu MainWindow, která je odvozená od Ribbon Window
///
///
/// Tato třida definuje hlavní okno porgramu
///
public partial class MainWindow : RibbonWindow
{
////////////////////////////////////Deklarace proměnných/////////////////////////////////////////////////
string zbytek = ""; //proměnná do které se ukládají data pro připojovaíc řetězec k SQL serveru
public Dictionary data_paru = new Dictionary(); //slovník do kterého se kopírují páry z okna pro nastavení grafu
public Dictionary data_paru2 = new Dictionary(); // slovník párů, které se předávají pro zobrazen grafu
public List nazev_sl = new List(); // List názvů sloupců, které se používají v metodě pro zobrazení grafů
napln_graf_win okno_graf; //deklarace okna grafů
Prohlizec webProhlizec; //deklarace weobého prohlížeče
QueryBuilder query; // deklarace okna query builderu
Dotazy SQLdotaz = new Dotazy(); // deklarace třídy dotazů
DataSet dSet = new DataSet(); // dekalrace datasetu, který z SQL dotazu naplněn
//proměnné která hlídají, zda je okno grafů již něčím naplněné nebo ne
int pocet_sloupcu2 = 0;
int pocet_radku2 = 0;
///
/// Konstruktor hlavního okna
/// Při inicializaci definuje napoejní třídy Dotazů na prvek ComboBox pro výběr statických dotazů
/// Inicializuje objekt okna pro zobrazení grafů - inicializován je zde z výkonostních důvodů
///
public MainWindow()
{
InitializeComponent();
CB_dotazy.ItemsSource = SQLdotaz.naplnslovnik();
CB_dotazy.DisplayMemberPath = "Key";
CB_dotazy.SelectedValuePath = "Value";
okno_graf = new napln_graf_win();
}
///
/// Metoda provádějící připojení k databázi, vracející naplněný dataset
///
///
///
///
DataSet Pripojeni(string retezec_pripojeni, string dotaz) //vyřešit aby metoda vracela string dotazu a otevře spojení
{
//před každým připojením se vyčistí InfoText
InfoText.Clear();
string connString = @" network address =" + retezec_pripojeni;
SqlConnection conn = new SqlConnection(connString);
DataSet dataSET = new DataSet();
try
{
conn.Open();
InfoText.Text += "Připojení otevřeno: ";
InfoText.Text += "\n";
SqlDataAdapter SqlAdapter = new SqlDataAdapter(dotaz, conn);
SqlAdapter.Fill(dataSET);
}
catch (Exception err)
{
//InfoText.Text += "Chyba připojení: ";
//InfoText.Text += "\n";
InfoText.Text += err.ToString();
//InfoText.Text += "\n";
create_XLS.IsEnabled = false;
create_XML.IsEnabled = false;
nacti_graf.IsEnabled = false;
Menu_ClearTab.IsEnabled = false;
}
finally
{
conn.Close();
InfoText.Text += dotaz;
InfoText.Text += "\n";
InfoText.Text += "Připojení uzavřeno";
}
return dataSET;
}
///
/// MEtoda, která vrácený dataset z připoejení vizualizuje v tabulce
/// Ellipse fill znamená zobrazní červeného / zeleného kolečka signalizující zda je dataSet naplněn nějakými daty
///
///
private void vizualizujData(DataSet data)
{
try
{
if (data.Tables.Count > 0)
{
ellipse1.Fill = System.Windows.Media.Brushes.Green;
}
else
{
ellipse1.Fill = System.Windows.Media.Brushes.Red;
}
//nastavení zdorjů pro zobrazní datasetu v tabulce
this.DataContext = dSet.Tables[0].DefaultView;
int pocet_sloupcu = dSet.Tables[0].Columns.Count;
int pocet_radku = dSet.Tables[0].Rows.Count;
/// povolení dalších tlačítek v menu
create_XLS.IsEnabled = true;
create_XML.IsEnabled = true;
nacti_graf.IsEnabled = true;
Menu_ClearTab.IsEnabled = true;
}
catch(Exception err)
{
InfoText.Text += "Chyba zobrazení dat: ";
InfoText.Text += "\n";
InfoText.Text += err;
InfoText.Text += "\n";
create_XLS.IsEnabled = false;
create_XML.IsEnabled = false;
nacti_graf.IsEnabled = false;
Menu_ClearTab.IsEnabled = false;
}
}
///
/// Událost, která provede dotaz na databázi, při změně ComboBoxu
/// Provede dotaz, jehož Alias je vbrán
///
///
///
private void CB_dotazy_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//pokud měním dotaz, a je nějaký graf načetn musím ho nejdřív smazat
smaz_graf_Click(sender, e);
//nastaví proěmnné aby se při znovuotevření grafu při jednom dotazu nenačitaly znova a znova prvkou sloupců a řádků
pocet_radku2 = 0;
pocet_sloupcu2 = 0;
//pro každý změněný dotaz se vytvoří nový objekt okna grafu.
okno_graf = new napln_graf_win();
//vyčistí tabulku, to je tu hlavně pro opakovaný dotaz
dSet.Clear();
//vymaže ten InfoBox
InfoText.Clear();
//SQL dotaz
string sql_dotaz = CB_dotazy.SelectedValue.ToString();
//připojovaí řetězec, proměnná zbytek je řetězec, který dává detily připojení z okna DB_conn_win
string connString = @" network address =" + zbytek;
//Připojí se k databázi a na základě dotazu vrátí výsledek naplněný dataset
dSet = Pripojeni(zbytek, sql_dotaz);
//Přečte a naplní Tabulku daty
vizualizujData(dSet);
}
///
/// Metoda, která vymaže obsah tabulky
/// Nastaví semafor na červenou
/// Zakáže sama sebe, načtení grafu a exporty do XLS a XML
/// pokud je zobrazen graf vymaže ho
///
///
///
private void Menu_ClearTab_Click(object sender, RoutedEventArgs e)
{
dSet.Reset();
dSet.Clear();
dSet.Tables.Clear();
if (dSet.Tables.Count == 0) //tohle by mohla byt samostatna metoda, ktera kontroluje obsha datasetu
{
ellipse1.Fill = System.Windows.Media.Brushes.Red;
}
Menu_ClearTab.IsEnabled = false;
create_XLS.IsEnabled = false;
create_XML.IsEnabled = false;
nacti_graf.IsEnabled = false;
}
///
/// Událost, která při spuštění tlačítka zobrazí okno pro nastavení parametrů připojení
/// Volá metodu spojení
///
///
///
private void Connect_DB_win_Click(object sender, RoutedEventArgs e)
{
spojeniDB();
}
///
/// Událost pro export tabulky do XML
///
///
///
private void create_XML_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog save_dlg = new Microsoft.Win32.SaveFileDialog();
save_dlg.Filter = "soubor formátu XML |*.xml";
save_dlg.FileName = "Tabulka_export";
var dialog = save_dlg.ShowDialog();
string XML_cesta = save_dlg.FileName;
dSet.WriteXml(XML_cesta);
}
///
/// Událost pro export tabulky do Excelu
/// Zde je přidána externí knihovna ExcelLibrary.dll
///
///
///
///
private void create_XLS_Click(object sender, RoutedEventArgs e)
{
Microsoft.Win32.SaveFileDialog save_dlg = new Microsoft.Win32.SaveFileDialog();
save_dlg.Filter = "Textový soubor Excel 2003 - 2007 |*.xls";
save_dlg.FileName = "Tabulka_export";
var dialog = save_dlg.ShowDialog();
string cesta = save_dlg.FileName;
CreateWorkbook2(cesta, dSet);
}
///
/// Metoda pro export do excelu - metoda která se nachází ve výše zmíěnné knihovně musela být opravena a explicitně napsána
/// Důvodem bylo oštřerní případů pro DB NULL hodnoty
///
///
///
public static void CreateWorkbook2(String filePath, DataSet dataset)
{
if (dataset.Tables.Count == 0)
throw new ArgumentException("Data set musí obsahovat alespoň jednu tabulku", "dataset");
Workbook workbook = new Workbook();
foreach (DataTable dt in dataset.Tables)
{
Worksheet worksheet = new Worksheet(dt.TableName);
for (int i = 0; i < dt.Columns.Count; i++)
{
// Přidá hlavičku sloupců
worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName);
// Naplní řádky
for (int j = 0; j < dt.Rows.Count; j++)
//ošetření případnu hodnoty která je DB NULL
worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i] == DBNull.Value ? "" : dt.Rows[j][i]);
}
workbook.Worksheets.Add(worksheet); // přidá list tabulky
}
workbook.Save(filePath); //uoží tabulku
}
///
/// Metoda, které zobrazí okono pro připojení, z okna přebere argumenty a nastaví proměnné připojení (cestu hestlo, username)
/// Je možnost 3 parametrů - připojení na FSV serverv GEO1
/// Lokální server
/// Libovolný jiný server
///
private void spojeniDB()
{
DB_conn_win2 okno = new DB_conn_win2();
okno.Title = "Připojení k serveru";
if (okno.ShowDialog().Value)
{
if (okno.server_text_string.Text.Equals("Geo1_server"))
{
zbytek = "tcp:geo1.fsv.cvut.cz\\MSSQLSERVERR2,1433 ;user id =" + okno.name_of_user.Text + ";password =" + okno.password_of_user.Password + ";Initial Catalog=COST_mesta";
}
else if (okno.local_radio.IsChecked == true)
{
zbytek = okno.server_text_string.Text;
}
else if (okno.other_remote_radio.IsChecked == true)
{
zbytek = okno.server_text_string.Text + ";user id =" + okno.name_of_user.Text + ";password =" + okno.password_of_user.Password;
}
//Povolení na dotazovací funkce
CB_dotazy.IsEnabled = true;
QueryBuild_DB_win.IsEnabled = true;
}
}
///
/// Zobrazuje graf
/// Přebírá hodnoty z okna grafů
///
///
private void zobraz_data(napln_graf_win okno_graf)
{
//vyčistí data párů
data_paru2.Clear();
mcChart.Series.Clear();
//inicializace pomocné hodnoty
double hodnota = -1;
int j = 0; //pomocna proměnná pro číslo sloupce
foreach (string line in data_paru.Keys)
{
int index = data_paru[line];
if (dSet.Tables[0].Rows[index][nazev_sl[j]] == DBNull.Value) //pokud je hodnota DB NULL zobrazí se hodnota 0
{
hodnota = (int)0;
}
else
{
hodnota = Double.Parse((dSet.Tables[0].Rows[index][nazev_sl[j]]).ToString());
}
j++;
data_paru2.Add(line, hodnota);
}
// nastaví podel předané hodnoty z okna grafů, jaký typ grafu se bude zobrazovat
switch (okno_graf.t)
{
// histogram
case 1:
{
ColumnSeries bar = new ColumnSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
// sloupce naležato
case 2:
{
BarSeries bar = new BarSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
// Koláčový
case 3:
{
PieSeries bar = new PieSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
// Bodový
case 4:
{
ScatterSeries bar = new ScatterSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
// liniový
case 5:
{
LineSeries bar = new LineSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
// liniový s výplní
case 6:
{
AreaSeries bar = new AreaSeries();
bar.IndependentValuePath = "Key";
bar.DependentValuePath = "Value";
bar.ItemsSource = data_paru2;
mcChart.Series.Add(bar);
break;
}
}
}
///
/// Událost, která zobrazí okno grafu
/// je zde variant, že pokud není v grafu nic načteno, porjde celá procedura včetně načtení dat z data setu
/// V případě že již nějaká data načtena jsou, je předpokald že okno je jen schováno - tudíž je přeskočeno načítání obsahu a okno se jen zobrazí
///
///
///
///
private void nacti_graf_Click(object sender, RoutedEventArgs e)
{
if (pocet_radku2 == 0 && pocet_sloupcu2 == 0)
{
pocet_sloupcu2 = dSet.Tables[0].Columns.Count;
pocet_radku2 = dSet.Tables[0].Rows.Count;
for (int i = 1; i < pocet_sloupcu2; i++) //jednička je tam, abychom se vyhnuli problémům, kdyby někdo ve sloupci hodnot vybral obec
{
okno_graf.list_hodnota.Items.Add(dSet.Tables[0].Columns[i].ToString());
}
//zbavíme se sloupce ID pokud ho hodnota obsahuje
if (okno_graf.list_hodnota.Items.Contains("ID"))
{
okno_graf.list_hodnota.Items.RemoveAt(okno_graf.list_hodnota.Items.IndexOf("ID"));
}
for (int j = 0; j < pocet_radku2; j++)
{
okno_graf.list_promenna.Items.Add(dSet.Tables[0].Rows[j][0]);
}
//překopíruje slovník z okna grafů skrz vlastnost
data_paru = okno_graf.d;
//prekopiruje názevl sloupců z okna grafů skrz vlastnost
nazev_sl = okno_graf.s;
}
///Volám funkci, která bude volat zobrazení do grafu
okno_graf.ShowDialog();
zobraz_data(okno_graf);
}
///
/// Událost, která otevře Dialog pro otevření souborů, načetný XML soubor se načte do stasetu a zobrazí v tabulce
/// Dále se s daty může pracovat jako v případě výseldku z SQL dotazu
/// Je to zde z důvodu, pokud uživtel chce pracovat s již jendou generovanými daty
/// pro zobrazení grafu nastaví proměnné, aby se graf nově otevřel
///
///
///
private void load_XML_Click(object sender, RoutedEventArgs e)
{
pocet_sloupcu2 = 0;
pocet_radku2 = 0;
//pokud měním dotaz, a je nějaký graf načetn musím ho nejdřív smazat
smaz_graf_Click(sender, e);
//pro každý změněný dotaz se vytvoří nový objekt okna grafu.
okno_graf = new napln_graf_win();
dSet.EnforceConstraints = false;
//vyčistí dataset
Menu_ClearTab_Click(sender,e);
//otevře dialog s filtrem na XML
Microsoft.Win32.OpenFileDialog open_dlg = new Microsoft.Win32.OpenFileDialog();
open_dlg.Filter = "XML dokuemnt |*.xml";
Nullable result = open_dlg.ShowDialog();
//pokud OK nastaví dataSet daty z XML
if (result == true)
{
string XML_cesta = open_dlg.FileName;
try
{
dSet.ReadXml(XML_cesta);
}
//pokud není XML ve vhodném stavu, je zachycena vyjímka, která uvede data Setdo zákaldího stavu
catch
{
dSet.Reset();
MessageBox.Show("V datasetu nejsou relevatní data");
}
}
else
{
MessageBox.Show("Není vybrán žádný XML soubor");
}
//pokud jsou v XML nějaká data
if (dSet.Tables.Count > 0)
{
ellipse1.Fill = System.Windows.Media.Brushes.Green;
vizualizujData(dSet);
}
}
///
/// Událost, která smaže vytovřený graf
///
///
///
private void smaz_graf_Click(object sender, RoutedEventArgs e)
{
mcChart.Series.Clear();
}
///
/// Po zaškrtnutí zobrazí tabulku
///
///
///
private void check_tab_Checked(object sender, RoutedEventArgs e)
{
tabView3.Visibility = Visibility.Visible;
}
///
/// Po odkšrtnutí se tabulka schová
///
///
///
private void check_tab_Unchecked(object sender, RoutedEventArgs e)
{
tabView3.Visibility = Visibility.Collapsed;
}
///
/// Po zaškrtnutí zobrazí graf
///
///
///
private void check_graf_Checked(object sender, RoutedEventArgs e)
{
mcChart.Visibility = Visibility.Visible;
tabView3.MaxWidth = groupZobraz.ActualWidth / 2; // aby to bylo videt
}
///
/// Po odkšrtnutí se graf schová
///
///
///
private void check_graf_Unchecked(object sender, RoutedEventArgs e)
{
mcChart.Visibility = Visibility.Collapsed;
tabView3.MaxWidth = groupZobraz.ActualWidth; // aby to bylo videt
}
///
/// Pokud je nějaký graf aktivní, je po stitku exportován do png
/// Pokud je graf prázndný uživatel je na to upozorněn
///
///
///
private void export_graf_Click(object sender, RoutedEventArgs e)
{
bool tabulka_nucenene_zavrena = false; //exportovat graf je možné jen při zavřené tabulce
string obr_cesta = null;
if (okno_graf.list_par.Items.Count < 1 || mcChart.Series.Count < 1)
{
MessageBox.Show("Není co exportovat z grafu");
}
else
{
if (tabView3.IsVisible == true)
{
tabView3.Visibility = Visibility.Collapsed;
check_tab.IsChecked = false;
tabulka_nucenene_zavrena = true;
}
// kód pro uložení obrázku
Microsoft.Win32.SaveFileDialog uloz_obr = new Microsoft.Win32.SaveFileDialog();
uloz_obr.Filter = "Obrázek |*.png";
uloz_obr.FileName = "Graf";
Nullable result = uloz_obr.ShowDialog();
if (result == true)
{
obr_cesta = uloz_obr.FileName; //cesta k souboru
graf_export((int)mcChart.ActualWidth, (int)mcChart.ActualHeight, obr_cesta);
}
if (tabulka_nucenene_zavrena == true && tabView3.IsVisible == false)
{
tabView3.Visibility = Visibility.Visible;
check_tab.IsChecked = true;
tabulka_nucenene_zavrena = false;
}
}
}
///
/// Metoda pro vlastní exprot obrázku do png
/// Vstupuje zde rozmery obrázku a cesta k nemu
///
///
///
///
private void graf_export(int sirka, int vyska, string obr_cesta)
{
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(sirka, vyska, 96d, 96d, PixelFormats.Pbgra32);
renderBitmap.Render(mcChart);
FileStream outStream = new FileStream(obr_cesta, FileMode.Create);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(outStream);
outStream.Close();
}
///
/// Po zakšrtnutí je objeví okno s webovou prohlížečkou nastavenou na projekt Kadlecová Kratocvhíl
///
///
///
private void check_web_Checked(object sender, RoutedEventArgs e)
{
Uri uri = new Uri("http://geo1.fsv.cvut.cz/pin2/2012/g/", UriKind.RelativeOrAbsolute);
webProhlizec = new Prohlizec();
webProhlizec.webBrowser.Navigate(uri);
webProhlizec.Closing += delegate { uncheck(); };
webProhlizec.Show();
}
///
/// metoda, která je přidána do prohlížeče jako delegát, která říká že po odškrtnutí se zavře
///
private void uncheck()
{
check_web.IsChecked = false;
webProhlizec.Closing -= delegate{uncheck() ;};
}
///
/// Událost otevře okno Query Builderu
///
///
///
private void QueryBuild_DB_win_Click(object sender, RoutedEventArgs e)
{
//před změnou dotazu musím smazat graf a tabulka
smaz_graf_Click(sender, e);
Menu_ClearTab_Click(sender,e);
query = new QueryBuilder();
//nsataví proěmnné pro zobrazení grafu
pocet_radku2 = 0;
pocet_sloupcu2 = 0;
// vytovří objekt okna grafů
okno_graf = new napln_graf_win();
//naplní dotazem SQL TreeView peo výber prvků pro SQL dostaz
DataSet pokusX = new DataSet();
string sql_dotaz2 = @"Select Distinct t.name AS tabulka_name, s.name AS sloupec_name FROM COST_mesta.sys.tables t INNER JOIN COST_mesta.sys.all_columns s on t.object_id = s.object_id Where t.name != 'sysdiagrams'";
pokusX = Pripojeni(zbytek, sql_dotaz2);
DataRow[] tabfiltr = pokusX.Tables[0].Select("tabulka_name IS NOT NULL");
//vyčístí tabulku od dupplicitních záznamů
DataView view = new DataView(pokusX.Tables[0]);
DataTable distinctValues = view.ToTable(true, "tabulka_name");
// vlastní naplnění
// Nejprve se zjistí název tabulky (první foreach) a pro každou tabulku se vypíšou její sloupce (vnořený foreach)
foreach (DataRow rad_tab in distinctValues.Rows)
{
string rok = "'" + (string)rad_tab[0] + "'";
TreeViewItem node = new TreeViewItem();
node.FontStyle = FontStyles.Oblique;
node.FontSize = 14;
node.Header = rok;
query.treeView1.Items.Add(node);
DataRow[] filtrovane = pokusX.Tables[0].Select("tabulka_name = " + rok.ToString());
foreach (DataRow radek in filtrovane)
{
string sloupec = (string)radek[1];
TreeViewItem item = new TreeViewItem();
item.Header = sloupec;
item.FontStyle = FontStyles.Normal;
item.FontSize = 12;
node.Items.Add(item);
//Odstranění sloupců (ID a obec), které jsou nevhodné pro explicitní výběr SQL dotazu
if (sloupec == "ID" | sloupec == "obec" + (string)rad_tab[0])
{
node.Items.Remove(item);
}
}
}
//zobrazí dialog
query.ShowDialog();
//naplní dataset
dSet = Pripojeni(zbytek, query.textVysledek.Text);
//naplní Tabulku daty
vizualizujData(dSet);
}
///
/// Událost, která hlídá, to aby při zapnutých grafech a tabulce, měly oba prvky maximálně polovinu celého prostoru
/// Událsot má rozné eventuaility zakštrnutých checkboxů
///
///
///
private void Hlavni_okno_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (tabView3.IsVisible & mcChart.IsVisible)
{
tabView3.MaxWidth = groupZobraz.ActualWidth / 2;
}
else if (tabView3.IsVisible & !mcChart.IsVisible)
{
tabView3.MaxWidth = groupZobraz.ActualWidth;
}
else if (!tabView3.IsVisible & mcChart.IsVisible)
{
mcChart.MaxWidth = groupZobraz.ActualWidth;
}
InfoText.MaxWidth = zalozka_databaze.ActualWidth / 2;
}
///
/// Otevře okno a zobrazí inforamce o porgramu
///
///
///
private void About_Click(object sender, RoutedEventArgs e)
{
about_win oProgramu = new about_win();
oProgramu.ShowDialog();
}
///
/// Zobrazí okno nápovědy
///
///
///
private void Help_Click(object sender, RoutedEventArgs e)
{
Prohlizec pomoc = new Prohlizec();
string curDir = Directory.GetCurrentDirectory();
Uri url = new Uri(String.Format("file:///{0}/help/pm_view.htm", curDir));
pomoc.webBrowser.Navigate(url);
pomoc.Show();
}
}
}