Click here to Skip to main content
15,892,927 members
Articles / Desktop Programming / Windows Forms

Document Preview Application

Rate me:
Please Sign up or sign in to vote.
4.74/5 (25 votes)
2 Jul 2009CPOL2 min read 133.1K   12.6K   89  
An application to preview your documents and files such as PDF, Doc, JPG, PPT, XSL.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Management;
using System.Collections;
using System.Linq;
using DocExp.PreviewControls;
using DocExp.Actions;
using DocExp.Controls;
using DocExp.Attributes;
using DocExp.Enums;

namespace DocExp
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        List<FileType> fileTypes = new List<FileType>();
        List<FileTypeGroup> groups = new List<FileTypeGroup>();
        List<ActionType> actionTypes = new List<ActionType>();
        private void Form1_Load(object sender, EventArgs e)
        {
            FileTypeGroup pdfFileTypeGroup = new FileTypeGroup("PDF Documents", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup imageFileTypeGroup = new FileTypeGroup("Images", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup otherFileTypeGroup = new FileTypeGroup("Other Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup videoFileTypeGroup = new FileTypeGroup("Video Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup musicFileTypeGroup = new FileTypeGroup("Music Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup textFileTypeGroup = new FileTypeGroup("Text Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup htmlFileTypeGroup = new FileTypeGroup("Html Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup wordFileTypeGroup = new FileTypeGroup("Word Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup excelFileTypeGroup = new FileTypeGroup("Excel Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup powerpointFileTypeGroup = new FileTypeGroup("PowerPoint Files", true, DocExp.Enums.GroupTypes.File);
            FileTypeGroup drives = new FileTypeGroup("Drives", false, DocExp.Enums.GroupTypes.Drive);
            FileTypeGroup folders = new FileTypeGroup("Folders", false, DocExp.Enums.GroupTypes.Folder);
            FileTypeGroup up = new FileTypeGroup("", false, DocExp.Enums.GroupTypes.FolderUp);

            groups.Add(drives);
            groups.Add(folders);
            groups.Add(up);
            groups.Add(musicFileTypeGroup);
            groups.Add(videoFileTypeGroup);
            groups.Add(pdfFileTypeGroup);
            groups.Add(wordFileTypeGroup);
            groups.Add(excelFileTypeGroup);
            groups.Add(powerpointFileTypeGroup);
            groups.Add(imageFileTypeGroup);
            groups.Add(textFileTypeGroup);
            groups.Add(htmlFileTypeGroup);
            groups.Add(otherFileTypeGroup);
            

            fileTypes.Add(new FileType("Drivers", "*.*", null, drives));
            fileTypes.Add(new FileType("Folders", "*.*", null, folders));
            fileTypes.Add(new FileType("Up", "*.*", null, up));
            fileTypes.Add(new FileType("PDF Files", "*.Pdf", typeof(PdfPreview), pdfFileTypeGroup));
            fileTypes.Add(new FileType("JPG Files", "*.Jpg", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("JPEG Files", "*.Jpeg", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("TIFF Files", "*.Tif", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("GIF Files", "*.Gif", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("BMP Files", "*.Bmp", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("PNG Files", "*.Png", typeof(ImagePreview), imageFileTypeGroup));
            fileTypes.Add(new FileType("MP3 Files", "*.Mp3", typeof(MediaPreview), musicFileTypeGroup));
            fileTypes.Add(new FileType("Wav Files", "*.Wav", typeof(MediaPreview), musicFileTypeGroup));
            fileTypes.Add(new FileType("Wma Files", "*.Wma", typeof(MediaPreview), musicFileTypeGroup));
            fileTypes.Add(new FileType("Midi Files", "*.Mid", typeof(MediaPreview), musicFileTypeGroup));
            fileTypes.Add(new FileType("Avi Files", "*.Avi", typeof(MediaPreview), videoFileTypeGroup));
            fileTypes.Add(new FileType("Mpg Files", "*.Mpg", typeof(MediaPreview), videoFileTypeGroup));
            fileTypes.Add(new FileType("Wmv Files", "*.Wmv", typeof(MediaPreview), videoFileTypeGroup));
            fileTypes.Add(new FileType("Html Files", "*.Html", typeof(HtmlPreview), htmlFileTypeGroup));
            fileTypes.Add(new FileType("Htm Files", "*.Htm", typeof(HtmlPreview), htmlFileTypeGroup));
            fileTypes.Add(new FileType("Txt Files", "*.Txt", typeof(TextPreview), textFileTypeGroup));
            fileTypes.Add(new FileType("Rtf Files", "*.Rtf", typeof(TextPreview), textFileTypeGroup));
            fileTypes.Add(new FileType("Docx Files", "*.Docx", typeof(WordPreview), wordFileTypeGroup));
            fileTypes.Add(new FileType("Doc Files", "*.Doc", typeof(WordPreview), wordFileTypeGroup));
            fileTypes.Add(new FileType("Xlsx Files", "*.Xlsx", typeof(ExcelPreview), excelFileTypeGroup));
            fileTypes.Add(new FileType("Xls Files", "*.Xls", typeof(ExcelPreview), excelFileTypeGroup));
            fileTypes.Add(new FileType("Pptx Files", "*.Pptx", typeof(PowerPointPreview), powerpointFileTypeGroup));
            fileTypes.Add(new FileType("Ppt Files", "*.Ppt", typeof(PowerPointPreview), powerpointFileTypeGroup));
            fileTypes.Add(new FileType("Ppsx Files", "*.Ppsx", typeof(PowerPointPreview), powerpointFileTypeGroup));
            fileTypes.Add(new FileType("Pps Files", "*.Pps", typeof(PowerPointPreview), powerpointFileTypeGroup));
            fileTypes.Add(new FileType("Other Files", "*.*", null, otherFileTypeGroup));

            foreach (Type t in System.Reflection.Assembly.GetExecutingAssembly().GetTypes())
            {
                if (t.BaseType == typeof(DocExp.AbstractClasses.Action))
                {
                    string actionName = ((ActionAttributes)t.GetCustomAttributes(typeof(ActionAttributes), true)[0]).ActionName;
                    bool isDefault = ((ActionAttributes)t.GetCustomAttributes(typeof(ActionAttributes), true)[0]).IsDefaultAction;
                    GroupTypes[] gt = ((ActionAttributes)t.GetCustomAttributes(typeof(ActionAttributes), true)[0]).ActionsGroupTypes;
                    ActionType at = new ActionType(actionName, t, isDefault);
                    foreach (GroupTypes g in gt)
                    {
                        at.ActionsGroupTypes.Add(g);
                    }
                    actionTypes.Add(at);
                }
            }
            SetImageSize();
            LoadDrives();
        }
        private void SetContextMenu()
        {
            cm.Items.Clear();
            cm.ImageList = ilContext;
            List<GroupTypes> groupTypes = new List<GroupTypes>();
            foreach (DocExpListViewItem d in lvExplorer.SelectedItems)
            {
                if (!groupTypes.Contains(d.FileType.Group.GroupType))
                {
                    groupTypes.Add(d.FileType.Group.GroupType);
                }
            }

            foreach (ActionType at in actionTypes)
            {
                bool containsAll = true;
                foreach (GroupTypes gt in groupTypes)
                {
                    if (!at.ActionsGroupTypes.Contains(gt))
                    {
                        containsAll = false;
                    }
                }
                if (containsAll)
                {
                    ToolStripButton tsb = new ToolStripButton(at.ActionName,ilContext.Images[at.ActionName]);
                    tsb.Tag = at;
                    tsb.ImageKey = at.ActionName;
                    cm.Items.Add(tsb);
                }
            }

        }
        public void LoadDrives()
        {
            txtPath.Text = "";
            lvExplorer.Groups.Clear();
            lvExplorer.Items.Clear();
            ListViewGroup grpDrives = new ListViewGroup(groups[0].HeaderName);
            grpDrives.Tag = groups[0];
            lvExplorer.Groups.Add(grpDrives);
            ManagementObjectSearcher mos = new ManagementObjectSearcher();
            mos.Query = new ObjectQuery("SELECT * From Win32_LogicalDisk");
            foreach (ManagementObject mo in mos.Get())
            {
                string type = mo["DriveType"].ToString();
                string name = mo["DeviceId"].ToString() + @"\";

                DocExpListViewItem lviDrive = new DocExpListViewItem(name, grpDrives);
                lviDrive.FileType = fileTypes[0];
                lviDrive.Path = name;
                if (type == "3")
                {
                    lviDrive.ImageKey = "Drive";
                }
                else if (type == "4")
                {
                    lviDrive.ImageKey = "NetworkDrive";
                }
                else if (type == "5")
                {
                    lviDrive.ImageKey = "CDDVD";
                }
                else
                {

                }

                lvExplorer.Items.Add(lviDrive);
            }

        }
        public void LoadSubFilesAndFolders(string path)
        {
            fsw.Path = path;
            txtPath.Text = path;

            lvExplorer.Groups.Clear();
            lvExplorer.Items.Clear();

            ListViewGroup grpActions = new ListViewGroup(" ");
            grpActions.Tag = groups[2];
            lvExplorer.Groups.Add(grpActions);
            ListViewGroup grpDirectories = new ListViewGroup(groups[1].HeaderName);
            grpDirectories.Tag = groups[1];
            lvExplorer.Groups.Add(grpDirectories);



            DocExpListViewItem lviUp = new DocExpListViewItem("Up", grpActions);
            lviUp.ImageKey = "FolderUp";
            lviUp.FileType = fileTypes[2];
            lviUp.Path = path;
            lvExplorer.Items.Add(lviUp);

            foreach (string directory in Directory.GetDirectories(path))
            {
                DocExpListViewItem lviDirectory = new DocExpListViewItem(directory.Substring(directory.LastIndexOf(@"\") + 1), grpDirectories);
                lviDirectory.Path = directory;
                lviDirectory.FileType = fileTypes[1];
                lviDirectory.ImageKey = "Folder";
                lvExplorer.Items.Add(lviDirectory);

            }
            List<string> filesLoaded = new List<string>();
            foreach (FileTypeGroup ftg in (from ftg in groups where ftg.ShowInExplorer == true select ftg))
            {
                List<DocExpListViewItem> items = new List<DocExpListViewItem>();
                foreach (FileType ft in (from ft in fileTypes where ft.Group == ftg select ft))
                {
                    ListViewGroup grpFiles = null;
                    if (lvExplorer.Groups[ftg.HeaderName] == null)
                    {
                        grpFiles = new ListViewGroup(ftg.HeaderName, ftg.HeaderName);
                        grpFiles.Tag = ftg;
                        lvExplorer.Groups.Add(grpFiles);
                    }
                    else
                    {
                        grpFiles = lvExplorer.Groups[ftg.HeaderName];
                    }

                    foreach (string file in Directory.GetFiles(path, ft.SearchCriteria, SearchOption.TopDirectoryOnly))
                    {
                        if (!filesLoaded.Contains(file))
                        {
                            DocExpListViewItem lviFile = new DocExpListViewItem(file.Substring(file.LastIndexOf(@"\") + 1), grpFiles);
                            lviFile.Path = file;
                            lviFile.FileType = ft;
                            if (ilExplorer.Images.Keys.IndexOf(ft.SearchCriteria.Replace("*.", "")) > -1)
                            {
                                lviFile.ImageKey = ft.SearchCriteria.Replace("*.", "");
                            }
                            else
                            {
                                lviFile.ImageKey = "*";
                            }
                            items.Add(lviFile);
                            filesLoaded.Add(file);
                        }
                    }
                    
                }
                foreach (DocExpListViewItem itm in (from i in items orderby i.Text ascending select i))
                {
                    lvExplorer.Items.Add(itm);
                }
            }
        }
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            if (txtPath.Text == "")
            {
                LoadDrives();
            }
            else
            {
                LoadSubFilesAndFolders(txtPath.Text);
            }
        }
        List<Image> imageList = new List<Image>();
        private void iconSize_ValueChanged(object sender, EventArgs e)
        {
            SetImageSize();
        }

        private void SetImageSize()
        {
            if (imageList.Count == 0)
            {
                foreach (Image i in ilExplorer.Images)
                {
                    imageList.Add(i);
                }
            }
            ilExplorer.ImageSize = new Size(iconSize.Value, iconSize.Value);
            ilExplorer.ColorDepth = ColorDepth.Depth32Bit;
            ilExplorer.TransparentColor = System.Drawing.Color.Transparent;
            foreach (Image i in imageList)
            {
                ilExplorer.Images.Add(i);
            }
            int fontsize = 0;
            if (iconSize.Value <= 32)
            {
                fontsize = 8;
            }
            else if (iconSize.Value <= 64)
            {
                fontsize = 12;
            }
            else
            {
                fontsize = 16;
            }
            Font f = new Font(lvExplorer.Font.FontFamily, fontsize);
            lvExplorer.Font = f;
        }

        private void cm_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            foreach (DocExpListViewItem li in lvExplorer.SelectedItems)
            {
                Type t = ((ActionType)e.ClickedItem.Tag).Action;
                ((DocExp.AbstractClasses.Action)Activator.CreateInstance(t)).DoAction(li.Path, li.FileType, this);
            }
        }

        private void lvExplorer_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                SetContextMenu();
            }
        }

        private void lvExplorer_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                try
                {
                    if (lvExplorer.SelectedItems.Count != 0)
                    {
                        FileType ft = ((DocExpListViewItem)lvExplorer.SelectedItems[0]).FileType;
                        string path = ((DocExpListViewItem)lvExplorer.SelectedItems[0]).Path;
                        if (ft.Group.GroupType == DocExp.Enums.GroupTypes.Folder || ft.Group.GroupType == DocExp.Enums.GroupTypes.Drive)
                        {
                            LoadSubFilesAndFolders(path);
                        }

                        else if (ft.Group.GroupType == DocExp.Enums.GroupTypes.FolderUp)
                        {
                            if (path.Length == 3)
                            {
                                LoadDrives();
                            }
                            else
                            {
                                path = path.Substring(0, path.LastIndexOf(@"\"));
                                if (path.Length == 2)
                                {
                                    path += @"\";
                                }
                                LoadSubFilesAndFolders(path);
                            }
                        }
                        else
                        {
                            IEnumerable<ActionType> resultSet = (from a in actionTypes where a.IsDefaultAction == true select a);
                            if (resultSet.Count() == 1)
                            {
                                Type t = resultSet.First().Action;
                                ((DocExp.AbstractClasses.Action)Activator.CreateInstance(t)).DoAction(path, ft, this);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("An error occured, you may not have permission to object or object is inaccessable.");
                }
            }
        }

        private void fsw_Changed(object sender, FileSystemEventArgs e)
        {
            LoadSubFilesAndFolders(txtPath.Text);
        }

        private void fsw_Created(object sender, FileSystemEventArgs e)
        {
            LoadSubFilesAndFolders(txtPath.Text);
        }

        private void fsw_Deleted(object sender, FileSystemEventArgs e)
        {
            LoadSubFilesAndFolders(txtPath.Text);
        }

        private void fsw_Renamed(object sender, RenamedEventArgs e)
        {
            LoadSubFilesAndFolders(txtPath.Text);
        }

        private void btnClosePreview_Click(object sender, EventArgs e)
        {
            sc.Panel2Collapsed = true;
            SetPreviewPanelButtonsVisibility();
        }

        private void btnShowPreview_Click(object sender, EventArgs e)
        {
            sc.Panel2Collapsed = false;
            SetPreviewPanelButtonsVisibility();
        }
        public void SetPreviewPanelButtonsVisibility()
        {
            if (sc.Panel2Collapsed)
            {
                btnShowPreview.Visible = true;
            }
            else
            {
                btnShowPreview.Visible = false;
            }
        }





    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Team Leader
Turkey Turkey
Tamer Oz is a Microsoft MVP and works as Assistant Unit Manager.

Comments and Discussions