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

namespace FileListBox_Demo
{
    public partial class FileListBox : UserControl
    {
        #region Pola prywatne
        //wewnetrzne
        private string[] listaKatalogow = null;
        private string[] listaPlikow = null;
        private string[] listaDyskow = null;
        private bool pokazujDwieKropki = true;
        //konfigurowanie komponentu
        private string sciezkaKatalogu = null;
        private bool uwzglednijKatalogi = true;
        private bool uwzglednijPliki = true;
        private bool uwzglednijDyski = true;
        private bool uwzglednijKatalogNadrzedny = true;
        private string filtr = null;
        private bool mozliweZmienianieKatalogow = true;
        #endregion

        #region Metody prywatne
        private void PobierzZawartoscKatalogu()
        {
            if (sciezkaKatalogu==null) 
                sciezkaKatalogu=Directory.GetCurrentDirectory();

            pokazujDwieKropki=(sciezkaKatalogu!=Path.GetPathRoot(sciezkaKatalogu) 
                   && uwzglednijKatalogNadrzedny);

	        if (!Directory.Exists(sciezkaKatalogu))
		        throw new Exception("Katalog "+sciezkaKatalogu+" nie istnieje!");

            listBox1.Items.Clear();

	        if (uwzglednijKatalogi)
		    {
		        if (pokazujDwieKropki) listBox1.Items.Add("[..]");
		        listaKatalogow=Directory.GetDirectories(sciezkaKatalogu);
                Array.Sort(listaKatalogow);
		        //listBox1.Items.AddRange(listaKatalogow);
                foreach (string katalog in listaKatalogow)
                    listBox1.Items.Add("["+Path.GetFileName(katalog)+"]");
		    }
	        if (uwzglednijPliki)
		    {
                if (filtr != null)
                    listaPlikow = Directory.GetFiles(sciezkaKatalogu, filtr);
                else
                    listaPlikow=Directory.GetFiles(sciezkaKatalogu);
                Array.Sort(listaPlikow);
		        //listBox1.Items.AddRange(listaPlikow);
                foreach (string plik in listaPlikow)
                    listBox1.Items.Add(Path.GetFileName(plik));
		    }
	        if (uwzglednijDyski)
		    {
		        listaDyskow=Directory.GetLogicalDrives();
		        //listBox1.Items.AddRange(listaDyskow);
                foreach (string dysk in listaDyskow)
                    listBox1.Items.Add("<" + dysk.Substring(0, 2) + ">");
		    }
        }
        #endregion


        public FileListBox()
        {
            InitializeComponent();
            PobierzZawartoscKatalogu();
        }

        private void listBox1_DoubleClick(object sender, EventArgs e)
        {
            int przesuniecie = (pokazujDwieKropki && uwzglednijKatalogi) ? 1 : 0;
            int numer = listBox1.SelectedIndex - przesuniecie; //+1 dla [..]
            int poczatekPlikow = (uwzglednijKatalogi ? listaKatalogow.Length : 0);
            int poczatekDyskow =
                    poczatekPlikow + (uwzglednijPliki ? listaPlikow.Length : 0);

            //zmiana katalogu
            string nowaSciezkaKatalogu = null;
            if (numer == -1) nowaSciezkaKatalogu = sciezkaKatalogu + "\\..";
            if (numer >= 0 && numer < poczatekPlikow)
                nowaSciezkaKatalogu = listaKatalogow[numer];
            if (numer >= poczatekDyskow) 
                nowaSciezkaKatalogu = listaDyskow[numer-poczatekDyskow];
            if (nowaSciezkaKatalogu != null 
                && Directory.Exists(nowaSciezkaKatalogu)
                && mozliweZmienianieKatalogow)
            {
                sciezkaKatalogu = Path.GetFullPath(nowaSciezkaKatalogu);
                PobierzZawartoscKatalogu();
            }
        }
    }
}
