//public PPTPaneManager() : this(DEFAULT_MODES) { }
 public PPTPaneManager(PPTLibrary.PPT ppt)
     : this(DEFAULT_MODES, ppt)
 {
 }
        //public PPTPaneManager(string[] modes) : this(modes, new PPTLibrary.PPT()) { }
        public PPTPaneManager(string[] modes, PPTLibrary.PPT ppt)
        {
            if (modes == null)
                modes = DEFAULT_MODES;

            if (ppt == null)
                throw new ArgumentNullException("ppt");

            this.myPPT = ppt;

            // Set up the list of modes; should match the ordering of the buttons in the mode button bars.
            this.myModes = new string[modes.Length + 1];
            System.Array.Copy(modes, 0, this.myModes, 1, modes.Length);
            this.myModes[0] = DEFAULT_MODE;

            // Set up the bars.
            this.myPresentationModeBar = this.myPPT.AddCommandBar(PRESENTATION_MODEBAR_NAME,
                Core.MsoBarPosition.msoBarTop, true, true);
            this.myShapeModeBar = this.myPPT.AddCommandBar(SHAPE_MODEBAR_NAME,
                Core.MsoBarPosition.msoBarTop, true, true);

            // Add the "base" buttons
            Core.CommandBarButton button = (Core.CommandBarButton)
                this.myPPT.AddControl(this.myPresentationModeBar, Core.MsoControlType.msoControlButton, "Projected View");
            button.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandlePresentationModeClick);
            button.TooltipText = "Switch to base mode in which only unrestricted objects are visible.";
            button.Style = Core.MsoButtonStyle.msoButtonWrapCaption;

            button = (Core.CommandBarButton)
                this.myPPT.AddControl(this.myShapeModeBar, Core.MsoControlType.msoControlButton, "Unrestricted");
            button.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandleShapeModeClick);
            button.TooltipText = "Set shape(s) to be unrestricted, making them visible in all modes.";
            button.Style = Core.MsoButtonStyle.msoButtonWrapCaption;

            foreach (string mode in modes) {
                button = (Core.CommandBarButton)
                    this.myPPT.AddControl(this.myPresentationModeBar, Core.MsoControlType.msoControlButton, mode + " View");
                button.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandlePresentationModeClick);
                button.TooltipText = "Toggle '" + mode + " View'.\nOnly unrestricted objects and objects restricted to '" + mode + " View' are visible in '" + mode + " View'.";
                button.Style = Core.MsoButtonStyle.msoButtonWrapCaption;

                button = (Core.CommandBarButton)
                    this.myPPT.AddControl(this.myShapeModeBar, Core.MsoControlType.msoControlButton, mode + " Note");
                button.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandleShapeModeClick);
                button.TooltipText = "Toggle restriction of shape(s) to '" + mode + "' mode.\nUnrestricted objects are visible in all modes.\nRestricted objects are visible only in the modes to which they are restricted.";
                button.Style = Core.MsoButtonStyle.msoButtonWrapCaption;
            }

            // Hook to relevant PPT events.
            this.myPPT.App.WindowActivate += new PowerPoint.EApplication_WindowActivateEventHandler(this.HandleWindowActivate);
            this.myPPT.App.WindowDeactivate += new PowerPoint.EApplication_WindowDeactivateEventHandler(this.HandleWindowDeactivate);
            this.myPPT.App.WindowSelectionChange += new PowerPoint.EApplication_WindowSelectionChangeEventHandler(this.HandleWindowSelectionChange);
            // New presentation event doesn't seem to be working in pre-SP2 (or possibly SP1).
            this.myPPT.App.AfterNewPresentation += new PowerPoint.EApplication_AfterNewPresentationEventHandler(this.HandleAfterNewPresentation);
            this.myPPT.App.PresentationSave += new PowerPoint.EApplication_PresentationSaveEventHandler(this.HandlePresentationSave);
            this.myPPT.App.AfterPresentationOpen += new PowerPoint.EApplication_AfterPresentationOpenEventHandler(this.HandleAfterPresentationOpen);
            this.myPPT.App.PresentationNewSlide += new PowerPoint.EApplication_PresentationNewSlideEventHandler(this.HandlePresentationNewSlide);

            this.ConfigurePresentationModeBar();
            this.ConfigureShapeModeBar();

            foreach (PowerPoint.Presentation presentation in this.myPPT.App.Presentations)
                this.RebuildCache(presentation);
        }
		public const int PPT_SAVE_AS_ID = 748; // Determined by experimentation; should hold regardless of language.

		/// <summary>
		/// Creates the PPT automation component which handles exporting CSD decks from PPT.
		/// </summary>
		/// <param name="ppt">non-null ppt library accessor</param>
		/// <param name="paneManager">pane manager or null if no pane management is to be used</param>
		public PPTDeckBuilder(PPTLibrary.PPT ppt, PPTPaneManagement.PPTPaneManager paneManager)
