/*
 IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc. ("Apple") in
 consideration of your agreement to the following terms, and your use, installation,
 modification or redistribution of this Apple software constitutes acceptance of these
 terms.  If you do not agree with these terms, please do not use, install, modify or
 redistribute this Apple software.

 In consideration of your agreement to abide by the following terms, and subject to these
 terms, Apple grants you a personal, non-exclusive license, under Apple�s copyrights in
 this original Apple software (the "Apple Software"), to use, reproduce, modify and
 redistribute the Apple Software, with or without modifications, in source and/or binary
 forms; provided that if you redistribute the Apple Software in its entirety and without
 modifications, you must retain this notice and the following text and disclaimers in all
 such redistributions of the Apple Software.  Neither the name, trademarks, service marks
 or logos of Apple Computer, Inc. may be used to endorse or promote products derived from
 the Apple Software without specific prior written permission from Apple. Except as expressly
 stated in this notice, no other rights or licenses, express or implied, are granted by Apple
 herein, including but not limited to any patent rights that may be infringed by your
 derivative works or by other works in which the Apple Software may be incorporated.

 The Apple Software is provided by Apple on an "AS IS" basis.  APPLE MAKES NO WARRANTIES,
 EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF NON-INFRINGEMENT,
 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS
 USE AND OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.

 IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR CONSEQUENTIAL
 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
          OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE,
 REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED AND
 WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR
 OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef PluginObject__DEFINED
#define PluginObject__DEFINED

#include "main.h"
#include <jni.h>

enum CustomEventTypes {
    kSurfaceCreated_CustomEvent     = 0,
    kSurfaceChanged_CustomEvent     = 1,
    kSurfaceDestroyed_CustomEvent   = 2,
};
typedef int32_t CustomEventType;

class SubPlugin {
public:
    SubPlugin(NPP inst) : m_inst(inst) {}
    virtual ~SubPlugin() {}
    virtual int16 handleEvent(const ANPEvent* evt) = 0;
    virtual bool supportsDrawingModel(ANPDrawingModel) = 0;

    int getPluginWidth();
    int getPluginHeight();

    NPP inst() const { return m_inst; }

private:
    NPP m_inst;
};

class SurfaceSubPlugin : public SubPlugin {
public:
    SurfaceSubPlugin(NPP inst) : SubPlugin(inst) { m_context = NULL; }
    virtual ~SurfaceSubPlugin() {}
    virtual jobject getSurface() = 0;
    virtual bool supportsDrawingModel(ANPDrawingModel);

    void setContext(jobject context);

    jobject m_context;
};

enum PluginTypes {
    kAnimation_PluginType  = 1,
    kAudio_PluginType      = 2,
    kBackground_PluginType = 3,
    kForm_PluginType       = 4,
    kText_PluginType       = 5,
    kPaint_PluginType      = 6,
    kVideo_PluginType      = 7,
    kNavigation_PluginType = 8,
};
typedef uint32_t PluginType;

typedef struct PluginObject {
    NPObject header;
    NPP npp;
    NPWindow* window;

    PluginType pluginType;
    SubPlugin* activePlugin;

} PluginObject;

NPClass *getPluginClass(void);

#endif // PluginObject__DEFINED
