//Bakalarska prace

//TEMA:
//UZIVATELSKY PROGRAM PRO ZOBRAZENI
//A ZPRACOVANI KVANTITATIVNI FAZE
//Z DIGITALNIHO HOLOGRAFICKEHO MIKROSKOPU

//FAKULTA STROJNIHO INZENYRSTVI
//USTAV FYZIKALNIHO INZENYRSTVI

//Jmeno:		Hladik Lukas
//Skupina:		3E/91
//Verze:		1.0
//Datum:		27. kvetna 2010


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;


//using System.

namespace WindowsFormsApplication1
{
           
    
    public partial class nastaveni_souboru : Form
    {
        

        
        //DEKLARACE GLOBALNICH PROMENNYCH V RAMCI TOHOTO FORMULARE
        string nazevSlozky = "C:\\";
        int status; //cerna
        uint[] SpatnyRozmer;
        uint pocetNeshodnychSouboru;
        //string celaCestaSouboru;

        protected PerformanceCounter ramCounter; 
        
                
        
        public nastaveni_souboru()   //Zde probiha inicializace formulare "nastaveni_souboru"
        {
            
            InitializeComponent();

            comboBox2.Items.Add("Rastrové soubory (*.BMP)");  //NAPLNENI ComboBoxu vyberu formatu obrazku
            comboBox2.Items.Add("JPEG (*.JPG)");
            comboBox2.Items.Add("GIF (*.GIF)");
            comboBox2.Items.Add("TIFF (*.TIF)");       
            comboBox2.Items.Add("PNG (*.PNG)");  
            comboBox2.Items.Add("Všechny soubory obrázků");
            comboBox2.Items.Add("Všechny soubory"); 


        }

