//===========================================
//  Lumina-DE source code
//  Copyright (c) 2015, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
#ifndef _LUMINA_DESKTOP_UTILITIES_TERMINAL_PROCESS_WIDGET_H
#define _LUMINA_DESKTOP_UTILITIES_TERMINAL_PROCESS_WIDGET_H

#include <QTextEdit>
#include <QKeyEvent>
#include <QResizeEvent>
#include <QSocketNotifier>
#include <QTimer>
#include <QMenu>
#include <QClipboard>

#include "TtyProcess.h"

class TerminalWidget : public QTextEdit{
	Q_OBJECT
public:
	TerminalWidget(QWidget *parent =0, QString dir="");
	~TerminalWidget();

	void setTerminalFont(QFont);
	void aboutToClose();

private:
	TTYProcess *PROC;
	QTimer *resizeTimer;
	QTextCharFormat DEFFMT, CFMT; //default/current text format
	QTextCursor selCursor, lastCursor;
	QMenu *contextMenu;
	QAction *copyA, *pasteA;
	int selectionStart;
	bool closing;

	//Incoming Data parsing
	void InsertText(QString);
	void applyData(QByteArray data); //overall data parsing
	void applyANSI(QByteArray code); //individual code application
	void applyANSIColor(int code); //Add the designated color code to the  CFMT structure

	//Outgoing Data parsing
	void sendKeyPress(int key);

	//Special incoming data flags
	int startrow, endrow; //indexes for the first/last row ("\x1b[A;Br" CC)
	bool altkeypad;
private slots:
	void UpdateText();
	void ShellClosed();

	void copySelection();
	void pasteSelection();

	void updateTermSize();

signals:
	void ProcessClosed(QString);

protected:
	void keyPressEvent(QKeyEvent *ev);
	void mousePressEvent(QMouseEvent *ev);
	void mouseMoveEvent(QMouseEvent *ev);
	void mouseReleaseEvent(QMouseEvent *ev);
	void mouseDoubleClickEvent(QMouseEvent *ev);
	//void contextMenuEvent(QContextMenuEvent *ev);
	void resizeEvent(QResizeEvent *ev);
};

#endif