# Fire Application and Document Events Example (C#)

This example shows how to fire application and document events.

    //------------------------------------------------------------
    // Preconditions:
    // 1. Create a C# Windows console project.
    // 2. Copy and paste this example into the C# IDE.
    // 3. Add a reference to:
    //    install_dir\APISDK\tlb\DraftSight.Interop.dsAutomation.dll.
    // 4. Add references to System and System.Windows.Forms.
    // 5. Change the path and name of the image file to insert.
    //    NOTE: Image must be a PNG file.
    // 6. Start DraftSight, create, save, and close a drawing named
    //    c:\test\circle.dwg.
    // 7. Set a break point in the project where the project connects
    //    to DraftSight.
    // 8. Press F10 to step through the project.
    //
    // Postconditions: Message boxes pop up for all events,
    // regardless if fired.  Read the the text in each message box
    // before clicking OK to close it.
    //--------------------------------------------------------------

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    using DraftSight.Interop.dsAutomation;

        static class Program
        {

            static DraftSight.Interop.dsAutomation.Application dsApp = null;
            static Document dsDoc = null;
            static bool filePreOpenNotify;
            static bool filePostOpenNotify;
            static bool docDestroyNotify;
            static bool fileSavePreNotify;
            static bool fileSavePostNotify;
            static bool fileModifyNotify;

            static string docName = "c:\\test\\circle.dwg";
            static string imageFileName = "c:\\test\\note.png";

>        public static void Main()
>        {
>     	//Connect to DraftSight
>     	dsApp = (DraftSight.Interop.dsAutomation.Application)Marshal.GetActiveObject("DraftSight.Application");
>     	dsApp.AbortRunningCommand(); // abort any command currently running in DraftSight to avoid nested commands

>             //Set up dsApp events
>             AttachAppEventHandlers();

>             //Open document

>             filePostOpenNotify = false;
>             filePreOpenNotify = false;

>             dsDoc = (Document)dsApp.OpenDocument2(docName, dsDocumentOpenOption_e.dsDocumentOpen_Default, dsEncoding_e.dsEncoding_Default);

>             if (dsDoc != null)
>             {
>                 if (false == filePreOpenNotify)
>                 {
>                     MessageBox.Show("FileOpenPreNotify event wasn't fired while opening a document.");
>                 }
>                 if (false == filePostOpenNotify)
>                 {
>                     MessageBox.Show("FileOpenPostNotify event wasn't fired while opening a document.");
>                 }
>             }

>             //Set up dsDoc events
>             AttachDocEventHandlers();

>             //Modify document
>     	TestFileModifyEvents();

>             //Save document as a different document
>     	TestFileSaveEvents();

>             //Close documents
>             CloseAllDocuments();

>             //Detach events
>             DetachEventHandlers();

    	}

            //Attach dsApp event handlers
            static public void AttachAppEventHandlers()
            {
                AttachAppEvents();
            }

            static public void AttachAppEvents()
            {
                dsApp.FileOpenPostNotify += new _IApplicationEvents_FileOpenPostNotifyEventHandler(FileOpenPostNotify);
                dsApp.FileOpenPreNotify += new _IApplicationEvents_FileOpenPreNotifyEventHandler(FileOpenPreNotify);
            }

            //Attach dsDoc event handlers
            static public void AttachDocEventHandlers()
            {
                AttachDocEvents();
            }

            static public void AttachDocEvents()
            {
                dsDoc.FileSavePostNotify += new _IDocumentEvents_FileSavePostNotifyEventHandler(FileSavePostNotify);
                dsDoc.FileSavePreNotify += new _IDocumentEvents_FileSavePreNotifyEventHandler(FileSavePreNotify);
                dsDoc.ModifyNotify += new _IDocumentEvents_ModifyNotifyEventHandler(ModifyNotify);
                dsDoc.DestroyNotify += new _IDocumentEvents_DestroyNotifyEventHandler(DestroyNotify);
            }

            //Detach all event handlers
            static public void DetachEventHandlers()
            {
                dsApp.FileOpenPostNotify -= new _IApplicationEvents_FileOpenPostNotifyEventHandler(FileOpenPostNotify);
                dsApp.FileOpenPreNotify -= new _IApplicationEvents_FileOpenPreNotifyEventHandler(FileOpenPreNotify);
                dsDoc.FileSavePostNotify -= new _IDocumentEvents_FileSavePostNotifyEventHandler(FileSavePostNotify);
                dsDoc.FileSavePreNotify -= new _IDocumentEvents_FileSavePreNotifyEventHandler(FileSavePreNotify);
                dsDoc.ModifyNotify -= new _IDocumentEvents_ModifyNotifyEventHandler(ModifyNotify);
                dsDoc.DestroyNotify -= new _IDocumentEvents_DestroyNotifyEventHandler(DestroyNotify);
            }

            static public void TestFileModifyEvents()
            {
                filePreOpenNotify = false;
                filePostOpenNotify = false;

                ReferenceImage dsPicture = default(ReferenceImage);

                Model dsModel = default(Model);
                SketchManager dsSketchMgr = default(SketchManager);

                if ((dsDoc != null))
                {
                    //Get model space
                    dsModel = (Model)dsDoc.GetModel();
                    if ((dsModel != null))
                    {
                        //Get sketch manager
                        dsSketchMgr = (SketchManager)dsModel.GetSketchManager();
                        if ((dsSketchMgr != null))
                        {
                            fileModifyNotify = false;

                            //insert a picture in the model
                            dsPicture = (ReferenceImage)dsSketchMgr.InsertPicture(imageFileName, 0.0, 0.0, 0.0, 1.0, 0.0);

                            if ((dsPicture != null))
                            {
                                //Check if ModifyNotify event is fired
                                if (false == fileModifyNotify)
                                {
                                    MessageBox.Show("ModifyNotify event wasn't fired while inserting a picture in the document.");
                                }
                            }
                            else
                            {
                                MessageBox.Show("ISketchManager::InsertPicture method returns Nothing for the '" + dsDoc.GetPathName() + "' document");
                            }
                        }
                        else
                        {
                            MessageBox.Show("IModel.GetSketchManager method returns Nothing for the '" + dsDoc.GetPathName() + "' document.");
                        }
                    }
                    else
                    {
                        MessageBox.Show("IDocument.GetModel method returns Nothing for the '" + dsDoc.GetPathName() + "' document.");
                    }
                }
                else
                {
                    MessageBox.Show("IApplication.OpenDocument method returns Nothing for the '" + docName + "' document.");
                }
            }

            static public void TestFileSaveEvents()
            {
                dsDocumentSaveError_e saveError = default(dsDocumentSaveError_e);

                string savedDocName = null;

                if ((dsDoc != null))
                {
                    fileSavePreNotify = false;
                    fileSavePostNotify = false;

                    //Save document
                    savedDocName = docName + "_saved.dwg";
                    dsDoc.SaveAs2(savedDocName, dsDocumentSaveAsOption_e.dsDocumentSaveAs_R2010_DWG, true, out saveError);

                    if (saveError != dsDocumentSaveError_e.dsDocumentSave_Succeeded)
                    {
                        MessageBox.Show("SaveAs method returns '" + saveError + "' error.");
                    }
                    else
                    {
                        //Check FileSavePreNotify and FileSavePostNotify events
                        if (false == fileSavePreNotify)
                        {
                            MessageBox.Show("FileSavePreNotify event wasn't fired after saving the '" + docName + "' document");
                        }
                        if (false == fileSavePostNotify)
                        {
                            MessageBox.Show("FileSavePostNotify event wasn't fired after saving the '" + docName + "' document");
                        }
                    }
                }
                else
                {
                    MessageBox.Show("OpenDocument method returns Nothing for the '" + docName + "' document.");
                }
            }

            static public void CloseAllDocuments()
            {
                object[] dsDocs = null;
                int index = 0;

                docDestroyNotify = false;

                //Get documents
                dsDocs = (object[])dsApp.GetDocuments();
                if (dsDocs == null)
                {
                    MessageBox.Show("No open documents.");
                }
                else
                {
                    for (index = 0; index <= dsDocs.Length - 1; index++)
                    {
                        dsDoc = (Document)dsDocs[index];
                        dsApp.CloseDocument(dsDoc.GetPathName(), false);
                        if (false == docDestroyNotify)
                        {
                            MessageBox.Show("DestroyNotify event wasn't fired after closing a document.");
                        }
                    }
                }
            }

            static public void FileOpenPostNotify(Document Document)
            {
                filePostOpenNotify = true;
                MessageBox.Show("FileOpenPostNotify event was fired while opening a document.");
            }

            static public void FileOpenPreNotify(string FileName, dsDocumentOpenOption_e Option)
            {
                filePreOpenNotify = true;
                MessageBox.Show("FileOpenPreNotify event was fired while opening a document.");
            }
            static public void DestroyNotify()
            {
                docDestroyNotify = true;
                MessageBox.Show("DestroyNotify event was fired after closing a document.");
            }
            static public void FileSavePostNotify()
            {
                fileSavePostNotify = true;
                MessageBox.Show("FileSavePostNotify event was fired while saving a document.");
            }
            static public void FileSavePreNotify(string FileName, dsDocumentSaveAsOption_e SaveOption)
            {
                fileSavePreNotify = true;
                MessageBox.Show("FileSavePreNotify event was fired while saving a document.");
            }
            static public void ModifyNotify()
            {
                fileModifyNotify = true;
                MessageBox.Show("ModifyNotify event was fired while inserting a picture in a document.");
            }
        }