#endif
		{
			if (ppt == null) throw new ArgumentNullException("ppt");

			// Hook up to arguments.
			this.myPPT = ppt;

			// Prepare the loader.
			this.myLoader = new PPTSlideLoader(DEFAULT_SIZE, DEFAULT_COMMENT_TYPE, this.myPPT, paneManager
#if SIP_MODE
				, propertyManager
#endif
				);

			// Find the menubar. 
			Core.CommandBar menu = null;
			foreach (Core.CommandBar cb in this.myPPT.App.CommandBars)
				if (cb.Id == PPT_MENU_BAR_ID)
				{
					menu = cb;
					break;
				}
			if (menu == null) 
				throw new Exception("PPTDeckBuilderAddin: Unable to find the PowerPoint menu bar.");

			// Find the file menu.
			Core.CommandBarPopup fileMenu = null;
			foreach (Core.CommandBarControl bar in menu.Controls)
				if (bar.Id == PPT_FILE_ID)
				{
					fileMenu = (Core.CommandBarPopup)bar;
					break;
				}
			if (fileMenu == null) 
				throw new Exception("PPTDeckBuilderAddin: Unable to find the PowerPoint file menu.");

			// Find the Save As.. button.
			// And see if the export to CSD button is already there.
			Core.CommandBarControl saveAs = null;
			foreach (Core.CommandBarControl control in fileMenu.Controls)
			{
				if (control.Id == PPT_SAVE_AS_ID)
					saveAs = control;
				if (control.Caption == "&Export to CSD...")
					control.Delete(false); // Delete permanently.
				if (control.Caption == "Load &Feedback Menu...")
					control.Delete(false);
			}

			// Add and configure the export to CSD button...
			this.myExportButton = (Core.CommandBarButton)fileMenu.Controls.Add(
				Core.MsoControlType.msoControlButton, 
				System.Reflection.Missing.Value,                // Not a built in button: no ID.
				System.Reflection.Missing.Value,                // No parameters used.
				(saveAs == null) ? (object)System.Reflection.Missing.Value : (object)(saveAs.Index + 1), // Place just after Save As... if possible.
				true);                                          // Temporary (disappear on closing PPT).
			this.myExportButton.Caption = "&Export to CSD...";
			this.myExportButton.DescriptionText = "Export the current presentation to the Conferencing Slide Deck format.";
			this.myExportButton.TooltipText = this.myExportButton.DescriptionText;
			this.myExportButton.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandleCSDButtonClick);
			this.myExportButton.Visible = true;
			this.ConfigureButton();

			// Add and configure the load feedback menu button...
			this.myFeedbackButton = (Core.CommandBarButton)fileMenu.Controls.Add(
				Core.MsoControlType.msoControlButton, 
				System.Reflection.Missing.Value,                // Not a built in button: no ID.
				System.Reflection.Missing.Value,                // No parameters used.
				(object)(this.myExportButton.Index + 1), // Place just after Export to CSD
				true);                                          // Temporary (disappear on closing PPT).
			this.myFeedbackButton.Caption = "Load &Feedback Menu...";
			this.myFeedbackButton.DescriptionText = "Load a feedback menu to associate with this deck.";
			this.myFeedbackButton.TooltipText = this.myFeedbackButton.DescriptionText;
			this.myFeedbackButton.Click += new Core._CommandBarButtonEvents_ClickEventHandler(this.HandleFeedbackButtonClick);
			this.myFeedbackButton.Visible = true;
			this.ConfigureButton();

			// Hook up to events to enable/disable the export button.
			this.myPPT.App.PresentationClose += new PowerPoint.EApplication_PresentationCloseEventHandler(this.HandlePresentation);
			this.myPPT.App.PresentationOpen += new PowerPoint.EApplication_PresentationOpenEventHandler(this.HandlePresentation);
			this.myPPT.App.WindowActivate += new PowerPoint.EApplication_WindowActivateEventHandler(this.HandleWindow);
			this.myPPT.App.WindowDeactivate += new PowerPoint.EApplication_WindowDeactivateEventHandler(this.HandleWindow);
		}
		/// <summary>
		/// Creates the PPT automation component which handles exporting CSD decks from PPT.
		/// </summary>
		/// <param name="ppt">non-null ppt library accessor</param>
		/// <param name="paneManager">pane manager or null if no pane management is to be used</param>
		/// <param name="propertyManager">widget property manager or null if the builder should assume no widgets exist</param>
		public PPTDeckBuilder(PPTLibrary.PPT ppt, PPTPaneManagement.PPTPaneManager paneManager,
			PPTPropertyManagement.PPTPropertyManager propertyManager)
		/// <param name="ppt">non-null ppt library accessor</param>
		/// <param name="paneManager">pane manager or null if no pane management is to be used</param>
		public PPTSlideLoader(Size viewerSize, int commentMenuType, PPTLibrary.PPT ppt, PPTPaneManagement.PPTPaneManager paneManager) 
#endif
		{
			if (ppt == null) throw new ArgumentNullException("ppt");

			this.myPPT = ppt;
			this.myPaneManager = paneManager;
#if SIP_MODE
			this.myPropertyManager = propertyManager;
#endif

			this.myViewerSize = viewerSize;
			this.myDefaultCommentMenuType = commentMenuType;

			this.myFilesLoaded = 0;

			this.myTemporaryDirectoryPath =  Path.GetTempPath() + "\\DeckBuilderTempFiles";
			try 
			{
				if (Directory.Exists(this.myTemporaryDirectoryPath))
					Directory.Delete(this.myTemporaryDirectoryPath, true);		// Delete directory to clean up old files
				Directory.CreateDirectory(this.myTemporaryDirectoryPath);

			}
			catch (IOException e)
			{
				Console.WriteLine(e.Message);
			}

		}
		/// <param name="ppt">non-null ppt library accessor</param>
		/// <param name="paneManager">pane manager or null if no pane management is to be used</param>
		/// <param name="propertyManager">widget property manager or null if the loader should assume no widgets exist</param>
		public PPTSlideLoader(Size viewerSize, int commentMenuType, PPTLibrary.PPT ppt, 
			PPTPaneManager paneManager, PPTPropertyManager propertyManager) 
 //public PPTPaneManager() : this(DEFAULT_MODES) { }
 public PPTPaneManager(PPTLibrary.PPT ppt, InstructorModeRibbon r)
     : this(DEFAULT_MODES, ppt, r)
 {
 }