//=============================================================================//
//   File : toolbareditor.cpp
//   Created on Wed 01 Dec 2004 14:42:20 by Szymon Stefanek
//
//   This file is part of the KVIrc IRC client distribution
//   Copyright (C) 2004 Szymon Stefanek <pragma at kvirc dot net>
//
//   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 2
//   of the License, or (at your opinion) 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, write to the Free Software Foundation,
//   Inc. ,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
//=============================================================================

#include "toolbareditor.h"
#include "kvi_actiondrawer.h"
#include "kvi_locale.h"
#include "kvi_frame.h"
#include "kvi_iconmanager.h"
#include "kvi_actionmanager.h"
#include "kvi_customtoolbar.h"
#include "kvi_customtoolbarmanager.h"
#include "kvi_customtoolbardescriptor.h"
#include "kvi_imagedialog.h"
#include "kvi_fileutils.h"
#include "kvi_filedialog.h"
#include "kvi_kvs_useraction.h"
#include "kvi_draganddrop.h"

#include <qpushbutton.h>
#include <qlayout.h>
#include <qapplication.h>
#include <qtooltip.h>

#include <qlineedit.h>
#include <qlabel.h>
#include <qmessagebox.h>
#include <qframe.h>
#include <qdir.h>
#include <qtimer.h>
#include <qevent.h>

KviCustomizeToolBarsDialog * KviCustomizeToolBarsDialog::m_pInstance = 0;
extern QRect g_rectToolBarEditorDialogGeometry;



KviTrashcanLabel::KviTrashcanLabel(QWidget * p)
: QLabel(p)
{
	setPixmap(*(g_pIconManager->getBigIcon("kvi_bigicon_trashcan.png")));
	QToolTip::add(this,__tr2qs("Drop here the icons from the toolbars to remove them"));
	setFrameStyle(QFrame::Sunken | QFrame::WinPanel);
	setAcceptDrops(true);
	setAlignment(Qt::AlignCenter);
	setMinimumSize(40,40);
	m_uFlashCount = 0;
	m_pFlashTimer = 0;
	m_clrOriginal = paletteBackgroundColor();
	connect(KviActionManager::instance(),SIGNAL(removeActionsHintRequest()),this,SLOT(flash()));
}

KviTrashcanLabel::~KviTrashcanLabel()
{
	if(m_pFlashTimer)
	{
		m_pFlashTimer->stop();
		delete m_pFlashTimer;
	}
}

void KviTrashcanLabel::flash()
{
	m_uFlashCount = 0;
	if(m_pFlashTimer)return;
	m_pFlashTimer = new QTimer();
	connect(m_pFlashTimer,SIGNAL(timeout()),this,SLOT(heartbeat()));
	m_pFlashTimer->start(200);
}

void KviTrashcanLabel::heartbeat()
{
	m_uFlashCount++;
	if(m_uFlashCount % 2)
		setPaletteBackgroundColor(QColor(0,0,0));
	else
		setPaletteBackgroundColor(m_clrOriginal);
	update();
	if(m_uFlashCount == 8)
	{
		m_pFlashTimer->stop();
		delete m_pFlashTimer;
		m_pFlashTimer = 0;
	}
}

void KviTrashcanLabel::dropEvent(QDropEvent * e)
{
	if(KviTextDrag::canDecode(e))
		e->accept();
}

void KviTrashcanLabel::dragEnterEvent(QDragEnterEvent * e)
{
	QString s;
	if(KviTextDrag::decode(e,s))
		e->accept();
}



