Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Net.Mail;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Základní okno adresáře.
- /// </summary>
- public partial class AddressBookForm : Form
- {
- /// <summary>
- /// Adresář kontaktů.
- /// </summary>
- public Adresar adresar;
- internal List<JedenKontakt> ovladaciPrvky;
- /// <summary>
- /// Aktuální přihlášení.
- /// </summary>
- protected Prihlaseni aktualniPrihlaseni;
- /// <summary>
- /// Konstruktor, který se nesmí nikdy zavolat. Máme ho zde kvůli polymorfismu, jinak by to nefungovalo.
- /// </summary>
- protected AddressBookForm() { }
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení. Toto je zde kvůli odesílání e-mailů a nalezení správného adresáře.</param>
- /// <param name="pridatDoEmailu">Rozhoduje, jaký druh adresáře zobrazí. Jestli ten editovací, nebo ten, který přidává kontakty do e-mailu.</param>
- /// </summary>
- public AddressBookForm(Prihlaseni aktualniPrihlaseni, bool pridatDoEmailu)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- adresar = new Adresar(aktualniPrihlaseni);
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- ovladaciPrvky = new List<JedenKontakt>();
- // Vyřešíme takhle jednoduše, abychom nemuseli "složitě" upravovat designer.
- if (pridatDoEmailu)
- {
- this.VytvoritButton.Visible = false;
- this.ZavritButton.Text = "Připojit k e-mailu";
- }
- for (int i = 0; i < adresar.seznamKontaktu.Count; i++)
- ovladaciPrvky.Add(new JedenKontakt(adresar.seznamKontaktu[i], i, this, pridatDoEmailu));
- }
- /// <summary>
- /// Vytvoří nový kontakt.
- /// </summary>
- internal virtual void VytvoritButton_Click(object sender, EventArgs e)
- {
- using (var form = new ContactForm(aktualniPrihlaseni))
- if (form.ShowDialog() == DialogResult.OK)
- {
- adresar.seznamKontaktu.Add(form.novyKontakt);
- ovladaciPrvky.Add(new JedenKontakt(adresar.seznamKontaktu[adresar.seznamKontaktu.Count - 1], adresar.seznamKontaktu.Count - 1, this, false));
- }
- }
- /// <summary>
- /// Odstraní daný kontakt z adresáře.
- /// </summary>
- /// <param name="kolikaty">Kolikátý kontakt v pořadí se má smazat.</param>
- private void OdstranExistujiciKontakt(int kolikaty)
- {
- // Všechny kontakty pod tímto musíme posunout směrem nahoru.
- ovladaciPrvky.GetRange(kolikaty + 1, ovladaciPrvky.Count - kolikaty - 1).ForEach(kontakt =>
- {
- kontakt.JmenoKontaktLabel.Location = new System.Drawing.Point(52, kontakt.JmenoKontaktLabel.Location.Y - 38);
- kontakt.EmailKontaktLabel.Location = new System.Drawing.Point(230, kontakt.EmailKontaktLabel.Location.Y - 38);
- kontakt.DeleteButton.Location = new System.Drawing.Point(482, kontakt.DeleteButton.Location.Y - 38);
- kontakt.EditButton.Location = new System.Drawing.Point(449, kontakt.EditButton.Location.Y - 38);
- kontakt.InfoButton.Location = new System.Drawing.Point(416, kontakt.InfoButton.Location.Y - 38);
- kontakt.ObrazekKontaktPicturebox.Location = new System.Drawing.Point(3, kontakt.ObrazekKontaktPicturebox.Location.Y - 38);
- });
- // Uvolnění resourců, aby prvky smazané kontakty nezůstaly na pozadí a nezabíraly tak zbytečně paměť.
- ovladaciPrvky[kolikaty].Dispose();
- adresar.seznamKontaktu.RemoveAt(kolikaty);
- }
- /// <summary>
- /// Zavře okno s kontakty.
- /// </summary>
- protected void ZavritButton_Click(object sender, EventArgs e)
- {
- this.DialogResult = DialogResult.OK;
- this.Close();
- }
- /// <summary>
- /// Třída sloužící k inicializaci jednoho kontaktu v adresářovém okně - tedy inicializuje labely a tlačítka pro daný kontakt.
- /// </summary>
- internal class JedenKontakt : IDisposable
- {
- internal Kontakt kontakt;
- private AddressBookForm okno;
- private int kolikatyKontakt;
- internal System.Windows.Forms.Label EmailKontaktLabel;
- internal System.Windows.Forms.PictureBox InfoButton;
- internal System.Windows.Forms.PictureBox EditButton;
- internal System.Windows.Forms.PictureBox DeleteButton;
- internal System.Windows.Forms.PictureBox ObrazekKontaktPicturebox;
- internal System.Windows.Forms.Label JmenoKontaktLabel;
- internal System.Windows.Forms.CheckBox PridatKontaktCheckbox;
- internal ToolTip PridatDoEmailuToolTip;
- /// <summary>
- /// Inicializace celého kontaktu.
- /// </summary>
- /// <param name="kontakt">Kontakt, který se má inicializovat.</param>
- /// <param name="kolikatyKontakt">Určuje, o kolikátý kontakt v seznamu se jedná. Kvůli pozici tlačítek a tak.</param>
- /// <param name="okno">Aktuální okno.</param>
- /// <param name="pridatDoEmailu">Rozhoduje, jaký druh adresáře zobrazí. Jestli ten editovací, nebo ten, který přidává kontakty do e-mailu.</param>
- internal JedenKontakt(Kontakt kontakt, int kolikatyKontakt, AddressBookForm okno, bool pridatDoEmailu)
- {
- this.kontakt = kontakt;
- this.okno = okno;
- this.kolikatyKontakt = kolikatyKontakt;
- #region Inicializace ovládacích prvků.
- this.JmenoKontaktLabel = new System.Windows.Forms.Label();
- this.EmailKontaktLabel = new System.Windows.Forms.Label();
- this.ObrazekKontaktPicturebox = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.ObrazekKontaktPicturebox)).BeginInit();
- //
- // JmenoKontaktLabel
- //
- this.JmenoKontaktLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.JmenoKontaktLabel.Font = new System.Drawing.Font("Calibri", 10F);
- this.JmenoKontaktLabel.Location = new System.Drawing.Point(52, 38 * kolikatyKontakt);
- this.JmenoKontaktLabel.Name = "JmenoKontaktLabel";
- this.JmenoKontaktLabel.Size = new System.Drawing.Size(171, 32);
- this.JmenoKontaktLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // EmailKontaktLabel
- //
- this.EmailKontaktLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.EmailKontaktLabel.Font = new System.Drawing.Font("Calibri Light", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
- this.EmailKontaktLabel.ForeColor = System.Drawing.SystemColors.Highlight;
- this.EmailKontaktLabel.Location = new System.Drawing.Point(230, 38 * kolikatyKontakt);
- this.EmailKontaktLabel.Name = "EmailKontaktLabel";
- this.EmailKontaktLabel.Size = new System.Drawing.Size(171, 32);
- this.EmailKontaktLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // ObrazekKontaktPicturebox
- //
- this.ObrazekKontaktPicturebox.Location = new System.Drawing.Point(3, 38 * kolikatyKontakt);
- this.ObrazekKontaktPicturebox.Name = "ObrazekKontaktPicturebox";
- this.ObrazekKontaktPicturebox.Size = new System.Drawing.Size(32, 32);
- this.ObrazekKontaktPicturebox.TabIndex = 18;
- this.ObrazekKontaktPicturebox.TabStop = false;
- this.ObrazekKontaktPicturebox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
- ((System.ComponentModel.ISupportInitialize)(this.ObrazekKontaktPicturebox)).EndInit();
- okno.AdresarPanel.Controls.Add(this.ObrazekKontaktPicturebox);
- okno.AdresarPanel.Controls.Add(this.JmenoKontaktLabel);
- okno.AdresarPanel.Controls.Add(this.EmailKontaktLabel);
- this.PridatKontaktCheckbox = new System.Windows.Forms.CheckBox();
- if (pridatDoEmailu)
- {
- //
- // PridatKontaktCheckbox
- //
- this.PridatKontaktCheckbox.AutoSize = true;
- this.PridatKontaktCheckbox.Location = new System.Drawing.Point(449, 11 + 38 * kolikatyKontakt);
- this.PridatKontaktCheckbox.Name = "PridatKontaktCheckbox";
- this.PridatKontaktCheckbox.Size = new System.Drawing.Size(16, 16);
- this.PridatKontaktCheckbox.TabIndex = kolikatyKontakt;
- this.PridatKontaktCheckbox.UseVisualStyleBackColor = true;
- PridatDoEmailuToolTip = new ToolTip();
- PridatDoEmailuToolTip.UseFading = true;
- PridatDoEmailuToolTip.UseAnimation = true;
- PridatDoEmailuToolTip.ReshowDelay = 500;
- PridatDoEmailuToolTip.InitialDelay = 500;
- PridatDoEmailuToolTip.AutoPopDelay = 15000;
- PridatDoEmailuToolTip.ShowAlways = true;
- PridatDoEmailuToolTip.ToolTipIcon = ToolTipIcon.Info;
- PridatDoEmailuToolTip.SetToolTip(PridatKontaktCheckbox, "Připojí kontakt k e-mailu.");
- ToolTip InfoToolTip = new ToolTip();
- InfoToolTip.UseFading = true;
- InfoToolTip.UseAnimation = true;
- InfoToolTip.ReshowDelay = 500;
- InfoToolTip.InitialDelay = 500;
- InfoToolTip.AutoPopDelay = 15000;
- InfoToolTip.ShowAlways = true;
- InfoToolTip.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip.SetToolTip(ObrazekKontaktPicturebox, "Zobrazit kontakt.");
- ToolTip InfoToolTip2 = new ToolTip();
- InfoToolTip2.UseFading = true;
- InfoToolTip2.UseAnimation = true;
- InfoToolTip2.ReshowDelay = 500;
- InfoToolTip2.InitialDelay = 500;
- InfoToolTip2.AutoPopDelay = 15000;
- InfoToolTip2.ShowAlways = true;
- InfoToolTip2.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip2.SetToolTip(JmenoKontaktLabel, "Zobrazit kontakt.");
- okno.AdresarPanel.Controls.Add(this.PridatKontaktCheckbox);
- this.ObrazekKontaktPicturebox.Click += new System.EventHandler(this.InfoButton_Click);
- this.JmenoKontaktLabel.Click += new System.EventHandler(this.InfoButton_Click);
- this.JmenoKontaktLabel.Cursor = Cursors.Hand;
- this.ObrazekKontaktPicturebox.Cursor = Cursors.Hand;
- this.EmailKontaktLabel.ForeColor = this.JmenoKontaktLabel.ForeColor;
- }
- else
- {
- this.DeleteButton = new System.Windows.Forms.PictureBox();
- this.EditButton = new System.Windows.Forms.PictureBox();
- this.InfoButton = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.EditButton)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.InfoButton)).BeginInit();
- //
- // DeleteButton
- //
- this.DeleteButton.Image = global::Mail_Agent_2017.Properties.Resources.OdstranitSoubor;
- this.DeleteButton.Location = new System.Drawing.Point(482, 38 * kolikatyKontakt);
- this.DeleteButton.Name = "DeleteButton";
- this.DeleteButton.Padding = new System.Windows.Forms.Padding(4);
- this.DeleteButton.Size = new System.Drawing.Size(32, 32);
- this.DeleteButton.TabStop = false;
- this.DeleteButton.Cursor = Cursors.Hand;
- //
- // EditButton
- //
- this.EditButton.Image = global::Mail_Agent_2017.Properties.Resources.EditovatSoubor;
- this.EditButton.Location = new System.Drawing.Point(449, 38 * kolikatyKontakt);
- this.EditButton.Name = "EditButton";
- this.EditButton.Padding = new System.Windows.Forms.Padding(4);
- this.EditButton.Size = new System.Drawing.Size(32, 32);
- this.EditButton.TabStop = false;
- this.EditButton.Cursor = Cursors.Hand;
- //
- // InfoButton
- //
- this.InfoButton.Image = global::Mail_Agent_2017.Properties.Resources.InformaceOSouboru;
- this.InfoButton.Location = new System.Drawing.Point(416, 38 * kolikatyKontakt);
- this.InfoButton.Name = "InfoButton";
- this.InfoButton.Padding = new System.Windows.Forms.Padding(4);
- this.InfoButton.Size = new System.Drawing.Size(32, 32);
- this.InfoButton.TabStop = false;
- this.InfoButton.Cursor = Cursors.Hand;
- ToolTip SendToolTip = new ToolTip();
- SendToolTip.UseFading = true;
- SendToolTip.UseAnimation = true;
- SendToolTip.ReshowDelay = 500;
- SendToolTip.InitialDelay = 500;
- SendToolTip.AutoPopDelay = 15000;
- SendToolTip.ShowAlways = true;
- SendToolTip.ToolTipIcon = ToolTipIcon.Info;
- SendToolTip.SetToolTip(EmailKontaktLabel, "Kliknutím odešlete e-mail na danou adresu.");
- ToolTip InfoToolTip = new ToolTip();
- InfoToolTip.UseFading = true;
- InfoToolTip.UseAnimation = true;
- InfoToolTip.ReshowDelay = 500;
- InfoToolTip.InitialDelay = 500;
- InfoToolTip.AutoPopDelay = 15000;
- InfoToolTip.ShowAlways = true;
- InfoToolTip.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip.SetToolTip(InfoButton, "Zobrazit kontakt.");
- ToolTip EditToolTip = new ToolTip();
- EditToolTip.UseFading = true;
- EditToolTip.UseAnimation = true;
- EditToolTip.ReshowDelay = 500;
- EditToolTip.InitialDelay = 500;
- EditToolTip.AutoPopDelay = 15000;
- EditToolTip.ShowAlways = true;
- EditToolTip.ToolTipIcon = ToolTipIcon.Info;
- EditToolTip.SetToolTip(EditButton, "Editovat kontakt.");
- ToolTip DeleteToolTip = new ToolTip();
- DeleteToolTip.UseFading = true;
- DeleteToolTip.UseAnimation = true;
- DeleteToolTip.ReshowDelay = 500;
- DeleteToolTip.InitialDelay = 500;
- DeleteToolTip.AutoPopDelay = 15000;
- DeleteToolTip.ShowAlways = true;
- DeleteToolTip.ToolTipIcon = ToolTipIcon.Info;
- DeleteToolTip.SetToolTip(DeleteButton, "Smazat kontakt.");
- this.InfoButton.Click += new System.EventHandler(this.InfoButton_Click);
- this.EditButton.Click += new System.EventHandler(this.EditButton_Click);
- this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click);
- this.EmailKontaktLabel.Click += new System.EventHandler(this.SendButton_Click);
- okno.AdresarPanel.Controls.Add(this.EditButton);
- okno.AdresarPanel.Controls.Add(this.InfoButton);
- okno.AdresarPanel.Controls.Add(this.DeleteButton);
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.EditButton)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.InfoButton)).EndInit();
- this.EmailKontaktLabel.Cursor = Cursors.Hand;
- }
- #endregion
- JmenoKontaktLabel.Text = kontakt.Jmeno;
- EmailKontaktLabel.Text = kontakt.Email;
- int pomer = Math.Max(kontakt.Fotografie.Width / 24, kontakt.Fotografie.Height / 24);
- ObrazekKontaktPicturebox.Image = new Bitmap(kontakt.Fotografie, new Size(kontakt.Fotografie.Width / pomer, kontakt.Fotografie.Height / pomer));
- okno.Invalidate();
- }
- /// <summary>
- /// Zobrazí informace o kontaktu.
- /// </summary>
- private void InfoButton_Click(object sender, EventArgs e)
- {
- new ContactForm(kontakt, true, okno.aktualniPrihlaseni).ShowDialog();
- }
- /// <summary>
- /// Otevře okno, které odešle danému kontaktu e-mail.
- /// </summary>
- private void SendButton_Click(object sender, EventArgs e)
- {
- // Nejdřív uložíme adresář do souboru.
- okno.adresar.Ulozit();
- new SendForm(okno.aktualniPrihlaseni, ((Label)sender).Text).ShowDialog();
- }
- /// <summary>
- /// Upraví kontakt.
- /// </summary>
- private void EditButton_Click(object sender, EventArgs e)
- {
- using (var form = new ContactForm(kontakt, false, okno.aktualniPrihlaseni))
- if (form.ShowDialog() == DialogResult.OK)
- kontakt = form.novyKontakt;
- JmenoKontaktLabel.Text = kontakt.Jmeno;
- EmailKontaktLabel.Text = kontakt.Email;
- int pomer = Math.Max(kontakt.Fotografie.Width / 24, kontakt.Fotografie.Height / 24);
- ObrazekKontaktPicturebox.Image = new Bitmap(kontakt.Fotografie, new Size(kontakt.Fotografie.Width / pomer, kontakt.Fotografie.Height / pomer));
- okno.adresar.seznamKontaktu[kolikatyKontakt] = kontakt;
- okno.ovladaciPrvky[kolikatyKontakt] = this;
- }
- /// <summary>
- /// Odstraní kontakt.
- /// </summary>
- private void DeleteButton_Click(object sender, EventArgs e)
- {
- if (MessageBox.Show("Opravdu chcete odstranit tento kontakt?", "Odstranit", MessageBoxButtons.YesNo) == DialogResult.Yes)
- okno.OdstranExistujiciKontakt((this.DeleteButton.Location.Y) / 38); // O kolikátý kontakt se jedná, poznáme podle jeho pozice.
- }
- /// <summary>
- /// Klasická implementace metody Dispose.
- /// </summary>
- public void Dispose()
- {
- EmailKontaktLabel.Dispose();
- InfoButton.Dispose();
- EditButton.Dispose();
- DeleteButton.Dispose();
- ObrazekKontaktPicturebox.Dispose();
- JmenoKontaktLabel.Dispose();
- PridatKontaktCheckbox.Dispose();
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Mail_Agent_2017
- {
- interface IAdresarovaStruktura
- {
- void Ulozit();
- }
- /// <summary>
- /// Třída implementující adresář kontaktů.
- /// </summary>
- public class Adresar : IAdresarovaStruktura
- {
- /// <summary>
- /// Seznam kontaktů v adresáři.
- /// </summary>
- public List<Kontakt> seznamKontaktu;
- private Prihlaseni aktualniPrihlaseni;
- /// <summary>
- /// Konstruktor načte všechny kontakty ze souboru kontaktů.
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení zde máme proto, abychom věděli, čí adresář máme na disku hledat.</param>
- /// </summary>
- public Adresar(Prihlaseni aktualniPrihlaseni)
- {
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- seznamKontaktu = new List<Kontakt>();
- Skupiny skupiny = new Skupiny(aktualniPrihlaseni);
- object soubor;
- if (!File.Exists(@aktualniPrihlaseni._email + ".contacts_info"))
- {
- soubor = File.Create(aktualniPrihlaseni._email + ".contacts_info");
- ((FileStream)soubor).Close();
- }
- soubor = new StreamReader(@aktualniPrihlaseni._email + ".contacts_info");
- // Zkusíme načíst kontakty ze souboru.
- try
- {
- while (!((StreamReader)soubor).EndOfStream)
- {
- var jedenKontakt = ((StreamReader)soubor).ReadLine().Split(';');
- seznamKontaktu.Add(new Kontakt(jedenKontakt[0], jedenKontakt[1], jedenKontakt[2], jedenKontakt[3], jedenKontakt[4], jedenKontakt[5], jedenKontakt[6],
- (skupiny.seznamSkupin.IndexOf(new Skupina { _nazev = jedenKontakt[7] }) == -1) ? "" : jedenKontakt[7], // Pokud skupina již neexistuje (byla smazána), nebudeme ji vypisovat.
- jedenKontakt[8]));
- }
- }
- // Někde je chyba, vytvoříme nový adresář.
- catch { seznamKontaktu = new List<Kontakt>(); }
- finally { ((StreamReader)soubor).Close(); }
- }
- /// <summary>
- /// Uloží adresář z paměti do souboru.
- /// </summary>
- public void Ulozit()
- {
- StreamWriter soubor = new StreamWriter(@aktualniPrihlaseni._email + ".contacts_info");
- foreach (Kontakt kontakt in seznamKontaktu)
- soubor.WriteLine(kontakt.UlozKontakt());
- soubor.Close();
- }
- }
- /// <summary>
- /// Třída uchovávající informace o kontaktu.
- /// </summary>
- public class Kontakt
- {
- private string _fotka;
- private string _jmeno;
- private string _firma;
- private string _prezdivka;
- private string _email;
- private string _telefon;
- private string _web;
- internal string _skupina;
- private string _poznamka;
- #region Definice vlastností jednotlivých parametrů.
- // Všechno šifrujeme, abychom mohli údaje bezpečně uložit do souboru a nehrozilo zneužití údajů.
- /// <summary>
- /// Fotografie daného kontaktu.
- /// </summary>
- public Bitmap Fotografie
- {
- get { return _fotka == null ? null : Sifrovani.StringToBitmap(_fotka); }
- set { _fotka = Sifrovani.BitmapToString(value); }
- }
- /// <summary>
- /// Jméno daného kontaktu.
- /// </summary>
- public string Jmeno
- {
- get { return _jmeno == null ? null : Sifrovani.Decrypt(_jmeno); }
- set { _jmeno = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Firma daného kontaktu.
- /// </summary>
- public string Firma
- {
- get { return _firma == null ? null : Sifrovani.Decrypt(_firma); }
- set { _firma = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Přezdívka daného kontaktu.
- /// </summary>
- public string Prezdivka
- {
- get { return _prezdivka == null ? null : Sifrovani.Decrypt(_prezdivka); }
- set { _prezdivka = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// E-mail daného kontaktu.
- /// </summary>
- public string Email
- {
- get { return _email == null ? null : Sifrovani.Decrypt(_email); }
- set { _email = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Telefon daného kontaktu.
- /// </summary>
- public string Telefon
- {
- get { return _telefon == null ? null : Sifrovani.Decrypt(_telefon); }
- set { _telefon = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Web daného kontaktu.
- /// </summary>
- public string Web
- {
- get { return _web == null ? null : Sifrovani.Decrypt(_web); }
- set { _web = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Skupina daného kontaktu.
- /// </summary>
- public string Skupina
- {
- get { return _skupina == null ? null : Sifrovani.Decrypt(_skupina); }
- set { _skupina = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Poznámka daného kontaktu.
- /// </summary>
- public string Poznamka
- {
- get { return _poznamka == null ? null : Sifrovani.Decrypt(_poznamka); }
- set { _poznamka = Sifrovani.Encrypt(value); }
- }
- #endregion
- /// <summary>
- /// Obyčejný konstruktor inicializující nový objekt třídy Kontakt.
- /// </summary>
- public Kontakt() { }
- /// <summary>
- /// Tento konstruktor načítá zašifrované údaje přímo ze souboru.
- /// </summary>
- public Kontakt(string fotografie, string jmeno, string firma, string prezdivka, string email, string telefon, string web, string skupina, string poznamka)
- {
- this._fotka = fotografie;
- this._jmeno = jmeno;
- this._firma = firma;
- this._prezdivka = prezdivka;
- this._email = email;
- this._telefon = telefon;
- this._web = web;
- this._skupina = skupina;
- this._poznamka = poznamka;
- }
- /// <summary>
- /// Vytvoří záznam o kontaktu, který lze uložit do souboru.
- /// </summary>
- /// <returns>Šifrované údaje o kontaktu ve formátu, který se uloží do souboru.</returns>
- internal string UlozKontakt()
- {
- return @_fotka + ";" + @_jmeno + ";" + @_firma + ";" + @_prezdivka + ";" + @_email + ";" + @_telefon + ";" + @_web + ";" + @_skupina + ";" + @_poznamka; // Zavináče ruší meta význam znaků, které se zde díky šifrování mohou objevit.
- }
- }
- /// <summary>
- /// Třída implementující skupiny kontaktů.
- /// </summary>
- public class Skupiny : IAdresarovaStruktura
- {
- /// <summary>
- /// Zde budeme uchovávat základní informace o skupinách.
- /// </summary>
- public List<Skupina> seznamSkupin;
- private Prihlaseni aktualniPrihlaseni;
- /// <summary>
- /// Konstruktor načte všechny skupiny ze souboru skupin. Tam máme uložená pouze základní informace, kontakty máme ke skupinám přiřazené pouze v adresáři.
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení zde máme proto, abychom věděli, čí seznam skupin máme na disku hledat.</param>
- /// </summary>
- public Skupiny(Prihlaseni aktualniPrihlaseni)
- {
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- seznamSkupin = new List<Skupina>();
- object soubor;
- if (!File.Exists(@aktualniPrihlaseni._email + ".groups_info"))
- {
- soubor = File.Create(aktualniPrihlaseni._email + ".groups_info");
- ((FileStream)soubor).Close();
- }
- soubor = new StreamReader(@aktualniPrihlaseni._email + ".groups_info");
- // Zkusíme načíst skupiny ze souboru.
- try
- {
- while (!((StreamReader)soubor).EndOfStream)
- {
- var jednaSkupina = ((StreamReader)soubor).ReadLine().Split(';');
- seznamSkupin.Add(new Skupina(jednaSkupina[0], jednaSkupina[1], jednaSkupina[2]));
- }
- }
- // Někde je chyba, vytvoříme nový seznam skupin.
- catch { seznamSkupin = new List<Skupina>(); }
- finally { ((StreamReader)soubor).Close(); }
- }
- /// <summary>
- /// Uloží skupiny z paměti do souboru.
- /// </summary>
- public void Ulozit()
- {
- StreamWriter soubor = new StreamWriter(@aktualniPrihlaseni._email + ".groups_info");
- foreach (Skupina skupina in seznamSkupin)
- soubor.WriteLine(skupina.UlozSkupinu());
- soubor.Close();
- }
- }
- /// <summary>
- /// Třída sdružující základní informace o jedné skupině.
- /// </summary>
- public class Skupina : IEquatable<Skupina>
- {
- private string _fotka;
- internal string _nazev;
- private string _poznamka;
- #region Definice vlastností jednotlivých parametrů.
- // Všechno šifrujeme, abychom mohli údaje bezpečně uložit do souboru a nehrozilo zneužití údajů.
- /// <summary>
- /// Obrázek dané skupiny.
- /// </summary>
- public Bitmap Fotografie
- {
- get { return _fotka == null ? null : Sifrovani.StringToBitmap(_fotka); }
- set { _fotka = Sifrovani.BitmapToString(value); }
- }
- /// <summary>
- /// Název dané skupiny.
- /// </summary>
- public string Nazev
- {
- get { return _nazev == null ? null : Sifrovani.Decrypt(_nazev); }
- set { _nazev = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Poznámka dané skupiny.
- /// </summary>
- public string Poznamka
- {
- get { return _poznamka == null ? null : Sifrovani.Decrypt(_poznamka); }
- set { _poznamka = Sifrovani.Encrypt(value); }
- }
- #endregion
- /// <summary>
- /// Obyčejný konstruktor inicializující nový objekt třídy Skupina.
- /// </summary>
- public Skupina() { }
- /// <summary>
- /// Tento konstruktor načítá zašifrované údaje přímo ze souboru.
- /// </summary>
- public Skupina(string fotografie, string nazev, string poznamka)
- {
- this._fotka = fotografie;
- this._nazev = nazev;
- this._poznamka = poznamka;
- }
- /// <summary>
- /// Vytvoří záznam o skupině, který lze uložit do souboru.
- /// </summary>
- /// <returns>Šifrované údaje o skupině ve formátu, která se uloží do souboru.</returns>
- internal string UlozSkupinu()
- {
- return @_fotka + ";" + @_nazev + ";" + @_poznamka; // Zavináče ruší meta význam znaků, které se zde díky šifrování mohou objevit.
- }
- /// <summary>
- /// Klaiscká implementace metody Equals.
- /// </summary>
- /// <param name="sCim">S čím se má porovnávat.</param>
- /// <returns>True, pokud se názvy skupin shodují.</returns>
- public bool Equals(Skupina sCim)
- {
- return sCim._nazev == _nazev;
- }
- }
- }
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Okno, kde si uživatel nastavuje aplikaci.
- /// </summary>
- public partial class AppSettingsForm : Form
- {
- private Prihlaseni aktualniPrihlaseni;
- /// <summary>
- /// Hlavní inicializace okna.
- /// </summary>
- public AppSettingsForm(Prihlaseni aktualniPrihlaseni)
- {
- this.Icon = BarevnyMotiv.ikona;
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- InitializeComponent();
- this.AktualizaceTextbox.Text = aktualniPrihlaseni.refresh.ToString();
- if (aktualniPrihlaseni.ImapPripojeni.Capabilities.Idle)
- {
- this.AktualizaceTextbox.Enabled = false;
- this.InfoAktualizaceLabel.Visible = true;
- }
- // Implementováno tímto způsobem, aby se daly snáz provádět změny v barevných motivech.
- this.ModraButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Modra);
- this.CervenaButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Cervena);
- this.ZelenaButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Zelena);
- this.SedaButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Seda);
- this.CernaButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Cerna);
- this.ZlutaButton.BackColor = (Color)BarevnyMotiv.NastavBarvyTlacitek(BarevnyMotiv.BarevnaPaleta.Zluta);
- }
- /// <summary>
- /// Zavře okno.
- /// </summary>
- private void ZavritButton_Click(object sender, EventArgs e)
- {
- if (AktualizaceTextbox.Enabled && int.Parse(AktualizaceTextbox.Text) > 840 && int.Parse(AktualizaceTextbox.Text) < 120)
- {
- MessageBox.Show("Interval automatické aktualizace musí být mezi 120 a 840 sekundami.");
- return;
- }
- aktualniPrihlaseni.refresh = int.Parse(AktualizaceTextbox.Text);
- this.Close();
- }
- /// <summary>
- /// Obsluha tlačítek, které mění barevný motiv.
- /// </summary>
- private void NastavBarvu_Click(object sender, EventArgs e)
- {
- // Nastavujeme podle tab indexu tlačítka, který reprezentuje danou barvu. Celkem neobvyklé, ale funkční a jednoduché.
- BarevnyMotiv.Barva = (BarevnyMotiv.BarevnaPaleta)Enum.ToObject(typeof(BarevnyMotiv.BarevnaPaleta), ((Button)sender).TabIndex);
- this.ZavritButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.Icon = BarevnyMotiv.ikona;
- this.Invalidate();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Toto okno se zobrazí, pokud chce uživatel přidat k e-mailu nějakou přílohu.
- /// </summary>
- public partial class AttachmentForm : Form
- {
- internal List<Priloha> seznamPriloh;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- public AttachmentForm()
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- seznamPriloh = new List<Priloha>();
- InicializujNovouPrilohu(null);
- }
- /// <summary>
- /// Skryje toto okno.
- /// </summary>
- private void PridatButton_Click(object sender, EventArgs e)
- {
- this.Hide();
- }
- /// <summary>
- /// Inicializuje nové ovládací prvky, díky nim může uživatel přidat novou přílohu. Zároveň upravuje GUI.
- /// </summary>
- /// <param name="cesta">Cesta k souboru, v případě, že se jedná o již načtenou přílohu.</param>
- public virtual void InicializujNovouPrilohu(object cesta)
- {
- try
- {
- // Není vhodné posílat příliš mnoho souborů emailem. Navíc, kdybychom přidávali přílohy do nekonečna, dostali bychom se s GUI mimo obrazovku.
- if (seznamPriloh.Count == 10)
- throw new PrilisMnohoPrilohException("Byl dosažen maximální počet příloh u jednoho emailu.");
- // Posune celé GUI.
- if (seznamPriloh.Count > 5)
- {
- this.ClientSize = new System.Drawing.Size(384, this.ClientSize.Height + 36);
- this.PridatButton.Location = new System.Drawing.Point(90, this.PridatButton.Location.Y + 36);
- }
- // Přidáme ovládací prvky dané přílohy do seznamu, abychom k nim mohli snadno přistupovat.
- this.seznamPriloh.Add((cesta == null) ? new Priloha(this, seznamPriloh.Count) : new Priloha(this, seznamPriloh.Count, cesta));
- }
- catch (Exception ex)
- {
- if (ex is PrilisMnohoPrilohException)
- MessageBox.Show(ex.Message);
- }
- }
- /// <summary>
- /// Odstraní existující přílohu a to tak, že danou přílohu odebere ze seznamu příloh a celý seznam posune, také upravuje GUI.
- /// </summary>
- /// <param name="kolikataPriloha">Index přílohy, která se má odstranit.</param>
- internal void OdstranExistujiciPrilohu(int kolikataPriloha)
- {
- // V každém případě danou přílohu odstraníme ze seznamu a všechny přílohy posuneme o jedno políčko směrem nahoru.
- seznamPriloh.GetRange(kolikataPriloha + 1, seznamPriloh.Count - kolikataPriloha - 1).ForEach(priloha =>
- {
- priloha.label.Location = new System.Drawing.Point(152, priloha.label.Location.Y - 36);
- priloha.tlacitko.Location = new System.Drawing.Point(16, priloha.tlacitko.Location.Y - 36);
- });
- // A pokud jsme kvůli přílohám zvětšovali okno, tak ho zase zmenšíme.
- if (seznamPriloh.Count > 5)
- {
- this.PridatButton.Location = new System.Drawing.Point(90, this.PridatButton.Location.Y - 36);
- this.ClientSize = new System.Drawing.Size(384, this.ClientSize.Height - 36);
- }
- // Uvolnění resourců, aby prvky smazané přílohy nezůstaly na pozadí a nezabíraly tak zbytečně paměť.
- seznamPriloh[kolikataPriloha].Dispose();
- seznamPriloh.RemoveAt(kolikataPriloha);
- // Pokud jsme odebrali poslední přílohu, musíme přidat tlačítko na přidání nové.
- if (seznamPriloh.Count == 9 && seznamPriloh.Last().label.Text != "...")
- InicializujNovouPrilohu(null);
- }
- /// <summary>
- /// Definice třídy příloh, každá příloha se skládá z trojice - tlačítko, label a OpenFileDialog objekt.
- /// </summary>
- internal class Priloha : IDisposable
- {
- public Button tlacitko;
- public Label label;
- public OpenFileDialog soubor;
- internal ImapX.Attachment priloha;
- protected AttachmentForm okno;
- /// <summary>
- /// Zde probíhá inicializace ovládacích prvků.
- /// </summary>
- /// <param name="okno">Vzhledem k tomu, že se jedná o interní třídu ve třídě, tak nemůžeme použít this na vnější třídu. Vlastnosti okna musíme třídě předat jako parametr.</param>
- /// <param name="kolikataPriloha">Určuje, o kolikátou přílohu se jedná a dle toho umisťuje ovládací prvky.</param>
- public Priloha(AttachmentForm okno, int kolikataPriloha)
- {
- this.okno = okno;
- this.tlacitko = new System.Windows.Forms.Button();
- this.label = new System.Windows.Forms.Label();
- this.soubor = new System.Windows.Forms.OpenFileDialog();
- #region Inicializace ovládacích prvků
- okno.SuspendLayout();
- // Inicializuje tlačítko
- this.tlacitko.BackColor = BarevnyMotiv.barvaTlacitek;
- this.tlacitko.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.tlacitko.Font = new System.Drawing.Font("Calibri", 11F, System.Drawing.FontStyle.Bold);
- this.tlacitko.ForeColor = System.Drawing.Color.White;
- this.tlacitko.Location = new System.Drawing.Point(16, 100 + kolikataPriloha * 36);
- this.tlacitko.Size = new System.Drawing.Size(130, 28);
- this.tlacitko.TabIndex = kolikataPriloha;
- this.tlacitko.Text = "Vybrat ze souboru";
- this.tlacitko.UseVisualStyleBackColor = false;
- this.tlacitko.Click += new EventHandler(this.OtevriSoubor);
- // Inicializuje label
- this.label.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.label.Font = new System.Drawing.Font("Calibri", 12F);
- this.label.Location = new System.Drawing.Point(152, 100 + kolikataPriloha * 36);
- this.label.Size = new System.Drawing.Size(220, 28);
- this.label.Text = "...";
- this.label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- okno.ResumeLayout();
- #endregion
- okno.Controls.Add(this.tlacitko);
- okno.Controls.Add(this.label);
- }
- /// <summary>
- /// Rozšířený konstruktor, pokud již příloha existuje a známe k ní cestu.
- /// </summary>
- /// <param name="okno">Vzhledem k tomu, že se jedná o interní třídu ve třídě, tak nemůžeme použít this na vnější třídu. Vlastnosti okna musíme třídě předat jako parametr.</param>
- /// <param name="kolikataPriloha">Určuje, o kolikátou přílohu se jedná a dle toho umisťuje ovládací prvky.</param>
- /// <param name="cesta">Cesta ve filesystému k dané příloze.</param>
- public Priloha(AttachmentForm okno, int kolikataPriloha, object cesta) : this(okno, kolikataPriloha)
- {
- string temp;
- this.tlacitko.Text = "Odstranit";
- this.priloha = ((ImapX.Attachment)cesta);
- this.tlacitko.Click -= new EventHandler(this.OtevriSoubor);
- this.tlacitko.Click += new EventHandler(this.OdstranPrilohu);
- if (cesta is ImapX.Attachment)
- {
- try { ((ImapX.Attachment)cesta).Download(); }
- catch { }
- temp = ((ImapX.Attachment)cesta).FileName;
- }
- else temp = cesta.ToString();
- this.label.Text = "..\u005c" + temp.ToString().Split('\u005c').ToList().Last(); // V labelu zobrazíme pouze název souboru.
- }
- /// <summary>
- /// Obsluha tlačítka, které přidává přílohu.
- /// </summary>
- protected virtual void OtevriSoubor(object sender, EventArgs e)
- {
- if (this.soubor.ShowDialog() == DialogResult.OK)
- {
- this.tlacitko.Text = "Odstranit";
- this.label.Text = "..\u005c" + this.soubor.FileName.ToString().Split('\u005c').ToList().Last(); // V labelu zobrazíme pouze název souboru.
- // Tlačítko přidat měníme na tlačítko odstranit, musíme upravit obsluhy daného tlačítka.
- this.tlacitko.Click -= new EventHandler(this.OtevriSoubor);
- this.tlacitko.Click += new EventHandler(this.OdstranPrilohu);
- // Přidáme možnost přidání nové přílohy.
- okno.InicializujNovouPrilohu(null);
- }
- }
- /// <summary>
- /// Obsluha tlačítka, které odebírá přílohu.
- /// </summary>
- private void OdstranPrilohu(object sender, EventArgs e)
- {
- if (MessageBox.Show("Opravdu chcete odstranit tuto přílohu?", "Odstranit", MessageBoxButtons.YesNo) == DialogResult.Yes)
- {
- this.tlacitko.Text = "Vybrat ze souboru";
- this.label.Text = "...";
- this.soubor = new System.Windows.Forms.OpenFileDialog();
- // Tlačítko odstranit měníme na tlačítko přidat, musíme upravit obsluhy daného tlačítka.
- this.tlacitko.Click -= new EventHandler(this.OdstranPrilohu);
- this.tlacitko.Click += new EventHandler(this.OtevriSoubor);
- okno.OdstranExistujiciPrilohu((this.label.Location.Y - 100) / 36); // O kolikátou přílohu se jedná, poznáme podle její pozice.
- }
- }
- /// <summary>
- /// Klasická implementace metody Dispose.
- /// Disposuje všechny tři elementy tohoto objektu.
- /// </summary>
- public void Dispose()
- {
- this.tlacitko.Dispose();
- this.label.Dispose();
- this.soubor.Dispose();
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Okno na vytváření konceptů.
- /// </summary>
- public class ConceptForm : SendForm
- {
- /// <summary>
- /// Konstruktor jen lehce pozmění GUI třídy SendForm.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- public ConceptForm(Prihlaseni aktualniPrihlaseni) : base (aktualniPrihlaseni)
- {
- this.Name = "ConceptForm";
- this.Text = "Mail Agent 2017 - Nový koncept";
- PrilohyButton.Location = KonceptButton.Location;
- PrilohaLabel.Location = new System.Drawing.Point(PrilohyButton.Location.X + PrilohyButton.Size.Width + 15, PrilohaLabel.Location.Y);
- SendButton.Visible = false;
- KonceptButton.Location = SendButton.Location;
- KonceptButton.Size = SendButton.Size;
- }
- }
- }
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Okno na přidávání, zobrazení a editaci kontaktů.
- /// </summary>
- public partial class ContactForm : Form
- {
- /// <summary>
- /// Kontakt, který se v tomto formuláři vytvoří/edituje.
- /// </summary>
- public Kontakt novyKontakt;
- /// <summary>
- /// Aktuální přihlášení.
- /// </summary>
- protected Prihlaseni aktualniPrihlaseni;
- /// <summary>
- /// Konstruktor, který se nesmí nikdy zavolat. Máme ho zde kvůli polymorfismu, jinak by to nefungovalo.
- /// </summary>
- protected ContactForm() { }
- /// <summary>
- /// Základní inicializace nového kontaktu.
- /// </summary>
- public ContactForm(Prihlaseni aktualniPrihlaseni)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- InitializeEditComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- novyKontakt = new Kontakt { Fotografie = (Bitmap)FotografiePicturebox.Image };
- SkupinaCombobox.Items.Add("");
- foreach (Skupina skupina in new Skupiny(aktualniPrihlaseni).seznamSkupin)
- SkupinaCombobox.Items.Add(skupina.Nazev);
- this.SkupinaCombobox.SelectedIndex = 0;
- this.Text = "Mail Agent 2017 - Vytvořit kontakt";
- this.HlavniButton.Text = "Vytvořit kontakt";
- }
- /// <summary>
- /// Základní inicializace existujícího kontaktu.
- /// </summary>
- /// <param name="kontakt">Kontakt, který se bude editovat.</param>
- /// <param name="pouzeZobrazit">Rozhoduje, zdali se má zobrazit formulář, pomocí kterého lze kontakt editovat, nebo pouze zobrazit kontakt.</param>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- public ContactForm(Kontakt kontakt, bool pouzeZobrazit, Prihlaseni aktualniPrihlaseni)
- {
- this.Icon = BarevnyMotiv.ikona;
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- InitializeComponent();
- if (pouzeZobrazit) // Pokud uživatel klikl na tlačítko "Pouze zobrazit", nedovolíme mu kontakt měnit.
- {
- InitializeShowComponent();
- FotografiePicturebox.Image = kontakt.Fotografie;
- JmenoInputLabel.Text = kontakt.Jmeno;
- FirmaInputLabel.Text = kontakt.Firma;
- PrezdivkaInputLabel.Text = kontakt.Prezdivka;
- EmailInputLabel.Text = kontakt.Email;
- WebInputLabel.Text = kontakt.Web;
- SkupinaInputLabel.Text = kontakt.Skupina;
- PoznamkaInputLabel.Text = kontakt.Poznamka;
- TelefonInputLabel.Text = kontakt.Telefon;
- foreach (Skupina skupina in new Skupiny(aktualniPrihlaseni).seznamSkupin) if (skupina.Nazev == kontakt.Skupina)
- SkupinaInputLabel.Text = kontakt.Skupina;
- }
- else // Jinak se jedná o možnost editace kontaktu. Toto je analogické jako tvorba nového kontaktu, akorát budou nějaké textboxy předvyplněné na základě údajů o kontaktu.
- {
- InitializeEditComponent();
- this.novyKontakt = kontakt;
- EmailTextbox.Text = novyKontakt.Email;
- FirmaTextbox.Text = novyKontakt.Firma;
- JmenoTextbox.Text = novyKontakt.Jmeno;
- PoznamkaTextbox.Text = novyKontakt.Poznamka;
- PrezdivkaTextbox.Text = novyKontakt.Prezdivka;
- WebTextbox.Text = novyKontakt.Web;
- TelefonTextbox.Text = novyKontakt.Telefon;
- FotografiePicturebox.Image = novyKontakt.Fotografie;
- SkupinaCombobox.Items.Add(novyKontakt.Skupina);
- if (novyKontakt.Skupina != "") SkupinaCombobox.Items.Add("");
- foreach (Skupina skupina in new Skupiny(aktualniPrihlaseni).seznamSkupin) if (SkupinaCombobox.Items[0].ToString() != skupina.Nazev)
- SkupinaCombobox.Items.Add(skupina.Nazev);
- this.SkupinaCombobox.SelectedIndex = 0;
- this.Text = "Mail Agent 2017 - Upravit kontakt";
- this.HlavniButton.Text = "Upravit kontakt";
- }
- }
- /// <summary>
- /// Tlačítko, které dá uživateli možnost zvolit fotografii kontaktu.
- /// </summary>
- protected virtual void FotografieButton_Click(object sender, EventArgs e)
- {
- OpenFileDialog soubor = new OpenFileDialog();
- if (soubor.ShowDialog() == DialogResult.OK)
- {
- Bitmap temp = new Bitmap(soubor.FileName);
- // Nyní naškálujeme fotku na velikost maximálně 128x128.
- try
- {
- int pomer = Math.Max(temp.Width / 128, temp.Height / 128);
- novyKontakt.Fotografie = new Bitmap(temp, new Size(temp.Width / pomer, temp.Height / pomer));
- }
- catch (DivideByZeroException) { novyKontakt.Fotografie = temp; } // Pokud jsou rozměry menší než 128x128, vložíme fotku v plné velikosti.
- finally { FotografiePicturebox.Image = novyKontakt.Fotografie; }
- this.Invalidate();
- }
- }
- /// <summary>
- /// Tlačítko, které kontroluje chyby a přidává/vrací kontakt do adresáře, respektive vrací ho otcovskému oknu.
- /// </summary>
- protected virtual void PridatNeboEditovat_Click(object sender, EventArgs e)
- {
- try
- {
- if (string.IsNullOrEmpty(JmenoTextbox.Text))
- throw new ChybneZadaniException("Jméno musí být vyplněno.");
- if (string.IsNullOrEmpty(EmailTextbox.Text))
- throw new ChybneZadaniException("E-mail musí být vyplněn.");
- if (!Utility.SpravnyFormatAdresy(EmailTextbox.Text))
- throw new ChybneZadaniException("E-mailová adresa má nesprávný formát.");
- }
- catch (ChybneZadaniException ex)
- {
- ChyboveOknoLabel.Show();
- ChyboveOknoLabel.Text = ex.Message;
- ZobrazeniChybyTimer.Enabled = true;
- return;
- }
- novyKontakt.Email = EmailTextbox.Text;
- novyKontakt.Firma = FirmaTextbox.Text;
- novyKontakt.Jmeno = JmenoTextbox.Text;
- novyKontakt.Poznamka = PoznamkaTextbox.Text;
- novyKontakt.Prezdivka = PrezdivkaTextbox.Text;
- novyKontakt.Web = WebTextbox.Text;
- novyKontakt.Telefon = TelefonTextbox.Text;
- novyKontakt.Skupina = SkupinaCombobox.SelectedItem == null ? "" : SkupinaCombobox.SelectedItem.ToString();
- this.DialogResult = DialogResult.OK;
- this.Close();
- }
- /// <summary>
- /// Zavře okno s kontaktem.
- /// </summary>
- protected void Zavrit_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- /// <summary>
- /// Otevře okno, které odešle danému kontaktu e-mail.
- /// </summary>
- private void SendButton_Click(object sender, EventArgs e)
- {
- new SendForm(aktualniPrihlaseni, ((Label)sender).Text).ShowDialog();
- }
- /// <summary>
- /// Po kliknutí na webový odkaz zobrazí webovou stránku tím stylem, že se otevře v defaultním webovém prohlížeči.
- /// </summary>
- private void ZobrazitWeb(object sender, EventArgs e)
- {
- if (MessageBox.Show("Aplikace se pokouší zobrazit webovou stránku. Chcete pokračovat?", "Zobrazit webovou stránku", MessageBoxButtons.YesNo) == DialogResult.Yes)
- System.Diagnostics.Process.Start(((Label)sender).Text);
- }
- /// <summary>
- /// Skryje chybovou hlášku po uplynutí deseti sekund.
- /// </summary>
- protected void ZobrazeniChybyTimer_Tick(object sender, EventArgs e)
- {
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.Hide();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Třída seskupující informace o jednotlivých e-mail service providerech.
- /// Umožňuje uživateli jednodušší přihlášení ke své e-mailové schránce.
- /// V případě, že uživatel využívá ESP, který není v seznamu, tak se po prvním úspěšném přihlášení do tohoto seznamu zapíše.
- /// </summary>
- class ESP
- {
- private List<ESP_Zaznam> seznam;
- /// <summary>
- /// Konstruktor načte údaje o všech ESP z tabulky, která je uložena v souboru.
- /// </summary>
- public ESP()
- {
- this.seznam = new List<ESP_Zaznam>();
- StreamReader esp_seznam = new StreamReader(".esp_info");
- while (!esp_seznam.EndOfStream)
- {
- string[] zaznam = esp_seznam.ReadLine().Split(';');
- seznam.Add(new ESP_Zaznam(zaznam[0], zaznam[1], int.Parse(zaznam[2]), bool.Parse(zaznam[3]),
- zaznam[4], int.Parse(zaznam[5]), bool.Parse(zaznam[6]), bool.Parse(zaznam[7])));
- }
- esp_seznam.Close();
- }
- /// <summary>
- /// Třída zahrnující informace o e-mail service providerovi.
- /// </summary>
- internal class ESP_Zaznam : IEquatable<ESP_Zaznam>
- {
- public string nazev;
- public string ImapServer;
- public int ImapPort;
- public bool ImapSsl;
- public string SmtpServer;
- public int SmtpPort;
- public bool SmtpSsl;
- public bool SmtpAuth;
- /// <summary>
- /// Klasický konstruktor, inicializuje celý objekt dle vstupních hodnot.
- /// </summary>
- public ESP_Zaznam(string nazev, string ImapServer, int ImapPort, bool ImapSsl, string SmtpServer, int SmtpPort, bool SmtpSsl, bool SmtpAuth)
- {
- this.nazev = nazev;
- this.ImapServer = ImapServer;
- this.ImapPort = ImapPort;
- this.ImapSsl = ImapSsl;
- this.SmtpServer = SmtpServer;
- this.SmtpPort = SmtpPort;
- this.SmtpSsl = SmtpSsl;
- this.SmtpAuth = SmtpAuth;
- }
- /// <summary>
- /// Klasická implementace metody Equals.
- /// </summary>
- public bool Equals(ESP_Zaznam zaznam)
- {
- return this.nazev == zaznam.nazev;
- }
- }
- /// <summary>
- /// Metoda, která hledá ESP uživatele v tabulce známých ESP.
- /// </summary>
- /// <param name="nazev">E-mail service provider uživatele</param>
- /// <returns>E-mail service provider uživatele</returns>
- public ESP_Zaznam NajdiVhodnehoESP(string nazev)
- {
- foreach (ESP_Zaznam esp in seznam) if (esp.nazev == nazev)
- return esp;
- return null;
- }
- /// <summary>
- /// Metoda, která přidává nový záznam o ESP do tabulky známých ESP.
- /// </summary>
- public void PridejZaznamOESP(string nazev, string ImapServer, int ImapPort, bool ImapSsl, string SmtpServer, int SmtpPort, bool SmtpSsl, bool SmtpAuth)
- {
- seznam.Add(new ESP_Zaznam(nazev, ImapServer, ImapPort, ImapSsl, SmtpServer, SmtpPort, SmtpSsl, SmtpAuth));
- TextWriter esp_seznam = new StreamWriter(".esp_info", true);
- esp_seznam.WriteLine("{0};{1};{2};{3};{4};{5};{6};{7}", nazev, ImapServer, ImapPort,
- ImapSsl, SmtpServer, SmtpPort, SmtpSsl, SmtpAuth);
- esp_seznam.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Okno pro editaci složek.
- /// </summary>
- public partial class FolderForm : Form
- {
- private Prihlaseni aktualniPrihlaseni;
- internal List<string> slozky;
- private List<JednaSlozka> ovladaciPrvky;
- internal ImapX.Folder kamPresunout;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="presunout">Tento parametr se nastavuje, pokud chceme přesunout e-mail do nějaké existující složky.</param>
- public FolderForm(Prihlaseni aktualniPrihlaseni, bool presunout)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- ovladaciPrvky = new List<JednaSlozka>();
- // Pokud chceme e-mail přesunout, odebereme tlačítko na vytvoření nové složky. A také přidáme do seznamu klasické složky.
- if (presunout)
- {
- this.VytvoritButton.Visible = false;
- this.ZavritButton.Visible = false;
- this.Size = new Size(this.Width + 68, this.Height - 35);
- ovladaciPrvky.Add(new JednaSlozka("Doručená pošta", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Označená pošta", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Důležitá pošta", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Odeslaná pošta", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Koncepty", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Nevyžádaná pošta", ovladaciPrvky.Count, this, true));
- ovladaciPrvky.Add(new JednaSlozka("Koš", ovladaciPrvky.Count, this, true));
- }
- slozky = NacistSlozky();
- foreach (var slozka in slozky)
- ovladaciPrvky.Add(new JednaSlozka(slozka, ovladaciPrvky.Count, this, presunout));
- }
- /// <summary>
- /// Vytvoří novou složku.
- /// </summary>
- private void VytvoritButton_Click(object sender, EventArgs e)
- {
- string nazev;
- try
- {
- if ((nazev = new Prompt().ShowDialog("Zadejte název nové složky.", "Mail Agent 2017 - Vytvořit novou složku", 20)) == null)
- throw new ChybneZadaniException();
- }
- catch
- { return; }
- aktualniPrihlaseni.ImapPripojeni.Folders.Add(nazev);
- ovladaciPrvky.Add(new JednaSlozka(nazev, slozky.Count, this, false));
- slozky.Add(nazev);
- }
- /// <summary>
- /// Odstraní danou složku.
- /// </summary>
- /// <param name="kolikata">Kolikátá skupina v pořadí se má smazat.</param>
- private void OdstranSlozku(int kolikata)
- {
- // Všechny složky musíme posunout směrem nahoru.
- ovladaciPrvky.GetRange(kolikata + 1, ovladaciPrvky.Count - kolikata - 1).ForEach(slozka =>
- {
- slozka.SlozkaLabel.Location = new System.Drawing.Point(slozka.SlozkaLabel.Location.X, slozka.SlozkaLabel.Location.Y - 38);
- slozka.DeleteButton.Location = new System.Drawing.Point(slozka.DeleteButton.Location.X, slozka.DeleteButton.Location.Y - 38);
- slozka.SlozkaPicturebox.Location = new System.Drawing.Point(slozka.SlozkaPicturebox.Location.X, slozka.SlozkaPicturebox.Location.Y - 38);
- });
- try { aktualniPrihlaseni.ImapPripojeni.Folders[ovladaciPrvky[kolikata].slozka].Remove(); }
- catch { }
- // Uvolnění resourců, aby prvky smazané složky nezůstaly na pozadí a nezabíraly tak zbytečně paměť.
- ovladaciPrvky[kolikata].Dispose();
- slozky.RemoveAt(kolikata);
- UlozitSlozky();
- }
- /// <summary>
- /// Načte údaje od složkách do paměti.
- /// </summary>
- /// <returns></returns>
- private List<string> NacistSlozky()
- {
- List<string> nacteneSlozky = new List<string>();
- object soubor;
- if (!File.Exists(@aktualniPrihlaseni._email + ".folders_info"))
- {
- soubor = File.Create(@aktualniPrihlaseni._email + ".folders_info");
- ((FileStream)soubor).Close();
- }
- soubor = new StreamReader(@aktualniPrihlaseni._email + ".folders_info");
- // Zkusíme načíst složky ze souboru.
- try
- {
- while (!((StreamReader)soubor).EndOfStream)
- nacteneSlozky.Add(Sifrovani.Decrypt(((StreamReader)soubor).ReadLine())); // U názvů složek to se šifrováním nebudeme přehánět. Budou zašifrované jen v souboru.
- }
- // Někde je chyba, vytvoříme nový adresář.
- catch { nacteneSlozky = new List<string>(); }
- finally { ((StreamReader)soubor).Close(); }
- return nacteneSlozky;
- }
- /// <summary>
- /// Uloží údaje o složkách do souboru.
- /// </summary>
- internal void UlozitSlozky()
- {
- StreamWriter soubor = new StreamWriter(@aktualniPrihlaseni._email + ".folders_info");
- foreach (var slozka in slozky) soubor.WriteLine(Sifrovani.Encrypt(slozka));
- soubor.Close();
- }
- /// <summary>
- /// Zavře okno se složkami.
- /// </summary>
- private void ZavritButton_Click(object sender, EventArgs e)
- {
- this.DialogResult = DialogResult.OK;
- this.Close();
- }
- /// <summary>
- /// Třída sloužící k inicializaci jedné složky v okně.
- /// </summary>
- internal class JednaSlozka : IDisposable
- {
- internal string slozka;
- private FolderForm okno;
- private int kolikataSlozka;
- internal System.Windows.Forms.Label SlozkaLabel;
- internal System.Windows.Forms.PictureBox DeleteButton;
- internal System.Windows.Forms.Button PresunoutButton;
- internal System.Windows.Forms.PictureBox SlozkaPicturebox;
- /// <summary>
- /// Inicializace celé složky..
- /// </summary>
- /// <param name="slozka">Složka, která se má inicializovat.</param>
- /// <param name="kolikataSlozka">Určuje, o kolikátou složku v seznamu se jedná. Kvůli pozici tlačítek a tak.</param>
- /// <param name="okno">Aktuální okno.</param>
- /// <param name="presunout">Určuje, v jakém smyslu se složka inicializuje.</param>
- internal JednaSlozka(string slozka, int kolikataSlozka, FolderForm okno, bool presunout)
- {
- this.slozka = slozka;
- this.okno = okno;
- this.kolikataSlozka = kolikataSlozka;
- #region Inicializace ovládacích prvků.
- this.SlozkaLabel = new System.Windows.Forms.Label();
- this.SlozkaPicturebox = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.SlozkaPicturebox)).BeginInit();
- this.SlozkaLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.SlozkaLabel.Font = new System.Drawing.Font("Calibri", 10F);
- this.SlozkaLabel.Location = new System.Drawing.Point(52, 38 * kolikataSlozka);
- this.SlozkaLabel.Name = "SlozkaLabel";
- this.SlozkaLabel.Size = new System.Drawing.Size(158, 32);
- this.SlozkaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- this.SlozkaPicturebox.Location = new System.Drawing.Point(3, 38 * kolikataSlozka);
- this.SlozkaPicturebox.Name = "SlozkaPicturebox";
- this.SlozkaPicturebox.Size = new System.Drawing.Size(32, 32);
- this.SlozkaPicturebox.TabIndex = 18;
- this.SlozkaPicturebox.TabStop = false;
- this.SlozkaPicturebox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
- SlozkaPicturebox.Image = global::Mail_Agent_2017.Properties.Resources.Slozka;
- ((System.ComponentModel.ISupportInitialize)(this.SlozkaPicturebox)).EndInit();
- if (presunout)
- {
- this.PresunoutButton = new System.Windows.Forms.Button();
- this.PresunoutButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.PresunoutButton.Location = new System.Drawing.Point(212, 38 * kolikataSlozka);
- this.PresunoutButton.Name = slozka;
- this.PresunoutButton.Text = "Přesunout";
- this.PresunoutButton.Padding = new System.Windows.Forms.Padding(0);
- this.PresunoutButton.Size = new System.Drawing.Size(100, 35);
- this.PresunoutButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.PresunoutButton.ForeColor = Color.White;
- this.PresunoutButton.Font = new System.Drawing.Font("Calibri", 10F, System.Drawing.FontStyle.Regular);
- this.PresunoutButton.TabStop = false;
- ToolTip PresunoutTooltip = new ToolTip();
- PresunoutTooltip.UseFading = true;
- PresunoutTooltip.UseAnimation = true;
- PresunoutTooltip.ReshowDelay = 500;
- PresunoutTooltip.InitialDelay = 500;
- PresunoutTooltip.AutoPopDelay = 15000;
- PresunoutTooltip.ShowAlways = true;
- PresunoutTooltip.ToolTipIcon = ToolTipIcon.Info;
- PresunoutTooltip.SetToolTip(PresunoutButton, "Přesune e-mail do této složky.");
- this.PresunoutButton.Click += new System.EventHandler(delegate (object sender, EventArgs e)
- {
- switch (((Button)sender).Name)
- {
- case "Doručená pošta": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Inbox; break;
- case "Označená pošta": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Flagged; break;
- case "Důležitá pošta": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Important; break;
- case "Odeslaná pošta": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Sent; break;
- case "Koncepty": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Drafts; break;
- case "Nevyžádaná pošta": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Junk; break;
- case "Koš": okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders.Trash; break;
- default: okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders[((Button)sender).Name]; break; // Name proto, protože název složky máme trikově skryt v názvu tlačítka.
- }
- if (okno.kamPresunout == null) // Toto u gmailu nastat nemůže.
- {
- if (okno.aktualniPrihlaseni.ImapPripojeni.Folders[((Button)sender).Name] == null)
- okno.aktualniPrihlaseni.ImapPripojeni.Folders.Add(((Button)sender).Name);
- okno.kamPresunout = okno.aktualniPrihlaseni.ImapPripojeni.Folders[((Button)sender).Name];
- }
- okno.DialogResult = DialogResult.OK;
- okno.Close();
- });
- okno.SlozkyPanel.Controls.Add(this.PresunoutButton);
- }
- else
- {
- this.DeleteButton = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).BeginInit();
- this.DeleteButton.Image = global::Mail_Agent_2017.Properties.Resources.OdstranitSoubor;
- this.DeleteButton.Location = new System.Drawing.Point(212, 38 * kolikataSlozka);
- this.DeleteButton.Name = "DeleteButton";
- this.DeleteButton.Padding = new System.Windows.Forms.Padding(4);
- this.DeleteButton.Size = new System.Drawing.Size(32, 32);
- this.DeleteButton.TabStop = false;
- this.DeleteButton.Cursor = Cursors.Hand;
- ToolTip DeleteToolTip = new ToolTip();
- DeleteToolTip.UseFading = true;
- DeleteToolTip.UseAnimation = true;
- DeleteToolTip.ReshowDelay = 500;
- DeleteToolTip.InitialDelay = 500;
- DeleteToolTip.AutoPopDelay = 15000;
- DeleteToolTip.ShowAlways = true;
- DeleteToolTip.ToolTipIcon = ToolTipIcon.Info;
- DeleteToolTip.SetToolTip(DeleteButton, "Smazat složku.");
- this.DeleteButton.Click += new System.EventHandler(delegate (object sender, EventArgs e)
- {
- if (MessageBox.Show("Opravdu chcete odstranit tuto složku? Veškeré e-maily v ní budou vymazány.", "Odstranit", MessageBoxButtons.YesNo) == DialogResult.Yes)
- okno.OdstranSlozku((this.DeleteButton.Location.Y) / 38); // O kolikátou složku se jedná, poznáme podle její pozice.
- });
- okno.SlozkyPanel.Controls.Add(this.DeleteButton);
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).EndInit();
- }
- okno.SlozkyPanel.Controls.Add(this.SlozkaPicturebox);
- okno.SlozkyPanel.Controls.Add(this.SlozkaLabel);
- #endregion
- SlozkaLabel.Text = slozka;
- okno.Invalidate();
- }
- /// <summary>
- /// Klasická implementace metody Dispose.
- /// </summary>
- public void Dispose()
- {
- SlozkaLabel.Dispose();
- SlozkaPicturebox.Dispose();
- DeleteButton.Dispose();
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Třída implementující okno seznamu skupin.
- /// Jedná se de facto o to stejné okno, jako je adresář, až na nějaké drobnosti.
- /// </summary>
- public class GroupBookForm : AddressBookForm
- {
- /// <summary>
- /// Adresář skupin.
- /// </summary>
- public Skupiny skupiny;
- new internal List<JednaSkupina> ovladaciPrvky;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení. Toto je zde kvůli nalezení správného adresáře.</param>
- /// <param name="pridatDoEmailu">Rozhoduje, jaký druh skupinového adresáře zobrazí. Jestli ten editovací, nebo ten, který přidává skupiny kontaktů do e-mailu.</param>
- /// </summary>
- public GroupBookForm(Prihlaseni aktualniPrihlaseni, bool pridatDoEmailu)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- #region Úprava designeru otcovské třídy.
- this.VytvoritButton.Text = "Vytvořit novou skupinu";
- this.Name = "GroupBookForm";
- this.Text = "Mail Agent 2017 - Adresář skupin";
- this.JmenoLabel.Text = "Název skupiny";
- this.EmailLabel.Text = "Členové skupiny";
- #endregion
- skupiny = new Skupiny(aktualniPrihlaseni);
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- ovladaciPrvky = new List<JednaSkupina>();
- // Vyřešíme takhle jednoduše, abychom nemuseli "složitě" upravovat designer.
- if (pridatDoEmailu)
- {
- this.VytvoritButton.Visible = false;
- this.ZavritButton.Text = "Připojit k e-mailu";
- }
- for (int i = 0; i < skupiny.seznamSkupin.Count; i++)
- ovladaciPrvky.Add(new JednaSkupina(skupiny.seznamSkupin[i], i, this, pridatDoEmailu));
- }
- /// <summary>
- /// Vytvoří novou skupinu.
- /// </summary>
- internal override void VytvoritButton_Click(object sender, EventArgs e)
- {
- using (var form = new GroupForm(aktualniPrihlaseni))
- if (form.ShowDialog() == DialogResult.OK)
- {
- skupiny.seznamSkupin.Add(form.novaSkupina);
- ovladaciPrvky.Add(new JednaSkupina(skupiny.seznamSkupin[skupiny.seznamSkupin.Count - 1], skupiny.seznamSkupin.Count - 1, this, false));
- skupiny.Ulozit();
- }
- }
- /// <summary>
- /// Odstraní danou skupinu z adresáře.
- /// </summary>
- /// <param name="kolikata">Kolikátá skupina v pořadí se má smazat.</param>
- private void OdstranExistujiciSkupinu(int kolikata)
- {
- // Všechny skupiny pod touto musíme posunout směrem nahoru.
- ovladaciPrvky.GetRange(kolikata + 1, ovladaciPrvky.Count - kolikata - 1).ForEach(skupina =>
- {
- skupina.NazevSkupinaLabel.Location = new System.Drawing.Point(52, skupina.NazevSkupinaLabel.Location.Y - 38);
- skupina.ClenoveSkupinaLabel.Location = new System.Drawing.Point(230, skupina.ClenoveSkupinaLabel.Location.Y - 38);
- skupina.DeleteButton.Location = new System.Drawing.Point(482, skupina.DeleteButton.Location.Y - 38);
- skupina.EditButton.Location = new System.Drawing.Point(449, skupina.EditButton.Location.Y - 38);
- skupina.InfoButton.Location = new System.Drawing.Point(416, skupina.InfoButton.Location.Y - 38);
- skupina.ObrazekSkupinaPicturebox.Location = new System.Drawing.Point(3, skupina.ObrazekSkupinaPicturebox.Location.Y - 38);
- });
- // Uvolnění resourců, aby prvky smazané skupiny nezůstaly na pozadí a nezabíraly tak zbytečně paměť.
- ovladaciPrvky[kolikata].Dispose();
- skupiny.seznamSkupin.RemoveAt(kolikata);
- }
- /// <summary>
- /// Třída sloužící k inicializaci jedné skupiny v adresářovém okně - tedy inicializuje labely a tlačítka pro daný skupina.
- /// </summary>
- internal class JednaSkupina : IDisposable
- {
- internal Skupina skupina;
- private GroupBookForm okno;
- private int kolikataSkupina;
- internal System.Windows.Forms.Label ClenoveSkupinaLabel;
- internal System.Windows.Forms.PictureBox InfoButton;
- internal System.Windows.Forms.PictureBox EditButton;
- internal System.Windows.Forms.PictureBox DeleteButton;
- internal System.Windows.Forms.PictureBox ObrazekSkupinaPicturebox;
- internal System.Windows.Forms.Label NazevSkupinaLabel;
- internal System.Windows.Forms.CheckBox PridatSkupinuCheckbox;
- /// <summary>
- /// Inicializace celé skupiny.
- /// </summary>
- /// <param name="skupina">Skupina, která se má inicializovat.</param>
- /// <param name="kolikataSkupina">Určuje, o kolikátou skupinu v seznamu se jedná. Kvůli pozici tlačítek a tak.</param>
- /// <param name="okno">Aktuální okno.</param>
- /// <param name="pridatDoEmailu">Rozhoduje, jaký druh skupinového adresáře zobrazí. Jestli ten editovací, nebo ten, který přidává kontakty do e-mailu.</param>
- internal JednaSkupina(Skupina skupina, int kolikataSkupina, GroupBookForm okno, bool pridatDoEmailu)
- {
- this.skupina = skupina;
- this.okno = okno;
- this.kolikataSkupina = kolikataSkupina;
- #region Inicializace ovládacích prvků.
- this.NazevSkupinaLabel = new System.Windows.Forms.Label();
- this.ClenoveSkupinaLabel = new System.Windows.Forms.Label();
- this.ObrazekSkupinaPicturebox = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.ObrazekSkupinaPicturebox)).BeginInit();
- //
- // NazevSkupinaLabel
- //
- this.NazevSkupinaLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.NazevSkupinaLabel.Font = new System.Drawing.Font("Calibri", 10F);
- this.NazevSkupinaLabel.Location = new System.Drawing.Point(52, 38 * kolikataSkupina);
- this.NazevSkupinaLabel.Name = "NazevSkupinaLabel";
- this.NazevSkupinaLabel.Size = new System.Drawing.Size(171, 32);
- this.NazevSkupinaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // ClenoveSkupinaLabel
- //
- this.ClenoveSkupinaLabel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.ClenoveSkupinaLabel.Font = new System.Drawing.Font("Calibri Light", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
- this.ClenoveSkupinaLabel.Location = new System.Drawing.Point(230, 38 * kolikataSkupina);
- this.ClenoveSkupinaLabel.Name = "ClenoveSkupinaLabel";
- this.ClenoveSkupinaLabel.Size = new System.Drawing.Size(171, 32);
- this.ClenoveSkupinaLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
- //
- // ObrazekSkupinaPicturebox
- //
- this.ObrazekSkupinaPicturebox.Location = new System.Drawing.Point(3, 38 * kolikataSkupina);
- this.ObrazekSkupinaPicturebox.Name = "ObrazekSkupinaPicturebox";
- this.ObrazekSkupinaPicturebox.Size = new System.Drawing.Size(32, 32);
- this.ObrazekSkupinaPicturebox.TabIndex = 18;
- this.ObrazekSkupinaPicturebox.TabStop = false;
- this.ObrazekSkupinaPicturebox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
- ((System.ComponentModel.ISupportInitialize)(this.ObrazekSkupinaPicturebox)).EndInit();
- okno.AdresarPanel.Controls.Add(this.ObrazekSkupinaPicturebox);
- okno.AdresarPanel.Controls.Add(this.NazevSkupinaLabel);
- okno.AdresarPanel.Controls.Add(this.ClenoveSkupinaLabel);
- this.PridatSkupinuCheckbox = new System.Windows.Forms.CheckBox();
- if (pridatDoEmailu)
- {
- //
- // PridatSkupinuCheckbox
- //
- this.PridatSkupinuCheckbox.AutoSize = true;
- this.PridatSkupinuCheckbox.Location = new System.Drawing.Point(449, 11 + 38 * kolikataSkupina);
- this.PridatSkupinuCheckbox.Name = "PridatSkupinuCheckbox";
- this.PridatSkupinuCheckbox.Size = new System.Drawing.Size(16, 16);
- this.PridatSkupinuCheckbox.TabIndex = kolikataSkupina;
- this.PridatSkupinuCheckbox.UseVisualStyleBackColor = true;
- ToolTip PridatDoEmailuToolTip = new ToolTip();
- PridatDoEmailuToolTip.UseFading = true;
- PridatDoEmailuToolTip.UseAnimation = true;
- PridatDoEmailuToolTip.ReshowDelay = 500;
- PridatDoEmailuToolTip.InitialDelay = 500;
- PridatDoEmailuToolTip.AutoPopDelay = 15000;
- PridatDoEmailuToolTip.ShowAlways = true;
- PridatDoEmailuToolTip.ToolTipIcon = ToolTipIcon.Info;
- PridatDoEmailuToolTip.SetToolTip(PridatSkupinuCheckbox, "Připojí skupinu kontaktů k e-mailu.");
- ToolTip InfoToolTip = new ToolTip();
- InfoToolTip.UseFading = true;
- InfoToolTip.UseAnimation = true;
- InfoToolTip.ReshowDelay = 500;
- InfoToolTip.InitialDelay = 500;
- InfoToolTip.AutoPopDelay = 15000;
- InfoToolTip.ShowAlways = true;
- InfoToolTip.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip.SetToolTip(ObrazekSkupinaPicturebox, "Zobrazit skupinu.");
- ToolTip InfoToolTip2 = new ToolTip();
- InfoToolTip2.UseFading = true;
- InfoToolTip2.UseAnimation = true;
- InfoToolTip2.ReshowDelay = 500;
- InfoToolTip2.InitialDelay = 500;
- InfoToolTip2.AutoPopDelay = 15000;
- InfoToolTip2.ShowAlways = true;
- InfoToolTip2.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip2.SetToolTip(NazevSkupinaLabel, "Zobrazit skupinu.");
- okno.AdresarPanel.Controls.Add(this.PridatSkupinuCheckbox);
- this.ObrazekSkupinaPicturebox.Click += new System.EventHandler(this.InfoButton_Click);
- this.NazevSkupinaLabel.Click += new System.EventHandler(this.InfoButton_Click);
- this.NazevSkupinaLabel.Cursor = Cursors.Hand;
- this.ObrazekSkupinaPicturebox.Cursor = Cursors.Hand;
- this.ClenoveSkupinaLabel.ForeColor = this.NazevSkupinaLabel.ForeColor;
- }
- else
- {
- this.DeleteButton = new System.Windows.Forms.PictureBox();
- this.EditButton = new System.Windows.Forms.PictureBox();
- this.InfoButton = new System.Windows.Forms.PictureBox();
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.EditButton)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.InfoButton)).BeginInit();
- //
- // DeleteButton
- //
- this.DeleteButton.Image = global::Mail_Agent_2017.Properties.Resources.OdstranitSoubor;
- this.DeleteButton.Location = new System.Drawing.Point(482, 38 * kolikataSkupina);
- this.DeleteButton.Name = "DeleteButton";
- this.DeleteButton.Padding = new System.Windows.Forms.Padding(4);
- this.DeleteButton.Size = new System.Drawing.Size(32, 32);
- this.DeleteButton.TabStop = false;
- this.DeleteButton.Cursor = Cursors.Hand;
- //
- // EditButton
- //
- this.EditButton.Image = global::Mail_Agent_2017.Properties.Resources.EditovatSoubor;
- this.EditButton.Location = new System.Drawing.Point(449, 38 * kolikataSkupina);
- this.EditButton.Name = "EditButton";
- this.EditButton.Padding = new System.Windows.Forms.Padding(4);
- this.EditButton.Size = new System.Drawing.Size(32, 32);
- this.EditButton.TabStop = false;
- this.EditButton.Cursor = Cursors.Hand;
- //
- // InfoButton
- //
- this.InfoButton.Image = global::Mail_Agent_2017.Properties.Resources.InformaceOSouboru;
- this.InfoButton.Location = new System.Drawing.Point(416, 38 * kolikataSkupina);
- this.InfoButton.Name = "InfoButton";
- this.InfoButton.Padding = new System.Windows.Forms.Padding(4);
- this.InfoButton.Size = new System.Drawing.Size(32, 32);
- this.InfoButton.TabStop = false;
- this.InfoButton.Cursor = Cursors.Hand;
- ToolTip InfoToolTip = new ToolTip();
- InfoToolTip.UseFading = true;
- InfoToolTip.UseAnimation = true;
- InfoToolTip.ReshowDelay = 500;
- InfoToolTip.InitialDelay = 500;
- InfoToolTip.AutoPopDelay = 15000;
- InfoToolTip.ShowAlways = true;
- InfoToolTip.ToolTipIcon = ToolTipIcon.Info;
- InfoToolTip.SetToolTip(InfoButton, "Zobrazit skupinu.");
- ToolTip EditToolTip = new ToolTip();
- EditToolTip.UseFading = true;
- EditToolTip.UseAnimation = true;
- EditToolTip.ReshowDelay = 500;
- EditToolTip.InitialDelay = 500;
- EditToolTip.AutoPopDelay = 15000;
- EditToolTip.ShowAlways = true;
- EditToolTip.ToolTipIcon = ToolTipIcon.Info;
- EditToolTip.SetToolTip(EditButton, "Editovat skupinu.");
- ToolTip DeleteToolTip = new ToolTip();
- DeleteToolTip.UseFading = true;
- DeleteToolTip.UseAnimation = true;
- DeleteToolTip.ReshowDelay = 500;
- DeleteToolTip.InitialDelay = 500;
- DeleteToolTip.AutoPopDelay = 15000;
- DeleteToolTip.ShowAlways = true;
- DeleteToolTip.ToolTipIcon = ToolTipIcon.Info;
- DeleteToolTip.SetToolTip(DeleteButton, "Smazat skupinu.");
- this.InfoButton.Click += new System.EventHandler(this.InfoButton_Click);
- this.EditButton.Click += new System.EventHandler(this.EditButton_Click);
- this.DeleteButton.Click += new System.EventHandler(this.DeleteButton_Click);
- okno.AdresarPanel.Controls.Add(this.EditButton);
- okno.AdresarPanel.Controls.Add(this.InfoButton);
- okno.AdresarPanel.Controls.Add(this.DeleteButton);
- ((System.ComponentModel.ISupportInitialize)(this.DeleteButton)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.EditButton)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.InfoButton)).EndInit();
- }
- #endregion
- NazevSkupinaLabel.Text = skupina.Nazev;
- // Zde vypíšeme prvních pár kontaktů do kolonky členů.
- List<Kontakt> clenoveSkupiny = Utility.VypisKontaktyVeSkupine(new Adresar(okno.aktualniPrihlaseni), skupina);
- if (clenoveSkupiny.Count >= 2) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno + ", " + clenoveSkupiny[1].Jmeno + " ...";
- else if (clenoveSkupiny.Count == 2) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno + ", " + clenoveSkupiny[1].Jmeno;
- else if (clenoveSkupiny.Count == 1) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno;
- else ClenoveSkupinaLabel.Text = "---";
- int pomer = Math.Max(skupina.Fotografie.Width / 24, skupina.Fotografie.Height / 24);
- ObrazekSkupinaPicturebox.Image = new Bitmap(skupina.Fotografie, new Size(skupina.Fotografie.Width / pomer, skupina.Fotografie.Height / pomer));
- okno.Invalidate();
- }
- /// <summary>
- /// Zobrazí informace o skupině.
- /// </summary>
- private void InfoButton_Click(object sender, EventArgs e)
- {
- new GroupForm(skupina, true, okno.aktualniPrihlaseni).ShowDialog();
- }
- /// <summary>
- /// Upraví skupinu.
- /// </summary>
- private void EditButton_Click(object sender, EventArgs e)
- {
- using (var form = new GroupForm(skupina, false, okno.aktualniPrihlaseni))
- if (form.ShowDialog() == DialogResult.OK)
- skupina = form.novaSkupina;
- okno.skupiny.Ulozit();
- NazevSkupinaLabel.Text = skupina.Nazev;
- List<Kontakt> clenoveSkupiny = Utility.VypisKontaktyVeSkupine(new Adresar(okno.aktualniPrihlaseni), skupina);
- if (clenoveSkupiny.Count >= 2) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno + ", " + clenoveSkupiny[1].Jmeno + " ...";
- else if (clenoveSkupiny.Count == 2) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno + ", " + clenoveSkupiny[1].Jmeno;
- else if (clenoveSkupiny.Count == 1) ClenoveSkupinaLabel.Text = clenoveSkupiny[0].Jmeno;
- else ClenoveSkupinaLabel.Text = "---";
- int pomer = Math.Max(skupina.Fotografie.Width / 24, skupina.Fotografie.Height / 24);
- ObrazekSkupinaPicturebox.Image = new Bitmap(skupina.Fotografie, new Size(skupina.Fotografie.Width / pomer, skupina.Fotografie.Height / pomer));
- okno.skupiny.seznamSkupin[kolikataSkupina] = skupina;
- okno.ovladaciPrvky[kolikataSkupina] = this;
- }
- /// <summary>
- /// Odstraní skupinu.
- /// </summary>
- private void DeleteButton_Click(object sender, EventArgs e)
- {
- if (MessageBox.Show("Opravdu chcete odstranit tuto skupinu?", "Odstranit", MessageBoxButtons.YesNo) == DialogResult.Yes)
- okno.OdstranExistujiciSkupinu((this.DeleteButton.Location.Y) / 38); // O kolikátou skupinu se jedná, poznáme podle její pozice.
- okno.skupiny.Ulozit();
- }
- /// <summary>
- /// Klasická implementace metody Dispose.
- /// </summary>
- public void Dispose()
- {
- ClenoveSkupinaLabel.Dispose();
- InfoButton.Dispose();
- EditButton.Dispose();
- DeleteButton.Dispose();
- ObrazekSkupinaPicturebox.Dispose();
- NazevSkupinaLabel.Dispose();
- PridatSkupinuCheckbox.Dispose();
- }
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Okno na přidávání a editaci skupin, podobné tomu pro kontakty.
- /// </summary>
- class GroupForm : ContactForm
- {
- /// <summary>
- /// Skupina, která se vytváří/edituje.
- /// </summary>
- public Skupina novaSkupina;
- private Label ClenoveLabel;
- private Label ClenoveInputLabel;
- private Button ClenoveButton;
- /// <summary>
- /// Metoda upravující designer otcovské třídy.
- /// </summary>
- private void OverrideComponent()
- {
- this.SuspendLayout();
- this.Size = new Size(this.Width, this.Height - 165);
- this.PrezdivkaTextbox.Visible = false;
- this.FirmaInputLabel.Visible = false; this.FirmaLabel.Visible = false; this.FirmaTextbox.Visible = false;
- this.WebInputLabel.Visible = false; this.WebLabel.Visible = false; this.WebTextbox.Visible = false;
- this.EmailInputLabel.Visible = false; this.EmailLabel.Visible = false; this.EmailTextbox.Visible = false;
- this.TelefonInputLabel.Visible = false; this.TelefonLabel.Visible = false; this.TelefonTextbox.Visible = false;
- this.SkupinaCombobox.Visible = false; this.SkupinaInputLabel.Visible = false; this.SkupinaLabel.Visible = false;
- this.FotografiePicturebox.Image = global::Mail_Agent_2017.Properties.Resources.DefaultSkupinaFotografie;
- this.JmenoLabel.Text = "Název:";
- this.ClenoveLabel = PrezdivkaLabel;
- this.ClenoveLabel.Name = "ClenoveLabel";
- this.ClenoveLabel.Text = "Členové:";
- this.ClenoveInputLabel = PrezdivkaInputLabel;
- this.ClenoveInputLabel.Name = "ClenoveInputLabel";
- this.PoznamkaInputLabel.Location = new Point(PoznamkaInputLabel.Location.X, PoznamkaInputLabel.Location.Y - 165);
- this.PoznamkaLabel.Location = new Point(PoznamkaLabel.Location.X, PoznamkaLabel.Location.Y - 165);
- this.PoznamkaTextbox.Location = new Point(PoznamkaTextbox.Location.X, PoznamkaTextbox.Location.Y - 165);
- this.ChyboveOknoLabel.Location = new Point(ChyboveOknoLabel.Location.X, ChyboveOknoLabel.Location.Y - 165);
- this.HlavniButton.Location = new Point(HlavniButton.Location.X, HlavniButton.Location.Y - 165);
- this.ClenoveButton = new Button();
- this.ClenoveButton.Location = PrezdivkaTextbox.Location;
- this.ClenoveButton.Size = PrezdivkaTextbox.Size;
- this.ClenoveButton.Name = "ClenoveButton";
- this.ClenoveButton.Text = "Upravit";
- this.ClenoveButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.ClenoveButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.ClenoveButton.Font = new System.Drawing.Font("Calibri", 10F);
- this.ClenoveButton.ForeColor = System.Drawing.Color.White;
- this.ClenoveButton.UseVisualStyleBackColor = false;
- this.ClenoveButton.Click += new EventHandler(delegate (object sender, EventArgs e) // Otevře okno, které umožní přidat kontakty do skupiny.
- {
- using (var form = new AddressBookForm(aktualniPrihlaseni, true) ) // Je to stejné okno jako to, pomocí kterého přidáváme kontakty do e-mailu. Jen lehce pozměníme GUI.
- {
- form.ZavritButton.Text = "Upravit členy skupiny";
- foreach (AddressBookForm.JedenKontakt kontakt in form.ovladaciPrvky)
- {
- kontakt.PridatDoEmailuToolTip.SetToolTip(kontakt.PridatKontaktCheckbox, "Přidá kontakt do skupiny.");
- if (kontakt.kontakt.Skupina == novaSkupina.Nazev) // Pokud již kontakt ve skupině je, zobrazí se zaškrtnutý checkbox. Kontakt můžeme ze skupiny odebrat odškrtnutím checkboxu.
- kontakt.PridatKontaktCheckbox.Checked = true;
- else if (!string.IsNullOrEmpty(kontakt.kontakt.Skupina)) // Pokud je v nějaké jiné skupině, nemůžeme ho přidat do této.
- kontakt.PridatKontaktCheckbox.Enabled = false;
- }
- if (form.ShowDialog() == DialogResult.OK)
- foreach (AddressBookForm.JedenKontakt kontakt in form.ovladaciPrvky)
- {
- if (kontakt.PridatKontaktCheckbox.Checked)
- kontakt.kontakt.Skupina = novaSkupina.Nazev;
- else kontakt.kontakt._skupina = "";
- }
- form.adresar.Ulozit();
- }
- });
- this.Controls.Add(ClenoveLabel);
- this.Controls.Add(ClenoveInputLabel);
- this.Controls.Add(ClenoveButton);
- this.ResumeLayout();
- this.Invalidate();
- }
- public GroupForm(Prihlaseni aktualniPrihlaseni)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- InitializeEditComponent();
- OverrideComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- novaSkupina = new Skupina { Fotografie = (Bitmap)FotografiePicturebox.Image };
- this.Text = "Mail Agent 2017 - Vytvořit skupinu";
- this.HlavniButton.Text = "Vytvořit novou skupinu";
- }
- /// <summary>
- /// Základní inicializace existující skupiny.
- /// </summary>
- /// <param name="skupina">Skupina, která se bude editovat.</param>
- /// <param name="pouzeZobrazit">Rozhoduje, zdali se má zobrazit formulář, pomocí kterého lze kontakt editovat, nebo pouze zobrazit skupinu.</param>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- public GroupForm(Skupina skupina, bool pouzeZobrazit, Prihlaseni aktualniPrihlaseni)
- {
- this.Icon = BarevnyMotiv.ikona;
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- InitializeComponent();
- if (pouzeZobrazit)
- {
- InitializeShowComponent();
- OverrideComponent();
- FotografiePicturebox.Image = skupina.Fotografie;
- JmenoInputLabel.Text = skupina.Nazev;
- PoznamkaInputLabel.Text = skupina.Poznamka;
- ClenoveButton.Visible = false;
- // Zde vypíšeme prvních pár kontaktů do kolonky členů.
- List<Kontakt> clenoveSkupiny = new List<Kontakt>();
- foreach (Kontakt kontakt in new Adresar(aktualniPrihlaseni).seznamKontaktu)
- if (kontakt.Skupina == skupina.Nazev)
- clenoveSkupiny.Add(kontakt);
- if (clenoveSkupiny.Count > 1) ClenoveInputLabel.Text = clenoveSkupiny[0].Jmeno + "...";
- else if (clenoveSkupiny.Count == 1) ClenoveInputLabel.Text = clenoveSkupiny[0].Jmeno;
- else ClenoveInputLabel.Text = "Tato skupina nemá žádné členy.";
- this.Text = "Mail Agent 2017 - Zobrazit skupinu";
- }
- else
- {
- InitializeEditComponent();
- OverrideComponent();
- this.novaSkupina = skupina;
- JmenoTextbox.Text = novaSkupina.Nazev;
- FotografiePicturebox.Image = novaSkupina.Fotografie;
- ClenoveInputLabel.Visible = false;
- this.Text = "Mail Agent 2017 - Upravit skupinu";
- this.HlavniButton.Text = "Upravit skupinu";
- }
- }
- /// <summary>
- /// Tlačítko, které kontroluje chyby a přidává/vrací skupinu do adresáře, respektive vrací ji otcovskému oknu.
- /// </summary>
- protected override void PridatNeboEditovat_Click(object sender, EventArgs e)
- {
- try
- {
- if (string.IsNullOrEmpty(JmenoTextbox.Text))
- throw new ChybneZadaniException("Název musí být vyplněn.");
- }
- catch (ChybneZadaniException ex)
- {
- ChyboveOknoLabel.Show();
- ChyboveOknoLabel.Text = ex.Message;
- ZobrazeniChybyTimer.Enabled = true;
- return;
- }
- novaSkupina.Nazev = JmenoTextbox.Text;
- novaSkupina.Poznamka = PoznamkaTextbox.Text;
- this.DialogResult = DialogResult.OK;
- this.Close();
- }
- /// <summary>
- /// Tlačítko, které dá uživateli možnost zvolit obrázek skupiny.
- /// </summary>
- protected override void FotografieButton_Click(object sender, EventArgs e)
- {
- OpenFileDialog soubor = new OpenFileDialog();
- if (soubor.ShowDialog() == DialogResult.OK)
- {
- Bitmap temp = new Bitmap(soubor.FileName);
- // Nyní naškálujeme fotku na velikost maximálně 128x128.
- try
- {
- int pomer = Math.Max(temp.Width / 128, temp.Height / 128);
- novaSkupina.Fotografie = new Bitmap(temp, new Size(temp.Width / pomer, temp.Height / pomer));
- }
- catch (DivideByZeroException) { novaSkupina.Fotografie = temp; } // Pokud jsou rozměry menší než 128x128, vložíme fotku v plné velikosti.
- finally { FotografiePicturebox.Image = novaSkupina.Fotografie; }
- this.Invalidate();
- }
- }
- }
- }
- using System;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Zobrazí náhled HTML kódu.
- /// </summary>
- public partial class HtmlPreviewForm : Form
- {
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- /// <param name="kod">HTML kód.</param>
- public HtmlPreviewForm(string kod)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- HtmlPreviewWebbrowser.DocumentText = "<!DOCTYPE html><html><body style=\"font-family: Calibri;\">" + kod + "</body></html>";
- }
- /// <summary>
- /// Zavře okno s náhledem.
- /// </summary>
- private void ZavritButton_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// První přihlašovací okno.
- /// </summary>
- public partial class LoginForm1 : Form
- {
- Prihlaseni aktualniPrihlaseni;
- Stack<Form> PrihlasovaciProces;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="PrihlasovaciProces">Zásobník oken reprezentující přihlašovací proces.</param>
- public LoginForm1(Prihlaseni aktualniPrihlaseni, Stack<Form> PrihlasovaciProces)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- this.PrihlasovaciProces = PrihlasovaciProces;
- AdresaTextbox.Text = aktualniPrihlaseni.Email; // Toto je zde pro případ, kdyby se uživatel vracel do tohoto okna.
- }
- /// <summary>
- /// Metoda, která se spustí po kliknutí na tlačítko "Dále" na první přihlašovací obrazovce.
- /// Kotroluje, zdali má zadaná e-mailová adresa správný formát a v případě úspěchu odkáže uživatele na další přihlašovací obrazovku.
- /// </summary>
- private void DaleButton_Click(object sender, EventArgs e)
- {
- try
- {
- if (!Utility.SpravnyFormatAdresy(AdresaTextbox.Text))
- throw new ChybneZadaniException("E-mailová adresa má chybný formát.");
- }
- catch (Exception ex)
- {
- ChyboveOknoLabel.Show();
- ChyboveOknoLabel.Text = ex.Message;
- ZobrazeniChybyTimer.Enabled = true;
- return;
- }
- aktualniPrihlaseni.Email = AdresaTextbox.Text;
- PrihlasovaciProces.Push(new LoginForm2(aktualniPrihlaseni, PrihlasovaciProces));
- this.Close();
- }
- /// <summary>
- /// Skryje chybovou hlášku po uplynutí deseti sekund.
- /// </summary>
- private void ZobrazeniChybyTimer_Tick(object sender, EventArgs e)
- {
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.Hide();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using ImapX;
- using System.Threading;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Druhé přihlašovací okno.
- /// </summary>
- public partial class LoginForm2 : Form
- {
- Prihlaseni aktualniPrihlaseni;
- Stack<Form> PrihlasovaciProces;
- ESP seznamESP;
- /// <summary>
- /// Konstruktor se stará zejména o vyplnění údajů o známých ESP, upravuje dle toho UI.
- /// </summary>
- public LoginForm2(Prihlaseni aktualniPrihlaseni, Stack<Form> PrihlasovaciProces)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- this.PrihlasovaciProces = PrihlasovaciProces;
- this.EmailAddressTextbox.Text = aktualniPrihlaseni.Email;
- this.HesloTextbox.Text = aktualniPrihlaseni.Heslo;
- this.JmenoTextbox.Text = aktualniPrihlaseni.Jmeno;
- this.seznamESP = new ESP(); // Načtení tabulky známých ESP.
- // Aplikace zkontroluje, zdali se uživatelův ESP nenachází v tabulce známých ESP.
- if (seznamESP.NajdiVhodnehoESP(aktualniPrihlaseni.Email.Split('@')[1]) != null)
- {
- OznameniLabel.Text = "Váš poskytovatel e-mailových služeb je nám známý. Některé údaje budou automaticky předvyplněny.";
- UpravyCheckbox.Checked = false;
- var aktualniESP = seznamESP.NajdiVhodnehoESP(aktualniPrihlaseni.Email.Split('@')[1]);
- ImapServerTextbox.Text = aktualniESP.ImapServer;
- ImapServerTextbox.Enabled = UpravyCheckbox.Checked;
- ImapPortTextbox.Text = aktualniESP.ImapPort.ToString();
- ImapPortTextbox.Enabled = UpravyCheckbox.Checked;
- SmtpServerTextbox.Text = aktualniESP.SmtpServer;
- SmtpServerTextbox.Enabled = UpravyCheckbox.Checked;
- SmtpPortTextbox.Text = aktualniESP.SmtpPort.ToString();
- SmtpPortTextbox.Enabled = UpravyCheckbox.Checked;
- ImapSslCheckbox.Checked = aktualniESP.ImapSsl;
- ImapSslCheckbox.Enabled = UpravyCheckbox.Checked;
- SmtpSslCheckbox.Checked = aktualniESP.SmtpSsl;
- SmtpSslCheckbox.Enabled = UpravyCheckbox.Checked;
- SmtpAuthCheckbox.Checked = aktualniESP.SmtpAuth;
- SmtpAuthCheckbox.Enabled = UpravyCheckbox.Checked;
- }
- else
- {
- OznameniLabel.Text = "V případě nesnází se obraťte na Vašeho poskytovatele e-mailových služeb.";
- UpravyCheckbox.Visible = false;
- ZmenaLabel.Visible = false;
- }
- }
- /// <summary>
- /// Implementace tlačítka zpět - po stisknutí tlačítka se vrátí na předchozí přihlašovací okno.
- /// </summary>
- private void ZpetButton_Click(object sender, EventArgs e)
- {
- PrihlasovaciProces.Push(new LoginForm1(aktualniPrihlaseni, PrihlasovaciProces));
- this.Close();
- }
- /// <summary>
- /// Metoda starající se o navazování spojení se SMTP a IMAP servery.
- /// Rovněž hledá a kontroluje chyby, obeznamuje o nich uživatele.
- /// </summary>
- private async void DaleButton_Click(object sender, EventArgs e)
- {
- ZobrazeniChybyTimer.Enabled = false;
- aktualniPrihlaseni.Heslo = HesloTextbox.Text;
- aktualniPrihlaseni.Jmeno = JmenoTextbox.Text;
- // Zatímco budeme čekat na navázání spojení, uživateli se bude zobrazovat efekt blikajících teček při přihlašování.
- ChyboveOknoLabel.Text = "";
- NacitaniTimer.Enabled = true;
- ChyboveOknoLabel.ForeColor = Color.Black;
- ChyboveOknoLabel.Show();
- // Navazování spojení rozběhneme na novém pracovním vlákně jako asynchronní metodu.
- await Task.Run(() =>
- {
- try
- {
- // Chyba: Nebyly vyplněny všechny údaje.
- if (string.IsNullOrWhiteSpace(HesloTextbox.Text) || string.IsNullOrWhiteSpace(JmenoTextbox.Text) || string.IsNullOrWhiteSpace(ImapServerTextbox.Text) ||
- string.IsNullOrWhiteSpace(ImapPortTextbox.Text) || string.IsNullOrWhiteSpace(SmtpServerTextbox.Text) || string.IsNullOrWhiteSpace(SmtpPortTextbox.Text))
- throw new ChybneZadaniException("Nebyly vyplněny všechny údaje.");
- // Chyba: Porty neobsahují číselné hodnoty.
- if (!int.TryParse(ImapPortTextbox.Text, out int imap) || !int.TryParse(SmtpPortTextbox.Text, out int smtp))
- throw new ChybneZadaniException("Porty byly vyplněny chybně.");
- // Inicializace SMTP a IMAP spojení.
- aktualniPrihlaseni.ImapPripojeni = new ImapClient(ImapServerTextbox.Text, int.Parse(ImapPortTextbox.Text), ImapSslCheckbox.Checked, ImapSslCheckbox.Checked);
- aktualniPrihlaseni.SmtpPripojeni = Utility.SmtpConnect(SmtpServerTextbox.Text, int.Parse(SmtpPortTextbox.Text), SmtpSslCheckbox.Checked,
- SmtpAuthCheckbox.Checked, aktualniPrihlaseni.Email, HesloTextbox.Text);
- // Chyba: Nepodařilo se navázat spojení s IMAP serverem.
- if (!aktualniPrihlaseni.ImapPripojeni.Connect())
- throw new ImapConnectFailException("Chyba při navazování spojení s IMAP serverem.");
- // Chyba: Špatná e-mailová adresa nebo heslo.
- else if (!aktualniPrihlaseni.ImapPripojeni.Login(aktualniPrihlaseni.Email, aktualniPrihlaseni.Heslo))
- throw new SpatneHesloException("Heslo a e-mailová adresa se neshodují.");
- // Chyba: Nepodařilo se navázat spojení se SMTP serverem. Pro otestování spojení se SMTP serverem pošle testovací zprávu.
- else if (aktualniPrihlaseni.SmtpPripojeni == null)
- throw new SmtpConnectFailException("Chyba při navazování spojení se SMTP serverem.");
- }
- catch (Exception ex)
- {
- // Zkontrolujeme, jestli se jedná o výjimku vyvolanou námi.
- if (ex is ChybneZadaniException || ex is SmtpConnectFailException || ex is ImapConnectFailException || ex is SpatneHesloException)
- // Zobrazení chybové hlášky. Texty labelů (a všeobecně celé GUI) se můžou měnit pouze z UI vlákna, proto je to řešeno pomocí MethodInvokeru.
- this.BeginInvoke(new MethodInvoker(delegate ()
- {
- // Zastavení blikajích teček
- NacitaniTimer.Enabled = false;
- ChyboveOknoLabel.Text = ex.Message; ChyboveOknoLabel.ForeColor = Color.Red;
- ZobrazeniChybyTimer.Enabled = true;
- }));
- // Pokud se jedná o jinou výjimku, tak prostě nebudeme uživateli nic tajit a řekneme mu tím, jak neumíme programovat.
- else MessageBox.Show(ex.Message);
- }
- finally
- {
- // Toto je zde pro efekt.
- // Poznámka autora: Když už jsem si dal tu práci s programováním blikajících teček, tak ať jsou alespoň vidět i v případě, že je spojení navázáno rychle.
- Thread.Sleep(2500);
- }
- });
- // Výsledek z pracovního vlákna poznáme snadno, a to tak, že pouze v případě chyby se rozběhne tento timer.
- if (ZobrazeniChybyTimer.Enabled)
- return;
- // Po úspěšném navázání spojení přidá záznam do tabulky známých ESP, pokud tam již není.
- if (seznamESP.NajdiVhodnehoESP(aktualniPrihlaseni.Email.Split('@')[1]) == null)
- seznamESP.PridejZaznamOESP(aktualniPrihlaseni.Email.Split('@')[1], ImapServerTextbox.Text, int.Parse(ImapPortTextbox.Text), ImapSslCheckbox.Checked,
- SmtpServerTextbox.Text, int.Parse(SmtpPortTextbox.Text), SmtpSslCheckbox.Checked, SmtpAuthCheckbox.Checked);
- PrihlasovaciProces.Push(new LoginForm3(aktualniPrihlaseni, PrihlasovaciProces));
- this.Close();
- }
- /// <summary>
- /// Skryje chybovou hlášku po uplynutí deseti sekund.
- /// </summary>
- private void ZobrazeniChybyTimer_Tick(object sender, EventArgs e)
- {
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.Hide();
- }
- /// <summary>
- /// Metoda, která obsluhuje tlačítko, které povoluje změny předvyplněných údajů.
- /// </summary>
- private void ZmenaCB_CheckedChanged(object sender, EventArgs e)
- {
- ImapServerTextbox.Enabled = UpravyCheckbox.Checked;
- ImapPortTextbox.Enabled = UpravyCheckbox.Checked;
- SmtpServerTextbox.Enabled = UpravyCheckbox.Checked;
- SmtpPortTextbox.Enabled = UpravyCheckbox.Checked;
- ImapSslCheckbox.Enabled = UpravyCheckbox.Checked;
- SmtpSslCheckbox.Enabled = UpravyCheckbox.Checked;
- SmtpAuthCheckbox.Enabled = UpravyCheckbox.Checked;
- }
- /// <summary>
- /// Metoda pro efekt, zobrazuje efekt blikajících teček při přihlašování.
- /// </summary>
- private void NacitaniTimer_Tick(object sender, EventArgs e)
- {
- if (ChyboveOknoLabel.Text.Length >= 75 || ChyboveOknoLabel.Text.Length == 0)
- ChyboveOknoLabel.Text = "Počkejte, prosím. Toto může chvíli trvat. Probíhá navazování komunikace ";
- else
- ChyboveOknoLabel.Text += ".";
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Třetí přihlašovací okno.
- /// </summary>
- public partial class LoginForm3 : Form
- {
- Prihlaseni aktualniPrihlaseni;
- Stack<Form> PrihlasovaciProces;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="PrihlasovaciProces">Zásobník oken reprezentující přihlašovací proces.</param>
- public LoginForm3(Prihlaseni aktualniPrihlaseni, Stack<Form> PrihlasovaciProces)
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- this.PrihlasovaciProces = PrihlasovaciProces;
- PopisLabel.Text = "Při této příležitosti Vám byla zaslána testovací zpráva.\n" +
- "Nyní můžete vstoupit do aplikace a využívat všechny její funkce.\n\n" +
- "Děkujeme Vám, " + aktualniPrihlaseni.Jmeno.Split(' ')[0] + ", že jste si vybral Mail Agent 2017.";
- }
- /// <summary>
- /// Implementace tlačítka zpět - po stisknutí tlačítka se vrátí na předchozí přihlašovací okno.
- /// </summary>
- private void ZpetButton_Click(object sender, EventArgs e)
- {
- PrihlasovaciProces.Push(new LoginForm2(aktualniPrihlaseni, PrihlasovaciProces));
- this.Close();
- }
- /// <summary>
- /// Přesměruje uživatele do aplikace.
- /// </summary>
- private void DaleButton_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Hlavní okno celé aplikace.
- /// </summary>
- public partial class MainForm : Form, IDisposable
- {
- [System.Runtime.InteropServices.DllImport("user32.dll")]
- private static extern bool ShowScrollBar(IntPtr panel, int velikost, bool zobrazit); // Tímto skryjeme horizontální scrollbar. Nevím sice proč, ale funguje to.
- /// <summary>
- /// Metoda se spustí při inicializaci okna. Pomocí API funkce pro scrollbar zakáže horizontální scrollbar pro panel složek.
- /// </summary>
- protected override void OnShown(EventArgs e)
- {
- ShowScrollBar(this.SlozkaPanel.Handle, 0, false);
- base.OnShown(e);
- }
- private Prihlaseni aktualniPrihlaseni;
- private object vybranaSlozka;
- private StazeneEmaily stazeneEmaily;
- // Toto zde máme z jednoduchého důvodu. Během stahování e-mailů nemůžeme nijak měnit GUI, neboť bychom tím mohli rozbít IMAP připojení, což by vedlo k vyvolání výjimky.
- // Každý event handler, který se zavolá, zkontroluje, jestli je tato hodnota nastavená na true. Pokud ano, obsluha dané události neproběhne.
- // Tento problém je zde proto, že navazování spojení probíhá na vedlejším vlákně. ImapX knihovna je stavěna tak, že v jednom okamžiku může být navázáno pouze jedno spojení.
- // Proměnnou nastavujeme v případě, kdy se nás tento problém týká.
- // Alternativní řešení, pro uživatele příjemnější, pro programátora mnohem obtížnější, je využití CancellationToken-u.
- internal bool pozastavSpousteniEventHandleru = false;
- /// <summary>
- /// Konstruktor se stará o hlavní inicializaci, popř. spouští přihlašovací proces...
- /// </summary>
- public MainForm()
- {
- this.Icon = BarevnyMotiv.ikona;
- this.aktualniPrihlaseni = new Prihlaseni();
- Utility.PrihlasovaciProces(ref aktualniPrihlaseni);
- InitializeComponent();
- VlastniSlozky(new FolderForm(aktualniPrihlaseni, false).slozky); // Vytvoříme tlačítka pro vlastní složky.
- this.Text = "Mail Agent 2017 - " + aktualniPrihlaseni.Email;
- // Po dokončení úprav přesunout do designeru.
- this.OdpovedetButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.SmazatButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.PreposlatButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.PresunoutButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.PrilohyButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.KonceptButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.EmailPanel.Scroll += new ScrollEventHandler(AktualizujPostu);
- this.EmailPanel.MouseWheel += new MouseEventHandler(MouseScroll);
- // Pokud server podporuje idle stav spojení, spustíme idle stav, který po každém přijatém e-mailu aktualizuje poštu.
- // Jinak bude aktualizovat v intervalu, který si nastavil uživatel.
- if (aktualniPrihlaseni.ImapPripojeni.Capabilities.Idle)
- {
- aktualniPrihlaseni.ImapPripojeni.Folders.Inbox.StartIdling();
- aktualniPrihlaseni.ImapPripojeni.OnNewMessagesArrived +=
- new EventHandler<ImapX.IdleEventArgs>(delegate (object sender, ImapX.IdleEventArgs e) {
- if (MessageBox.Show("Přišel Vám nový e-mail. Chcete ho zobrazit?", "Nový e-mail", MessageBoxButtons.YesNo) == DialogResult.Yes)
- this.BeginInvoke(new MethodInvoker(delegate () { EmailPanel.VerticalScroll.Value = 0;
- VyberSlozku(DorucenaPostaButton, null); }));
- // Pro jistotu rozběhneme na UI vlákně. Nevím, jak funguje idlování knihoviny ImapX, a ani to není nikde napsané.
- });
- }
- else
- {
- // Toto je napsané velmi ošklivě. Jedním z důvodů je ten, že většina serverů podporuje idle stav. Ale do budoucna určitě upravit!
- AktualizujTimer.Interval = aktualniPrihlaseni.refresh == 0 ? 840000 : aktualniPrihlaseni.refresh * 1000;
- AktualizujTimer.Enabled = true;
- AktualizujTimer.Tick += new EventHandler(delegate (object sender, EventArgs e) { EmailPanel.VerticalScroll.Value = 0; VyberSlozku(NajdiTlacitko(vybranaSlozka), null); });
- }
- VyberSlozku(DorucenaPostaButton, null);
- HledejTextbox_UpravaPopisku(HledejTextbox, null); // Počáteční inicializace popisku.
- }
- /// <summary>
- /// Nebudeme nepořádní a před zavřením aplikace odešleme na servery zprávu o ukončení spojení.
- /// </summary>
- new public void Dispose()
- {
- aktualniPrihlaseni.ImapPripojeni.Disconnect();
- aktualniPrihlaseni.SmtpPripojeni.Dispose();
- Dispose(true);
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- // Definice obsluh tlačítek hlavní nabídky. Z důvodu konzistence kódu v samostatném souboru.
- public partial class MainForm
- {
- /// <summary>
- /// Odhlásí se a spustí nový přihlašovací proces.
- /// </summary>
- private void odhlásitSeToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- this.Hide();
- aktualniPrihlaseni.OdhlasitSe();
- aktualniPrihlaseni = new Prihlaseni();
- Utility.PrihlasovaciProces(ref aktualniPrihlaseni);
- this.Show();
- }
- /// <summary>
- /// Ukončí aplikaci.
- /// </summary>
- private void ukončitToolStripMenuItem_Click(object sender, EventArgs e)
- {
- this.Dispose();
- Environment.Exit(0);
- }
- /// <summary>
- /// Otevře okno na odeslání emailu.
- /// </summary>
- private void novýEmailToolStripMenuItem_Click(object sender, EventArgs e)
- {
- new SendForm(aktualniPrihlaseni).ShowDialog();
- }
- /// <summary>
- /// Otevře okni adresáře.
- /// </summary>
- private void zobrazitAdresářToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (var form = new AddressBookForm(aktualniPrihlaseni, false))
- {
- form.ShowDialog();
- form.adresar.Ulozit();
- }
- }
- /// <summary>
- /// Otevře okno s nastavením aplikace.
- /// </summary>
- private void nastaveníAplikaceToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- new AppSettingsForm(aktualniPrihlaseni).ShowDialog();
- this.Icon = BarevnyMotiv.ikona;
- if (vybranaSlozka == null) VyberSlozku(DorucenaPostaButton, null);
- else if (vybranaSlozka is Button) VyberSlozku(vybranaSlozka, null);
- else if (vybranaSlozka is ZakladniSlozky)
- switch (vybranaSlozka)
- {
- case ZakladniSlozky.Dorucene: VyberSlozku(DorucenaPostaButton, null); break;
- case ZakladniSlozky.Odeslane: VyberSlozku(OdeslanaPostaButton, null); break;
- case ZakladniSlozky.Oznacene: VyberSlozku(OznaceneButton, null); break;
- case ZakladniSlozky.Dulezite: VyberSlozku(DuleziteButton, null); break;
- case ZakladniSlozky.Koncepty: VyberSlozku(KonceptyButton, null); break;
- case ZakladniSlozky.Spam: VyberSlozku(SpamButton, null); break;
- case ZakladniSlozky.Kos: VyberSlozku(KosButton, null); break;
- }
- PreposlatButton.BackColor = BarevnyMotiv.barvaTlacitek;
- OdpovedetButton.BackColor = BarevnyMotiv.barvaTlacitek;
- PrilohyButton.BackColor = BarevnyMotiv.barvaTlacitek;
- SmazatButton.BackColor = BarevnyMotiv.barvaTlacitek;
- PresunoutButton.BackColor = BarevnyMotiv.barvaTlacitek;
- }
- /// <summary>
- /// Otevře okno s možností vytvořit koncept.
- /// </summary>
- private void novýKonceptToolStripMenuItem_Click(object sender, EventArgs e)
- {
- new ConceptForm(aktualniPrihlaseni).ShowDialog();
- }
- /// <summary>
- /// Otevře okno adresáře skupin.
- /// </summary>
- private void zobrazitSkupinyToolStripMenuItem_Click(object sender, EventArgs e)
- {
- using (var form = new GroupBookForm(aktualniPrihlaseni, false))
- {
- form.ShowDialog();
- form.skupiny.Ulozit();
- }
- }
- /// <summary>
- /// Manuální aktualizace doručené pošty.
- /// </summary>
- private void aktualizovatPoštuToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- VyberSlozku(NajdiTlacitko(vybranaSlozka), null);
- }
- /// <summary>
- /// Otevře okno se složkami.
- /// </summary>
- private void složkaToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- using (var form = new FolderForm(aktualniPrihlaseni, false))
- {
- form.ShowDialog();
- form.UlozitSlozky();
- VlastniSlozky(form.slozky); // Aktualizujeme GUI.
- }
- }
- /// <summary>
- /// Otevře okno s nápovědou.
- /// </summary>
- private void nápovědaToolStripMenuItem_Click(object sender, EventArgs e)
- {
- new ManualForm().Show();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- // Zde jsou hlavní metody pro náhled jednoho e-mailu. Z důvodu konzistence kódu v samostatném souboru.
- public partial class MainForm
- {
- /// <summary>
- /// Aktuální zpráva, která se zobrazuje ve velkém okně pro náhled e-mailu. Máme to tu, abychom měli možnost na tuto zprávu odpovědět, stáhnout přílohy apod.
- /// </summary>
- private ImapX.Message aktualniZprava;
- /// <summary>
- /// Metoda se spustí po kliknutí na e-mail, v důsledku toho se stáhne celý e-mail včetně příloh a zobrazí se ve velkém okně.
- /// </summary>
- /// <param name="sender">Jaký e-mail se má zobrazit.</param>
- public async void ZobrazEmail(object sender)
- {
- if (pozastavSpousteniEventHandleru) return;
- if (!(sender is StazeneEmaily.JedenEmail)) return;
- pozastavSpousteniEventHandleru = true;
- aktualniZprava = ((StazeneEmaily.JedenEmail)sender).email;
- ZobrazitGUI(false);
- this.LoadingEmailPicturebox.Visible = true;
- this.SuspendLayout();
- // Odebereme highlight nepřečteného e-mailu.
- ((StazeneEmaily.JedenEmail)sender).cas.Font = new System.Drawing.Font(((StazeneEmaily.JedenEmail)sender).cas.Font, System.Drawing.FontStyle.Regular);
- ((StazeneEmaily.JedenEmail)sender).odesilatel.Font = new System.Drawing.Font(((StazeneEmaily.JedenEmail)sender).odesilatel.Font, System.Drawing.FontStyle.Regular);
- ((StazeneEmaily.JedenEmail)sender).predmet.Font = new System.Drawing.Font(((StazeneEmaily.JedenEmail)sender).predmet.Font, System.Drawing.FontStyle.Regular);
- // Tato operace trvá paradoxně nejdéle. Pět set milisekund až řádově sekundy, záleží na kvalitě připojení.
- if(!aktualniZprava.Seen)
- await Task.Run(() => aktualniZprava.Seen = true);
- this.PredmetInputLabel.Text = (aktualniZprava.Subject == null || string.IsNullOrEmpty(aktualniZprava.Subject)) ? "Bez předmětu" : aktualniZprava.Subject;
- if (aktualniZprava.From != null)
- this.OdesilatelInputLabel.Text = !string.IsNullOrEmpty(aktualniZprava.From.DisplayName) ? aktualniZprava.From.DisplayName + " (" + aktualniZprava.From.Address + ")" : aktualniZprava.From.Address;
- this.CasInputLabel.Text = ((StazeneEmaily.JedenEmail)sender).cas.Text;
- if (((StazeneEmaily.JedenEmail)sender).cas.Text.Substring(0, 4) == "dne ")
- this.CasInputLabel.Text += " v " + aktualniZprava.Date.Value.Hour + ":" + (aktualniZprava.Date.Value.Minute.ToString().Length == 1 ? "0" : "") + aktualniZprava.Date.Value.Minute + ":" + (aktualniZprava.Date.Value.Second.ToString().Length == 1 ? "0" : "") + aktualniZprava.Date.Value.Second;
- foreach (var kopie in aktualniZprava.Cc)
- {
- if (!string.IsNullOrEmpty(this.KopieInputLabel.Text))
- this.KopieInputLabel.Text += ", ";
- this.KopieInputLabel.Text += kopie.DisplayName != null || string.IsNullOrEmpty(kopie.DisplayName) ? kopie.DisplayName + " (" + kopie.Address + ")" : kopie.Address;
- }
- if (aktualniZprava.Cc.Count == 0) this.KopieInputLabel.Text = "---";
- // Toto také může nějaký čas zabrat.
- await Task.Run(() =>
- {
- if (aktualniZprava.Body.HasHtml)
- TextWebbrowser.DocumentText = "<!DOCTYPE html><html><body style=\"font-family: Calibri; background-color: rgb(240,240,240); width: " + ObsahPanel.Size.Width + " px;\">" + aktualniZprava.Body.Html + "</body></html>";
- else
- {
- var teloEmailu = aktualniZprava.Body.Text; // V této chvíli se tělo e-mailu teprve začne stahovat. Nebudeme tím zatěžovat UI vlákno.
- this.BeginInvoke(new MethodInvoker(delegate () { TextInputLabel.Text = teloEmailu; }));
- }
- });
- this.LoadingEmailPicturebox.Visible = false;
- ZobrazitGUI(true);
- this.PerformLayout();
- if (aktualniZprava.Body.HasHtml) TextInputLabel.Visible = false; else TextWebbrowser.Visible = false;
- pozastavSpousteniEventHandleru = false;
- }
- /// <summary>
- /// Zobrazuje GUI tohoto panelu.
- /// </summary>
- /// <param name="zobrazit">V případě hodnoty true zobrazí, v opačním přípdě skryje.</param>
- private void ZobrazitGUI(bool zobrazit)
- {
- if (!zobrazit) this.PrilohyButton.Visible = zobrazit;
- else if (aktualniZprava.Attachments.Count() > 0)
- {
- this.PrilohyButton.Text = "Přílohy (" + aktualniZprava.Attachments.Count() + ")";
- this.PrilohyButton.Visible = zobrazit;
- }
- if (vybranaSlozka is ZakladniSlozky && (ZakladniSlozky)vybranaSlozka == ZakladniSlozky.Koncepty)
- {
- if (PreposlatButton.Visible || OdpovedetButton.Visible)
- {
- this.PreposlatButton.Visible = false;
- this.OdpovedetButton.Visible = false;
- }
- this.KonceptButton.Visible = zobrazit;
- }
- else
- {
- if (KonceptButton.Visible)
- this.KonceptButton.Visible = false;
- this.PreposlatButton.Visible = zobrazit;
- this.OdpovedetButton.Visible = zobrazit;
- }
- this.KopieInputLabel.Visible = zobrazit;
- this.KopieLabel.Visible = zobrazit;
- this.OdesilatelInputLabel.Visible = zobrazit;
- this.OdesilatelLabel.Visible = zobrazit;
- this.PredmetInputLabel.Visible = zobrazit;
- this.PredmetLabel.Visible = zobrazit;
- this.PresunoutButton.Visible = zobrazit;
- this.SmazatButton.Visible = zobrazit;
- this.Separator.Visible = zobrazit;
- this.TextWebbrowser.Visible = zobrazit;
- this.TextInputLabel.Visible = zobrazit;
- this.CasInputLabel.Visible = zobrazit;
- this.CasLabel.Visible = zobrazit;
- }
- /// <summary>
- /// Zobrazí okno s možností odpovědi.
- /// </summary>
- private void OdpovedetButton_Click(object sender, EventArgs e)
- {
- new SendForm(aktualniPrihlaseni, aktualniZprava, true).ShowDialog();
- }
- /// <summary>
- /// Zobrazí okno s možností přeposlání.
- /// </summary>
- private void PreposlatButton_Click(object sender, EventArgs e)
- {
- new SendForm(aktualniPrihlaseni, aktualniZprava, false).ShowDialog();
- }
- /// <summary>
- /// Odstraní e-mail.
- /// </summary>
- private async void SmazatButton_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- pozastavSpousteniEventHandleru = true;
- if (vybranaSlozka is ZakladniSlozky && (ZakladniSlozky)vybranaSlozka == ZakladniSlozky.Kos && MessageBox.Show("Opravdu chcete trvale odstranit tuto zprávu?", "Odstranit zprávu", MessageBoxButtons.YesNo) == DialogResult.Yes)
- await Task.Run(() => aktualniZprava.Remove());
- else
- {
- await Task.Run(() => aktualniZprava.MoveTo(aktualniPrihlaseni.ImapPripojeni.Folders.Trash));
- MessageBox.Show("Zpráva byla přesunuta do koše. Odtud ji můžete odstranit trvale.");
- }
- pozastavSpousteniEventHandleru = false;
- VyberSlozku(NajdiTlacitko(vybranaSlozka), null);
- }
- /// <summary>
- /// Zobrazí nabídku složek a přesune e-mail do vybrané složky.
- /// </summary>
- private void PresunoutButton_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- pozastavSpousteniEventHandleru = true;
- using (var form = new FolderForm(aktualniPrihlaseni, true))
- if (form.ShowDialog() == DialogResult.OK)
- aktualniZprava.MoveTo(form.kamPresunout);
- pozastavSpousteniEventHandleru = false;
- VyberSlozku(NajdiTlacitko(vybranaSlozka), null);
- }
- /// <summary>
- /// Zobrazí okno s editací konceptu. Pokud dojde ke změně nebo odeslání konceptů, koncept se smaže.
- /// </summary>
- private async void KonceptButton_Click(object sender, EventArgs e)
- {
- if (new SendForm(aktualniPrihlaseni, aktualniZprava).ShowDialog() == DialogResult.OK)
- await Task.Run(() => aktualniZprava.Remove());
- }
- /// <summary>
- /// Zobrazí okno s přílohami, kde si je uživatel může stáhnout.
- /// </summary>
- private void PrilohyButton_Click(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- new ShowAttachmentForm(aktualniZprava).ShowDialog();
- }
- /// <summary>
- /// Třída zajišťující funkčnost tlačítka zobrazení příloh.
- /// </summary>
- private class ShowAttachmentForm : AttachmentForm
- {
- /// <summary>
- /// Základní inicializace tohoto okna.
- /// </summary>
- /// <param name="aktualniZprava">Aktuální zpráva, jejíž přílohy chceme zobrazit.</param>
- public ShowAttachmentForm(ImapX.Message aktualniZprava)
- {
- this.Icon = BarevnyMotiv.ikona;
- base.InitializeComponent();
- this.PridatButton.Click += new EventHandler(delegate (object sender, EventArgs e) { this.Close(); });
- this.PridatButton.Text = "Zavřít";
- this.Text = "Mail Agent 2017 - Zobrazit přílohy";
- this.PopisLabel.Text = "Mějte na paměti, že soubory mohou obsahovat viry.";
- // Na základě počtu příloh upravíme velikost okna.
- if (aktualniZprava.Attachments.Count() > 5)
- {
- this.ClientSize = new System.Drawing.Size(384, this.ClientSize.Height + 36 * (aktualniZprava.Attachments.Count() - 5));
- this.PridatButton.Location = new System.Drawing.Point(90, this.PridatButton.Location.Y + 36 * (aktualniZprava.Attachments.Count() - 5));
- }
- // Zobrazí přílohy.
- for (int i = 0; i < aktualniZprava.Attachments.Count(); i++)
- new ZobrazPrilohu(this, i, aktualniZprava.Attachments[i]);
- }
- /// <summary>
- /// Přepíšeme metodu, která se nachází v konstruktoru výchozí třídy a která by naši zděděnou třídu rozbila.
- /// </summary>
- public override void InicializujNovouPrilohu(object cesta) { }
- /// <summary>
- /// Třída poskytující základní funkce jedné příloze.
- /// </summary>
- internal class ZobrazPrilohu : Priloha
- {
- private ImapX.Attachment priloha;
- /// <summary>
- /// Konstruktor inicializuje GUI jedné přílohy.
- /// </summary>
- /// <param name="okno">K jakému oknu GUI patří.</param>
- /// <param name="kolikataPriloha">O kolikátou přílohu se jedná.</param>
- /// <param name="priloha">Příloha.</param>
- public ZobrazPrilohu(AttachmentForm okno, int kolikataPriloha, ImapX.Attachment priloha) : base (okno, kolikataPriloha)
- {
- this.tlacitko.Text = "Stáhnout";
- this.label.Text = priloha.FileName;
- this.priloha = priloha;
- }
- /// <summary>
- /// Metoda stáhne přílohu do vybraného umístění.
- /// </summary>
- protected async override void OtevriSoubor(object sender, EventArgs e)
- {
- using (var ulozit = new FolderBrowserDialog())
- if (ulozit.ShowDialog() == DialogResult.OK)
- {
- if (!priloha.Downloaded) await Task.Run(() => priloha.Download());
- try { priloha.Save(@ulozit.SelectedPath, priloha.FileName); }
- catch { }
- MessageBox.Show("Soubor byl úspěšně uložen.");
- }
- }
- }
- }
- }
- }
- using ImapX;
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- // Zde jsou hlavní metody pro náhledy stažených e-mailů a složky. Z důvodu konzistence kódu v samostatném souboru.
- public partial class MainForm
- {
- private List<SlozkaButton> vlastniSlozky;
- /// <summary>
- /// Tato metoda způsobí to, že po kliknutí na tlačítko dané složky tuto složku vybere. Mění GUI.
- /// </summary>
- private async void VyberSlozku(object sender, EventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- // Nejdřív odebereme highlight složky, která byla vybrána předtím.
- if (vybranaSlozka != null && vybranaSlozka is Button)
- {
- ((Control)vybranaSlozka).Font = new Font(DorucenaPostaButton.Font, FontStyle.Regular);
- ((Control)vybranaSlozka).BackColor = System.Drawing.SystemColors.Control;
- ((Control)vybranaSlozka).ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
- }
- else if (vybranaSlozka != null && vybranaSlozka is ZakladniSlozky)
- switch (vybranaSlozka)
- {
- case ZakladniSlozky.Dorucene: DorucenaPostaButton.Font = new Font(DorucenaPostaButton.Font, FontStyle.Regular); DorucenaPostaButton.BackColor = System.Drawing.SystemColors.Control; DorucenaPostaButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Odeslane: OdeslanaPostaButton.Font = new Font(OdeslanaPostaButton.Font, FontStyle.Regular); OdeslanaPostaButton.BackColor = System.Drawing.SystemColors.Control; OdeslanaPostaButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Oznacene: OznaceneButton.Font = new Font(OznaceneButton.Font, FontStyle.Regular); OznaceneButton.BackColor = System.Drawing.SystemColors.Control; OznaceneButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Dulezite: DuleziteButton.Font = new Font(DuleziteButton.Font, FontStyle.Regular); DuleziteButton.BackColor = System.Drawing.SystemColors.Control; DuleziteButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Koncepty: KonceptyButton.Font = new Font(KonceptyButton.Font, FontStyle.Regular); KonceptyButton.BackColor = System.Drawing.SystemColors.Control; KonceptyButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Spam: SpamButton.Font = new Font(SpamButton.Font, FontStyle.Regular); SpamButton.BackColor = System.Drawing.SystemColors.Control; SpamButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- case ZakladniSlozky.Kos: KosButton.Font = new Font(KosButton.Font, FontStyle.Regular); KosButton.BackColor = System.Drawing.SystemColors.Control; KosButton.ForeColor = System.Drawing.SystemColors.ActiveCaptionText; break;
- }
- switch (((Control)sender).Name)
- {
- case "DorucenaPostaButton": vybranaSlozka = ZakladniSlozky.Dorucene; break;
- case "OdeslanaPostaButton": vybranaSlozka = ZakladniSlozky.Odeslane; break;
- case "OznaceneButton": vybranaSlozka = ZakladniSlozky.Oznacene; break;
- case "DuleziteButton": vybranaSlozka = ZakladniSlozky.Dulezite; break;
- case "KonceptyButton": vybranaSlozka = ZakladniSlozky.Koncepty; break;
- case "SpamButton": vybranaSlozka = ZakladniSlozky.Spam; break;
- case "KosButton": vybranaSlozka = ZakladniSlozky.Kos; break;
- default: vybranaSlozka = (Control)sender; break; // Pokud se nejedná o základní složku, do proměnné vybrané složky vložíme tlačítko dané složky.
- }
- ((Control)sender).BackColor = BarevnyMotiv.barvaTlacitek;
- ((Control)sender).ForeColor = Color.WhiteSmoke;
- ((Control)sender).Font = new Font(DorucenaPostaButton.Font, FontStyle.Bold);
- await Aktualizuj();
- if (stazeneEmaily.stazeneEmaily.Count != 0)
- ZobrazEmail(stazeneEmaily.stazeneEmaily[0]);
- }
- /// <summary>
- /// Až dojedeme na konec panelu, stáhneme nové e-maily.
- /// </summary>
- private async void AktualizujPostu(object sender, ScrollEventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- if (sender == null || e.NewValue == EmailPanel.VerticalScroll.Maximum - EmailPanel.VerticalScroll.LargeChange + 1)
- if (sender == null || e.NewValue != e.OldValue)
- {
- pozastavSpousteniEventHandleru = true;
- LoadingPicturebox.Visible = true;
- await stazeneEmaily.StahniEmaily(stazeneEmaily.stazeneEmaily.Count + 10);
- pozastavSpousteniEventHandleru = false;
- foreach (var email in stazeneEmaily.stazeneEmaily) email.NastavEventHandlery(ZobrazEmail);
- }
- }
- /// <summary>
- /// Bohužel, event Scroll nereaguje na scrollování kolečkem myši. Na to máme tuhle metodu.
- /// </summary>
- private void MouseScroll(object sender, MouseEventArgs e)
- {
- if (EmailPanel.VerticalScroll.Value == EmailPanel.VerticalScroll.Maximum - EmailPanel.VerticalScroll.LargeChange + 1)
- AktualizujPostu(null, null);
- }
- /// <summary>
- /// Každých N sekund budeme aktualizovat poštu, pokud server nepodporuje idle mód.
- /// </summary>
- private async Task Aktualizuj()
- {
- ZadneEmailyLabel.Visible = false;
- LoadingPicturebox.Visible = true;
- pozastavSpousteniEventHandleru = true;
- // Nyní smažeme veškerý obsah okna stažených e-mailů. Prostě vrátíme panel do původního stavu.
- foreach (var c in EmailPanel.Controls.Cast<Control>().ToArray()) if (c is Panel) c.Dispose();
- this.EmailPanel.VerticalScroll.Value = 0;
- this.LoadingPicturebox.Location = new System.Drawing.Point(145, 17);
- stazeneEmaily = new StazeneEmaily(aktualniPrihlaseni, vybranaSlozka, EmailPanel);
- await stazeneEmaily.StahniEmaily(1 + Screen.PrimaryScreen.Bounds.Height / 85);
- pozastavSpousteniEventHandleru = false;
- foreach (var email in stazeneEmaily.stazeneEmaily) email.NastavEventHandlery(ZobrazEmail);
- }
- /// <summary>
- /// Po opuštění textboxu upravíme jeho popisek v případě, že je prázdné.
- /// Naopak, pokud dojde k focusu textboxu a bude v něm popisek, tak ho smažeme.
- /// </summary>
- private void HledejTextbox_UpravaPopisku(object sender, EventArgs e)
- {
- const string popis = "Hledat e-mail";
- if (string.IsNullOrEmpty(((TextBox)sender).Text))
- {
- ((TextBox)sender).ForeColor = Color.DimGray;
- ((TextBox)sender).Text = popis;
- ((TextBox)sender).TextAlign = HorizontalAlignment.Center;
- }
- else if (((TextBox)sender).Text == popis)
- {
- ((TextBox)sender).ForeColor = Color.Black;
- ((TextBox)sender).Text = "";
- ((TextBox)sender).TextAlign = HorizontalAlignment.Left;
- }
- }
- /// <summary>
- /// Vyhledá v dané složce e-mail, jehož identifikační znaky (odesílatel, předmět) byly zadány do textboxu.
- /// </summary>
- private async void VyhledejEmail(object sender, KeyEventArgs e)
- {
- if (pozastavSpousteniEventHandleru) return;
- if (e.KeyCode != Keys.Enter) return;
- if (string.IsNullOrEmpty(((TextBox)sender).Text)) { EmailPanel.Focus(); return; } // Takový sprostý trik. Ztratíme fokus na hledacím textboxu tak, že ho nastavíme na nějaký nedůležitý prvek. Tím spustíme event, který upraví GUI textboxu a aktualizuje poštu.
- EmailPanel.VerticalScroll.Value = 0;
- ZadneEmailyLabel.Visible = false;
- LoadingPicturebox.Visible = true;
- pozastavSpousteniEventHandleru = true;
- foreach (var c in EmailPanel.Controls.Cast<Control>().ToArray()) if (c is Panel) c.Dispose();
- this.LoadingPicturebox.Location = new System.Drawing.Point(145, 17);
- var nalezeneZpravy = await stazeneEmaily.NajdiEmaily(((TextBox)sender).Text);
- LoadingPicturebox.Visible = false;
- if (nalezeneZpravy.Count == 0) ZadneEmailyLabel.Visible = true;
- else await Task.Run(() =>
- {
- for (int i = 0; i < nalezeneZpravy.Count(); i++)
- stazeneEmaily.stazeneEmaily.Add(new StazeneEmaily.JedenEmail(nalezeneZpravy[i], i, EmailPanel, aktualniPrihlaseni));
- });
- pozastavSpousteniEventHandleru = false;
- if (stazeneEmaily != null) foreach (var email in stazeneEmaily.stazeneEmaily) email.NastavEventHandlery(ZobrazEmail);
- }
- /// <summary>
- /// Vytvoří GUI vlastních složek.
- /// </summary>
- /// <param name="jake">Jaké složky má vložit do GUI.</param>
- private void VlastniSlozky(List<string> jake)
- {
- if (vlastniSlozky != null) foreach (var slozka in vlastniSlozky) slozka.Dispose();
- vlastniSlozky = new List<SlozkaButton>();
- for (int i = 0; i < jake.Count; i++)
- {
- vlastniSlozky.Add(new SlozkaButton(476 + 68 * i, jake[i]));
- vlastniSlozky[i].Click += new EventHandler(VyberSlozku);
- SlozkaPanel.Controls.Add(vlastniSlozky[i]);
- }
- }
- /// <summary>
- /// Jedná se o tlačítko s GUI pro složku. Pro jednodušší inicializaci objektů tohoto typu.
- /// </summary>
- private class SlozkaButton : Button
- {
- /// <summary>
- /// Inicializace tlačítka.
- /// </summary>
- /// <param name="pozice">Na jaké Y-ové souřadnici se má vyskytovat.</param>
- /// <param name="text">Text tlačítka.</param>
- public SlozkaButton(int pozice, string text) : base()
- {
- Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- BackColor = System.Drawing.SystemColors.Control;
- FlatAppearance.BorderSize = 0;
- FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- Font = new System.Drawing.Font("Calibri", 14F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
- ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
- Location = new System.Drawing.Point(0, pozice);
- Margin = new System.Windows.Forms.Padding(0);
- Name = "ADDED_MANUALLY";
- Size = new System.Drawing.Size(194, 68);
- TabIndex = 5;
- Text = text;
- UseVisualStyleBackColor = false;
- }
- }
- /// <summary>
- /// Najdé tlačítko dané složky.
- /// </summary>
- /// <param name="slozka">Tlačítko jaké složky se má najít.</param>
- /// <returns>Odkaz na tlačítko.</returns>
- private Button NajdiTlacitko(object slozka)
- {
- if (slozka is ZakladniSlozky)
- switch (slozka)
- {
- case ZakladniSlozky.Dorucene: return DorucenaPostaButton;
- case ZakladniSlozky.Odeslane: return OdeslanaPostaButton;
- case ZakladniSlozky.Oznacene: return OznaceneButton;
- case ZakladniSlozky.Dulezite: return DuleziteButton;
- case ZakladniSlozky.Koncepty: return KonceptyButton;
- case ZakladniSlozky.Spam: return SpamButton;
- case ZakladniSlozky.Kos: return KosButton;
- }
- else if (slozka is Button) return (Button)slozka;
- else if (slozka is string) // Teď nějak nevím, jestli toto vlastně může nastat.
- foreach (Control c in SlozkaPanel.Controls) if (c is Button && ((Button)c).Name == slozka.ToString()) return (Button)c;
- return null;
- }
- }
- }
- using System;
- using System.IO;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Zobrazí manuálové stránky.
- /// </summary>
- public partial class ManualForm : Form
- {
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- public ManualForm()
- {
- this.Icon = BarevnyMotiv.ikona;
- InitializeComponent();
- StreamReader soubor = null;
- try
- {
- ManualWebbrowser.Url = new Uri("https://www.ms.mff.cuni.cz/~riedell/MA2017/help/index.html");
- // soubor = new StreamReader("help/index.html");
- // ManualWebbrowser.DocumentText = soubor.ReadToEnd();
- }
- catch
- {
- ManualWebbrowser.DocumentText = "<!DOCTYPE html><html><body>" +
- "<div style=\"text-align: center; font-family: Calibri; font-size: 32px; color: red; position: relative; top: 150px;\">" +
- "Soubor s nápovědou nebyl nalezen." +
- "</div></body></html>";
- }
- finally
- {
- if (soubor != null) soubor.Close();
- }
- }
- /// <summary>
- /// Zavře okno s nápovědou.
- /// </summary>
- private void ZavritButton_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Definuje barvu celé aplikace.
- /// </summary>
- public static class BarevnyMotiv
- {
- internal static Color barvaTlacitek;
- internal static Image logo;
- internal static Icon ikona;
- /// <summary>
- /// Barvy, které má uživatel na výběr.
- /// Dalo by se říct, že hlavní barva aplikace přímo závisí na tomto výčtovém typu.
- /// </summary>
- public enum BarevnaPaleta
- {
- /// <summary>
- /// Modrá barva RGB(28, 139, 196)
- /// </summary>
- Modra,
- /// <summary>
- /// Červená barva RGB(196, 28, 56)
- /// </summary>
- Cervena,
- /// <summary>
- /// Zelená barva RGB(140, 196, 28)
- /// </summary>
- Zelena,
- /// <summary>
- /// Černá barva RGB(32, 32, 32)
- /// </summary>
- Cerna,
- /// <summary>
- /// Šedá barva RGB(134, 136, 138)
- /// </summary>
- Seda,
- /// <summary>
- /// Žlutá barva RGB(252, 209, 22)
- /// </summary>
- Zluta
- }
- /// <summary>
- /// Vrací barvu na základě hodnoty výčtového typu.
- /// </summary>
- /// <param name="barva">Barva, jejíž RGB hodnota se má vrátit.</param>
- /// <returns>Chtěná barva.</returns>
- internal static object NastavBarvyTlacitek(BarevnaPaleta barva)
- {
- switch (barva)
- {
- case BarevnaPaleta.Modra: return Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(139)))), ((int)(((byte)(196)))));
- case BarevnaPaleta.Cervena: return Color.FromArgb(((int)(((byte)(196)))), ((int)(((byte)(28)))), ((int)(((byte)(56)))));
- case BarevnaPaleta.Zelena: return Color.FromArgb(((int)(((byte)(140)))), ((int)(((byte)(196)))), ((int)(((byte)(28)))));
- case BarevnaPaleta.Cerna: return Color.FromArgb(((int)(((byte)(32)))), ((int)(((byte)(32)))), ((int)(((byte)(32)))));
- case BarevnaPaleta.Seda: return Color.FromArgb(((int)(((byte)(134)))), ((int)(((byte)(136)))), ((int)(((byte)(138)))));
- case BarevnaPaleta.Zluta: return Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(209)))), ((int)(((byte)(22)))));
- }
- return null;
- }
- /// <summary>
- /// Vrací barvu loga na základě hodnoty výčtového typu.
- /// </summary>
- /// <param name="barva">Barva loga, jež se má vrátit.</param>
- /// <returns>Chtěná barva loga.</returns>
- private static object NastavBarvuLoga(BarevnaPaleta barva)
- {
- switch (barva)
- {
- case BarevnaPaleta.Modra: return global::Mail_Agent_2017.Properties.Resources.LogoModre;
- case BarevnaPaleta.Cervena: return global::Mail_Agent_2017.Properties.Resources.LogoCervene;
- case BarevnaPaleta.Zelena: return global::Mail_Agent_2017.Properties.Resources.LogoZelene;
- case BarevnaPaleta.Cerna: return global::Mail_Agent_2017.Properties.Resources.LogoCerne;
- case BarevnaPaleta.Seda: return global::Mail_Agent_2017.Properties.Resources.LogoSede;
- case BarevnaPaleta.Zluta: return global::Mail_Agent_2017.Properties.Resources.LogoZlute;
- }
- return null;
- }
- /// <summary>
- /// Vrací barvu ikony na základě výčtového typu.
- /// </summary>
- /// <param name="barva">Barva ikony, jež se má vrátit.</param>
- /// <returns>Chtěná barva ikony.</returns>
- private static object NastavBarvuIkony(BarevnaPaleta barva)
- {
- switch (barva)
- {
- case BarevnaPaleta.Modra: return global::Mail_Agent_2017.Properties.Resources.IkonaModra;
- case BarevnaPaleta.Cervena: return global::Mail_Agent_2017.Properties.Resources.IkonaCervena;
- case BarevnaPaleta.Zelena: return global::Mail_Agent_2017.Properties.Resources.IkonaZelena;
- case BarevnaPaleta.Cerna: return global::Mail_Agent_2017.Properties.Resources.IkonaCerna;
- case BarevnaPaleta.Seda: return global::Mail_Agent_2017.Properties.Resources.IkonaSeda;
- case BarevnaPaleta.Zluta: return global::Mail_Agent_2017.Properties.Resources.IkonaZluta;
- }
- return null;
- }
- /// <summary>
- /// Pomocí této vlastnosti nastavujeme barvevný motiv. K této vlastnosti přistupujeme v nastavení aplikace nebo při startu aplikace.
- /// </summary>
- public static BarevnaPaleta Barva
- {
- get
- {
- if (barvaTlacitek != null && logo != null && ikona != null)
- foreach (var barva in Enum.GetValues(typeof(BarevnaPaleta)))
- if (barvaTlacitek == (Color)NastavBarvyTlacitek((BarevnaPaleta)barva))
- return (BarevnaPaleta)barva;
- return BarevnaPaleta.Modra;
- }
- set
- {
- // Každou změnu barevného motivu zapíšeme do souboru.
- // Při první inicializaci ne, protože se načítá hodnota ze souboru, pokud je hodnota inicializovaná.
- if (barvaTlacitek != null && logo != null && ikona != null)
- {
- StreamWriter nastaveni = new StreamWriter(".settings");
- nastaveni.WriteLine((int)value);
- nastaveni.Close();
- }
- barvaTlacitek = (Color)NastavBarvyTlacitek(value);
- logo = (Image)NastavBarvuLoga(value);
- ikona = (Icon)NastavBarvuIkony(value);
- }
- }
- }
- }
- using System;
- using System.Text;
- using System.Security.Cryptography;
- using ImapX;
- using System.Net.Mail;
- using System.Net;
- using System.IO;
- using System.Windows.Forms;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Web;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Třída sdružující informace o aktuálním přihlášení.
- /// </summary>
- public class Prihlaseni
- {
- internal string _email;
- internal string _heslo;
- internal string _jmeno;
- /// <summary>
- /// Aktuální IMAP připojení.
- /// </summary>
- public ImapClient ImapPripojeni;
- /// <summary>
- /// Aktuální SMTP připojení.
- /// </summary>
- public SmtpClient SmtpPripojeni;
- /// <summary>
- /// Jak často se budou aktualizovat e-maily.
- /// </summary>
- public int refresh;
- /// <summary>
- /// E-mail daného přihlášení.
- /// </summary>
- public string Email
- {
- get { return _email == null ? null : Sifrovani.Decrypt(_email); }
- set { _email = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Heslo daného přihlášení.
- /// </summary>
- public string Heslo
- {
- get { return _heslo == null ? null : Sifrovani.Decrypt(_heslo); }
- set { _heslo = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Jméno daného přihlášení.
- /// </summary>
- public string Jmeno
- {
- get { return _jmeno == null ? null : Sifrovani.Decrypt(_jmeno); }
- set { _jmeno = Sifrovani.Encrypt(value); }
- }
- /// <summary>
- /// Uloží aktuální přihlášení do souboru, aby při příštím přihlášení uživatel nemusel znovu podstupovat přihlašovací proces.
- /// </summary>
- public void UlozPrihlaseniDoSouboru()
- {
- try
- {
- if (_email == null || _heslo == null || _jmeno == null || ImapPripojeni == null || SmtpPripojeni == null)
- throw new ChybneZadaniException("Nepodařilo se uložit aktuální relaci. Při příštím spuštění aplikace se budete muset znovu přihlásit.");
- }
- catch (ChybneZadaniException ex)
- { MessageBox.Show(ex.Message); return; }
- StreamWriter prihlaseniSoubor = new StreamWriter(".login_info");
- prihlaseniSoubor.WriteLine("{0} {1} {2} {3}", _email, _heslo, _jmeno, (refresh == 0 ? 840 : refresh)); // Pokud není refresh nastaven, defaultní nastavení bude 840 sekund. To je doba, po které IMAP server uzavře spojení s klientem, pokud nedojde k obnovení spojení.
- prihlaseniSoubor.WriteLine("{0} {1} {2}", ImapPripojeni.Host, ImapPripojeni.Port, ImapPripojeni.UseSsl);
- prihlaseniSoubor.WriteLine("{0} {1} {2} {3}", SmtpPripojeni.Host, SmtpPripojeni.Port, SmtpPripojeni.EnableSsl, !SmtpPripojeni.UseDefaultCredentials);
- prihlaseniSoubor.Close();
- }
- /// <summary>
- /// Načte poslední přihlášení ze souboru, pokud existuje.
- /// </summary>
- public bool NactiPrihlaseniZeSouboru()
- {
- try
- {
- StreamReader prihlaseniSoubor = new StreamReader(".login_info");
- string[] prihlaseni = prihlaseniSoubor.ReadLine().Split(' ');
- string[] IMAP = prihlaseniSoubor.ReadLine().Split(' ');
- string[] SMTP = prihlaseniSoubor.ReadLine().Split(' ');
- this._email = prihlaseni[0];
- this._heslo = prihlaseni[1];
- this._jmeno = prihlaseni[2];
- this.refresh = int.Parse(prihlaseni[3]);
- this.ImapPripojeni = new ImapClient(IMAP[0], int.Parse(IMAP[1]), bool.Parse(IMAP[2]));
- this.SmtpPripojeni = new SmtpClient(SMTP[0], int.Parse(SMTP[1]));
- this.SmtpPripojeni.EnableSsl = bool.Parse(SMTP[2]);
- if (bool.Parse(SMTP[3]))
- {
- this.SmtpPripojeni.UseDefaultCredentials = false;
- this.SmtpPripojeni.Credentials = new NetworkCredential(Email, Heslo);
- }
- // Pokud se nepovede přihlášení k IMAP serveru, bude uživatel vyzván, aby se přihlásil znovu.
- if (!ImapPripojeni.Connect() || !ImapPripojeni.Login(Email, Heslo))
- throw new ImapConnectFailException("Přihlášení bylo neúspěšné. Přihlašte se, prosím, znovu.");
- prihlaseniSoubor.Close();
- }
- catch (Exception ex)
- {
- if (ex is ImapConnectFailException)
- MessageBox.Show(ex.Message);
- // Pokud dojde k jiné výjimce, například chybný nebo prázdný vstup, uživatele s tím ani obeznamovat nebudeme. Nemusí vědět všechno.
- return false;
- }
- return true;
- }
- /// <summary>
- /// Odhlásí se a odstraní soubor s přihlášením.
- /// </summary>
- public void OdhlasitSe()
- {
- File.Delete(".login_info");
- SmtpPripojeni.Dispose();
- ImapPripojeni.Disconnect();
- ImapPripojeni.Dispose();
- _email = null;
- _heslo = null;
- _jmeno = null;
- }
- }
- /// <summary>
- /// Třída poskytující drobné utility, které se hodí (nejen) u přihlašování.
- /// </summary>
- public static class Utility
- {
- /// <summary>
- /// Metoda rozhoduje, zdali má zadaná adresa správný formát.
- /// </summary>
- /// <param name="email">E-mailová adresa, která má být zkontrolována.</param>
- /// <returns>Úspěch v případě správného formátu adresy, neúspěch v opačném případě.</returns>
- public static bool SpravnyFormatAdresy(string email)
- {
- // Využijeme třídu .NET pro emailové adresy a pokusíme se vytvořit novou emailovou adresu.
- // V případě neúspěchu vyvolá výjimku - tedy v případě, že adresa má nesprávný formát.
- try { return new System.Net.Mail.MailAddress(email).Address == email; }
- catch { return false; }
- }
- /// <summary>
- /// Metoda se pokusí připojit k SMTP serveru podle údajů, které zadal uživatel.
- /// Také se pokusí poslat testovací zprávu, jakožto indikátor úspěšného připojení,
- /// </summary>
- /// <returns>V případě úspěšného připojení odkaz na objekt SmtpClient, v opačném případě null.</returns>
- public static SmtpClient SmtpConnect(string SmtpServer, int SmtpPort, bool SmtpSsl, bool SmtpAuth, string email, string heslo)
- {
- // Zde nemusíme ověřovat (v případě zaškrtnutého checkboxu Auth), zdali se e-mailová adresa shoduje s heslem, vlastně ani nemáme jak.
- // Proč nemusíme? Ověří to za nás připojení k IMAP serveru, které předchází připojení k SMTP serveru.
- SmtpClient SmtpPripojeni = new SmtpClient(SmtpServer, SmtpPort);
- SmtpPripojeni.EnableSsl = SmtpSsl;
- if (SmtpAuth)
- {
- SmtpPripojeni.UseDefaultCredentials = false;
- SmtpPripojeni.Credentials = new NetworkCredential(email, heslo);
- }
- // Metoda vyvolá výjimku, když se nepodaří odeslat zprávu.
- try
- {
- SmtpPripojeni.Send(email , email, "Mail Agent 2017 - Testovací zpráva", @"Přihlášení do aplikace proběhlo úspěšně.");
- return SmtpPripojeni;
- }
- catch
- { return null; }
- }
- /// <summary>
- /// Spustí přihlašovací proces.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Relace přihlášení, která má být inicializována.</param>
- public static void PrihlasovaciProces(ref Prihlaseni aktualniPrihlaseni)
- {
- Stack<Form> prihlasovaciProces = new Stack<Form>();
- if (!aktualniPrihlaseni.NactiPrihlaseniZeSouboru())
- {
- /*
- * Přihlašovací proces je řešený pomocí zásobníku oken.
- * Při kliknutí na tlačítko "Zpět" se do zásobníku pushne předchozí okno, aby uživatel mohl provést změny.
- * Přihlašovací proces končí, když je zásobník prázdný.
- */
- prihlasovaciProces.Push(new LoginForm1(aktualniPrihlaseni, prihlasovaciProces));
- while (prihlasovaciProces.Count > 0)
- prihlasovaciProces.Pop().ShowDialog();
- // Pokud neprobělo přihlášení, dojde k ukončení celé aplikace.
- if (aktualniPrihlaseni.ImapPripojeni == null || aktualniPrihlaseni.SmtpPripojeni == null || aktualniPrihlaseni.Email == null || aktualniPrihlaseni.Heslo == null)
- Environment.Exit(0);
- // Uložíme aktuální relaci do souboru, abychom ji při příštím spuštění aplikace mohli snadno načíst.
- aktualniPrihlaseni.UlozPrihlaseniDoSouboru();
- }
- }
- /// <summary>
- /// Třída, která projde adresář a vypíše kontakty, které se nachází v dané skupině.
- /// </summary>
- /// <param name="adresar">Jaký adresář se má prohledat.</param>
- /// <param name="skupina">Skupina.</param>
- /// <returns>Seznam kontaktů ve skupině.</returns>
- public static List<Kontakt> VypisKontaktyVeSkupine(Adresar adresar, Skupina skupina)
- {
- List<Kontakt> clenoveSkupiny = new List<Kontakt>();
- foreach (Kontakt kontakt in adresar.seznamKontaktu)
- if (kontakt.Skupina == skupina.Nazev)
- clenoveSkupiny.Add(kontakt);
- return clenoveSkupiny;
- }
- }
- /// <summary>
- /// Následující třída poskytuje šifrovací a dešifrovací funkce.
- /// Autorem metod nejsem já, byly použity šifrovací funkce nalezené na internetu.
- /// </summary>
- public static class Sifrovani
- {
- private static readonly string PasswordHash = "h€$$łö";
- private static readonly string SaltKey = "M@iL&g€n†2oI7";
- private static readonly string VIKey = "@1B2c3D4e5F6g7H8";
- /// <summary>
- /// Metoda šifrující daný text.
- /// </summary>
- /// <param name="plainText">Text, který se má zašifrovat.</param>
- /// <returns>Zašifrovaný text.</returns>
- internal static string Encrypt(string plainText)
- {
- byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText.ToString());
- byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
- var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
- var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
- byte[] cipherTextBytes;
- using (var memoryStream = new MemoryStream())
- {
- using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
- {
- cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
- cryptoStream.FlushFinalBlock();
- cipherTextBytes = memoryStream.ToArray();
- cryptoStream.Close();
- }
- memoryStream.Close();
- }
- return HttpUtility.UrlEncode(Convert.ToBase64String(cipherTextBytes));
- }
- /// <summary>
- /// Metoda dešifrující daný text.
- /// </summary>
- /// <param name="encryptedText">Text, který se má dešifrovat.</param>
- /// <returns>Dešifrovaný text.</returns>
- internal static string Decrypt(string encryptedText)
- {
- byte[] cipherTextBytes = Convert.FromBase64String(HttpUtility.UrlDecode(encryptedText.ToString()));
- byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
- var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };
- var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
- var memoryStream = new MemoryStream(cipherTextBytes);
- var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
- byte[] plainTextBytes = new byte[cipherTextBytes.Length];
- int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
- memoryStream.Close();
- cryptoStream.Close();
- return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
- }
- /// <summary>
- /// Metoda šifrující bitmapu do stringu.
- /// </summary>
- /// <param name="bitmap">Bitmapa, která se má zašifrovat.</param>
- /// <returns>Stringová hodnota dané bitmapy.</returns>
- internal static string BitmapToString(Bitmap bitmap)
- {
- MemoryStream memoryStream = new MemoryStream();
- bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
- byte[] bitmapBytes = memoryStream.GetBuffer();
- return Convert.ToBase64String(bitmapBytes, Base64FormattingOptions.None);
- }
- /// <summary>
- /// Metoda dešifrující bitmapu ze stringu.
- /// </summary>
- /// <param name="bitmapString">Bitmapa, která se má dešifrovat. Vložena jako text.</param>
- /// <returns>Objekt bitmapy.</returns>
- internal static Bitmap StringToBitmap(string bitmapString)
- {
- byte[] bitmapBytes = Convert.FromBase64String(bitmapString);
- MemoryStream memoryStream = new MemoryStream(bitmapBytes);
- return (Bitmap)(Image.FromStream(memoryStream));
- }
- }
- /// <summary>
- /// Vyrobíme si okno podobné příkazu prompt v Javascriptu.
- /// Přišlo mi zbytečné na to vytvářet další soubor s designerem, když je na to potřeba pár řádek kódu.
- /// </summary>
- public class Prompt
- {
- /// <summary>
- /// Implementace metody ShowDialog. Podobná té klasické ShowDialog ze třídy Form.
- /// </summary>
- /// <param name="text">Text, který se zobrazí v labelu.</param>
- /// <param name="popis">Název okna.</param>
- /// <param name="maxDelka">Maximální délka vstupu. Pokud je nastavena -1, pak nekonečno.</param>
- /// <returns>V případě úspěchu bude okno vracet obsah textboxu.</returns>
- public string ShowDialog(string text, string popis, int maxDelka)
- {
- Form prompt = new Form()
- {
- Width = 500,
- Height = 150,
- FormBorderStyle = FormBorderStyle.FixedDialog,
- Text = popis,
- StartPosition = FormStartPosition.CenterScreen,
- MaximizeBox = false,
- MinimizeBox = false
- };
- Label label = new Label() { Left = 50, Top = 20, Text = text, Width = 400 };
- TextBox textbox = new TextBox() { Left = 50, Top = 40, Width = 400 };
- Button tlacitko = new Button() { Text = "Potvrdit", Left = 350, Width = 100, Top = 70, DialogResult = DialogResult.OK };
- tlacitko.Click += (sender, e) => { prompt.Close(); };
- if (maxDelka != -1) textbox.MaxLength = maxDelka;
- prompt.Controls.Add(textbox);
- prompt.Controls.Add(tlacitko);
- prompt.Controls.Add(label);
- prompt.AcceptButton = tlacitko;
- // V případě úspěchu bude okno vracet obsah textboxu.
- return prompt.ShowDialog() == DialogResult.OK ? textbox.Text : null;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Výčtový typ definující základní složky.
- /// </summary>
- public enum ZakladniSlozky
- {
- /// <summary>
- /// Doručená pošta.
- /// </summary>
- Dorucene,
- /// <summary>
- /// Odeslaná pošta.
- /// </summary>
- Odeslane,
- /// <summary>
- /// Odstraněná pošta.
- /// </summary>
- Kos,
- /// <summary>
- /// Nevyžádaná pošta.
- /// </summary>
- Spam,
- /// <summary>
- /// Označená pošta.
- /// </summary>
- Oznacene,
- /// <summary>
- /// Důležitá pošta.
- /// </summary>
- Dulezite,
- /// <summary>
- /// Koncepty.
- /// </summary>
- Koncepty
- }
- /// <summary>
- /// Delegát pro obsluhu události zobrazení jednoho e-mailu.
- /// </summary>
- /// <param name="sender">Jaký e-mail se má zobrazit.</param>
- public delegate void ZobrazEmailEventHandler(object sender);
- /// <summary>
- /// Objekty této třídy budou obsahovat stažené e-maily z IMAP serveru.
- /// </summary>
- public class StazeneEmaily
- {
- private Prihlaseni aktualniPrihlaseni;
- internal ImapX.Folder slozka;
- private Panel panel;
- /// <summary>
- /// V tomto seznamu budeme uchovávaz informace o stažených e-mailech, včetně jejich GUI.
- /// </summary>
- internal List<JedenEmail> stazeneEmaily;
- /// <summary>
- /// Konstruktor stahuje požadované e-maily z IMAP serveru.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení a údaje o IMAP serveru, z kterého se mají e-maily stáhnout.</param>
- /// <param name="slozka">Složka, která se má stáhnout.</param>
- /// <param name="panel">Panel, ke kterému se tato část kódu váže. Kvůli úpravě GUI.</param>
- public StazeneEmaily(Prihlaseni aktualniPrihlaseni, object slozka, Panel panel)
- {
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- this.panel = panel;
- this.stazeneEmaily = new List<JedenEmail>();
- string nazevSlozky = ""; // Toto využijeme pouze v případě, že náš poskytovatel nemá v základu běžné složky. Třeba seznam.cz.
- if (slozka is Button)
- this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders[((Button)slozka).Text];
- else if (slozka is ZakladniSlozky)
- {
- switch (slozka)
- {
- case ZakladniSlozky.Dorucene: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Inbox; nazevSlozky = "Doručená pošta"; break;
- case ZakladniSlozky.Odeslane: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Sent; nazevSlozky = "Odeslaná pošta"; break;
- case ZakladniSlozky.Kos: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Trash; nazevSlozky = "Koš"; break;
- case ZakladniSlozky.Oznacene: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Flagged; nazevSlozky = "Označená pošta"; break;
- case ZakladniSlozky.Dulezite: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Important; nazevSlozky = "Důležitá pošta"; break;
- case ZakladniSlozky.Koncepty: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Drafts; nazevSlozky = "Koncepty"; break;
- case ZakladniSlozky.Spam: this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders.Junk; nazevSlozky = "Nevyžádaná pošta"; break;
- }
- if (this.slozka == null) // Toto u gmailu nastat nemůže.
- {
- if (aktualniPrihlaseni.ImapPripojeni.Folders[nazevSlozky] == null)
- aktualniPrihlaseni.ImapPripojeni.Folders.Add(nazevSlozky);
- this.slozka = aktualniPrihlaseni.ImapPripojeni.Folders[nazevSlozky];
- }
- }
- }
- /// <summary>
- /// Seřadí e-maily dle času odeslání.
- /// </summary>
- /// <param name="emaily">E-maily, které se mají setřídit.</param>
- /// <returns>Setřízené e-maily.</returns>
- private List<ImapX.Message> SeradEmaily(object emaily)
- {
- // Musíme to takto udělat, neboť ImapX složka je read-only. To znamená, že nepodporuje řazení "na místě".
- // Implementováno něčím, co připomíná Selection sort. V našem případě časově přijatelné, protože se jedná pouze o pár prvků.
- // A je to vlastně jeden z mála přijatelných algoritmů pro náš problém.
- // Typ object zde máme proto, že ve složce jsou zprávy uloženy pod typem MessageCollection. Zatímco hledání e-mailů vrací typ List<Message>.
- List<ImapX.Message> serazeneEmaily = new List<ImapX.Message>();
- var neserazeneEmaily = emaily is ImapX.Collections.MessageCollection ? ((ImapX.Collections.MessageCollection)emaily).ToList() : (List<ImapX.Message>)emaily;
- for (int i = 0; i < (emaily is ImapX.Collections.MessageCollection ? ((ImapX.Collections.MessageCollection)emaily).Count() : ((List<ImapX.Message>)emaily).Count); i++)
- {
- ImapX.Message temp = null;
- for (int j = 0; j < neserazeneEmaily.Count; j++)
- if (temp == null || neserazeneEmaily[j].Date > temp.Date)
- temp = neserazeneEmaily[j];
- serazeneEmaily.Add(temp);
- neserazeneEmaily.Remove(temp);
- }
- return serazeneEmaily;
- }
- /// <summary>
- /// Asynchronně stáhne požadovaný počet e-mailů.
- /// </summary>
- /// <param name="kolik">Kolik e-mailů se má stáhnout.</param>
- public async Task StahniEmaily(int kolik)
- {
- int puvodniPocetEmailu = stazeneEmaily.Count;
- List<ImapX.Message> serazeneEmaily = null;
- await Task.Run(() => // Toto může trvat netriviální množství času.
- {
- slozka.Messages.Download("ALL", ImapX.Enums.MessageFetchMode.Tiny, kolik);
- serazeneEmaily = SeradEmaily(slozka.Messages);
- });
- foreach (Control control in panel.Controls)
- if (control is PictureBox && ((PictureBox)control).Name == "LoadingPicturebox")
- ((PictureBox)control).Visible = false;
- // E-maily zobrazíme na vedlejším vlákně, protože by se jinak mohlo zasekávat UI. Assign e-mailu k panelu je vyřešen pomocí MethodInvokeru, který spustí na GUI vlákně jediný řádek kódu - a to právě onen assign.
- await Task.Run(() =>
- {
- for (int i = puvodniPocetEmailu; i < serazeneEmaily.Count; i++)
- stazeneEmaily.Add(new JedenEmail(serazeneEmaily[i], i, panel, aktualniPrihlaseni));
- });
- foreach (Control control in panel.Controls)
- {
- if (control is Label && ((Label)control).Name == "ZadneEmailyLabel" && stazeneEmaily.Count == 0)
- ((Label)control).Visible = true;
- else if (control is PictureBox && ((PictureBox)control).Name == "LoadingPicturebox")
- ((PictureBox)control).Location = new Point(((PictureBox)control).Location.X, 15 + 85 * stazeneEmaily.Count - this.panel.VerticalScroll.Value);
- }
- }
- /// <summary>
- /// Asynchronní prohledávání složky. Hledá e-maily dle zadaných kritérií.
- /// </summary>
- /// <param name="jake">Dle čeho se mají e-maily hledat.</param>
- /// <returns>Nalezené e-maily.</returns>
- public async Task<List<ImapX.Message>> NajdiEmaily(string jake)
- {
- List<ImapX.Message> nalezeneEmaily = new List<ImapX.Message>();
- ImapX.Message[] nalezeneEmaily1 = null;
- ImapX.Message[] nalezeneEmaily2 = null;
- // Napevno stáhneme pouze tolik e-mailů, kolik se vejde na obrazovku. Při scrollnutí na konec panelu se nové nenačtou, to by bylo v současné chvíli až moc implementačně náročné. Třeba někdy jindy...
- // Pozor, nefunguje pro stringy obsahující diakritiku!
- if (Encoding.UTF8.GetByteCount(jake) != jake.Length) { MessageBox.Show("Je nám líto, řetězce obsahující diakritiku nejsou v současnosti podporovány."); return nalezeneEmaily; }
- // A momentálně ani nevím, jak to vyřešit.
- await Task.Run(() => nalezeneEmaily1 = slozka.Search("SUBJECT \"" + jake + "\"", ImapX.Enums.MessageFetchMode.Tiny, 1 + Screen.PrimaryScreen.Bounds.Height / 85));
- await Task.Run(() => nalezeneEmaily2 = slozka.Search("FROM \"" + jake + "\"", ImapX.Enums.MessageFetchMode.Tiny, 1 + Screen.PrimaryScreen.Bounds.Height / 85));
- foreach (var email in nalezeneEmaily1) nalezeneEmaily.Add(email);
- foreach (var email in nalezeneEmaily2) if (nalezeneEmaily.IndexOf(email) == -1) nalezeneEmaily.Add(email);
- return SeradEmaily(nalezeneEmaily);
- }
- /// <summary>
- /// Třída poskytující GUI náhledu jednoho e-mailu.
- /// </summary>
- internal class JedenEmail : IDisposable
- {
- internal Panel jedenEmail;
- internal ImapX.Message email;
- internal Label odesilatel;
- internal Label predmet;
- internal Label cas;
- private Panel panel;
- /// <summary>
- /// Inicializace GUI jednoho e-mailu.
- /// </summary>
- /// <param name="email">E-mailová zpráva.</param>
- /// <param name="kolikaty">O kolikátý e-mail v GUI se jedná.</param>
- /// <param name="panel">Panel, jehož GUI máme měnit.</param>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení, kvůli prohledávání adresáře.</param>
- internal JedenEmail(ImapX.Message email, int kolikaty, Panel panel, Prihlaseni aktualniPrihlaseni)
- {
- this.panel = panel;
- this.email = email;
- jedenEmail = new Panel();
- odesilatel = new Label();
- predmet = new Label();
- cas = new Label();
- if (email.From != null)
- odesilatel.Text = string.IsNullOrEmpty(email.From.DisplayName.ToString()) ? email.From.Address.ToString() : email.From.DisplayName.ToString(); // Pokud má odesilatel nastavené jméno, zobrazíme to. Jinak adresu.
- foreach (Kontakt kontakt in new Adresar(aktualniPrihlaseni).seznamKontaktu) // Zkontrolujeme, jestli daný e-mail není v adresáři.
- if (kontakt.Email == email.From.Address)
- {
- if (!string.IsNullOrEmpty(kontakt.Prezdivka))
- odesilatel.Text = kontakt.Prezdivka;
- else
- odesilatel.Text = kontakt.Jmeno;
- }
- odesilatel.Text = odesilatel.Text.Length > 40 ? odesilatel.Text.Substring(0, 40) + "..." : odesilatel.Text; // Pokud je jeho jméno moc dlouhé, zkrátíme ho, aby se vešlo do panelu.
- predmet.Text = email.Subject == null || string.IsNullOrEmpty(email.Subject.ToString()) ? "Bez předmětu" : email.Subject.ToString();
- predmet.Text = predmet.Text.Length > 40 ? predmet.Text.Substring(0, 40) + "..." : predmet.Text; // To stejné s předmětem.
- // S časem to vymyslíme trochu sofistikovaněji. Pokud e-mail přišel dnes, napíšeme jen čas. Pokud včera, napíšeme, že včera. Jinak napíšeme celý datum bez času.
- DateTime aktualniDatum = DateTime.Now;
- if (int.Parse(aktualniDatum.Day.ToString()) == int.Parse(email.Date.Value.Day.ToString()) &&
- int.Parse(aktualniDatum.Month.ToString()) == int.Parse(email.Date.Value.Month.ToString()) &&
- int.Parse(aktualniDatum.Year.ToString()) == int.Parse(email.Date.Value.Year.ToString()))
- cas.Text = "dnes v " + email.Date.Value.Hour + ":" + ((email.Date.Value.Minute.ToString().Length == 1) ? "0" + email.Date.Value.Minute.ToString() : email.Date.Value.Minute.ToString());
- else if (int.Parse(aktualniDatum.Day.ToString()) - 1 == int.Parse(email.Date.Value.Day.ToString()) &&
- int.Parse(aktualniDatum.Month.ToString()) == int.Parse(email.Date.Value.Month.ToString()) &&
- int.Parse(aktualniDatum.Year.ToString()) == int.Parse(email.Date.Value.Year.ToString())) // Toto nefunguje, pokud je dnes první den v měsíci.
- cas.Text = "včera v " + email.Date.Value.Hour + ":" + ((email.Date.Value.Minute.ToString().Length == 1) ? "0" + email.Date.Value.Minute.ToString() : email.Date.Value.Minute.ToString());
- else
- cas.Text = "dne " + email.Date.Value.Day + "." + email.Date.Value.Month + "." + email.Date.Value.Year;
- #region Inicializace GUI.
- this.jedenEmail.AutoScroll = false;
- this.jedenEmail.Margin = new System.Windows.Forms.Padding(0);
- this.jedenEmail.Size = new System.Drawing.Size(panel.Size.Width - 6 - 19, 85);
- this.jedenEmail.Location = new System.Drawing.Point(3, this.jedenEmail.Size.Height * kolikaty - this.panel.VerticalScroll.Value);
- this.jedenEmail.BorderStyle = BorderStyle.None;
- this.jedenEmail.Controls.Add(new Label() { Height = 1, Dock = DockStyle.Bottom, BackColor = Color.Black }); // Tímto trikem vytvoříme dolní okraj.
- this.jedenEmail.TabIndex = kolikaty;
- this.odesilatel.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.odesilatel.Font = new System.Drawing.Font("Calibri", 14F);
- this.odesilatel.Location = new System.Drawing.Point(10, 10);
- this.odesilatel.Size = new System.Drawing.Size(this.jedenEmail.Size.Width - 6, 25);
- this.odesilatel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.jedenEmail.Controls.Add(odesilatel);
- this.predmet.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.predmet.Font = new System.Drawing.Font("Calibri", 12F);
- this.predmet.Location = new System.Drawing.Point(10, 35);
- this.predmet.Size = new System.Drawing.Size(this.jedenEmail.Size.Width - 6, 20);
- this.predmet.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- this.jedenEmail.Controls.Add(predmet);
- this.cas.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
- this.cas.Font = new System.Drawing.Font("Calibri", 10F);
- this.cas.Location = new System.Drawing.Point(10, 55);
- this.cas.Size = new System.Drawing.Size(this.jedenEmail.Size.Width - 6, 20);
- this.cas.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
- this.jedenEmail.Controls.Add(cas);
- panel.BeginInvoke(new MethodInvoker(delegate () { this.panel.Controls.Add(jedenEmail); }));
- #endregion
- // Pokud je zpráva nepřečtená, vyznačíme ji tučně.
- if (!email.Seen)
- {
- this.odesilatel.Font = new Font(odesilatel.Font, FontStyle.Bold);
- this.predmet.Font = new Font(predmet.Font, FontStyle.Bold);
- this.cas.Font = new Font(cas.Font, FontStyle.Bold);
- }
- // Těmito eventy z panelu uděláme de facto tlačítko.
- this.jedenEmail.MouseMove += new MouseEventHandler(delegate (object sender, MouseEventArgs e) { this.jedenEmail.BackColor = Color.FromArgb(215, 215, 215); });
- this.jedenEmail.MouseLeave += new EventHandler(delegate (object sender, EventArgs e) { this.jedenEmail.BackColor = SystemColors.Control; });
- this.odesilatel.MouseMove += new MouseEventHandler(delegate (object sender, MouseEventArgs e) { this.jedenEmail.BackColor = Color.FromArgb(215, 215, 215); });
- this.odesilatel.MouseLeave += new EventHandler(delegate (object sender, EventArgs e) { this.jedenEmail.BackColor = SystemColors.Control; });
- this.predmet.MouseMove += new MouseEventHandler(delegate (object sender, MouseEventArgs e) { this.jedenEmail.BackColor = Color.FromArgb(215, 215, 215); });
- this.predmet.MouseLeave += new EventHandler(delegate (object sender, EventArgs e) { this.jedenEmail.BackColor = SystemColors.Control; });
- this.cas.MouseMove += new MouseEventHandler(delegate (object sender, MouseEventArgs e) { this.jedenEmail.BackColor = Color.FromArgb(215, 215, 215); });
- this.cas.MouseLeave += new EventHandler(delegate (object sender, EventArgs e) { this.jedenEmail.BackColor = SystemColors.Control; });
- }
- /// <summary>
- /// Klasická implementace metody Dispose.
- /// </summary>
- public void Dispose()
- {
- odesilatel.Dispose();
- predmet.Dispose();
- cas.Dispose();
- jedenEmail.Dispose();
- }
- /// <summary>
- /// Edituje event handlery celému tlačítku.
- /// </summary>
- /// <param name="zobrazit">Metoda, která se má při události spustit.</param>
- public void NastavEventHandlery(ZobrazEmailEventHandler zobrazit)
- {
- // Nejdřív odebereme, to ničemu nevadí a zabráníme tomu, že na jeden prvek bude odkázáno více stejných event handlerů.
- odesilatel.Click -= new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- cas.Click -= new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- predmet.Click -= new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- jedenEmail.Click -= new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- // Na každý element panelu tlačítka vytvoříme event handler, který spustí metodu na zobrazení právě tohoto e-mailu.
- odesilatel.Click += new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- cas.Click += new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- predmet.Click += new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- jedenEmail.Click += new EventHandler(delegate (object sender, EventArgs e) { zobrazit(this); });
- }
- }
- }
- }
- using System;
- using System.IO;
- using System.Windows.Forms;
- // Aplikace je naprosto bezpečná. Bez znalosti šifrovacího klíče nehrozí zneužití údajů.
- namespace Mail_Agent_2017
- {
- static class Program
- {
- /// <summary>
- /// Načte defaultní nastavení aplikace.
- /// </summary>
- private static void NactiDefaultniNastaveni()
- {
- BarevnyMotiv.Barva = BarevnyMotiv.BarevnaPaleta.Modra;
- }
- /// <summary>
- /// Rozšíření metody Contains. Tato rozšířená verze nám umožní ignorovat case-sensitivní znaky.
- /// </summary>
- /// <param name="zdroj">String, ve kterém se má daný substring hledat.</param>
- /// <param name="zkontrolovat">Substring, který se má nalézt.</param>
- /// <param name="comp">Možnosti porovnávání.</param>
- /// <returns>True, pokud daný string obsahuje daný substring.</returns>
- public static bool Contains(this string zdroj, string zkontrolovat, StringComparison comp)
- {
- return zdroj != null && zkontrolovat != null && zdroj.IndexOf(zkontrolovat, comp) >= 0;
- }
- /// <summary>
- /// Hlavní vstupní bod aplikace.
- /// </summary>
- [STAThread]
- static void Main()
- {
- // Nejdříve načteme uživatelské nastavení.
- StreamReader nastaveni = new StreamReader(".settings");
- try
- {
- // Číslo barevného motivu (číslo přiřazené hodnotě ve výčtovém typu) odpovídá první řádce v souboru nastavení.
- BarevnyMotiv.Barva = (BarevnyMotiv.BarevnaPaleta)Enum.ToObject(typeof(BarevnyMotiv.BarevnaPaleta), int.Parse(nastaveni.ReadLine()));
- }
- catch
- {
- // Pokud neexistuje, načteme defaultní nastavení.
- NactiDefaultniNastaveni();
- }
- finally
- { nastaveni.Close(); }
- Application.EnableVisualStyles();
- Application.SetCompatibleTextRenderingDefault(false);
- Application.Run(new MainForm());
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- // V tomto souboru je implementováno všechno týkající se adresáře a skupin v okně pro odesílní e-mailů.
- // Ačkoliv se jedná o tutéž třídu, je kód v tomto souboru, abychom nepřetěžovali soubor SendForm.cs, kde jsou nejdůležitější komponenty této třídy.
- public partial class SendForm
- {
- /// <summary>
- /// Otevře adresář, kde si může uživatel zvolit, jaké kontakty připojí k e-mailu.
- /// </summary>
- private void OtevritAdresar_Click(object sender, EventArgs e)
- {
- // Zde určíme, kam vybrané e-mailové adresy zapíšeme.
- TextBox kamZapsat = null;
- switch (((PictureBox)sender).Name)
- {
- case "ToAdresarButton": kamZapsat = ToTextbox; break;
- case "CcAdresarButton": kamZapsat = CcTextbox; break;
- case "BccAdresarButton": kamZapsat = BccTextbox; break;
- }
- // Zde dochází k zobrazení adresářového okna a v případě úspěšného ukončení pomocí tlačítka, projde všechny zaškrtnuté adresy a napíše je do příslušného textboxu.
- using (var form = new AddressBookForm(aktualniPrihlaseni, true))
- if (form.ShowDialog() == DialogResult.OK)
- foreach (AddressBookForm.JedenKontakt kontakt in form.ovladaciPrvky)
- if (kontakt.PridatKontaktCheckbox.Checked)
- kamZapsat.Text += string.IsNullOrWhiteSpace(kamZapsat.Text) ? kontakt.kontakt.Email + ";" : ( (kamZapsat.Text.Last() == ';') ? kontakt.kontakt.Email : ";" + kontakt.kontakt.Email);
- kamZapsat.SelectionStart = kamZapsat.Text.Length;
- }
- /// <summary>
- /// Jedná se o obsluhu stisku klávesy, když uživatel zadává e-mailové adresy.
- /// Pokud je počet znaků v e-mailové adrese větší než 3, spustí prohledávání adresáře a navrhování adres.
- /// </summary>
- private async void Textbox_KeyDown(object sender, KeyEventArgs e)
- {
- // Na začátku odebereme obsluhu tohoto eventu, neboť kdyby se stejná obsluha spustila vícekrát současně (kdyby uživatel psal moc rychle), mohlo by dojít k "rozbití" GUI. Na konci opět přidáme.
- ((TextBox)sender).KeyDown -= new KeyEventHandler(Textbox_KeyDown);
- Panel aktualniPanel = null;
- switch (((TextBox)sender).Name)
- {
- case "ToTextbox": aktualniPanel = ToAdresarPanel; break;
- case "CcTextbox": aktualniPanel = CcAdresarPanel; break;
- case "BccTextbox": aktualniPanel = BccAdresarPanel; break;
- default: throw new MissingMemberException();
- }
- this.SuspendLayout();
- // Při aktualizaci vymažeme všechny stávájící kontakty v okně.
- foreach (Control prvek in aktualniPanel.Controls)
- prvek.Dispose();
- if (((TextBox)sender).Text.Split(';').Last().Length >= 2)
- {
- var nalezeneKontakty = await ProhledejAdresar(((TextBox)sender).Text.Split(';').Last());
- for (int i = 0; i < nalezeneKontakty.Count; i++)
- {
- ExtendedLabel novyZaznam = new ExtendedLabel();
- novyZaznam.Font = new System.Drawing.Font("Calibri", 12F);
- novyZaznam.FlatStyle = FlatStyle.Flat;
- novyZaznam.Size = new System.Drawing.Size(600, 27);
- novyZaznam.Location = new System.Drawing.Point(0, 27 * i);
- novyZaznam.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
- novyZaznam.PridruzenyTextbox = ((TextBox)sender);
- novyZaznam.Click += new EventHandler(PridatKontaktDoEmailu);
- novyZaznam.Text = nalezeneKontakty[i].Jmeno + ((string.IsNullOrEmpty(nalezeneKontakty[i].Prezdivka)) ? "" : (" \"" + nalezeneKontakty[i].Prezdivka + "\"")) + " - " + nalezeneKontakty[i].Email + "\n"; // Do popisku se přidá i přezdívka, pokud existuje.
- novyZaznam.Cursor = Cursors.Hand;
- aktualniPanel.Controls.Add(novyZaznam);
- ToolTip AddContactTooltip = new ToolTip();
- AddContactTooltip.UseFading = true;
- AddContactTooltip.UseAnimation = true;
- AddContactTooltip.ReshowDelay = 500;
- AddContactTooltip.InitialDelay = 500;
- AddContactTooltip.AutoPopDelay = 15000;
- AddContactTooltip.ShowAlways = true;
- AddContactTooltip.ToolTipIcon = ToolTipIcon.Info;
- AddContactTooltip.SetToolTip(novyZaznam, "Připojí kontakt k e-mailu.");
- // Jakmile se kurzor ocitne nad tímto textem, zvýrazní se modře. Přišlo mi zbytečné na jeden řádek kódu vytvářet metodu obsluhy události, tak jsem to vyřešil pomocí delegáta.
- novyZaznam.MouseMove += new MouseEventHandler(delegate (object senderM, MouseEventArgs eM) { novyZaznam.ForeColor = System.Drawing.SystemColors.Highlight; });
- // A opačně.
- novyZaznam.MouseLeave += new EventHandler(delegate (object senderM, EventArgs eM) { novyZaznam.ForeColor = System.Drawing.Color.Black; });
- }
- if (nalezeneKontakty.Count > 0)
- aktualniPanel.Visible = true;
- }
- else
- aktualniPanel.Visible = false;
- this.ResumeLayout(false);
- ((TextBox)sender).KeyDown += new KeyEventHandler(Textbox_KeyDown);
- }
- /// <summary>
- /// Po kliknutí přidá kontakt do e-mailu.
- /// </summary>
- private void PridatKontaktDoEmailu(object sender, EventArgs e)
- {
- // Tato šílenost dělá jen to, že do textboxu adres přidá adresu , na kterou uživatel klikne.
- ((ExtendedLabel)sender).PridruzenyTextbox.Text = ((ExtendedLabel)sender).PridruzenyTextbox.Text.Substring(0, ((ExtendedLabel)sender).PridruzenyTextbox.Text.Length -
- ((ExtendedLabel)sender).PridruzenyTextbox.Text.Split(';').Last().Length);
- ((ExtendedLabel)sender).PridruzenyTextbox.Text += ((ExtendedLabel)sender).Text.Split('-')[1].Substring(1, ((ExtendedLabel)sender).Text.Split('-')[1].Length - 2) + ";";
- ((ExtendedLabel)sender).PridruzenyTextbox.SelectionStart = ((ExtendedLabel)sender).PridruzenyTextbox.Text.Length;
- ToAdresarPanel.Visible = false;
- CcAdresarPanel.Visible = false;
- BccAdresarPanel.Visible = false;
- }
- /// <summary>
- /// Spustí asynchronní prohledávání adresáře na základě údajů v textboxu. To může být jméno, přezdívka nebo e-mail.
- /// </summary>
- /// <param name="naZakladeCeho">Na základě čeho se má začít prohledávat.</param>
- /// <returns>Nalezené kontakty.</returns>
- private async Task<List<Kontakt>> ProhledejAdresar(string naZakladeCeho)
- {
- // Tato metoda je psaná asynchronně, neboť vyhledávání kontaktů v adresáři může zabrat spoustu času a aplikace by pak nebyla responsibilní.
- List<Kontakt> nalezeneKontakty = new List<Kontakt>();
- await Task.Run(() =>
- {
- foreach (Kontakt kontakt in adresar.seznamKontaktu)
- if (kontakt.Email.Contains(naZakladeCeho, StringComparison.OrdinalIgnoreCase) || kontakt.Jmeno.Contains(naZakladeCeho, StringComparison.OrdinalIgnoreCase) || kontakt.Prezdivka.Contains(naZakladeCeho, StringComparison.OrdinalIgnoreCase))
- nalezeneKontakty.Add(kontakt);
- });
- return nalezeneKontakty;
- }
- /// <summary>
- /// Při opuštění textboxu zavře okno s návrhy kontaktů.
- /// </summary>
- private void Textbox_Leave(object sender, EventArgs e)
- {
- switch (((TextBox)sender).Name)
- {
- case "ToTextbox": ToAdresarPanel.Visible = false; ; break;
- case "CcTextbox": ToAdresarPanel.Visible = false; ; break;
- case "BccTextbox": ToAdresarPanel.Visible = false; ; break;
- default: throw new MissingMemberException();
- }
- }
- /// <summary>
- /// Rozšířený label.
- /// Použijeme ho v okénku pro napovídání kontaktů tak, že si každý label bude pamatovat, k jakému textboxu je přidružen, aby mohl zapsat adresu do správného okénka.
- /// </summary>
- private class ExtendedLabel : Label
- {
- public TextBox PridruzenyTextbox;
- public ExtendedLabel() : base() { }
- }
- /// <summary>
- /// Zobrazí uživateli skupiny, které může přidat do e-mailu.
- /// </summary>
- private void ZobrazitSkupiny_Click(object sender, EventArgs e)
- {
- // Zde určíme, kam vybrané e-mailové adrey zapíšeme.
- TextBox kamZapsat = null;
- switch (((PictureBox)sender).Name)
- {
- case "ToSkupinaButton": kamZapsat = ToTextbox; break;
- case "CcSkupinaButton": kamZapsat = CcTextbox; break;
- case "BccoSkupinaButton": kamZapsat = BccTextbox; break;
- }
- // Zde dochází k zobrazení skupinového okna a v případě úspěšného ukončení pomocí tlačítka, projde všechny zaškrtnuté skupiny a napíše je do příslušného textboxu.
- using (var form = new GroupBookForm(aktualniPrihlaseni, true))
- if (form.ShowDialog() == DialogResult.OK)
- foreach (GroupBookForm.JednaSkupina skupina in form.ovladaciPrvky)
- if (skupina.PridatSkupinuCheckbox.Checked)
- foreach (Kontakt kontakt in Utility.VypisKontaktyVeSkupine(new Adresar(aktualniPrihlaseni), skupina.skupina))
- kamZapsat.Text += string.IsNullOrWhiteSpace(kamZapsat.Text) ? kontakt.Email + ";" : ((kamZapsat.Text.Last() == ';') ? kontakt.Email : ";" + kontakt.Email);
- kamZapsat.SelectionStart = kamZapsat.Text.Length;
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net.Mail;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace Mail_Agent_2017
- {
- // Jsem si vědom toho, že tato třída obsahuje příliš mnoho důležitých věcí a může to být nepřehledné.
- // Nicméně téměř každá metoda pracuje nějakým způsobem s GUI v této třídě, takže psaní metod do nějaké vnější třídy by mohlo být ještě nepřehlednější.
- /// <summary>
- /// Odesílání emailu.
- /// </summary>
- public partial class SendForm : Form
- {
- // TO-DO: Opravdový HTML editor pro textové pole. Bohužel, s mými aktuálními znalostmi jazyka nejspíš neproveditelné.
- Prihlaseni aktualniPrihlaseni;
- MailMessage emailovaZprava;
- AttachmentForm prilohy;
- Stack<string> undoZasobnik;
- Stack<string> redoZasobnik;
- Adresar adresar;
- /// <summary>
- /// Inicializace nejdůležitějších komponent pro toto okno.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- public SendForm(Prihlaseni aktualniPrihlaseni)
- {
- InitializeComponent();
- this.Icon = BarevnyMotiv.ikona;
- this.redoZasobnik = new Stack<string>();
- this.undoZasobnik = new Stack<string>();
- this.aktualniPrihlaseni = aktualniPrihlaseni;
- this.emailovaZprava = new MailMessage();
- this.prilohy = new AttachmentForm();
- UndoTimer.Enabled = true;
- this.undoZasobnik.Push("");
- this.adresar = new Adresar(aktualniPrihlaseni);
- // Barvy tlačítek se nastavují zde, neboť se při každé změně designeru přenastavují a je otrava je neustále nastavovat znovu.
- this.SendButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.NahledButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.KonceptButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.DeleteButton.BackColor = BarevnyMotiv.barvaTlacitek;
- this.PrilohyButton.BackColor = BarevnyMotiv.barvaTlacitek;
- }
- /// <summary>
- /// Otevře okno na odeslání e-mailu a předvyplní okno na základě údajů v e-mailové zprávě.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="email">E-mailová zpráva.</param>
- /// <param name="volba">True, pokud odpovědět. False, pokud přeposlat.</param> // Toto do budoucna předělat pomocí enumu, aby to bylo hezčí.
- public SendForm(Prihlaseni aktualniPrihlaseni, ImapX.Message email, bool volba) : this(aktualniPrihlaseni, email)
- {
- if (volba)
- {
- this.prilohy = new AttachmentForm();
- ToTextbox.Text = email.From.Address;
- foreach (var addr in email.Cc) CcTextbox.Text += (!string.IsNullOrEmpty(CcTextbox.Text) ? ";" : "") + addr.Address;
- foreach (var addr in email.Bcc) BccTextbox.Text += (!string.IsNullOrEmpty(BccTextbox.Text) ? ";" : "") + addr.Address;
- SubjectTextbox.Text = "Re: " + email.Subject;
- }
- else
- {
- ToTextbox.Text = "";
- SubjectTextbox.Text = "Fwd: " + email.Subject;
- }
- TextTextarea.Text = "\n\n\n\nPůvodní zpráva od " + (!string.IsNullOrEmpty(email.From.DisplayName) ? email.From.DisplayName + " (" + email.From.Address + ")" : email.From.Address) + " z " +
- (email.Date.Value.Day.ToString().Length == 1 ? "0" : "") + email.Date.Value.Day + "." + (email.Date.Value.Month.ToString().Length == 1 ? "0" : "") + email.Date.Value.Month + "." + email.Date.Value.Year + " " +
- (email.Date.Value.Hour.ToString().Length == 1 ? "0" : "") + email.Date.Value.Hour + ":" + (email.Date.Value.Minute.ToString().Length == 1 ? "0" : "") + email.Date.Value.Minute + ":" + (email.Date.Value.Second.ToString().Length == 1 ? "0" : "") + email.Date.Value.Second + "\n\n";
- if (!email.Body.HasText)
- {
- TextTextarea.Text += email.Body.Html;
- HtmlCheckbox.Checked = true;
- }
- else
- foreach (var radka in email.Body.Text.ToString().Split('\n'))
- TextTextarea.Text += ">" + radka + "\n";
- }
- /// <summary>
- /// Otevře okno s možností editace konceptu.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="email">E-mailová zpráva.</param>
- public SendForm(Prihlaseni aktualniPrihlaseni, ImapX.Message email) : this(aktualniPrihlaseni)
- {
- foreach (var addr in email.To) ToTextbox.Text += (!string.IsNullOrEmpty(ToTextbox.Text) ? ";" : "") + addr.Address;
- foreach (var addr in email.Cc) CcTextbox.Text += (!string.IsNullOrEmpty(CcTextbox.Text) ? ";" : "") + addr.Address;
- foreach (var addr in email.Bcc) BccTextbox.Text += (!string.IsNullOrEmpty(BccTextbox.Text) ? ";" : "") + addr.Address;
- SubjectTextbox.Text = email.Subject != null ? email.Subject : "";
- TextTextarea.Text = email.Body.Text;
- if (email.Attachments.Count() > 0)
- {
- this.prilohy.OdstranExistujiciPrilohu(0);
- foreach (var priloha in email.Attachments)
- this.prilohy.InicializujNovouPrilohu(priloha);
- this.prilohy.InicializujNovouPrilohu(null);
- }
- }
- /// <summary>
- /// Otevře okno na odeslání e-mailu a předvyplní okno adresou adresáta.
- /// </summary>
- /// <param name="aktualniPrihlaseni">Aktuální přihlášení.</param>
- /// <param name="email">E-mailová adresa příjemce.</param>
- public SendForm(Prihlaseni aktualniPrihlaseni, string email) : this(aktualniPrihlaseni)
- {
- ToTextbox.Text = email;
- }
- /// <summary>
- /// Tlačítko, které smaže obsah všech formulářů.
- /// </summary>
- private void DeleteButton_Click(object sender, EventArgs e)
- {
- if (MessageBox.Show("Opravdu chcete smazat veškerý obsah e-mailu?", "Smazat veškerý obsah", MessageBoxButtons.YesNo) == DialogResult.Yes)
- {
- ToTextbox.Text = "";
- CcTextbox.Text = "";
- BccTextbox.Text = "";
- SubjectTextbox.Text = "";
- TextTextarea.Text = "";
- PrilohaLabel.Text = "";
- prilohy = new AttachmentForm();
- }
- }
- /// <summary>
- /// Tlačítko spravující veškeré dění ohledně příloh.
- /// </summary>
- private void PrilohyButton_Click(object sender, EventArgs e)
- {
- prilohy.ShowDialog();
- // Počet přiložených souborů musíme řešit takto "složitě", neboť v seznamu příloh je poslední příloha neinicializovaná.
- // Je tam prázdné pole pro vložení nové přílohy, tedy až na případ, kdy je příloh 10. Pak je celý seznam obsazen přílohami.
- var pocetSouboru = (prilohy.seznamPriloh.Last().label.Text != "...") ? prilohy.seznamPriloh.Count.ToString() : (prilohy.seznamPriloh.Count - 1).ToString();
- // Podmínku pro if vymyslíme podobně. V této části se zapisuje do labelu na odesílací obrazovce, aby byl uživatel "v obraze" ohledně počtu příloh.
- if ((prilohy.seznamPriloh.Last().label.Text != "...") ? true : prilohy.seznamPriloh.Count - 1 > 0)
- // Čeština je "krásná" řeč.
- switch (pocetSouboru)
- {
- case "1": PrilohaLabel.Text = "K e-mailu je momentálně přiložen 1 soubor."; break;
- case "2": case "3": case "4": PrilohaLabel.Text = "K e-mailu jsou momentálně přiloženy " + pocetSouboru + " soubory."; break;
- default: PrilohaLabel.Text = "K e-mailu je momentálně přiloženo " + pocetSouboru + " souborů."; break;
- }
- else
- PrilohaLabel.Text = "";
- }
- /// <summary>
- /// Umožní uživateli psát email v jazyce HTML 5. Poskytuje mu k tomu drobné utility, de facto usnadnění.
- /// </summary>
- private void HtmlCheckbox_CheckedChanged(object sender, EventArgs e)
- {
- if (HtmlCheckbox.Checked)
- MessageBox.Show("Zvažte použití HTML prvků ve svém e-mailu. E-mailový klient Vašeho adresáta nemusí tuto možnost podporovat.");
- emailovaZprava.IsBodyHtml = HtmlCheckbox.Checked;
- NahledButton.Visible = HtmlCheckbox.Checked;
- BoldButton.Visible = HtmlCheckbox.Checked;
- ItalicButton.Visible = HtmlCheckbox.Checked;
- UnderlineButton.Visible = HtmlCheckbox.Checked;
- FontButton.Visible = HtmlCheckbox.Checked;
- FontColorButton.Visible = HtmlCheckbox.Checked;
- LeftAlignmentButton.Visible = HtmlCheckbox.Checked;
- CenterAlignmentButton.Visible = HtmlCheckbox.Checked;
- RightAlignmentButton.Visible = HtmlCheckbox.Checked;
- HyperlinkButton.Visible = HtmlCheckbox.Checked;
- ImageButton.Visible = HtmlCheckbox.Checked;
- }
- /// <summary>
- /// Zobrazí náhled HTML kódu.
- /// </summary>
- private void NahledButton_Click(object sender, EventArgs e)
- {
- new HtmlPreviewForm(TextTextarea.Text).ShowDialog();
- }
- /// <summary>
- /// Odešle e-mail na dané adresy z uživatelova e-mailu. Kontroluje chyby a nedostatky, které mohly vzniknout při psaní zprávy.
- /// Deklarováno jako asynchronní metoda, aby při posílání e-mailu neblokovala GUI. E-mail pošleme asynchronně na novém vlákně, tato možnost je implementována přímo v .NET.
- /// Také se stará o ukládání konceptů.
- /// </summary>
- private async void SendButton_Click(object sender, EventArgs e)
- {
- try
- {
- // Nejdříve zkontrolujeme, jestli mají e-mailové adresy správný formát.
- if (string.IsNullOrEmpty(ToTextbox.Text))
- throw new SpatneVyplnenyAdresatException("Musíte vyplnit alespoň jednoho adresáta.");
- foreach (string adresa in ToTextbox.Text.Split(';')) if (!string.IsNullOrEmpty(adresa))
- if (Utility.SpravnyFormatAdresy(adresa))
- emailovaZprava.To.Add(adresa);
- else
- throw new SpatneVyplnenyAdresatException("E-mailová adresa má nesprávný formát.");
- if (!string.IsNullOrEmpty(CcTextbox.Text)) foreach (string adresa in CcTextbox.Text.Split(';')) if (!string.IsNullOrEmpty(adresa))
- if (Utility.SpravnyFormatAdresy(adresa))
- emailovaZprava.CC.Add(adresa);
- else
- throw new SpatneVyplnenyAdresatException("E-mailová adresa má nesprávný formát.");
- if(!string.IsNullOrEmpty(BccTextbox.Text)) foreach (string adresa in BccTextbox.Text.Split(';')) if (!string.IsNullOrEmpty(adresa))
- if (Utility.SpravnyFormatAdresy(adresa))
- emailovaZprava.Bcc.Add(adresa);
- else
- throw new SpatneVyplnenyAdresatException("E-mailová adresa má nesprávný formát.");
- emailovaZprava.Subject = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(SubjectTextbox.Text)));
- // Pokud se jedná o HTML zprávu, zaměnímě newliny za HTML tag <br>.
- emailovaZprava.Body = (emailovaZprava.IsBodyHtml) ? TextTextarea.Text.Replace("\n", "<br>") : TextTextarea.Text;
- }
- catch (Exception ex)
- {
- ChyboveOknoLabel.ForeColor = System.Drawing.Color.Red;
- if (ex is SpatneVyplnenyAdresatException)
- {
- ChyboveOknoLabel.Show();
- ChyboveOknoLabel.Text = ex.Message;
- ZobrazeniChybyTimer.Enabled = true;
- return;
- }
- else if (ex is EmailBezPredmetuException || ex is EmailBezTextuException)
- { return; }
- else MessageBox.Show(ex.Message); // Upřímně řečeno si momentálně nejsem vůbec jistý, jestli může nastat nějaká jiná výjimka.
- }
- // Přidáme adresu odesílatele - tedy sebe.
- emailovaZprava.From = new MailAddress(aktualniPrihlaseni.Email, aktualniPrihlaseni.Jmeno, Encoding.Unicode);
- // Přidáme k e-mailu přílohy, pokud existují.
- foreach (var priloha in (prilohy.seznamPriloh.Last().label.Text != "...") ? prilohy.seznamPriloh : prilohy.seznamPriloh.GetRange(0, prilohy.seznamPriloh.Count - 1))
- {
- if (priloha.priloha == null)
- emailovaZprava.Attachments.Add(new Attachment(priloha.soubor.FileName)); // Výjimka by nastat neměla, neboť máme cesty k souborům uloženy v OpenFileDialog objektu.
- else
- {
- try { emailovaZprava.Attachments.Add(new Attachment(new System.IO.MemoryStream(priloha.priloha.FileData), priloha.priloha.FileName)); }
- catch { }
- }
- }
- // Pokud se jednalo pouze o koncept, uložíme ho a nic dalšího podnikat nebudeme.
- if (((Button)sender).Name == "KonceptButton")
- {
- await Task.Run(() => aktualniPrihlaseni.ImapPripojeni.Folders.Drafts.AppendMessage(emailovaZprava));
- MessageBox.Show("Koncept byl úspěšně uložen.");
- ChyboveOknoLabel.Show();
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.ForeColor = System.Drawing.Color.Black;
- ChyboveOknoLabel.Text = "Koncept byl úspěšně uložen.";
- this.DialogResult = DialogResult.OK;
- return;
- }
- try
- {
- // Optáme se uživatele, jestli chce opravdu odeslat email bez předmětu.
- if (string.IsNullOrEmpty(SubjectTextbox.Text) && MessageBox.Show("Opravdu chcete odeslat e-mail bez předmětu?", "Nebyl vyplněn předmět e-mailu.", MessageBoxButtons.YesNo) == DialogResult.No)
- throw new EmailBezPredmetuException();
- // Optáme se uživatele, jestli chce opravdu odeslat prázdný email.
- if (string.IsNullOrEmpty(TextTextarea.Text) && MessageBox.Show("Opravdu chcete odeslat prázdný e-mail?", "Nebyl vyplněn žádný text.", MessageBoxButtons.YesNo) == DialogResult.No)
- throw new EmailBezTextuException();
- }
- catch (Exception ex)
- {
- if (ex is EmailBezTextuException || ex is EmailBezPredmetuException)
- return;
- }
- try
- {
- // Zapneme blikající tečky a pro jistotu vypneme timer na hlášení chyby, kdyby byl náhodou aktivní, tak ať to nedělá nesmysly.
- ChyboveOknoLabel.Show();
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.Text = ""; ChyboveOknoLabel.ForeColor = System.Drawing.Color.Black;
- NacitaniTimer.Enabled = true;
- // Počkáme na pracovní vlákno, které za nás odešle e-mail, abychom zbytečně neblokovali UI.
- await aktualniPrihlaseni.SmtpPripojeni.SendMailAsync(emailovaZprava);
- }
- // Nevím, jestli asynchronní odesílání e-mailu může v našem případě vyvolat nějakou výjimku, ale pár řádek kódu navíc neuškodí.
- catch
- {
- ChyboveOknoLabel.Text = "Zprávu se nepodařilo odeslat.";
- ChyboveOknoLabel.ForeColor = System.Drawing.Color.Red;
- NacitaniTimer.Enabled = false;
- ZobrazeniChybyTimer.Enabled = true;
- return;
- }
- NacitaniTimer.Enabled = false;
- aktualniPrihlaseni.ImapPripojeni.Folders.Sent.AppendMessage(emailovaZprava); // Po úspěšném odeslání přidáme odeslanou zprávu na IMAP server do složky odeslaných e-mailů, neboť nám to bylo porazeno v dokumentaci knihovny ImapX.
- MessageBox.Show("Zpráva byla úspěšně odeslána.");
- ChyboveOknoLabel.Text = "Zpráva byla úspěšně odeslána.";
- this.DialogResult = DialogResult.OK;
- }
- /// <summary>
- /// Skryje chybovou hlášku po uplynutí deseti sekund.
- /// </summary>
- private void ZobrazeniChybyTimer_Tick(object sender, EventArgs e)
- {
- ZobrazeniChybyTimer.Enabled = false;
- ChyboveOknoLabel.Hide();
- ChyboveOknoLabel.ForeColor = System.Drawing.Color.Black;
- }
- /// <summary>
- /// Metoda pro efekt, zobrazuje efekt blikajících teček při přihlašování.
- /// </summary>
- private void NacitaniTimer_Tick(object sender, EventArgs e)
- {
- if (ChyboveOknoLabel.Text.Length >= 71 || ChyboveOknoLabel.Text.Length == 0)
- ChyboveOknoLabel.Text = "Počkejte, prosím. Toto může chvíli trvat. Probíhá odesílání e-mailu ";
- else
- ChyboveOknoLabel.Text += ".";
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Windows.Forms;
- // V tomto souboru jsou implementovány pomocná tlačítka, která slouží k editaci e-mailové zprávy a další komponenty spadající pod toto okno.
- // Ačkoliv se jedná o tutéž třídu, je kód v tomto souboru, abychom nepřetěžovali soubor SendForm.cs, kde jsou nejdůležitější komponenty této třídy.
- namespace Mail_Agent_2017
- {
- public partial class SendForm
- {
- #region Implementace obsluh tlačítek usnadňující HTML zadávání.
- // Není to optimální, ale kdybych to chtěl dělat přesně dle svých představ, programoval bych spíš HTML editor než e-mailového klienta.
- private void DekoraceButton_Click(object sender, EventArgs e)
- {
- int start = TextTextarea.SelectionStart;
- switch (((Button)sender).Name)
- {
- case "BoldButton": TextTextarea.Text = TextTextarea.Text.Insert(TextTextarea.SelectionStart, "<b></b>"); break;
- case "ItalicButton": TextTextarea.Text = TextTextarea.Text.Insert(TextTextarea.SelectionStart, "<i></i>"); break;
- case "UnderlineButton": TextTextarea.Text = TextTextarea.Text.Insert(TextTextarea.SelectionStart, "<u></u>"); break;
- }
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + 3;
- }
- private void FontButton_Click(object sender, EventArgs e)
- {
- // Na font se uživatele zeptáme pomocí font dialogu.
- FontDialog font = new FontDialog();
- font.ShowEffects = false;
- if (font.ShowDialog() == DialogResult.OK)
- {
- int start = TextTextarea.SelectionStart;
- string fontToHtml = "<span style = \"font-family: " + font.Font.ToString().Split('=')[1].Split(',')[0] + "; font-size: " + font.Font.ToString().Split('=')[2].Split(',')[0] + "px;\">";
- TextTextarea.Text = TextTextarea.Text.Insert(start, fontToHtml + "</span>");
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + fontToHtml.Length;
- }
- }
- private void FontColorButton_Click(object sender, EventArgs e)
- {
- // Na barvu se uživatele zeptáme pomocí color dialogu.
- ColorDialog barva = new ColorDialog();
- barva.AllowFullOpen = true;
- if (barva.ShowDialog() == DialogResult.OK)
- {
- int start = TextTextarea.SelectionStart;
- string barvaToHtml = "<span style = \"color: rgb(" + barva.Color.R + ", " + barva.Color.G + ", " + barva.Color.B + ");\">";
- TextTextarea.Text = TextTextarea.Text.Insert(start, barvaToHtml + "</span>");
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + barvaToHtml.Length;
- }
- }
- private void AlignmentButton_Click(object sender, EventArgs e)
- {
- int start = TextTextarea.SelectionStart;
- switch (((Button)sender).Name)
- {
- case "LeftAlignmentButton":
- TextTextarea.Text = TextTextarea.Text.Insert(start, "<div style=\"text-align: left;\"></div>");
- start += 31;
- break;
- case "RightAlignmentButton":
- TextTextarea.Text = TextTextarea.Text.Insert(start, "<div style=\"text-align: right;\"></div>");
- start += 32;
- break;
- case "CenterAlignmentButton":
- TextTextarea.Text = TextTextarea.Text.Insert(start, "<div style=\"text-align: center;\"></div>");
- start += 33;
- break;
- }
- TextTextarea.SelectionStart = start;
- TextTextarea.Focus();
- }
- private void HyperlinkButton_Click(object sender, EventArgs e)
- {
- string odkaz;
- string popisek;
- try
- {
- if ((odkaz = new Prompt().ShowDialog("Vložte odkaz", "Mail Agent 2017 - Vložit hypertextový odkaz", -1)) == null)
- throw new ChybneZadaniException();
- if ((popisek = new Prompt().ShowDialog("Vložte popisek odkazu", "Mail Agent 2017 - Vložit hypertextový odkaz", -1)) == null)
- throw new ChybneZadaniException();
- }
- catch
- { return; }
- int start = TextTextarea.SelectionStart;
- string odkazToHtml = "<a href = \"" + odkaz + "\">" + popisek + "</a>";
- TextTextarea.Text = TextTextarea.Text.Insert(start, odkazToHtml);
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + odkazToHtml.Length;
- }
- private void ImageButton_Click(object sender, EventArgs e)
- {
- string odkaz;
- try
- {
- if ((odkaz = new Prompt().ShowDialog("Vložte odkaz na obrázek", "Mail Agent 2017 - Vložit obrázek", -1)) == null)
- throw new ChybneZadaniException();
- }
- catch
- { return; }
- int start = TextTextarea.SelectionStart;
- string obrazekToHtml = "<img src = \"" + odkaz + "\">";
- TextTextarea.Text = TextTextarea.Text.Insert(start, obrazekToHtml);
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + obrazekToHtml.Length;
- }
- private void CopyButton_Click(object sender, EventArgs e)
- {
- Clipboard.SetText(TextTextarea.Text.Substring(TextTextarea.SelectionStart, TextTextarea.SelectionLength));
- TextTextarea.Focus();
- }
- private void PasteButton_Click(object sender, EventArgs e)
- {
- int start = TextTextarea.SelectionStart;
- TextTextarea.Text = TextTextarea.Text.Insert(start, Clipboard.GetText());
- TextTextarea.Focus();
- TextTextarea.SelectionStart = start + Clipboard.GetText().Length;
- }
- #endregion
- #region Implementace tlačítek zpět a vpřed.
- /*
- * Tlačítka si implementujeme po svém, aby splňovaly to, co od nich chceme.
- * Uděláme to tak, že každých 15 vteřin se uloží aktuální text na undo zásobník, pokud došlo ke změně.
- * Pří stisknutí tlačítka zpět se vždy do textboxu popne poslední záznam na zásobníku a aktuální stav se uloží na redo zásobník.
- * V případě provedení změny po undo se redo zásobník vymaže.
- */
- private void UndoButton_Click(object sender, EventArgs e)
- {
- if (undoZasobnik.Count > 0)
- {
- redoZasobnik.Push(TextTextarea.Text);
- TextTextarea.Text = undoZasobnik.Pop();
- }
- TextTextarea.Focus();
- }
- private void RedoButton_Click(object sender, EventArgs e)
- {
- if (redoZasobnik.Count > 0)
- {
- undoZasobnik.Push(TextTextarea.Text);
- TextTextarea.Text = redoZasobnik.Pop();
- }
- TextTextarea.Focus();
- }
- private void UndoTimer_Tick(object sender, EventArgs e)
- {
- // Pokud nedošlo od posledního ticku ke změně, nemá smysl pushovat na zásobník stejnou hodnotu.
- if ((TextTextarea.Text != null || undoZasobnik.Last() != TextTextarea.Text) && redoZasobnik.Count == 0)
- undoZasobnik.Push(TextTextarea.Text);
- }
- private void TextTextarea_KeyDown(object sender, KeyEventArgs e)
- {
- if (redoZasobnik.Count > 0)
- {
- redoZasobnik = new Stack<string>(); // Preventivně smažeme redo zásobník, jelikož po kroku zpět a následné změně se už "vpřed vrátit nemůžeme".
- if (TextTextarea.Text != null || undoZasobnik.First() != TextTextarea.Text)
- undoZasobnik.Push(TextTextarea.Text);
- }
- }
- #endregion
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Mail_Agent_2017
- {
- /// <summary>
- /// Definice výjimky pro nevyplněný předmět.
- /// </summary>
- public class EmailBezPredmetuException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public EmailBezPredmetuException() : base() { }
- }
- /// <summary>
- /// Definice výjimky pro prázdný text.
- /// </summary>
- public class EmailBezTextuException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public EmailBezTextuException() : base() { }
- }
- /// <summary>
- /// Definice výjimky pro chybně vyplněné adresáty.
- /// </summary>
- public class SpatneVyplnenyAdresatException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public SpatneVyplnenyAdresatException(string message) : base(message) { }
- }
- /// <summary>
- /// Výjimka, která je vyvolaná při chybě při navazování spojení se SMTP serverem.
- /// </summary>
- public class SmtpConnectFailException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public SmtpConnectFailException(string message) : base(message) { }
- }
- /// <summary>
- /// Výjimka, která je vyvolaná, když uživatel zadá chybné heslo.
- /// </summary>
- public class SpatneHesloException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public SpatneHesloException(string message) : base(message) { }
- }
- /// <summary>
- /// Výjimka, která je vyvolaná při chybě při navazování spojení s IMAP serverem.
- /// </summary>
- public class ImapConnectFailException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public ImapConnectFailException(string message) : base(message) { }
- }
- /// <summary>
- /// Výjimka, která je vyvolána při chybném vyplnění formuláře.
- /// </summary>
- public class ChybneZadaniException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public ChybneZadaniException(string message) : base(message) { }
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public ChybneZadaniException() : base() { }
- }
- /// <summary>
- /// Definice výjimky potřebné pro okno příloh.
- /// </summary>
- public class PrilisMnohoPrilohException : Exception
- {
- /// <summary>
- /// Klasický konstruktor pro výjimku, volá konstruktor otce.
- /// </summary>
- public PrilisMnohoPrilohException(string message) : base(message) { }
- }
- }
Add Comment
Please, Sign In to add comment