/***************************************************************************
 * Copyright (C) 2015 by Savoir-Faire Linux                                *
 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
 *                                                                         *
 * 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/>.   *
 **************************************************************************/

#ifndef INSTANTMESSAGINGWIDGET_H
#define INSTANTMESSAGINGWIDGET_H

#include <QWidget>
#include <QKeyEvent>
#include <QSettings>

#include "call.h"
#include "media/media.h"

#include "imdelegate.h"

namespace Ui {
class InstantMessagingWidget;
}

class InstantMessagingWidget final : public QWidget
{
    Q_OBJECT

public:
    explicit InstantMessagingWidget(QWidget *parent = 0);
    ~InstantMessagingWidget();
    void setMediaText(Call* call);

protected:
    virtual void keyPressEvent(QKeyEvent *event) override;
    virtual void showEvent(QShowEvent * event) override;

//UI SLOTS
private slots:
    void on_sendButton_clicked();

private slots:
    void mediaAdd(Media::Media *media);

private:
    Ui::InstantMessagingWidget *ui;
    ImDelegate* imDelegate_;
    QSettings settings_;
    void copyToClipboard();
};

#endif // INSTANTMESSAGINGWIDGET_H