KviCustomToolBarPropertiesDialog::KviCustomToolBarPropertiesDialog(QWidget * p,const QString &szText,const QString &szId,const QString &szLabel,const QString &szIconId)
: QDialog(p)
{
	m_szId = szId;
	m_szOriginalId = szId;
	m_szLabel = szLabel;

	setCaption(__tr2qs("ToolBar Properties"));
	setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TOOLBAR)));
	
	QGridLayout * g = new QGridLayout(this,5,6,5,3);
	
	QLabel * l = new QLabel(szText,this);
	g->addMultiCellWidget(l,0,0,0,5);

	l = new QLabel(__tr2qs("Label") + ":",this);
	g->addWidget(l,1,0);

	m_pLabelEdit = new QLineEdit(this);
	g->addMultiCellWidget(m_pLabelEdit,1,1,1,5);
	m_pLabelEdit->setText(szLabel);
	connect(m_pLabelEdit,SIGNAL(textChanged(const QString &)),this,SLOT(labelTextChanged(const QString &)));
	
	l = new QLabel(__tr2qs("Icon") + ":",this);
	g->addWidget(l,2,0);
	
	m_pIconEdit = new QLineEdit(this);
	m_pIconEdit->setReadOnly(true);
	g->addMultiCellWidget(m_pIconEdit,2,2,1,4);
	
	m_pIconButton = new QPushButton(this);
	g->addMultiCellWidget(m_pIconButton,2,2,5,5);
	connect(m_pIconButton,SIGNAL(clicked()),this,SLOT(iconButtonClicked()));

	iconSelected(szIconId);

	m_pAdvanced = new QWidget(this);
	QGridLayout * ag = new QGridLayout(m_pAdvanced,1,2,0,3);

	l = new QLabel(__tr2qs("Id") + ":",m_pAdvanced);
	l->setMinimumWidth(100);
	ag->addWidget(l,0,0);

	m_pIdEdit = new QLineEdit(m_pAdvanced);
	ag->addWidget(m_pIdEdit,0,1);
	ag->setRowStretch(0,1);

	m_pIdEdit->setText(szId);

	g->addMultiCellWidget(m_pAdvanced,3,3,0,5);
	m_pAdvanced->hide();

	m_pLabelEdit->setFocus();
	
	QPushButton * pb = new QPushButton(__tr2qs("OK"),this);
	connect(pb,SIGNAL(clicked()),this,SLOT(okClicked()));
	pb->setMinimumWidth(80);
	g->addMultiCellWidget(pb,4,4,4,5);
	
	pb = new QPushButton(__tr2qs("Cancel"),this);
	connect(pb,SIGNAL(clicked()),this,SLOT(reject()));
	pb->setMinimumWidth(80);
	g->addWidget(pb,4,3);
	
	m_pAdvancedButton = new QPushButton(__tr2qs("Advanced..."),this);
	connect(m_pAdvancedButton,SIGNAL(clicked()),this,SLOT(advancedClicked()));
	m_pAdvancedButton->setMinimumWidth(100);
	g->addMultiCellWidget(m_pAdvancedButton,4,4,0,1);
	
	g->setRowStretch(0,1);
	g->setColStretch(2,1);


}

KviCustomToolBarPropertiesDialog::~KviCustomToolBarPropertiesDialog()
{
}

void KviCustomToolBarPropertiesDialog::iconSelected(const QString &szIconId)
{
	QPixmap * p = g_pIconManager->getImage(szIconId.utf8().data());
	if(p)
	{
		m_pIconButton->setPixmap(*p);
		m_szIconId = szIconId;
		m_pIconEdit->setText(szIconId);
	} else {
		m_pIconButton->setText("...");
		m_szIconId = "";
		m_pIconEdit->setText("");
	}
}

void KviCustomToolBarPropertiesDialog::iconButtonClicked()
{
	KviImageDialog * dlg = new KviImageDialog(this,__tr2qs("Please choose the icon for the ToolBar"));
	if(dlg->exec() != QDialog::Accepted)
	{
		delete dlg;
		return;
	}
	QString s = dlg->selectedImage();
	delete dlg;
	iconSelected(s);
}


void KviCustomToolBarPropertiesDialog::labelTextChanged(const QString &s)
{
	if(m_szOriginalId.isEmpty())
	{
		QString szId = KviCustomToolBarManager::instance()->idForNewToolBar(s);
		m_pIdEdit->setText(szId);
	}
}


void KviCustomToolBarPropertiesDialog::okClicked()
{
	if(m_szLabel.isEmpty())
	{
		QMessageBox::information(this,__tr2qs("Invalid ToolBar Label"),__tr2qs("The ToolBar Label can't be empty!"),__tr2qs("OK"));
		return;
	}
	
	if(m_szId.isEmpty())
	{
		m_szId = KviCustomToolBarManager::instance()->idForNewToolBar(m_szLabel);
	}
	
	if(KviCustomToolBarManager::instance()->find(m_szId))
	{
		if(m_szId != m_szOriginalId)
		{
			if(QMessageBox::information(this,__tr2qs("Duplicate ToolBar Id"),
				__tr2qs("The specified ToolBar Id already exists.<br>" \
					"Would you like KVIrc to assign it automatically (so it doesn't "
					"collide with any other toolbar) or you prefer to do it manually ?"),
				__tr2qs("Manually"),__tr2qs("Automatically")) == 0)return;
			m_szId = KviCustomToolBarManager::instance()->idForNewToolBar(m_szLabel);
		}
	}

	m_szId = m_pIdEdit->text();
	m_szLabel = m_pLabelEdit->text();
	accept();
}

void KviCustomToolBarPropertiesDialog::advancedClicked()
{
	if(m_pAdvanced->isVisible())
	{
		m_pAdvanced->hide();
		m_pAdvancedButton->setText(__tr2qs("Advanced..."));
	} else {
		m_pAdvanced->show();
		m_pAdvancedButton->setText(__tr2qs("Hide Advanced"));
	}

}


