/*
   ------------------------------------------------------------------

   This file is part of the Open Ephys GUI
   Copyright (C) 2014 Open Ephys

   ------------------------------------------------------------------

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.

*/

#include "AccessClass.h"
#include "Processors/GenericProcessor/GenericProcessor.h"
#include "Processors/MessageCenter/MessageCenterEditor.h"

#include "UI/UIComponent.h"

namespace AccessClass
{
namespace
{
UIComponent* ui = nullptr;
EditorViewport* ev = nullptr;
ProcessorList* pl = nullptr;
DataViewport* dv = nullptr;
ProcessorGraph* pg = nullptr;
ControlPanel* cp = nullptr;
MessageCenterEditor* mc = nullptr;
AudioComponent* ac = nullptr;
GraphViewer* gv = nullptr;
PluginManager* pm = nullptr;
ScopedPointer<ActionBroadcaster> bc;
}

void setUIComponent(UIComponent* ui_)
{
    if (ui != nullptr) return;
    ui = ui_;

    ev = ui->getEditorViewport();
    dv = ui->getDataViewport();
    pl = ui->getProcessorList();
    pg = ui->getProcessorGraph();
    cp = ui->getControlPanel();
    mc = ui->getMessageCenter();
    ac = ui->getAudioComponent();
    gv = ui->getGraphViewer();
	pm = ui->getPluginManager();
    bc = new ActionBroadcaster();
    bc->addActionListener(mc);
}

void shutdownBroadcaster()
{
    bc = nullptr;
}

/** Returns a pointer to the application's EditorViewport. */
EditorViewport* getEditorViewport()
{
    return ev;
}

/** Returns a pointer to the application's DataViewport. */
DataViewport* getDataViewport()
{
    return dv;
}

/** Returns a pointer to the application's ProcessorList. */
ProcessorList* getProcessorList()
{
    return pl;
}

/** Returns a pointer to the application's ProcessorGraph. */
ProcessorGraph* getProcessorGraph()
{
    return pg;
}

/** Returns a pointer to the application's DataViewport. */
ControlPanel* getControlPanel()
{
    return cp;
}

/** Returns a pointer to the application's MessageCenter. */
MessageCenterEditor* getMessageCenter()
{
    return mc;
}

/** Returns a pointer to the application's UIComponent. */
UIComponent* getUIComponent()
{
    return ui;
}

/** Returns a pointer to the application's AudioComponent. */
AudioComponent* getAudioComponent()
{
    return ac;
}

/** Returns a pointer to the application's GraphViewer. */
GraphViewer* getGraphViewer()
{
    return gv;
}

PluginManager* getPluginManager()
{
	return pm;
}

ActionBroadcaster* getBroadcaster()
{
    return bc.get();
}


MidiBuffer* ExternalProcessorAccessor::getMidiBuffer(GenericProcessor* proc)
{
	return proc->m_currentMidiBuffer;
}

}