package addin1;
import java.util.Date;
import com.wilutions.com.BackgTask;
import com.wilutions.com.ByRef;
import com.wilutions.com.CoClass;
import com.wilutions.com.ComException;
import com.wilutions.com.Dispatch;
import com.wilutions.com.IDispatch;
import com.wilutions.com.Missing;
import com.wilutions.joa.DeclAddin;
import com.wilutions.joa.IconManager;
import com.wilutions.joa.LoadBehavior;
import com.wilutions.joa.OfficeApplication;
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.MailItem;
import com.wilutions.mslib.outlook.NoteItem;
import com.wilutions.mslib.outlook.OlItemType;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
@CoClass(progId = "JoaAddin1.Class", guid = "{d5f0439b-27ea-4848-a230-3fa5496ea5e1}")
@DeclAddin(application = OfficeApplication.Outlook, loadBehavior = LoadBehavior.LoadOnStart, friendlyName = "JOA Tutorial Add-in", description = "Example for an Outlook Add-in developed in Java")
public class JoaAddin1 extends OutlookAddin {
final ExplorerTaskPane taskPane = new ExplorerTaskPane();
final IconManager ribbonIcons;
private IRibbonUI ribbon;
public JoaAddin1() {
Globals.setThisAddin(this);
ribbonIcons = new IconManager(this);
}
@Override
public void onItemSend(IDispatch item, ByRef<Boolean> cancel) throws ComException {
if (item.is(MailItem.class)) {
MailItem mailItem = Dispatch.as(item, MailItem.class);
System.out.println("sent mail, subject=" + mailItem.getSubject());
}
}
@Override
public void onNewMailEx(String EntryID) throws ComException {
IDispatch item = getApplication().getSession().GetItemFromID(EntryID, Missing.Value);
if (item != null && item.is(MailItem.class)) {
MailItem mailItem = Dispatch.as(item, MailItem.class);
System.out.println("received mail, subject=" + mailItem.getSubject());
}
}
public void onSmileButtonClicked1(IRibbonControl ribbonControl) {
Object owner = getApplication().ActiveWindow();
MessageBox.show(owner, "Message", "You pressed the " + ribbonControl.getId(), (result, ex) -> {
System.out.println("MessageBox closed by button=" + result);
});
}
public void onSmileButtonClicked(Dispatch ribbonControl) {
// Event functions triggered from Outlook should not immediately call
// Outlook functions during processing. This can cause a deadlock.
// Thus: execute the code in a background thread.
BackgTask.run(() -> {
// Obtain Outlook application interface
com.wilutions.mslib.outlook.Application app = Globals.getThisAddin().getApplication();
// Create a new NoteItem object and "cast" it to NoteItem.class
NoteItem noteItem = app.CreateItem(OlItemType.olNoteItem).as(NoteItem.class);
// Assign some text and display the note
noteItem.setBody("Hello Note");
noteItem.Display(true);
noteItem.Delete();
});
}
public Dispatch onSmileButton2GetImage(IRibbonControl control) {
Dispatch picdisp = ribbonIcons.get("MyHappyFaceIcon.png");
return picdisp;
}
public void onSmileButton2Clicked(Dispatch ribbonControl) {
Dialog1 dialog = new Dialog1();
Object parentWindow = getApplication().ActiveExplorer();
dialog.showAsync(parentWindow, (ret, ex) -> {
System.out.println("dialog returned=" + ret);
});
}
public void onJoaTaskPaneClicked(Dispatch control, Boolean pressed) {
BackgTask.run(() -> {
if (taskPane.hasWindow()) {
taskPane.setVisible(pressed);
} else {
Object parentWindow = getApplication().ActiveExplorer();
createTaskPaneWindowAsync(taskPane, "JOA TaskPane", parentWindow, (succ, ex) -> {
if (ex == null) {
taskPane.setVisible(true);
}
if (ex != null) {
ex.printStackTrace();
}
});
}
});
}
public IRibbonUI getRibbon() {
return ribbon;
}
public void onLoadRibbon(IRibbonUI ribbon) {
this.ribbon = ribbon;
}
public boolean onJoaTaskPaneGetPressed(IRibbonControl control) {
boolean ret = taskPane.isVisible();
return ret;
}
public void onMenuButtonClicked(IRibbonControl control) {
Object owner = getApplication().ActiveExplorer();
String controlId = control.getId();
MessageBox.show(owner, "hello", "Button " + controlId + " clicked", null);
}
public Dispatch getMenuButtonImage(IRibbonControl control) {
return ribbonIcons.get("MyHappyFaceIcon.png");
}
public String getMenuButtonLabel(IRibbonControl control) {
return "My Button Label " + (new Date(System.currentTimeMillis()));
}
public Boolean getMenuButtonVisible(IRibbonControl control) {
return true;
}
private void showDialog() {
GridPane grid = new GridPane();
grid.setAlignment(Pos.CENTER);
grid.setHgap(10);
grid.setVgap(10);
grid.setPadding(new Insets(10));
Text text = new Text("Enter some text and click a button.");
grid.add(text, 0, 0);
final TextField textField = new TextField();
grid.add(textField, 0, 1);
Button bnOK = new Button("OK");
grid.add(bnOK, 0, 2);
Scene dialog = new Scene(grid);
Stage stage = new Stage();
stage.setScene(dialog);
bnOK.setOnAction((e) -> {
stage.close();
});
stage.show();
stage.toFront();
}
}