        public bool SizeCheck()  //Zkontroluje zda maji vsechny vybrane soubory stejnou velikost
        {

            
            string[] poleSouboruListView;
            poleSouboruListView = GetFileNames();
            
            //string[] Vybrane soubory GetFileNames()

            System.Drawing.Image objImage;
            int referencniSirka=0;
            int referencniVyska=0;
            bool alesponJedenChybny = false;
            try
            {
                referencniSirka = Image.FromFile(poleSouboruListView[0]).Width;
                referencniVyska = Image.FromFile(poleSouboruListView[0]).Height;
            }
            catch
            {
                //MessageBox.Show("Nepodporovaný typ souboru bude ze seznamu automaticky odstraněn.",
                //    "Chyba",
                //    MessageBoxButtons.OK,
                //    MessageBoxIcon.Exclamation,
                //    MessageBoxDefaultButton.Button1);
                return true;
            }
            
            
            

            SpatnyRozmer = new uint[poleSouboruListView.GetLength(0)];

            pocetNeshodnychSouboru = 0;
            int poleRozmeru;
            listBox1.Items.Clear();
            //status = 2;        
            //textBox3.Text = "Sirka prvniho obrazku " + Image.FromFile(listBox1.Items[0].ToString()).Width;
            
            for (uint i = 0; i < poleSouboruListView.GetLength(0); i++)
                
            {
                try
                {
                    objImage = Image.FromFile(poleSouboruListView[i]);

                }
                catch
                {
                    MessageBox.Show("Nepodporovaný typ souboru bude ze seznamu automaticky odstraněn.",
                    "Chyba",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button1);
                    return true;                   
    
                }

                if (referencniSirka == objImage.Width && referencniVyska == objImage.Height)
                {
                   
                    //pocetShodnychSouboru++;
                     //vymazani listBoxu
                    //status = 1; //nastaveni cerne barvy
                    listBox1.Items.Add(poleSouboruListView[i]);
                    GC.Collect();
                    GC.WaitForPendingFinalizers();

                }
                else
                {
                    //status = 2; //nastaveni cerne barvy
                    listBox1.Items.Add(poleSouboruListView[i]); 
                    SpatnyRozmer[i] = 1;
                    alesponJedenChybny = true;
                    pocetNeshodnychSouboru++;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    // poleRozmeru[0] = new Image.FromFile(listBox1.Items[i].ToString()).Width;
                }

              }
            objImage = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            return alesponJedenChybny; 
        }
        
        
        private void button1_Click(object sender, EventArgs e) //KLIKNUTO: OK
        {

           if (listBox1.Items.Count > 0) //zamezeni odeslani prazdneho formulare
            {

                //SizeCheck();

                if (SizeCheck() == true) //pokud najde obrazky s jinym rozmerem nez ma prvni
                {
                    MessageBox.Show("Vybraný soubor vstupních dat obsahuje obrázky různých rozměrů ( " + pocetNeshodnychSouboru + " )", "Nelze pokračovat: Různé rozměry obrázků", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                }
                else
                {
                    this.DialogResult = DialogResult.OK; //odesle s vysledkem OK
                    this.Close();  //zavre okno formulare
                }
                    
                             
                
            }
            else
            {
                MessageBox.Show("Nebyly vybrány žádné soubory", "Chyba");     //Pokud uzivatel nic nevybral
            }

            
        }

        private void button2_Click(object sender, EventArgs e) //KLIKNUTO: ZRUSIT
        {

            GC.Collect(); // uklidi
            this.DialogResult = DialogResult.Cancel;   //zavre okno bez naplneni promennych
            this.Close();
        }

        private void button3_Click(object sender, EventArgs e)
        {

        }

        

        public string[] GetFileNames()  //NAVRATOVA FUNKCE CELEHO DIALOGU, vraci seznam cest vybranych souboru
        {

            string[] destination = new string[listBox1.Items.Count]; //deklarace retezce
            listBox1.Items.CopyTo(destination, 0);  //naplneni retezce
            return destination;   //vrati pole obsahujici cesty k souborum
        }

        public int GetZobrazovat()
        {
            int vysledek = 0;
            
            if (checkBox1.Checked == true)
            {
                vysledek = 1;
            }
            
            return vysledek; 
        }

            
        private void btnDstFile_Click(object sender, EventArgs e)
        {
                        
            folderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer; //orevre dialog vyberu adresare, moc spatne
            textBox2.Text = nazevSlozky; //zobrazi cestu  ke slozce
            
            if (folderBrowserDialog1.ShowDialog(this) == DialogResult.OK)
            {

                try
                {

                    listView1.Clear();          //vycisti predchozi zobrazeni v horni casti
                    imageList1.Images.Clear();      //vycisti obrazky ikonek
                    nazevSlozky = folderBrowserDialog1.SelectedPath;    //ziskana nova uzivatelem zvolena cesta
                    textBox2.Text = nazevSlozky;  //zobrazi novou cestu do textboxu  
                    DisplayItems(nazevSlozky);     //zobrazi obsah vybraneho adresare v horni casti okna
                    //NASTAVENI DEFAULTNI HODNOTY COMBOBOX
                                     
                }
                
                finally
                {

                }

                                
            }
            
        }

        private void fillListView(FileInfo file) //Naplneni horniho okna

        {
            string key = file.Extension; //rozdeleni podle ikony

            
            switch (key.ToUpperInvariant())  //pro pripad velkych pismen
            {
                case ".EXE":
                case ".LNK":
                    key = System.IO.Path.GetFileNameWithoutExtension(file.FullName); //exe, lnk soubory mohou mit vlastni ikonu, neprirazenou OS, proto musime pouzit jejich
                    break;
            }

                        

            if (!this.imageList1.Images.Keys.Contains(key))
            {
                this.imageList1.Images.Add(key, System.Drawing.Icon.ExtractAssociatedIcon(file.FullName)); //pokud soubor splnuje podminky je pridam do seznamu
            }

            int index = this.imageList1.Images.Keys.IndexOf(key); //prirazeni odpovidajiciho indexu


            ListViewItem item = new ListViewItem(); //deklarace nove polozky listView

            item.Text = file.Name; //popisek u kazde polozky

            item.ImageIndex = index; //index

            item.Tag = file; 


            this.listView1.Items.Add(item); //odeslani vyplnene polozky k pridani do listView
                
        }


        private void DisplayItems(string path)  //zobrazeni polozek v listView
        {

            System.IO.DirectoryInfo di = new DirectoryInfo(path); //promenna pro uchovani informaci o slozce

            foreach (System.IO.FileInfo file in di.GetFiles()) //pro kazdy soubor, ktery se v tomto adresari nachazi
            {
               
                //V TOMTO BLOKU KODU SE FILTRUJI MOZNE PRIPONY SOUBORU OBSAZENE V DANE SLOZCE
                if (file.Name.ToLower().EndsWith(stavComboBoxu())) //filtruje jednotlive pripony  
                {

                    fillListView(file); //vybranym typem naplni listView
                }

                else
                {

                    if (stavComboBoxu() == "vsechnySoubory") //co nasel v adresari to zobrazi
                    {

                        fillListView(file); //naplni listView
                    }

                    else if (stavComboBoxu() == "vsechnyObrazky")
                    {



                        if (file.Name.ToLower().EndsWith("bmp") || file.Name.ToLower().EndsWith("png") || file.Name.ToLower().EndsWith("gif") || file.Name.ToLower().EndsWith("tif") || file.Name.ToLower().EndsWith("jpg"))
                        {


                            fillListView(file);//naplni listView
                        }
                        

                    }



                }

            }

        }


        private void button5_Click(object sender, EventArgs e) //KLIKNUTO: Odebrat
        {

            if (listBox1.SelectedItems.Count > 0) //pokud jsou vybrany nejake soubory
            {

                for (int n = 0; n < listBox1.SelectedItems.Count; n++)  //pres vsechny oznacene polozky
                {
                    listBox1.Items.RemoveAt(listBox1.Items.IndexOf(listBox1.SelectedItems[n])); //odebere oznacene soubory ze spodniho okna
                    //if (SizeCheck() == true)
                    if (pocetNeshodnychSouboru > 0) //MUSI BYT KVULI PODBARVENI
                    {
                        SizeCheck();
                    }
                        
                    
                }
            } 

            label1.Text = "Vstupní soubory: ( " + listBox1.Items.Count + " )"; //VYPLNI POCET VSTUPNICH SOUBORU

                        
        }

        private void nastaveni_souboru_Load(object sender, EventArgs e)
        {
            //PREDNASTAVENI predpokladanych parametru //
            comboBox2.SelectedIndex = 5;
            label1.Text =  "Vstupní soubory: ( 0 )";
                //CATEGORYListBox.Items[i].Selected = true;
            listBox1.DrawMode = DrawMode.OwnerDrawFixed;
            this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
           
            
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e) //zobrazeni nahledu obrazku v okne
        {
            
            
            if (listView1.SelectedItems.Count == 1 && (listView1.SelectedItems[0].Text.ToLower().EndsWith("bmp") || listView1.SelectedItems[0].Text.ToLower().EndsWith("png") || listView1.SelectedItems[0].Text.ToLower().EndsWith("tif") || listView1.SelectedItems[0].Text.ToLower().EndsWith("jpg") || listView1.SelectedItems[0].Text.ToLower().EndsWith("gif"))) //pokud plati tato podminka
            {
                
                textBox1.Text = listView1.SelectedItems[0].Text; //ziska cestu a jmeno prave oznaceneho souboru
                label6.Visible = false; //skryje text "Nahled neni k dispozici"

                try
                {
                    pictureBox1.Image = new Bitmap(nazevSlozky + "\\" + textBox1.Text); //nacteni obrazku do boxu  //pozor na neobraz
                }
                catch
                {
                    MessageBox.Show("Tento typ souboru není podporován.",
                    "Chyba",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button1);
                    GC.Collect();
                    return;


                }

                label8.Text = ("Rozlišení obrázku: " + pictureBox1.Image.Width + " × " + pictureBox1.Image.Height + " px");
                //statusBarPanel3.Text = "" + Image.FromFile(poleSouboru[1]).Width + " × " + Image.FromFile(poleSouboru[1]).Height + " × " + Image.FromFile(poleSouboru[1]).PixelFormat;


                GC.Collect();
                GC.WaitForPendingFinalizers();
                
                
            }

            else
            {
                textBox1.Text = null; //nezobrazi jmeno oznaceneho souboru pokud to neni obrazek
                pictureBox1.Image = null; //nezobrazi nahled
                label6.Visible = true;
                label8.Text = null;
            }    
            

        }


   
        private string stavComboBoxu() //vraci uzivatelem vybrany typ pripony
        {

            string filtrHodnotaCombo = null;
            switch (comboBox2.SelectedIndex)
            {
                case 0:
                    filtrHodnotaCombo = "bmp";
                    break;
                case 1:
                    filtrHodnotaCombo = "jpg";
                    break;
                case 2:
                    filtrHodnotaCombo = "gif";
                    break;
                case 3:
                    filtrHodnotaCombo = "tif";
                    break;

                case 4:
                    filtrHodnotaCombo = "png";
                    break;

                case 5:
                    filtrHodnotaCombo = "vsechnyObrazky";
                    break;
                case 6:
                    filtrHodnotaCombo = "vsechnySoubory";
                    break;
            }

            return filtrHodnotaCombo; //vracime stav
        }


        /*System.IO.FileInfo file in di.GetFiles()
         * */



        private void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) //Obarveni jednotlivych polozek listboxu
        {
          
            e.DrawBackground();
            Brush myBrush = Brushes.Black; //defaultni barva pisma
            
            if (SpatnyRozmer != null)  //pokud jsou nejake prvky ve spatnem rozmeru
            {
                if (SpatnyRozmer[e.Index] == 1)  //pokud polozka na tomto indexu ma spatny rozmer
                {
                    myBrush = Brushes.Red; //napis bude cervene
                }

            }
            if (listBox1.Items.Count > 0)
            {

                e.Graphics.DrawString(((ListBox)sender).Items[e.Index].ToString(), //prokresleni textu v ListBoxu
                e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);

                // If the ListBox has focus, draw a focus rectangle 
                // around the selected item.

                e.DrawFocusRectangle();
            }
        }

        


