/*
 * The contents of this file is dual-licensed under 2
 * alternative Open Source/Free licenses: LGPL 2.1 or later and
 * Apache License 2.0. (starting with JNA version 4.0.0).
 *
 * You can freely decide which license you want to apply to
 * the project.
 *
 * You may obtain a copy of the LGPL License at:
 *
 * http://www.gnu.org/licenses/licenses.html
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "LGPL2.1".
 *
 * You may obtain a copy of the Apache License at:
 *
 * http://www.apache.org/licenses/
 *
 * A copy is also included in the downloadable source code package
 * containing JNA, in file "AL2.0".
 */

package com.sun.jna.platform.win32.COM.office;

import com.sun.jna.platform.win32.Variant.VARIANT;
import com.sun.jna.platform.win32.COM.COMException;
import com.sun.jna.platform.win32.COM.COMLateBindingObject;
import com.sun.jna.platform.win32.COM.IDispatch;

public class MSExcel extends COMLateBindingObject {

    public MSExcel() throws COMException {
        super("Excel.Application", false);
    }

    public MSExcel(boolean visible) throws COMException {
        this();
        this.setVisible(visible);
    }

    public void setVisible(boolean bVisible) throws COMException {
        this.setProperty("Visible", bVisible);
    }

    public String getVersion() throws COMException {
        return this.getStringProperty("Version");
    }

    public void newExcelBook() throws COMException {
        this.invokeNoReply("Add", getWorkbooks());
    }

    public void openExcelBook(String filename) throws COMException {
        this.invokeNoReply("Open", getWorkbooks(), new VARIANT(filename));
    }

    public void closeActiveWorkbook(boolean bSave) throws COMException {
        this.invokeNoReply("Close", getActiveWorkbook(), new VARIANT(bSave));
    }

    public void quit() throws COMException {
        this.invokeNoReply("Quit");
    }

    public void insertValue(String range, String value) throws COMException {
        Range pRange = new Range(this.getAutomationProperty("Range",
                this.getActiveSheet(), new VARIANT(range)));
        this.setProperty("Value", pRange, new VARIANT(value));
    }

    public Application getApplication() {
        return new Application(this.getAutomationProperty("Application"));
    }

    public ActiveWorkbook getActiveWorkbook() {
        return new ActiveWorkbook(this.getAutomationProperty("ActiveWorkbook"));
    }

    public Workbooks getWorkbooks() {
        return new Workbooks(this.getAutomationProperty("WorkBooks"));
    }

    public ActiveSheet getActiveSheet() {
        return new ActiveSheet(this.getAutomationProperty("ActiveSheet"));
    }

    public class Application extends COMLateBindingObject {

        public Application(IDispatch iDispatch) throws COMException {
            super(iDispatch);
        }
    }

    public class Workbooks extends COMLateBindingObject {
        public Workbooks(IDispatch iDispatch) throws COMException {
            super(iDispatch);
        }
    }

    public class ActiveWorkbook extends COMLateBindingObject {
        public ActiveWorkbook(IDispatch iDispatch) throws COMException {
            super(iDispatch);
        }
    }

    public class ActiveSheet extends COMLateBindingObject {
        public ActiveSheet(IDispatch iDispatch) throws COMException {
            super(iDispatch);
        }
    }

    public class Range extends COMLateBindingObject {
        public Range(IDispatch iDispatch) throws COMException {
            super(iDispatch);
        }
    }
}
