Mini Kabibi Habibi

Current Path : C:/Users/Public/Documents/DXperience 13.1 Demos/WinForms/CS/PhotoViewer.MDI/
Upload File :
Current File : C:/Users/Public/Documents/DXperience 13.1 Demos/WinForms/CS/PhotoViewer.MDI/MainForm.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
using DevExpress.LookAndFeel;
using DevExpress.Skins;
using DevExpress.XtraBars;
using DevExpress.XtraBars.Docking2010.Views;
using DevExpress.XtraBars.Helpers;
using DevExpress.XtraBars.Ribbon;
using DevExpress.XtraEditors;
using DevExpress.XtraNavBar;
using DevExpress.XtraNavBar.ViewInfo;
using DevExpress.XtraSplashScreen;
using PhotoViewer.Data;

namespace PhotoViewer {
    public partial class MainForm : RibbonForm {
        internal int lockParentRibbonPageChanged = 0;
        public static Size HoverSkinImageSize = new Size(116, 86);
        public static Size SkinImageSize = new Size(58, 43);
        public MainForm() {
            InitializeComponent();
            mainRibbon.MdiMergeStyle = RibbonMdiMergeStyle.Always;
            InitSkins();
            SelectDefaultPage();
            LoadData();
            UpdateItemsEnabledState();
            UpdateAddToLibraryItem(biAddFolder);
            tabbedView.DocumentAdded += tabbedView_DocumentAdded;
            tabbedView.DocumentRemoved += tabbedView_DocumentRemoved;
            tabbedView.FloatDocuments.CollectionChanged += tabbedView_FloatDocumentsCollectionChanged;
        }
        protected override void OnLoad(EventArgs e) {
            base.OnLoad(e);
            foreach(AlbumData album in ViewData.Albums)
                OpenAlbum(album);
            SplashScreenManager.CloseForm();
        }
        protected internal void UpdateSelectedPictureEdit(string fileName) {
            selectedPictureEdit.LoadAsync(fileName);
        }
        PhotoViewerData viewData;
        PhotoViewerDataController viewDataController;
        NavBarGroup lastSelectedGroup;
        protected PhotoViewerData ViewData {
            [System.Diagnostics.DebuggerStepThrough]
            get {
                if(viewData == null)
                    viewData = new PhotoViewerData();
                return viewData;
            }
        }
        protected PhotoViewerDataController DataController {
            [System.Diagnostics.DebuggerStepThrough]
            get {
                if(viewDataController == null)
                    viewDataController = new PhotoViewerDataController(ViewData);
                return viewDataController;
            }
        }
        protected AlbumData SelectedAlbum {
            get {
                AlbumData album = CustomizableLink == null ? null : CustomizableLink.Item.Tag as AlbumData;
                if(album == null)
                    album = albumGroup.SelectedLink == null ? null : (AlbumData)albumGroup.SelectedLink.Item.Tag;
                return album;
            }
        }
        void SaveData() {
            DataController.SaveData();
        }
        void LoadData() {
            DataController.LoadData();
            InitNavBar();
        }
        protected void UpdateData() { 
            UpdateData(false); 
        }
        protected internal void UpdateData(bool onlyAlbums) {
            SaveData();
            InitNavBar(onlyAlbums);
        }
        void InitSkins() {
            SkinHelper.InitSkinGallery(skinGalleryBarItem, true);
            UserLookAndFeel.Default.SetSkinStyle("DevExpress Style");
        }
        void InitNavBar() { 
            InitNavBar(false); 
        }
        void InitNavBar(bool onlyAlbums) {
            navBar.SelectedLink = null;
            foreach(NavBarGroup group in navBar.Groups) {
                if(onlyAlbums && group != albumGroup)
                    continue;
                for(int i = group.ItemLinks.Count - 1; i >= 0; i--) {
                    navBar.Items.Remove(group.ItemLinks[i].Item);
                }
            }
            navBar.BeginUpdate();
            try {
                foreach(AlbumData album in ViewData.Albums) {
                    NavBarItem item = CreateAlbumItem(album);
                    navBar.Items.Add(item);
                    albumGroup.ItemLinks.Add(item);
                }
                if(onlyAlbums)
                    return;
                foreach(PathData folder in ViewData.Folders) {
                    NavBarItem item = CreateFolderItem(folder);
                    if(item != null) {
                        navBar.Items.Add(item);
                        foldersGroup.ItemLinks.Add(item);
                    }
                }
                foreach(PathData file in ViewData.Others.Files) {
                    NavBarItem item = CreateFolderItem(file);
                    if(item != null) {
                        navBar.Items.Add(item);
                        othersGroup.ItemLinks.Add(item);
                    }
                }
            }
            finally { navBar.EndUpdate(); }
            if(navBar.Items.Count > 0)
                navBar.SelectedLink = navBar.Items[0].Links[0];
        }
        void SelectDefaultPage() {
            mainRibbon.SelectedPage = imagePage;
        }
        NavBarItem CreateFolderItem(PathData folder) {
            NavBarItem item = new NavBarItem();
            item.Caption = folder.Name;
            item.Hint = folder.Path;
            item.Tag = folder;
            item.LinkClicked += new NavBarLinkEventHandler(OnFolderLinkClicked);
            return item;
        }
        NavBarItem CreateAlbumItem(AlbumData album) {
            NavBarItem item = new NavBarItem();
            item.Caption = album.Name;
            item.Hint = album.Description;
            item.Tag = album;
            item.LinkClicked += new NavBarLinkEventHandler(OnAlbumLinkClicked);
            return item;
        }
        protected virtual void CreateThumbForFiles(List<string> files, string progressText) {
            ProgressForm pf = new ProgressForm();
            pf.ProgressControl.Maximum = files.Count;
            pf.ProgressControl.ProgressText = progressText;
            pf.Show(this);
            foreach(string fileName in files) {
                CreateThumbForFile(fileName);
                pf.ProgressControl.Value++;
                Application.DoEvents();
            }
            pf.Close();
        }
        protected virtual void CreateThumbForFile(string fileName) {
            Image img = ThumbnailHelper.Default.GetThumbnail(fileName, 208, DataController.ThumbPath);
            if(img != null)
                img.Dispose();
        }
        protected virtual void CreateThumbsForFolder(PathData folder) {
            CreateThumbForFiles(DataController.GetImagesInFolder(folder), "Processing folder");
        }
        void OnFolderLinkClicked(object sender, NavBarLinkEventArgs e) {
            if(e.Link.Group == othersGroup)
                OpenOthers(e.Link.Item.Tag as PathData);
            else OpenFolder(e.Link.Item.Tag as PathData);
        }
        void OnAlbumLinkClicked(object sender, NavBarLinkEventArgs e) {
            OpenAlbum(e.Link.Item.Tag as AlbumData);
        }
        void OnFormClosing(object sender, FormClosingEventArgs e) {
            SaveData();
        }
        void OnExitButtonClick(object sender, EventArgs e) {
            if(XtraMessageBox.Show(this, "Exit Application?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) {
                Close();
            }
        }
        void OnNewAlbumItemClick(object sender, ItemClickEventArgs e) {
            AddAlbum();
        }
        void OnAddFolderItemClick(object sender, ItemClickEventArgs e) {
            if(folderBrowserDialog1.ShowDialog() == DialogResult.OK) {
                if(!DataController.IsFolderAdded(folderBrowserDialog1.SelectedPath)) {
                    PathData p = new PathData();
                    p.Name = Path.GetFileName(folderBrowserDialog1.SelectedPath);
                    p.Path = folderBrowserDialog1.SelectedPath;
                    ViewData.Folders.Add(p);
                    CreateThumbsForFolder(p);
                    UpdateData();
                    navBar.SelectedLink = GetLink(p);
                }
                UpdateAddToLibraryItem(e.Item);
            }
        }
        private NavBarItemLink GetLink(string fileName) {
            foreach(NavBarItemLink link in othersGroup.ItemLinks) {
                if(((PathData)link.Item.Tag).Path == fileName)
                    return link;
            }
            return null;
        }
        private NavBarItemLink GetLinkByTag(NavBarGroup group, object tag) {
            foreach(NavBarItemLink link in group.ItemLinks) {
                if(link.Item.Tag == tag)
                    return link;
            }
            return null;
        }
        private NavBarItemLink GetLink(AlbumData album) {
            return GetLinkByTag(albumGroup, album);
        }
        private NavBarItemLink GetLink(PathData path) {
            return GetLinkByTag(foldersGroup, path);
        }
        private void OnAddFileClick(object sender, ItemClickEventArgs e) {
            if(imageDialog.ShowDialog() == DialogResult.OK) {
                DataController.AddToOthers(imageDialog.FileNames, this);
                CreateThumbForFiles(new List<string>(imageDialog.FileNames), "Processing files");
                UpdateData();
                string lastFileName = ViewData.Others.Files[ViewData.Others.Files.Count - 1].Name;
                navBar.SelectedLink = GetLink(lastFileName);
            }
            UpdateAddToLibraryItem(e.Item);
        }
        void OnNavBarControl1SelectedLinkChanged(object sender, NavBarSelectedLinkChangedEventArgs e) {
            lastSelectedGroup = e.Group;
        }
        void OnNavBarControl1MouseDown(object sender, MouseEventArgs e) {
            if(e.Button == MouseButtons.Right) 
                ShowContextMenu(e.Location);
        }
        void ShowContextMenu(Point pt) {
            NavBarHitInfo hi = navBar.GetViewInfo().CalcHitInfo(pt);
            if(hi.Link == null) {
                mainRibbon.Manager.SetPopupContextMenu(navBar, null);
                return;
            }
            customizableLinkCore = hi.Link;
            if(hi.Group == albumGroup)
                mainRibbon.Manager.SetPopupContextMenu(navBar, albumPopupMenu);
            if(hi.Group == foldersGroup)
                mainRibbon.Manager.SetPopupContextMenu(navBar, folderPopupMenu);
            if(hi.Group == othersGroup)
                mainRibbon.Manager.SetPopupContextMenu(navBar, null);
        }
        void OnAboutItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) {
            DevExpress.Utils.About.AboutForm.Show(new DevExpress.Utils.About.ProductInfo(string.Empty, typeof(MainForm), DevExpress.Utils.About.ProductKind.DXperienceWin, DevExpress.Utils.About.ProductInfoStage.Registered));
        }
        void OnSaveImageItemClick(object sender, ItemClickEventArgs e) {
            XtraMessageBox.Show(this, "SaveImageItemClick", "PhotoViewer", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        void OnRibbonControlSelectedPageChanged(object sender, EventArgs e) {
            if(tabbedView.ActiveDocument != null) {
                GalleryForm galleryForm = tabbedView.ActiveDocument.Form as GalleryForm;
                if(galleryForm != null)
                    galleryForm.OnParentRibbonControlSelectedPageChanged();
            }
        }
        void OnAddToLibraryItemClick(object sender, ItemClickEventArgs e) {
            BarItem item = biAddToLibrary.Tag as BarItem;
            if(item != null)
                item.PerformClick();
        }
        void OnGenerateDataItemClick(object sender, ItemClickEventArgs e) {
            if(XtraMessageBox.Show(this, "Are you sure you want generate data? Current data will be lost.", Text, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) != DialogResult.Yes)
                return;
            GenerateSampleData();
        }
        void AddAlbum() {
            AlbumData newAlbum = DataController.AddNewAlbum(this);
            if(newAlbum != null) {
                UpdateData(true);
                navBar.SelectedLink = GetLink(newAlbum);
            }
        }
        void EditAlbum(AlbumData album) {
            AlbumPropertiesForm.EditAlbum(DataController, album, this);
            BaseDocument document = null;
            if(Documents.TryGetValue(album, out document)) {
                document.Caption = album.Name;
                tabbedView.Controller.Activate(document);
            }
            UpdateData(true);
        }
        void RemoveAlbum(AlbumData album) {
            if(DataController.RemoveAlbum(album, this)) {
                CloseAlbum(album);
                UpdateData();
            }
        }
        void RemoveFolder(PathData folder) {
            if(DataController.RemoveFolder(folder, this)) {
                CloseFolder(folder);
                UpdateData();
            }
        }
        void UpdateAlbumButtonsEnabledState() {
            biEditAlbum.Enabled = SelectedAlbum != null;
            biRemoveAlbum.Enabled = SelectedAlbum != null;
        }
        void UpdateSelectedPictureEdit(GalleryItemEventArgs e) {
            selectedPictureEdit.LoadAsync((string)e.Item.Tag);
        }
        private void UpdateItemsEnabledState() {
            UpdateAlbumButtonsEnabledState();
            UpdateCancelButtonEnabledState();
        }
        void UpdateAddToLibraryItem(BarItem item) {
            biAddToLibrary.Glyph = item.Glyph;
            biAddToLibrary.LargeGlyph = item.LargeGlyph;
            biAddToLibrary.SuperTip = item.SuperTip;
            biAddToLibrary.Hint = item.Hint;
            biAddToLibrary.Tag = item;
        }
        void GenerateSampleData() {
            ViewData.FirstRun = true;
            DataController.GenerateSampleData();
            UpdateData();
        }
        internal void UpdateCancelButtonEnabledState() {
            foreach(BaseDocument document in Documents.Values) {
                GalleryForm galleryForm = document.Form as GalleryForm;
                if(galleryForm != null)
                    galleryForm.UpdateCancelButtonEnabledState();
            }
        }
        void OnDateFilterSelectionChanged(object sender, EventArgs e) {
            foreach(BaseDocument document in Documents.Values) {
                GalleryForm galleryForm = document.Form as GalleryForm;
                if(galleryForm != null)
                    galleryForm.FilterGallery(dateFilter.AllowFilter, dateFilter.StartDate, dateFilter.EndDate);
            }
        }
        #region Documents
        IDictionary<object, BaseDocument> documentsCore = new Dictionary<object, BaseDocument>();
        public IDictionary<object, BaseDocument> Documents {
            get { return documentsCore; }
        }
        public void CloseAlbum(AlbumData album) {
            BaseDocument document = null;
            if(Documents.TryGetValue(album, out document)) {
                tabbedView.Controller.Close(document);
            }
        }
        public void CloseFolder(PathData folder) {
            BaseDocument document = null;
            if(Documents.TryGetValue(folder, out document)) {
                tabbedView.Controller.Close(document);
            }
        }
        public void OpenOthers(PathData path) {
            BaseDocument document = null;
            if(!Documents.TryGetValue(ViewData.Others, out document)) {
                AlbumGalleryForm albumForm = new AlbumGalleryForm(DataController, ViewData.Others);
                albumForm.MainForm = this;
                albumForm.MdiParent = this;
                albumForm.Show();
                if(tabbedView.Documents.TryGetValue(albumForm, out document)) {
                    document.Caption = ViewData.Others.Name;
                }
                albumForm.ScrollToFile(path.Path, true);
            }
            else tabbedView.Controller.Activate(document);
        }
        public void OpenAlbum(AlbumData album) {
            BaseDocument document = null;
            if(!Documents.TryGetValue(album, out document)) {
                AlbumGalleryForm albumForm = new AlbumGalleryForm(DataController, album);
                albumForm.MainForm = this;
                albumForm.MdiParent = this;
                albumForm.Show();
                if(tabbedView.Documents.TryGetValue(albumForm, out document)) {
                    document.Caption = album.Name;
                }
            }
            else tabbedView.Controller.Activate(document);
        }
        public void OpenFolder(PathData folder) {
            BaseDocument document = null;
            if(!Documents.TryGetValue(folder, out document)) {
                FolderGalleryForm folderForm = new FolderGalleryForm(DataController, folder);
                folderForm.MainForm = this;
                folderForm.MdiParent = this;
                folderForm.Show();
                if(tabbedView.Documents.TryGetValue(folderForm, out document)) {
                    document.Caption = folder.Name;
                }
            }
            else tabbedView.Controller.Activate(document);
        }
        void tabbedView_DocumentAdded(object sender, DocumentEventArgs e) {
            RegisterDocument(e.Document);
        }
        void tabbedView_DocumentRemoved(object sender, DocumentEventArgs e) {
            UnregisterDocument(e.Document);
        }
        void RegisterDocument(BaseDocument document) {
            AlbumGalleryForm albumForm = document.Form as AlbumGalleryForm;
            if(albumForm != null) Documents.Add(albumForm.Album, document);
            FolderGalleryForm folderForm = document.Form as FolderGalleryForm;
            if(folderForm != null) Documents.Add(folderForm.Folder, document);
        }
        void UnregisterDocument(BaseDocument document) {
            AlbumGalleryForm albumForm = document.Form as AlbumGalleryForm;
            if(albumForm != null) Documents.Remove(albumForm.Album);
            FolderGalleryForm folderForm = document.Form as FolderGalleryForm;
            if(folderForm != null) Documents.Remove(folderForm.Folder);
        }
        void tabbedView_FloatDocumentsCollectionChanged(DevExpress.XtraBars.Docking2010.Base.CollectionChangedEventArgs<BaseDocument> ea) {
            if(ea.ChangedType == DevExpress.XtraBars.Docking2010.Base.CollectionChangedType.ElementAdded)
                RegisterDocument(ea.Element);
            if(ea.ChangedType == DevExpress.XtraBars.Docking2010.Base.CollectionChangedType.ElementRemoved)
                UnregisterDocument(ea.Element);
        }
        #endregion Documents
        #region Album PopupMenu
        NavBarItemLink customizableLinkCore;
        protected NavBarItemLink CustomizableLink { 
            get { return customizableLinkCore; } 
        }
        void OnRemoveAlbumItemClick(object sender, ItemClickEventArgs e) {
            if(CustomizableLink == null)
                return;
            RemoveAlbum(CustomizableLink.Item.Tag as AlbumData);
        }
        void OnEditAlbumItemClick(object sender, ItemClickEventArgs e) {
            if(CustomizableLink == null)
                return;
            EditAlbum(CustomizableLink.Item.Tag as AlbumData);
        }
        void OnAlbumPopupMenuCloseUp(object sender, EventArgs e) {
            customizableLinkCore = null;
        }
        #endregion Album PopupMenu
        #region Folder PopupMenu
        void OnRemoveFolderItemClick(object sender, ItemClickEventArgs e) {
            if(CustomizableLink == null)
                return;
            PathData folder = (PathData)customizableLinkCore.Item.Tag;
            RemoveFolder(folder);
        }
        #endregion Folder PopupMenu
        GalleryForm viewForm;
        int lockVisibility = 0;
        internal void StartViewImages(GalleryForm form) {
            if(lockVisibility > 0) return;
            lockVisibility++;
            try {
                if(viewForm != null)
                    viewForm.CloseSelectedTabPage();
                viewForm = form;
                SuspendLayout();
                navBar.Visible = false;
                dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
                dockPanel2.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
                ResumeLayout(true);
                tabbedView.DocumentGroupProperties.ShowTabHeader = false;
            }
            finally { lockVisibility--; }
        }
        internal void EndViewImages() {
            if(lockVisibility > 0) return;
            lockVisibility++;
            try {
                SuspendLayout();
                dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                dockPanel2.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                navBar.Visible = true;
                ResumeLayout(true);
                tabbedView.DocumentGroupProperties.ShowTabHeader = true;
            }
            finally {
                viewForm = null;
                lockVisibility--; 
            }
        }
    }
}