/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2006 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/



//BibleTime includes
#include "clexiconreadwindow.h"
#include "cmodulechooserbar.h"
#include "cbuttons.h"

#include "backend/cswordkey.h"
#include "backend/cswordldkey.h"

#include "frontend/cbtconfig.h"
#include "frontend/cexportmanager.h"
#include "frontend/display/cdisplay.h"
#include "frontend/display/creaddisplay.h"
#include "frontend/keychooser/ckeychooser.h"

#include "util/ctoolclass.h"
#include "util/cresmgr.h"

//TDE includes
#include <tdeaccel.h>
#include <tdetoolbar.h>
#include <tdelocale.h>
#include <tdepopupmenu.h>

CLexiconReadWindow::CLexiconReadWindow(ListCSwordModuleInfo moduleList, CMDIArea* parent, const char *name) : CReadWindow(moduleList, parent,name) {
	setKey( CSwordKey::createInstance(moduleList.first()) );
}

CLexiconReadWindow::~CLexiconReadWindow() {}

void CLexiconReadWindow::insertKeyboardActions( TDEActionCollection* const a ) {
	new TDEAction(
		i18n("Next entry"), CResMgr::displaywindows::lexiconWindow::nextEntry::accel,
		a, "nextEntry"
	);
	new TDEAction(
		i18n("Previous entry"), CResMgr::displaywindows::lexiconWindow::previousEntry::accel,
		a, "previousEntry"
	);

	//  new TDEAction(i18n("Copy reference only"), TDEShortcut(0), a, "copyReferenceOnly");
	new TDEAction(i18n("Copy entry with text"), TDEShortcut(0), a, "copyEntryWithText");
	//  new TDEAction(i18n("Copy selected text"), TDEShortcut(0), a, "copySelectedText");
	new TDEAction(i18n("Save entry as plain text"), TDEShortcut(0), a, "saveEntryAsPlainText");
	new TDEAction(i18n("Save entry as HTML"), TDEShortcut(0), a, "saveEntryAsHTML");
	//   new TDEAction(i18n("Print reference only"), TDEShortcut(0), a, "printReferenceOnly");
	new TDEAction(i18n("Print entry with text"), TDEShortcut(0), a, "printEntryWithText");
}

