/*******************************************************************************
 * Copyright (c) 2007, 2018 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.examples.ole.win32;

import java.io.*;

import org.eclipse.swt.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.widgets.*;

/**
 * OLEExample is an example that uses <code>org.eclipse.swt</code> 
 * libraries to implement a simple SWT window that can host different Active X
 * controls.
 *
 * @since 3.3
 */ 
public class OLEExample {

	OleClientSite clientSite;
	OleFrame oleFrame;
	Button closeButton;
	boolean createClientSite = true; // to create OleControlSite, set to false.
	
	public static void main(String[] args) {
		Display display = new Display();
		OLEExample example = new OLEExample();
		example.open(display);
		display.dispose();
	}

	/** 
	 * Create a file Exit menu item 
	 */
	void addFileMenu(OleFrame frame) {
		final Shell shell = frame.getShell();
		Menu menuBar = shell.getMenuBar();
		if (menuBar == null) {
			menuBar = new Menu(shell, SWT.BAR);
			shell.setMenuBar(menuBar);
		}
		MenuItem fileMenu = new MenuItem(menuBar, SWT.CASCADE);
		fileMenu.setText("&File");
		Menu menuFile = new Menu(fileMenu);
		fileMenu.setMenu(menuFile);
		frame.setFileMenus(new MenuItem[] { fileMenu });
		
		MenuItem menuFileExit = new MenuItem(menuFile, SWT.CASCADE);
		menuFileExit.setText("Exit");
		menuFileExit.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> shell.dispose()));
	}

	OleClientSite createSite(OleFrame frame, String progID) {
		if (createClientSite) {
			return new OleClientSite(frame, SWT.NONE, progID);
		} else {
			return new OleControlSite(frame, SWT.NONE, progID);
		}
	}
	
	OleClientSite createSite(OleFrame frame, String progID, File file) {
		if (createClientSite) {
			return new OleClientSite(frame, SWT.NONE, progID, file);
		} else {
			return new OleControlSite(frame, SWT.NONE, progID, file);
		}
	}
	
	void disposeClient() {
		if (clientSite != null)
			clientSite.dispose();
		clientSite = null;
	}

	/**
	 * Prompt the user for a file and try to open it with some known ActiveX controls.
	 */
	void fileOpen() {
		Shell shell = oleFrame.getShell();
		FileDialog dialog = new FileDialog(shell, SWT.OPEN);
		String fileName = dialog.open();
		if (fileName == null) return;

		disposeClient();

		// try opening a .doc file using Word
		if (clientSite == null) {
			int index = fileName.lastIndexOf('.');
			if (index != -1) {
				String fileExtension = fileName.substring(index + 1);
				if (fileExtension.equalsIgnoreCase("doc") || 
						fileExtension.equalsIgnoreCase("rtf") ||
						fileExtension.equalsIgnoreCase("txt")) {
					try {
						clientSite = createSite(oleFrame, "Word.Document", new File(fileName));
					} catch (SWTException error2) {
						disposeClient();
					}
				}
			}
		}

		// try opening a xls file with Excel
		if (clientSite == null) {
			int index = fileName.lastIndexOf('.');
			if (index != -1) {
				String fileExtension = fileName.substring(index + 1);
				if (fileExtension.equalsIgnoreCase("xls")) {
					try {
						clientSite = createSite(oleFrame, "Excel.Sheet", new File(fileName));
					} catch (SWTException error2) {
						disposeClient();
					}
				}
			}
		}

		// try opening a media file with MPlayer
		if (clientSite == null) {
			int index = fileName.lastIndexOf('.');
			if (index != -1) {
				String fileExtension = fileName.substring(index + 1);
				if (fileExtension.equalsIgnoreCase("mpa")) {
					try {
						clientSite = createSite(oleFrame, "MPlayer", new File(fileName));
					} catch (SWTException error2) {
						disposeClient();
					}
				}
			}
		}

		// try opening with wmv, mpg, mpeg, avi, asf, wav with WMPlayer
		if (clientSite == null) {
			int index = fileName.lastIndexOf('.');
			if (index != -1) {
				String fileExtension = fileName.substring(index + 1);
				if (fileExtension.equalsIgnoreCase("wmv")
						|| fileExtension.equalsIgnoreCase("mpg")
						|| fileExtension.equalsIgnoreCase("mpeg")
						|| fileExtension.equalsIgnoreCase("avi")
						|| fileExtension.equalsIgnoreCase("asf")
						|| fileExtension.equalsIgnoreCase("wav")) {
					try {
						clientSite = createSite(oleFrame, "WMPlayer.OCX");
						OleAutomation player = new OleAutomation(clientSite);
						int playURL[] = player.getIDsOfNames(new String[] { "URL" });
						if (playURL != null) {
							boolean suceeded = player.setProperty(playURL[0], new Variant(fileName));
							if (!suceeded)
								disposeClient();
						} else {
							disposeClient();
						}
						player.dispose();
					} catch (SWTException error2) {
						disposeClient();
					}
				}
			}
		}

		// try opening a PDF file with Acrobat reader
		if (clientSite == null) {
			int index = fileName.lastIndexOf('.');
			if (index != -1) {
				String fileExtension = fileName.substring(index + 1);
				if (fileExtension.equalsIgnoreCase("pdf")) {
					try {
						clientSite = createSite(oleFrame, "PDF.PdfCtrl.5");
						clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
						OleAutomation pdf = new OleAutomation (clientSite);
						int loadFile[] = pdf.getIDsOfNames (new String [] {"LoadFile"});
						if (loadFile != null) {
							Variant result = pdf.invoke(loadFile[0], new Variant[] {new Variant(fileName)});
							if (result == null)
								disposeClient();
							else
								result.dispose();
						} else {
							disposeClient();
						}
						pdf.dispose();
					} catch (SWTException error2) {
						disposeClient();
					}
				}
			}
		}

		// try opening with Explorer
		if (clientSite == null) {
			try {
				clientSite = createSite(oleFrame, "Shell.Explorer");
				OleAutomation explorer = new OleAutomation(clientSite);
				int[] navigate = explorer.getIDsOfNames(new String[]{"Navigate"}); 
				
				if (navigate != null) {
					Variant result = explorer.invoke(navigate[0], new Variant[] {new Variant(fileName)});
					if (result == null)
						disposeClient();
					else
						result.dispose();
				} else {
					disposeClient();
				}
				explorer.dispose();
			} catch (SWTException error2) {
				disposeClient();
			}
		}

		if (clientSite != null){
			clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
		}
	}

	void newClientSite(String progID) {
		disposeClient();
		try {
			clientSite = createSite(oleFrame, progID);
		} catch (SWTException error) {

		}
		if (clientSite != null)
			clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
	}

	public void open(Display display) {
		Shell shell = new Shell(display);
		shell.setText("OLE Example");
		shell.setLayout(new FillLayout());

		Composite parent = new Composite(shell, SWT.NONE);
		parent.setLayout(new GridLayout(4, true));
		
		Composite buttons = new Composite(parent, SWT.NONE);
		buttons.setLayout(new GridLayout());
		GridData gridData = new GridData(SWT.BEGINNING, SWT.FILL, false, false);
		buttons.setLayoutData(gridData);
		
		Composite displayArea = new Composite(parent, SWT.BORDER);
		displayArea.setLayout(new FillLayout());
		displayArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));

		Button excelButton = new Button(buttons, SWT.RADIO);
		excelButton.setText("New Excel Sheet");
		excelButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			if (((Button) e.widget).getSelection())
				newClientSite("Excel.Sheet");
		}));
		Button mediaPlayerButton = new Button(buttons, SWT.RADIO);
		mediaPlayerButton.setText("New MPlayer");
		mediaPlayerButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			if (((Button) e.widget).getSelection())
				newClientSite("MPlayer");
		}));
		Button powerPointButton = new Button(buttons, SWT.RADIO);
		powerPointButton.setText("New PowerPoint Slide");
		powerPointButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			if (((Button) e.widget).getSelection())
				newClientSite("PowerPoint.Slide");
		}));
		Button wordButton = new Button(buttons, SWT.RADIO);
		wordButton.setText("New Word Document");
		wordButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			if (((Button) e.widget).getSelection())
				newClientSite("Word.Document");
		}));
		new Label(buttons, SWT.NONE);
		Button openButton = new Button(buttons, SWT.RADIO);
		openButton.setText("Open file...");
		openButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
			if (((Button) e.widget).getSelection())
				fileOpen();
		}));
		new Label(buttons, SWT.NONE);
		closeButton = new Button(buttons, SWT.RADIO);
		closeButton.setText("Close file");
		closeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e ->{
				if (((Button) e.widget).getSelection())
					disposeClient();
			}
		));	
		closeButton.setSelection(true);
		
		oleFrame = new OleFrame(displayArea, SWT.NONE);
		addFileMenu(oleFrame);

		shell.setSize(800, 600);
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}
}