        private void button3_Click_1(object sender, EventArgs e) //KLIKNUTO Pridat
        {
            

            if (listView1.SelectedItems.Count > 0) //pokud je oznacen nejaky soubor
                {


                    for (int n = 0; n < listView1.SelectedItems.Count; n++) //pokud jich je vic, tak prida vsechny oznacene

                    {
                       if ((listView1.SelectedItems[n].Text.ToLower().EndsWith("bmp")) || (listView1.SelectedItems[n].Text.ToLower().EndsWith("gif")) || (listView1.SelectedItems[n].Text.ToLower().EndsWith("tif")) || (listView1.SelectedItems[n].Text.ToLower().EndsWith("png")) || (listView1.SelectedItems[n].Text.ToLower().EndsWith("jpg")))
                        {
                            string item = (nazevSlozky + @"\" + listView1.SelectedItems[n].Text);  //format retezce jenz se prida do listBoxu
                            listBox1.Items.Add(item); //prida polozku do seznamu vybranych souboru
                            
                            
                        }
                    
                    }
                }

            label1.Text = "Vstupní soubory: ( " + listBox1.Items.Count + " )"; //VYPLNI POCET VSTUPNICH SOUBORU
                       
        }



        private void listView2_SelectedIndexChanged(object sender, EventArgs e)
        {
            
            
        }

        private void button4_Click(object sender, EventArgs e) //KLIKNUTO: Pridat vse
        {
            
            
            //presune vsechny polozky z horniho okna dolu
            for (int n = 0; n < listView1.Items.Count; n++) //pres vsechny polozky v listView
            {

                if ((listView1.Items[n].Text.ToLower().EndsWith("bmp")) || (listView1.Items[n].Text.ToLower().EndsWith("gif")) || (listView1.Items[n].Text.ToLower().EndsWith("tif")) || (listView1.Items[n].Text.ToLower().EndsWith("png")) || (listView1.Items[n].Text.ToLower().EndsWith("jpg")))                {
                    listBox1.Items.Add((nazevSlozky + @"\" + listView1.Items[n].Text));
                }
                
            }
            label1.Text = "Vstupní soubory: ( " + listBox1.Items.Count + " )"; //VYPLNI POCET VSTUPNICH SOUBORU
            
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) //Uzivatel zmenil typ souboru
        {

            listView1.Clear(); //vymaze doposud zobrazene soubory
            DisplayItems(nazevSlozky); //znovu nacte obsah adresare a zobrazi pouze soubory pozadovane pripony
            
        }

        private void comboBox2_MouseClick(object sender, MouseEventArgs e)
        {
            
        }


        private void listView1_DoubleClick(object sender, EventArgs e)
        {
            
        }

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) //poklepani na polozku ve vyberovem okne
        {
            button3_Click_1(0, e); //KLIKNUTO Pridat
        }

        private void listView1_ItemActivate(object sender, EventArgs e)
        {
            button3_Click_1(0, e); //KLIKNUTO Pridat
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e) //zobrazeni nahledu a infa pro ListBox
        {
            if (listBox1.SelectedItems.Count == 1)// &&    (listBox1.SelectedItems.].Text.ToLower().EndsWith("bmp") || listView1.SelectedItems[0].Text.ToLower().EndsWith("png") || listView1.SelectedItems[0].Text.ToLower().EndsWith("tif") || listView1.SelectedItems[0].Text.ToLower().EndsWith("jpg") || listView1.SelectedItems[0].Text.ToLower().EndsWith("gif")))
            {
                label6.Visible = false; //skryje napis "Nahled neni k dispozici"

                try
                {
                    pictureBox1.Image = new Bitmap(listBox1.SelectedItem.ToString());   //DORESIT KDYZ BUDE SEDET PRIPONA ALE NEBUDE TO OBRAZOVY SOUBOR !!!
                }
                catch
                {
                    MessageBox.Show("Tento typ souboru není podporován.",
                    "Chyba",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation,
                    MessageBoxDefaultButton.Button1);
                    GC.Collect();
                    return;
                }
                label8.Text = ("Rozlišení obrázku: " + pictureBox1.Image.Width + " × " + pictureBox1.Image.Height + " px");
                
                GC.Collect(); //vycistime promenne
                GC.WaitForPendingFinalizers();
            }
            else
            {
                textBox1.Text = null; //nahled nelze zobrazit
                pictureBox1.Image = null; //smaze predchozi obrazek nahledu
                label6.Visible = true; //zobrazi napis
                label8.Text = null;  //skryje informace o rozliseni
            }    


        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void button6_Click(object sender, EventArgs e) //KLIKNUTO  Odebrat vse
        {
            listBox1.Items.Clear(); //vymaze okno vyberu
            label1.Text = "Vstupní soubory: ( 0 )"; //vynuluje citac
            SpatnyRozmer = null;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            listBox1.Items.RemoveAt(3);
        }
    }
}