void CLexiconReadWindow::initActions() {
	CReadWindow::initActions();

	m_actions.backInHistory = dynamic_cast<TDEToolBarPopupAction*>(
								  actionCollection()->action(
									  CResMgr::displaywindows::general::backInHistory::actionName
								  )
							  );
	Q_ASSERT(m_actions.backInHistory);

	m_actions.forwardInHistory = dynamic_cast<TDEToolBarPopupAction*>(
									 actionCollection()->action(
										 CResMgr::displaywindows::general::forwardInHistory::actionName
									 )
								 );

	Q_ASSERT(m_actions.forwardInHistory);

	new TDEAction(
		i18n("Next entry"), CResMgr::displaywindows::lexiconWindow::nextEntry::accel,
		this, TQ_SLOT( nextEntry() ),
		actionCollection(), "nextEntry"
	);
	new TDEAction(
		i18n("Previous entry"), CResMgr::displaywindows::lexiconWindow::previousEntry::accel,
		this, TQ_SLOT( previousEntry() ),
		actionCollection(), "previousEntry"
	);

	m_actions.selectAll = actionCollection()->action("selectAll");
	Q_ASSERT(m_actions.selectAll);

	m_actions.findText = actionCollection()->action("findText");
	Q_ASSERT(m_actions.findText);
	
	//m_actions.findStrongs = new TDEAction(i18n("Strong's Search"), TDEShortcut(0),this, TQ_SLOT(openSearchStrongsDialog()), actionCollection(), "findStrongs");
	m_actions.findStrongs = new TDEAction(
		i18n("Strong's Search"),
		CResMgr::displaywindows::general::findStrongs::icon,
		CResMgr::displaywindows::general::findStrongs::accel,
		this, TQ_SLOT(openSearchStrongsDialog()),
		actionCollection(),
		CResMgr::displaywindows::general::findStrongs::actionName);

	m_actions.copy.reference = new TDEAction(i18n("Reference only"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQ_SLOT(copyAnchorOnly()), actionCollection(), "copyReferenceOnly");

	m_actions.copy.entry = new TDEAction(i18n("Entry with text"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQ_SLOT(copyAll()), actionCollection(), "copyEntryWithText");

	m_actions.copy.selectedText = actionCollection()->action("copySelectedText");
	Q_ASSERT(m_actions.copy.selectedText);

	m_actions.save.entryAsPlain = new TDEAction(i18n("Entry as plain text"), TDEShortcut(0), this, TQ_SLOT(saveAsPlain()),actionCollection(), "saveEntryAsPlain");

	m_actions.save.entryAsHTML = new TDEAction(i18n("Entry as HTML"), TDEShortcut(0), this, TQ_SLOT(saveAsHTML()), actionCollection(), "saveEntryAsHTML");

	m_actions.print.reference = new TDEAction(i18n("Reference only"), TDEShortcut(0), this, TQ_SLOT(printAnchorWithText()), actionCollection(), "printReferenceOnly");

	m_actions.print.entry = new TDEAction(i18n("Entry with text"), TDEShortcut(0), this, TQ_SLOT(printAll()), actionCollection(), "printEntryWithText");

	// init with the user defined settings
	CBTConfig::setupAccelSettings(CBTConfig::lexiconWindow, actionCollection());
};

/** No descriptions */
void CLexiconReadWindow::initConnections() {
	Q_ASSERT(keyChooser());

	connect(keyChooser(), TQ_SIGNAL(keyChanged(CSwordKey*)),
			this, TQ_SLOT(lookup(CSwordKey*)));
	connect(keyChooser(), TQ_SIGNAL(historyChanged()),
			this, TQ_SLOT(slotUpdateHistoryButtons()));

	//connect the history actions to the right slots
	connect(
		m_actions.backInHistory->popupMenu(), TQ_SIGNAL(aboutToShow()),
		this, TQ_SLOT(slotFillBackHistory())
	);
	connect(
		m_actions.backInHistory->popupMenu(), TQ_SIGNAL(activated(int)),
		keyChooser(), TQ_SLOT(backInHistory(int))
	);
	connect(
		m_actions.forwardInHistory->popupMenu(), TQ_SIGNAL(aboutToShow()),
		this, TQ_SLOT(slotFillForwardHistory())
	);
	connect(
		m_actions.forwardInHistory->popupMenu(), TQ_SIGNAL(activated(int)),
		keyChooser(), TQ_SLOT(forwardInHistory(int))
	);


}

void CLexiconReadWindow::initView() {
	setDisplayWidget( CDisplay::createReadInstance(this) );

	setMainToolBar( new TDEToolBar(this) );
	addDockWindow(mainToolBar());

	setKeyChooser( CKeyChooser::createInstance(modules(), key(), mainToolBar()) );

	mainToolBar()->insertWidget(0, keyChooser()->sizeHint().width(), keyChooser());
	mainToolBar()->setFullSize(false);

	setModuleChooserBar( new CModuleChooserBar(modules(), modules().first()->type(), this) );
	addDockWindow(moduleChooserBar());

	setButtonsToolBar( new TDEToolBar(this) );
	addDockWindow(buttonsToolBar());
	
	setIcon(CToolClass::getIconForModule(modules().first()));
	setCentralWidget( displayWidget()->view() );
}

void CLexiconReadWindow::initToolbars() {
	//main toolbar
	Q_ASSERT(m_actions.backInHistory);
	m_actions.backInHistory->plug( mainToolBar(),0 ); //1st button
	m_actions.forwardInHistory->plug( mainToolBar(),1 ); //2nd button

	//buttons toolbar
	TDEAction* action = actionCollection()->action(
		CResMgr::displaywindows::general::search::actionName);
	Q_ASSERT( action );
	if (action) {
		action->plug(buttonsToolBar());
	}
	setDisplaySettingsButton( new CDisplaySettingsButton( &displayOptions(), &filterOptions(), modules(), buttonsToolBar()) );
	buttonsToolBar()->insertWidget(2,displaySettingsButton()->size().width(), displaySettingsButton());
}

void CLexiconReadWindow::setupPopupMenu() {
	popup()->insertTitle(CToolClass::getIconForModule(modules().first()), i18n("Lexicon window"));

	//   m_actions.selectAll = new TDEAction(i18n("Select all"), TDEShortcut(0), displayWidget()->connectionsProxy(), TQ_SLOT(selectAll()), actionCollection());
	m_actions.findText->plug(popup());
	m_actions.findStrongs->plug(popup());
	
	m_actions.selectAll->plug(popup());

	
	(new TDEActionSeparator(this))->plug( popup() );

	m_actions.copyMenu = new TDEActionMenu(i18n("Copy..."), CResMgr::displaywindows::lexiconWindow::copyMenu::icon, actionCollection());
	m_actions.copyMenu->setDelayed(false);

	m_actions.copyMenu->insert(m_actions.copy.reference);
	m_actions.copyMenu->insert(m_actions.copy.entry);
	m_actions.copyMenu->insert(new TDEActionSeparator(this));
	m_actions.copyMenu->insert(m_actions.copy.selectedText);
	m_actions.copyMenu->plug(popup());

	m_actions.saveMenu = new TDEActionMenu(i18n("Save..."), CResMgr::displaywindows::lexiconWindow::saveMenu::icon, actionCollection());
	m_actions.saveMenu->setDelayed(false);
	m_actions.saveMenu->insert(m_actions.save.entryAsPlain);
	m_actions.saveMenu->insert(m_actions.save.entryAsHTML);
	m_actions.saveMenu->plug(popup());

	m_actions.printMenu = new TDEActionMenu(i18n("Print..."), CResMgr::displaywindows::lexiconWindow::printMenu::icon, actionCollection());
	m_actions.printMenu->setDelayed(false);
	m_actions.printMenu->insert(m_actions.print.reference);
	m_actions.printMenu->insert(m_actions.print.entry);
	m_actions.printMenu->plug(popup());
}

/** Reimplemented. */
void CLexiconReadWindow::updatePopupMenu() {
	//enable the action depending on the supported module features
/*	bool hasStrongs = false;
	ListCSwordModuleInfo mods = modules();
	for (ListCSwordModuleInfo::iterator it = mods.begin(); it != mods.end(); ++it) {
		if ( (*it)->has( CSwordModuleInfo::strongNumbers ) ) {
			hasStrongs = true;
			break;
		}
	}
	m_actions.findStrongs->setEnabled( hasStrongs );*/
	m_actions.findStrongs->setEnabled( displayWidget()->getCurrentNodeInfo()[CDisplay::Lemma] != TQString() );
	
	m_actions.copy.reference->setEnabled( displayWidget()->hasActiveAnchor() );
	//m_actions.copy.entry->setEnabled( displayWidget()->hasActiveAnchor() );
	m_actions.copy.selectedText->setEnabled( displayWidget()->hasSelection() );

	m_actions.print.reference->setEnabled( displayWidget()->hasActiveAnchor() );
}

/** No descriptions */
void CLexiconReadWindow::nextEntry() {
	keyChooser()->setKey(ldKey()->NextEntry());
}

/** No descriptions */
void CLexiconReadWindow::previousEntry() {
	keyChooser()->setKey(ldKey()->PreviousEntry());
}

/** Reimplementation to return the right key. */
CSwordLDKey* CLexiconReadWindow::ldKey() {
	return dynamic_cast<CSwordLDKey*>(CDisplayWindow::key());
}

/** This function saves the entry as html using the CExportMgr class. */
void CLexiconReadWindow::saveAsHTML() {
	CExportManager mgr(i18n("Saving entry ..."), true, i18n("Saving"), filterOptions(), displayOptions());
	mgr.saveKey(key(), CExportManager::HTML, true);
}

/** This function saves the entry as html using the CExportMgr class. */
void CLexiconReadWindow::saveAsPlain() {
	CExportManager mgr(i18n("Saving entry ..."), true, i18n("Saving"), filterOptions(), displayOptions());
	mgr.saveKey(key(), CExportManager::Text, true);
}

void CLexiconReadWindow::slotFillBackHistory() {
	//  tqWarning("fill back history");
	TQStringList keyList = keyChooser()->getPreviousKeys();
	TQPopupMenu* menu = m_actions.backInHistory->popupMenu();
	menu->clear();

	TQStringList::iterator it;
	int index = 1;
	for (it = keyList.begin(); it != keyList.end(); ++it) {
		menu->insertItem(*it,index, index);
		++index;
	}
}

void CLexiconReadWindow::slotFillForwardHistory() {
	//  tqWarning("fill forward history");
	TQStringList keyList = keyChooser()->getNextKeys();
	TQPopupMenu* menu = m_actions.forwardInHistory->popupMenu();
	menu->clear();

	TQStringList::iterator it;
	int index = 1;
	for (it = keyList.begin(); it != keyList.end(); ++it) {
		menu->insertItem(*it,index, index);
		++index;
	}
}


void CLexiconReadWindow::slotUpdateHistoryButtons() {
	//  tqWarning("updating history buttons");
	Q_ASSERT(m_actions.backInHistory);
	Q_ASSERT(keyChooser());

	m_actions.backInHistory->setEnabled( keyChooser()->getPreviousKeys().size() > 0 );
	m_actions.forwardInHistory->setEnabled( keyChooser()->getNextKeys().size() > 0 );
}

#include "clexiconreadwindow.moc"
