Files
Oogynize/AddIns/Addin.Office/Word.cs

425 lines
18 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Foo.AddIn.Common;
using System.Runtime.InteropServices;
using System.Reflection;
// Ignore 'Ambiguity' warning message, seems like no way around those
#pragma warning disable 0467
namespace Foo.Addin.Office
{
public class Word_Workspace : IWorkspace
{
public const string Word_ProgId = "Word.Application";
public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
Microsoft.Office.Interop.Word.Application app = null;
app = Functions.GetCOMObject(Word_ProgId) as Microsoft.Office.Interop.Word.Application;
// If no existing Word App is open, open a new one
if (app == null)
{
app = new Microsoft.Office.Interop.Word.Application();
app.Visible = true;
}
object fileName = strArtifactLocation;
object missing = Missing.Value;
Microsoft.Office.Interop.Word.Document doc = null;
doc = app.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
if (doc != null)
{
// Find the correct Window and position it
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
{
window.Top = WindowTop;
window.Left = WindowLeft;
window.Height = WindowHeight;
window.Width = WindowWidth;
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
}
retVal.Type = FuncRetValEnum.Action_Succeeded;
}
else
{
retVal.Type = FuncRetValEnum.Action_Failed;
}
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Launch(string strArtifactLocation)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
Microsoft.Office.Interop.Word.Application app = null;
app = Functions.GetCOMObject(Word_ProgId) as Microsoft.Office.Interop.Word.Application;
// If no existing Word App is open, open a new one
if (app == null)
{
app = new Microsoft.Office.Interop.Word.Application();
app.Visible = true;
}
object fileName = strArtifactLocation;
object missing = Missing.Value;
Microsoft.Office.Interop.Word.Document doc = null;
doc = app.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
if (doc != null)
{
retVal.Type = FuncRetValEnum.Action_Succeeded;
}
else
{
retVal.Type = FuncRetValEnum.Action_Failed;
}
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Show(string strArtifactLocation)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
{
if (!window.Visible)
{
window.Visible = true;
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
else
{
retVal.Type = FuncRetValEnum.NoAction_Needed;
return retVal;
}
}
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Hide(string strArtifactLocation)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
{
if (window.Visible)
{
window.Visible = false;
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
else
{
retVal.Type = FuncRetValEnum.NoAction_Needed;
return retVal;
}
}
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal QueryClose(string strArtifactLocation)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
if (doc.FullName.ToLower() == strArtifactLocation.ToLower())
{
if (doc.Saved)
{
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
else
{
retVal.Type = FuncRetValEnum.Action_Failed;
return retVal;
}
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft)
{
FuncRetVal retVal = new FuncRetVal();
WindowTop = 0;
WindowLeft = 0;
WindowWidth = 0;
WindowHeight = 0;
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
if (doc.FullName.ToLower() == strArtifactLocation.ToLower())
{
// Found the document to close * Close it Without Prompting *
object saveOption = null;
if (bAutoSaveArtifact)
saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges;
else
saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
object routeDocument = false;
var app = doc.Application;
// Let's get the Window that belongs to this document
Microsoft.Office.Interop.Word.Window docWindow = null;
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
docWindow = window;
}
// Get the Window properties
WindowTop = docWindow.Top;
WindowLeft = docWindow.Left;
WindowWidth = docWindow.Width;
WindowHeight = docWindow.Height;
//Object missing = Missing.Value;
doc.Close(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(doc); // force clean-up
// Close the Window
if (docWindow != null)
docWindow.Close(ref saveOption, ref routeDocument);
// Close Word if this is the Last Document Instance
if (app.Documents.Count == 0)
{
app.Quit(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(docWindow);
Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure
}
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
if (doc.FullName.ToLower() == strArtifactLocation.ToLower())
{
// Found the document to close * Close it Without Prompting *
object saveOption = null;
if (bAutoSaveArtifact)
saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges;
else
saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
object routeDocument = false;
var app = doc.Application;
// Let's get the Window that belongs to this document
Microsoft.Office.Interop.Word.Window docWindow = null;
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
docWindow = window;
}
//Object missing = Missing.Value;
doc.Close(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(doc); // force clean-up
// Close the Window
if (docWindow != null)
docWindow.Close(ref saveOption, ref routeDocument);
// Close Word if this is the Last Document Instance
if (app.Documents.Count == 0)
{
app.Quit(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(docWindow);
Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure
}
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
public FuncRetVal Close(string strArtifactLocation)
{
FuncRetVal retVal = new FuncRetVal();
if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal))
return retVal;
try
{
var RunningWordDocuments = Functions.GetRunningObjectsOfType<Microsoft.Office.Interop.Word.Document>();
foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments)
{
if (doc.FullName.ToLower() == strArtifactLocation.ToLower())
{
// Found the document to close * Close it Without Prompting *
object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges;
object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat;
object routeDocument = false;
var app = doc.Application;
// Let's get the Window that belongs to this document
Microsoft.Office.Interop.Word.Window docWindow = null;
foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows)
{
if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower())
docWindow = window;
}
//Object missing = Missing.Value;
doc.Close(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(doc); // force clean-up
// Close the Window
if (docWindow != null)
docWindow.Close(ref saveOption, ref routeDocument);
// Close Word if this is the Last Document Instance
if (app.Documents.Count == 0)
{
app.Quit(ref saveOption, ref originalFormat, ref routeDocument);
Marshal.FinalReleaseComObject(docWindow);
Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure
}
retVal.Type = FuncRetValEnum.Action_Succeeded;
return retVal;
}
}
retVal.Type = FuncRetValEnum.ArtifactUnavailable;
}
catch (Exception e)
{
retVal.Message = e.Message;
retVal.Type = FuncRetValEnum.ErrorThrown;
}
return retVal;
}
}
}