/*
Copyright (c) 2014 Wolfgang Imig
This file is part of the library "Java Add-in for Microsoft Office".
This file must be used according to the terms of
MIT License, http://opensource.org/licenses/MIT
*/
package com.wilutions.joa.example.cnaddin;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.wilutions.com.BackgTask;
import com.wilutions.com.CoClass;
import com.wilutions.com.ComException;
import com.wilutions.com.Dispatch;
import com.wilutions.com.IDispatch;
import com.wilutions.com.JoaDll;
import com.wilutions.com.reg.Registry;
import com.wilutions.joa.DeclAddin;
import com.wilutions.joa.IconManager;
import com.wilutions.joa.LoadBehavior;
import com.wilutions.joa.OfficeApplication;
import com.wilutions.joa.TaskPane;
import com.wilutions.joa.fx.MessageBox;
import com.wilutions.joa.outlook.OutlookAddin;
import com.wilutions.mslib.office.IRibbonControl;
import com.wilutions.mslib.office.IRibbonUI;
import com.wilutions.mslib.outlook.Application;
import com.wilutions.mslib.outlook.Inspector;
import com.wilutions.mslib.outlook.InspectorsEvents;
import com.wilutions.mslib.outlook.MailItem;
import com.wilutions.mslib.outlook._Inspector;
import com.wilutions.mslib.outlook._Inspectors;
/**
* This Add-in displays a task pane in a mail inspector window.
* This example is based on the MSND article "How to: Display Custom Task Panes with E-Mail Messages in Outlook".
* @see http://msdn.microsoft.com/en-us/library/bb608622(v=vs.90).aspx
*/
@CoClass(progId = "JoaExample2.Addin", guid = "{C2A41A22-7858-4C13-88D4-88192CAAEFCF}")
@DeclAddin(application = OfficeApplication.Outlook, loadBehavior = LoadBehavior.LoadOnStart, friendlyName = "Create Note Add-in", description = "Example for an Outlook Add-in developed in Java")
public class CreateNoteAddin extends OutlookAddin implements InspectorsEvents {
private final ArrayList<TaskPane> taskPanes = new ArrayList<TaskPane>();
private final HashMap<_Inspector, InspectorWrapper> inspectorWrappers = new HashMap<_Inspector, InspectorWrapper>();
private final Registry registry = new Registry(getClass());
private volatile _Inspectors inspectors;
private volatile IRibbonUI ribbon;
private final IconManager ribbonIcons;
public CreateNoteAddin() {
Globals.setThisAddin(this);
ribbonIcons = new IconManager(this);
}
public List<TaskPane> getTaskPanes() {
return taskPanes;
}
public IRibbonUI getRibbon() {
return ribbon;
}
public Registry getRegistry() {
return registry;
}
public void onLoadRibbon(IRibbonUI ribbon) throws ComException {
System.out.println("onLoadRibbon " + ribbon);
this.ribbon = ribbon;
}
public Object onGetImage(IRibbonControl control) {
System.out.println("onGetImage");
Object picdisp = ribbonIcons.get("Ribbon-Note.png");
return picdisp;
}
public boolean ShowHideTP_getVisible(IRibbonControl control) throws ComException {
System.out.println("ShowHideTP_getVisible " + control);
return true;
}
public boolean ShowHideTP_getPressed(IRibbonControl control) throws ComException {
System.out.println("ShowHideTP_getPressed " + control);
IDispatch ctx = control.getContext();
boolean ret = false;
if (ctx != null) {
Inspector inspector = ctx.as(Inspector.class);
InspectorWrapper inspectorWrapper = inspectorWrappers.get(inspector);
System.out.println("inspectorWrapper=" + inspectorWrapper);
if (inspectorWrapper != null) {
ret = inspectorWrapper.getTaskPaneVisible();
}
}
return ret;
}
public void onSmileButtonClicked(Dispatch control, Boolean pressed) throws ComException {
Object owner = getApplication().ActiveExplorer();
MessageBox.show(owner, "JOA Example", "This example application shows a custom task pane in mail inspector windows.", (result, ex) -> {
if (ex != null) {
ex.printStackTrace();
}
else {
System.out.println("Message box closed with button=" + result);
}
});
}
public void onButtonClicked(Dispatch control, Boolean pressed) throws ComException {
}
public void onShowHideTaskPaneClicked(Dispatch control, Boolean pressed) throws ComException {
System.out.println("onShowHideTaskPaneClicked: " + control._get("id"));
Dispatch ctx = (Dispatch) control._get("Context");
System.out.println("ctx=" + ctx + ", id=" + System.identityHashCode(ctx));
{
Inspector inspector = ctx.as(Inspector.class);
System.out.println("inspector=" + inspector + ", id=" + System.identityHashCode(inspector));
InspectorWrapper inspectorWrapper = inspectorWrappers.get(inspector);
System.out.println("inspectorWrapper=" + inspectorWrapper);
if (inspectorWrapper != null) {
inspectorWrapper.setTaskPaneVisible(pressed);
}
}
}
@Override
public void onStartup() throws ComException {
System.out.println("Ctp4IptorOutlookAddin.onStartup");
Application app = getApplication();
inspectors = app.getInspectors();
Dispatch.withEvents(inspectors, this);
int n = inspectors.getCount();
for (int i = 0; i < n; i++) {
Inspector inspector = inspectors.Item(i);
onNewInspector(inspector);
}
}
@Override
public void onQuit() throws ComException {
System.out.println("Ctp4IptorOutlookAddin.onQuit");
Dispatch.releaseEvents(inspectors, this);
JoaDll.dumpComReferenceMap("before exit");
super.onQuit();
}
@Override
public void onNewInspector(final _Inspector insp) throws ComException {
Inspector inspector = Dispatch.as(insp, Inspector.class);
System.out.println("Ctp4IptorOutlookAddin.onNewInspector " + inspector);
BackgTask.run(() -> {
try {
IDispatch dispItem = inspector.getCurrentItem();
if (dispItem.is(MailItem.class)) {
MailItem mailItem = dispItem.as(MailItem.class);
String id = mailItem.getEntryID();
// Display the task pane only for received or sent mails.
// Do not display the task pane for new mails to be composed.
if (id != null && id.length() != 0) {
inspectorWrappers.put(inspector, new InspectorWrapper(inspector));
}
}
} catch (Throwable e) {
e.printStackTrace();
}
});
}
public HashMap<_Inspector, InspectorWrapper> getInspectorWrappers() {
return inspectorWrappers;
}
}