KviCustomizeToolBarsDialog::KviCustomizeToolBarsDialog(QWidget * p)
: QDialog(p,"" /*,WType_TopLevel | WStyle_Customize | WStyle_Title | WStyle_StaysOnTop | WStyle_DialogBorder*/)
{
	setCaption(__tr2qs("Customize Toolbars"));
	setIcon(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TOOLBAR)));

	m_pInstance = this;

	QGridLayout * g = new QGridLayout(this,8,2,4,5);
	m_pDrawer = new KviActionDrawer(this);
	g->addMultiCellWidget(m_pDrawer,0,6,0,0);

	QPushButton * b = new QPushButton(__tr2qs("New ToolBar"),this);
	connect(b,SIGNAL(clicked()),this,SLOT(newToolBar()));
	g->addWidget(b,0,1);

	m_pDeleteToolBarButton = new QPushButton(__tr2qs("Delete ToolBar"),this);
	connect(m_pDeleteToolBarButton,SIGNAL(clicked()),this,SLOT(deleteToolBar()));
	g->addWidget(m_pDeleteToolBarButton,1,1);

	m_pRenameToolBarButton = new QPushButton(__tr2qs("Edit ToolBar"),this);
	connect(m_pRenameToolBarButton,SIGNAL(clicked()),this,SLOT(renameToolBar()));
	g->addWidget(m_pRenameToolBarButton,2,1);

	QFrame * f = new QFrame(this);
	f->setFrameStyle(QFrame::HLine | QFrame::Sunken);
	g->addWidget(f,3,1);
	
	m_pExportToolBarButton = new QPushButton(__tr2qs("Export ToolBar"),this);
	connect(m_pExportToolBarButton,SIGNAL(clicked()),this,SLOT(exportToolBar()));
	g->addWidget(m_pExportToolBarButton,4,1);

	KviTrashcanLabel * t = new KviTrashcanLabel(this);
	g->addWidget(t,6,1);

	b = new QPushButton(__tr2qs("Close"),this);
	connect(b,SIGNAL(clicked()),this,SLOT(closeClicked()));
	g->addWidget(b,7,1);

	g->setRowStretch(5,1);
	g->setColStretch(0,1);
	
	m_pDrawer->fill();

	connect(KviActionManager::instance(),SIGNAL(currentToolBarChanged()),this,SLOT(currentToolBarChanged()));
	KviActionManager::instance()->customizeToolBarsDialogCreated();
	
	currentToolBarChanged();

	if(g_rectToolBarEditorDialogGeometry.y() < 5)
	{
		g_rectToolBarEditorDialogGeometry.setY(5);
	}
	//setGeometry(KVI_OPTION_RECT(KviOption_rectRegisteredUsersDialogGeometry));
	resize(g_rectToolBarEditorDialogGeometry.width(),
		g_rectToolBarEditorDialogGeometry.height());
	move(g_rectToolBarEditorDialogGeometry.x(),
		g_rectToolBarEditorDialogGeometry.y());
}

KviCustomizeToolBarsDialog::~KviCustomizeToolBarsDialog()
{
	g_rectToolBarEditorDialogGeometry = QRect(pos().x(),pos().y(),size().width(),size().height());

	KviActionManager::instance()->customizeToolBarsDialogDestroyed();
	m_pInstance = 0;
}

void KviCustomizeToolBarsDialog::currentToolBarChanged()
{
	m_pDeleteToolBarButton->setEnabled(KviActionManager::instance()->currentToolBar());
	m_pRenameToolBarButton->setEnabled(KviActionManager::instance()->currentToolBar());
}

void KviCustomizeToolBarsDialog::showEvent(QShowEvent * e)
{
//	repaintContents();
//	QRect r = parentWidget() ? parentWidget()->rect() : QApplication::desktop()->rect();
//	int x = (r.width() - width()) / 2;
//	int y = (r.height() - height()) / 2;
//	move(x,y);
}


void KviCustomizeToolBarsDialog::deleteToolBar()
{
	KviCustomToolBar * t = KviActionManager::currentToolBar();
	if(!t)return;
	if(QMessageBox::question(this,
			__tr2qs("Confirm ToolBar Deletion"),
			__tr2qs("Do you really want to delete toolbar \"%1\" ?").arg(t->label()),
			__tr2qs("No"),
			__tr2qs("Yes")) == 0)return;
	KviCustomToolBarManager::instance()->destroyDescriptor(t->descriptor()->id());
}

