//# PlotEvent.cc: Classes for interaction events.
//# Copyright (C) 2008
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library 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 Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//#        Internet email: aips2-request@nrao.edu.
//#        Postal address: AIPS++ Project Office
//#                        National Radio Astronomy Observatory
//#                        520 Edgemont Road
//#                        Charlottesville, VA 22903-2475 USA
//#
//# $Id: $
#include <graphics/GenericPlotter/PlotEvent.h>

using namespace std;

using namespace casacore;
namespace casa {

/////////////////////////////////
// PLOTSELECTEVENT DEFINITIONS //
/////////////////////////////////

PlotSelectEvent::PlotSelectEvent(PlotCanvas* canvas, const PlotRegion& region):
        m_canvas(canvas), m_region(region) { }

PlotSelectEvent::~PlotSelectEvent() { }

PlotCanvas* PlotSelectEvent::canvas() const { return m_canvas; }

PlotRegion PlotSelectEvent::region() const { return m_region; }


////////////////////////////////
// PLOTMOUSEEVENT DEFINITIONS //
////////////////////////////////

PlotMouseEvent::PlotMouseEvent(PlotCanvas* canvas, Type t, Button b,
        const PlotCoordinate& c) : m_canvas(canvas), m_type(t), m_button(b),
        m_coord(c) { }

PlotMouseEvent::~PlotMouseEvent() { }

PlotCanvas* PlotMouseEvent::canvas() const { return m_canvas; }

PlotMouseEvent::Type PlotMouseEvent::type() const { return m_type; }

PlotMouseEvent::Button PlotMouseEvent::button() const { return m_button; }

PlotCoordinate PlotMouseEvent::where() const { return m_coord; }


////////////////////////////////
// PLOTWHEELEVENT DEFINITIONS //
////////////////////////////////

PlotWheelEvent::PlotWheelEvent(PlotCanvas* canvas, int d,
    const PlotCoordinate& c) : m_canvas(canvas), m_delta(d), m_coord(c) { }

PlotWheelEvent::~PlotWheelEvent() { }

PlotCanvas* PlotWheelEvent::canvas() const { return m_canvas; }

int PlotWheelEvent::delta() const { return m_delta; }

PlotCoordinate PlotWheelEvent::where() const { return m_coord; }


//////////////////////////////
// PLOTKEYEVENT DEFINITIONS //
//////////////////////////////

PlotKeyEvent::PlotKeyEvent(PlotCanvas* canvas, char key,
        const vector<Modifier>& m): m_canvas(canvas), m_key(key), m_mods(m) { }

PlotKeyEvent::~PlotKeyEvent() { }

PlotCanvas* PlotKeyEvent::canvas() const { return m_canvas; }

char PlotKeyEvent::key() const { return m_key; }

vector<PlotKeyEvent::Modifier> PlotKeyEvent::modifiers() const {
    return m_mods;
}

String PlotKeyEvent::toString() const {
    stringstream ss;
    
    for(unsigned int i = 0; i < m_mods.size(); i++) {
        ss << modifier(m_mods[i]);
        if(i < m_mods.size() - 1) ss << '+';
    }
    ss << m_key;
    
    return ss.str();
}


/////////////////////////////////
// PLOTRESIZEEVENT DEFINITIONS //
/////////////////////////////////

PlotResizeEvent::PlotResizeEvent(PlotCanvas* canvas, int oldW, int oldH,
        int newW, int newH) : m_plotter(NULL), m_canvas(canvas),
        m_old(oldW, oldH), m_new(newW, newH) { }

PlotResizeEvent::PlotResizeEvent(Plotter* plotter, int oldW, int oldH,
        int newW, int newH) : m_plotter(plotter), m_canvas(NULL),
        m_old(oldW, oldH), m_new(newW, newH) { }

PlotResizeEvent::~PlotResizeEvent() { }

PlotCanvas* PlotResizeEvent::canvas() const { return m_canvas; }

Plotter* PlotResizeEvent::plotter() const { return m_plotter; }

pair<int, int> PlotResizeEvent::oldSize() const { return m_old; }

pair<int, int> PlotResizeEvent::newSize() const { return m_new; }


/////////////////////////////////
// PLOTBUTTONEVENT DEFINITIONS //
/////////////////////////////////

PlotButtonEvent::PlotButtonEvent(PlotButton* button) : m_button(button) { }

PlotButtonEvent::~PlotButtonEvent() { }

PlotButton* PlotButtonEvent::button() const { return m_button; }


///////////////////////////////////
// PLOTCHECKBOXEVENT DEFINITIONS //
///////////////////////////////////

PlotCheckboxEvent::PlotCheckboxEvent(PlotCheckbox* cb) : m_checkbox(cb) { }

PlotCheckboxEvent::~PlotCheckboxEvent() { }

PlotCheckbox* PlotCheckboxEvent::checkbox() const { return m_checkbox; }

}