void KviCustomizeToolBarsDialog::exportToolBar()
{
	KviCustomToolBar * t = KviActionManager::currentToolBar();
	if(!t)return;

	QString szName = QDir::homeDirPath();
	if(!szName.endsWith(QString(KVI_PATH_SEPARATOR)))szName += KVI_PATH_SEPARATOR;
	szName += t->descriptor()->id();
	szName += ".kvs";
	
	QString szFile;
	
	if(!KviFileDialog::askForSaveFileName(szFile,__tr2qs("Choose a Filename - KVIrc"),szName,"*.kvs",true,true,true))return;

	QString szCode;

	int ret = QMessageBox::question(this,
			__tr2qs("ToolBar Export"),
			__tr2qs("Do you want the associated actions to be exported with the toolbar ?"),
			__tr2qs("Yes"),
			__tr2qs("No"),
			__tr2qs("Cancel"));

	if(ret == 2)return;

	bool bExportActions = ret == 0;

	if(bExportActions)
	{
		KviPointerList<QString> * a = t->descriptor()->actions();
		if(a)
		{
			for(QString * s = a->first();s;s = a->next())
			{
				KviAction * act = KviActionManager::instance()->getAction(*s);
				if(act)
				{
					if(act->isKviUserActionNeverOverrideThis())
					{
						((KviKvsUserAction *)act)->exportToKvs(szCode);
						szCode += "\n\n";
					}
				}
			}
		}
	}

	szCode += "toolbar.create ";
	szCode += t->descriptor()->id();
	szCode += " ";
	szCode += t->descriptor()->labelCode();
	szCode += " ";
	szCode += t->descriptor()->iconId();
	szCode += "\n";

	KviPointerList<QString> * aa = t->descriptor()->actions();
	if(aa)
	{
		for(QString * ss = aa->first();ss;ss = aa->next())
		{
			szCode += "toolbar.additem ";
			szCode += t->descriptor()->id();
			szCode += " ";
			szCode += *ss;
			szCode += "\n";
		}
	}

	szCode += "toolbar.show ";
	szCode += t->descriptor()->id();
	szCode += "\n";

	if(!KviFileUtils::writeFile(szFile,szCode))
	{
		QMessageBox::warning(this,__tr2qs("Write Failed - KVIrc"),__tr2qs("Unable to write to the toolbar file."),__tr2qs("OK"));
	}

}

void KviCustomizeToolBarsDialog::renameToolBar()
{
	KviCustomToolBar * t = KviActionManager::currentToolBar();
	if(!t)return;

	KviCustomToolBarPropertiesDialog * dlg = new KviCustomToolBarPropertiesDialog(this,
		__tr2qs("Please specify the properties for the toolbar \"%1\"").arg(t->label()),
		t->descriptor()->id(),
		t->descriptor()->labelCode(),
		t->descriptor()->iconId());

	dlg->show();
	if(dlg->exec() != QDialog::Accepted)
	{
		delete dlg;
		return;
	}

	QString id = dlg->id();
	QString label = dlg->label();
	QString icon = dlg->iconId();
	delete dlg;

	if((id == t->descriptor()->id()) && (label == t->descriptor()->labelCode()) && (icon == t->descriptor()->iconId()))return;

	KviCustomToolBarManager::instance()->renameDescriptor(t->descriptor()->id(),id,label);
	t->descriptor()->setIconId(icon);
}

void KviCustomizeToolBarsDialog::newToolBar()
{
	KviCustomToolBarPropertiesDialog * dlg = new KviCustomToolBarPropertiesDialog(this,
		__tr2qs("Please specify the properties for the new toolbar"),
		KviCustomToolBarManager::instance()->idForNewToolBar(__tr2qs("My ToolBar")),
		__tr2qs("My ToolBar"));

	dlg->show();
	if(dlg->exec() != QDialog::Accepted)
	{
		delete dlg;
		return;
	}

	QString id = dlg->id();
	QString label = dlg->label();
	QString icon = dlg->iconId();
	delete dlg;

	KviCustomToolBarDescriptor * d = KviCustomToolBarManager::instance()->create(id,label);
	d->setIconId(icon);
	KviCustomToolBar * t = d->createToolBar();
	KviActionManager::instance()->setCurrentToolBar(t);
}

void KviCustomizeToolBarsDialog::closeClicked()
{
	delete this;
}

void KviCustomizeToolBarsDialog::cleanup()
{
	if(!m_pInstance)return;
	delete m_pInstance;
	m_pInstance = 0;
}

void KviCustomizeToolBarsDialog::display()
{
	if(m_pInstance)return;
	m_pInstance = new KviCustomizeToolBarsDialog(g_pFrame);
	m_pInstance->show();
}

void KviCustomizeToolBarsDialog::closeEvent(QCloseEvent * e)
{
	e->ignore();
	delete this;
}

