//=============================================================================
//
//   File : kvinotifierwindowtabs.cpp
//   Created on dom 02 gen 2005 15:30:50 by Iacopo Palazzi
//
//   This file is part of the KVIrc irc client distribution
//   Copyright (C) 2005 Iacopo Palazzi < iakko(at)siena(dot)linux(dot)it >
//
//   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 "kvi_app.h"
#include "kvi_config.h"
#include "kvi_qstring.h"
#include "kvi_iconmanager.h"
#include "kvi_locale.h"
#include "kvi_options.h"
#include "kvi_window.h"

#include <qevent.h>
#include <qpainter.h>
#include <qbrush.h>
#include <qcolor.h>
#include <qfontmetrics.h>

#include "notifiermessage.h"
#include "notifierwindowtabs.h"

extern KviNotifierWindow * g_pNotifierWindow;
KviNotifierWindowTabs * g_pTabs;


// --- tab object definition class

KviNotifierWindowTab::KviNotifierWindowTab(KviWindow * pWnd, QString label)
{
	m_pWnd = pWnd;
	m_label = label;
	m_pMessageList = new KviPtrList<KviNotifierMessage>;
	m_pMessageList->setAutoDelete(true);
	m_bFocused = false;
	m_pCurrentMessage = 0;
	
	KviStr buffer;
	g_pApp->getReadOnlyConfigPath(buffer,"libkvinotifier.kvc",KviApp::ConfigPlugins,true);
	KviConfig cfg(buffer.ptr(),KviConfig::Read);
	cfg.setGroup("NotifierSkin");
		m_clrHighlightedLabel = cfg.readColorEntry("HighlightedTabLablerColor",QColor(200,0,0));
		m_clrNormalLabel = cfg.readColorEntry("NormalTabLablerColor",QColor(0,0,0));
		m_clrChangedLabel = cfg.readColorEntry("ChangedTabLablerColor",QColor(0,0,100));
	
	if(pWnd)
	{
		connect(pWnd,SIGNAL(windowNameChanged()),this,SLOT(labelChanged()));
		connect(pWnd,SIGNAL(destroyed()),this,SLOT(closeMe()));
	}
}

KviNotifierWindowTab::~KviNotifierWindowTab()
{
	delete m_pMessageList;
}

void KviNotifierWindowTab::setNextMessageAsCurrent()
{
	if(!m_pCurrentMessage)return;
	m_pMessageList->findRef(m_pCurrentMessage);
	m_pCurrentMessage = m_pMessageList->next();
	if(!m_pCurrentMessage)m_pCurrentMessage = m_pMessageList->last();
}

void KviNotifierWindowTab::setPrevMessageAsCurrent()
{
	if(!m_pCurrentMessage)return;
	m_pMessageList->findRef(m_pCurrentMessage);
	m_pCurrentMessage = m_pMessageList->prev();
	if(!m_pCurrentMessage)m_pCurrentMessage = m_pMessageList->first();
}

void KviNotifierWindowTab::setLastMessageAsCurrent()
{
	m_pCurrentMessage = m_pMessageList->last();
}

void KviNotifierWindowTab::appendMessage(KviNotifierMessage * m)
{
	if(m_pCurrentMessage == m_pMessageList->last())m_pCurrentMessage = m;
	m_pMessageList->append(m);
	// avoid having too much messages floating around
	while(m_pMessageList->count() > MAX_MESSAGES_IN_WINDOW)
	{
		m = m_pMessageList->first();
		m_pMessageList->removeFirst();
		if(m == m_pCurrentMessage)
			m_pCurrentMessage = m_pMessageList->first();
	}
	if(focused())setState(Normal);
	else setState(Highlighted);
}

void KviNotifierWindowTab::labelChanged()
{
	if(!m_pWnd)return;
	m_label = m_pWnd->windowName();
	setState(Changed);
	g_pTabs->needToRedraw();
	g_pNotifierWindow->update();
}

void KviNotifierWindowTab::closeMe()
{
	g_pTabs->closeTab(this);
}

void KviNotifierWindowTab::setFocused(bool b)
{
	m_bFocused = b;
	if(m_bFocused)setState(Normal);
}

void KviNotifierWindowTab::setState(TabState state)
{
	m_eState=state;
	switch (m_eState) {
		case Normal:
			m_cLabel = m_clrNormalLabel;
			break;
		case Highlighted:
			m_cLabel = m_clrHighlightedLabel;
			break;
		case Changed:
			m_cLabel = m_clrChangedLabel;
			break;
	}
};

int KviNotifierWindowTab::width(bool b) {
	int width = 0;
	QFont * font;

	QPixmap * sx;
	QPixmap * dx;

	if (focused()) {
		font = g_pTabs->fontFocused();
		sx = g_pTabs->tabFocusedPixSx();
		dx = g_pTabs->tabFocusedPixSx();
	} else {
		sx = g_pTabs->tabUnfocusedPixSx();
		dx = g_pTabs->tabUnfocusedPixSx();	
		font = g_pTabs->fontUnfocused();
	}
	
	QFontMetrics fm(*font);
	width = fm.width(label())+2;
	if (!b) width += sx->width() + dx->width();

	return width;
}

// ##################################################################################à
// ### end of tab object definition class
// ##################################################################################à


KviNotifierWindowTabs::KviNotifierWindowTabs(QRect r)
{
	g_pTabs = this;
	m_pPixmap = new QPixmap();
	m_pPainter = new QPainter();
	m_pTabFocused = 0;
	m_pWndTabFocused = 0;
	m_iTabToStartFrom = 0;

	m_tabPtrList.clear();

	loadImages();
	initConfig();
	resize(r);
}

KviNotifierWindowTabs::~KviNotifierWindowTabs()
{
	QMap<KviWindow *, KviNotifierWindowTab *>::Iterator tab;
	for(tab = m_tabMap.begin(); tab != m_tabMap.end(); tab++ )
		delete tab.data();
	m_tabMap.clear();
	delete m_pFocusedFont;
	delete m_pUnfocusedFont;
	delete m_pPainter;
	delete m_pPixmap;
}

void KviNotifierWindowTabs::initConfig()
{
	KviStr buffer;
	g_pApp->getReadOnlyConfigPath(buffer,"libkvinotifier.kvc",KviApp::ConfigPlugins,true);

	KviConfig cfg(buffer.ptr(),KviConfig::Read);

	cfg.setGroup("NotifierSkin");
	
	QString szFamily = cfg.readEntry("TextFontFocusedTab","Arial");
	m_pFocusedFont = new QFont(szFamily,cfg.readIntEntry("TextFocusedFontSize",10));
	m_pFocusedFont->setBold(true);
	szFamily = cfg.readEntry("TextFontUnfocusedTab","Arial");
	m_pUnfocusedFont = new QFont(szFamily,cfg.readIntEntry("TextUnfocusedFontSize",9));
}

void KviNotifierWindowTabs::loadImages()
{
	QPixmap * p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_dx.png")))
		m_pixDX = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_sx.png")))
		m_pixSX = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_bkg.png")))
		m_pixBKG = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_focused_sx.png")))
		m_pixSXFocused = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_focused_dx.png")))
		m_pixDXFocused = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_focused_bkg.png")))
		m_pixBKGFocused = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_unfocused_sx.png")))
		m_pixSXUnfocused = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_unfocused_dx.png")))
		m_pixDXUnfocused = *p;
	if((p = g_pIconManager->getPixmap("notifier_pix_tab_unfocused_bkg.png")))
		m_pixBKGUnfocused = *p;

	if((p = g_pIconManager->getPixmap("notifier_icon_tab_next_out.png")))
		m_pixIconTabNext_out = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_next_over.png")))
		m_pixIconTabNext_over = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_next_clicked.png")))
		m_pixIconTabNext_clicked = *p;

	m_pixIconTabNext = m_pixIconTabNext_out;
	
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_prev_out.png")))
		m_pixIconTabPrev_out = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_prev_over.png")))
		m_pixIconTabPrev_over = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_prev_clicked.png")))
		m_pixIconTabPrev_clicked = *p;

	m_pixIconTabPrev = m_pixIconTabPrev_out;

	if((p = g_pIconManager->getPixmap("notifier_icon_tab_close_off.png")))
		m_pixIconCloseTab_off = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_close_on.png")))
		m_pixIconCloseTab_on = *p;
	if((p = g_pIconManager->getPixmap("notifier_icon_tab_close_clicked.png")))
		m_pixIconCloseTab_clicked = *p;

	m_pixIconCloseTab = m_pixIconCloseTab_off;

	m_closeTabIconState = WDG_ICON_OFF;

}



void KviNotifierWindowTabs::addMessage(KviWindow * pWnd, KviNotifierMessage * message)
{
	QString sender = pWnd ? pWnd->windowName() : "----";

	// Qui servirebbe anche una lista... perche' quando si inserisce
	// un tab lui lo piazza dove gli pare nell'ordine
	// e quindi iterando i tab nuovi possono trovarsi PRIMA dei tab vecchi
	// il che' confonde un po
	KviNotifierWindowTab * tab;
	if (!m_tabMap.contains(pWnd)) {
		m_tabMap.insert(pWnd, tab = new KviNotifierWindowTab(pWnd, sender));
		m_tabPtrList.append(tab);
	} else {
		tab = m_tabMap[pWnd];
	}

	tab->appendMessage(message);
	
	if((g_pNotifierWindow->state()==Hidden) || (!m_pTabFocused))
	{
		setFocusOn(tab);
	} else {
		needToRedraw();
	}
}

void KviNotifierWindowTabs::resize(QRect r)
{
	m_rct.setX(r.x());
	m_rct.setY(r.y());
	m_rct.setHeight(r.height());
	setWidth(r.width());
	
	recalculatePositions();
}

void KviNotifierWindowTabs::setWidth(int w) {
	m_rct.setWidth(w);
	recalculatePositions();
}

void KviNotifierWindowTabs::recalculatePositions()
{
	m_rctCloseTabIcon.setX(m_rct.x()+m_rct.width()-m_pixIconCloseTab.width());
	m_rctCloseTabIcon.setY(m_rct.y());
	m_rctCloseTabIcon.setWidth(m_pixIconCloseTab.width());
	m_rctCloseTabIcon.setHeight(m_pixIconCloseTab.height());
	// The sensible area for the Close Icon
	m_rctCloseTabIconHotArea.setX(m_rctCloseTabIcon.x()+6);
	m_rctCloseTabIconHotArea.setY(m_rctCloseTabIcon.y()+3);
	m_rctCloseTabIconHotArea.setWidth(16);
	m_rctCloseTabIconHotArea.setHeight(16);

	if (m_bIsOverRightBound) {
		m_rctNextIcon.setX(m_rct.x() + m_rct.width() - m_rctCloseTabIcon.width() - m_pixIconTabNext.width());
		m_rctNextIcon.setY(m_rct.y());
		m_rctNextIcon.setWidth(m_pixIconTabNext.width());
		m_rctNextIcon.setHeight(m_pixIconTabNext.height());
	}
	
	if (m_bIsOverLeftBound) {
		m_rctPrevIcon.setX(m_rct.x());
		m_rctPrevIcon.setY(m_rct.y());
		m_rctPrevIcon.setWidth(m_pixIconTabPrev.width());
		m_rctPrevIcon.setHeight(m_pixIconTabPrev.height());
	}
	
	int tmpX, tmpWidth;
	
	tmpWidth = m_rctCloseTabIcon.x() - m_rct.x();
	
	if (m_bIsOverRightBound) {
		tmpWidth -= m_rctNextIcon.width();
	}
	
	if (m_bIsOverLeftBound) {
		tmpWidth -= m_rctPrevIcon.width();
		tmpX = m_rct.x() + m_rctPrevIcon.width();
	} else {
		tmpX = m_rct.x();
	}
	
	m_rctTabs.setX(tmpX);
	m_rctTabs.setY(m_rct.y());
	
	m_rctTabs.setWidth(tmpWidth);
	m_rctTabs.setHeight(m_rct.height());
	
	needToRedraw();
}

void KviNotifierWindowTabs::prev()
{
	if(!m_pTabFocused)return;

	KviNotifierWindowTab * tab;
	QPtrListIterator<KviNotifierWindowTab> tabIterator (m_tabPtrList);

	tab = m_tabMap[m_pTabFocused->wnd()];
	
	tabIterator.atFirst();
	
	while ((tabIterator.current()) != tab) {
		++tabIterator;
	}
	
	if (!tabIterator.atFirst()) {
		--tabIterator;
		tab = tabIterator.current();
		setFocusOn(tab);
	}
	
}

void KviNotifierWindowTabs::next()
{
	if(!m_pTabFocused)return;
	
	KviNotifierWindowTab * tab;
	QPtrListIterator<KviNotifierWindowTab> tabIterator (m_tabPtrList);

	tab = m_tabMap[m_pTabFocused->wnd()];
	tabIterator.atFirst();
	while ((tabIterator.current()) != tab) {
		++tabIterator;
	}
	
	if (!tabIterator.atLast()) {
		++tabIterator;
		tab = tabIterator.current();
		setFocusOn(tab);
	}

}

void KviNotifierWindowTabs::mousePressEvent(QMouseEvent * e) {

	if (m_bIsOverRightBound && m_rctNextIcon.contains(e->pos())) {
		return;
	}
	
	if (m_bIsOverLeftBound && m_rctPrevIcon.contains(e->pos())) {
		return;
	}

	if(m_rctTabs.contains(e->pos()))
	{
		QMap<KviWindow *, KviNotifierWindowTab *>::Iterator tab;
		for (tab = m_tabMap.begin(); tab != m_tabMap.end(); tab++ ) {
			if (tab.data()->rect().contains(e->pos())) {
				setFocusOn(tab.data());
				return;
			}
		}
	}

	if (m_rctCloseTabIconHotArea.contains(e->pos())) {
		setCloseTabIcon(WDG_ICON_CLICKED);
		return;
	}

}

void KviNotifierWindowTabs::mouseMoveEvent(QMouseEvent * e)
{
	if (m_rctCloseTabIconHotArea.contains(e->pos()))
	{
		setCloseTabIcon(WDG_ICON_ON);
	} else {
		if (closeTabIconState()!=WDG_ICON_OFF)
			setCloseTabIcon(WDG_ICON_OFF);
	}
}

void KviNotifierWindowTabs::mouseReleaseEvent(QMouseEvent * e)
{

	if (m_bIsOverRightBound && m_rctNextIcon.contains(e->pos())) {
		scrollTabsLeft();
		return;
	}
	
	if (m_bIsOverLeftBound && m_rctPrevIcon.contains(e->pos())) {
		scrollTabsRight();
		return;
	}

	if(currentTab())
	{
		if (rctCloseTabIconHotArea().contains(e->pos()))
		{
			closeCurrentTab();
			g_pNotifierWindow->update();
		}
	}
		
}

void KviNotifierWindowTabs::scrollTabsLeft() {
	if (m_bIsOverRightBound) {
		m_iTabToStartFrom++;
	}
	needToRedraw();
	g_pNotifierWindow->update();
};

void KviNotifierWindowTabs::scrollTabsRight() {
	if (m_bIsOverLeftBound) {
		m_iTabToStartFrom--;
	}
	needToRedraw();
	g_pNotifierWindow->update();
};

void KviNotifierWindowTabs::setCloseTabIcon(int state)	{

	//if (m_writeIconState==WDG_ICON_OFF && state!=WDG_ICON_OFF)
	if (m_closeTabIconState!=state) {
		switch (state) {
			case WDG_ICON_ON: m_pixIconCloseTab = m_pixIconCloseTab_on; break;
			case WDG_ICON_OFF: m_pixIconCloseTab = m_pixIconCloseTab_off; break;
			case WDG_ICON_CLICKED: m_pixIconCloseTab = m_pixIconCloseTab_clicked; break;
		}
		needToRedraw();
		m_closeTabIconState = state;
	}
}

void KviNotifierWindowTabs::resetIcons()
{
	setCloseTabIcon(WDG_ICON_OFF);
}

void KviNotifierWindowTabs::setFocusOn(KviNotifierWindowTab * tab)
{	
	if(m_pTabFocused)m_pTabFocused->setFocused(false);
	m_pTabFocused = tab;
	if(m_pTabFocused)m_pTabFocused->setFocused();

	if (m_lastVisitedTabPtrList.containsRef(tab)) {
		m_lastVisitedTabPtrList.removeRef(tab);
	}
	
	m_lastVisitedTabPtrList.insert(0, tab);

	needToRedraw();

	g_pNotifierWindow->update();
}

void KviNotifierWindowTabs::draw(QPainter * p)
{
	if(!m_bNeedToRedraw)return;

	m_pPixmap->resize(m_rct.width(), m_rct.height());

	m_pPainter->begin(m_pPixmap);

	QFont tmpFont;
	tmpFont = p->font();

	m_pPainter->setFont(tmpFont);

	QString str;
	
	bool isBigger = false;

	int offset = 0;
	
	int closeIcon_X = m_rct.width() - m_rctCloseTabIcon.width();
	int nextIcon_X = closeIcon_X  - m_pixIconTabNext_out.width();
	int prevIcon_X = m_rct.x();
	
	int tmpTabsWidth = 0;

	m_pPainter->drawPixmap(0,0,m_pixSX);
	m_pPainter->drawPixmap(m_rct.width()-m_pixDX.width(),0,m_pixDX);
	m_pPainter->drawTiledPixmap(m_pixSX.width(),0,m_rct.width()-m_pixSX.width()-m_pixDX.width(),m_rct.height(),m_pixBKG);

	QPtrListIterator<KviNotifierWindowTab> tabIterator (m_tabPtrList);
	
	//m_tabPtrList.findRef(m_tabMap[m_pTabFocused->wnd()]);

//	QMap<KviWindow *, KviNotifierWindowTab *>::Iterator tab;
	KviNotifierWindowTab * tab;
	//for (tab = m_tabMap.begin(); tab != m_tabMap.end() && !isBigger; tab++ )
	tabIterator.toFirst();
	
	int i = 0;
	while(m_iTabToStartFrom!=i) {
		i++;
		++tabIterator;
	}
	
	while ( ((tab = tabIterator.current()) != 0) && !isBigger)
	{
		++tabIterator;
		
		if (tab->focused()) {

			m_pPainter->setFont(*m_pFocusedFont);

			tab->setRect(m_rct.x() + offset, m_rctTabs.y(), tab->width(), m_rctTabs.height());
			
			m_pPainter->drawPixmap(offset,0,m_pixSXFocused);
			m_pPainter->drawTiledPixmap(offset+m_pixSXFocused.width(),0,tab->width(true),m_rctTabs.height(),m_pixBKGFocused);
			m_pPainter->drawPixmap(offset+m_pixSXFocused.width()+tab->width(true),0,m_pixDXFocused);
			QPen tmpP = m_pPainter->pen(); m_pPainter->setPen(tab->labelColor());
			m_pPainter->drawText(offset+m_pixSXFocused.width()+1,m_rctTabs.height()-NTF_TABS_FONT_BASELINE,tab->label());
			m_pPainter->setPen(tmpP);

			offset += tab->width();

		} else {

			m_pPainter->setFont(*m_pUnfocusedFont);

			tab->setRect(m_rct.x() + offset, m_rctTabs.y(), tab->width(), m_rctTabs.height());

			m_pPainter->drawPixmap(offset, 0, m_pixSXUnfocused);
			m_pPainter->drawTiledPixmap(offset+m_pixSXUnfocused.width(), 0, tab->width(true), m_rctTabs.height(), m_pixBKGUnfocused);
			m_pPainter->drawPixmap(offset+m_pixSXUnfocused.width()+tab->width(true), 0, m_pixDXUnfocused);
			QPen tmpP = m_pPainter->pen(); m_pPainter->setPen(tab->labelColor());
			m_pPainter->drawText(offset+m_pixSXUnfocused.width()+1,m_rctTabs.height()-NTF_TABS_FONT_BASELINE+1,tab->label());
			m_pPainter->setPen(tmpP);
			offset += tab->width();
		}
		
		if (offset > m_rctTabs.width()) isBigger = true; else isBigger = false;
	}

	if (m_iTabToStartFrom) {
		// Draw the left arrow for more tabs
		m_bIsOverLeftBound = true;
		m_pPainter->drawPixmap(0, 0, m_pixIconTabPrev);
	} else {
		m_bIsOverLeftBound = false;
	}

	if (isBigger) {
		// Draw the right arrow for more tabs
		m_bIsOverRightBound = true;
		m_pPainter->drawPixmap(nextIcon_X, 0, m_pixIconTabNext);
	} else {
		m_bIsOverRightBound = false;
	}

	m_pPainter->drawPixmap(closeIcon_X, 0, m_pixIconCloseTab);

	m_pPainter->end();
	
	p->drawPixmap(m_rct.x(), m_rct.y(), *m_pPixmap, 0, 0, m_pPixmap->width(), m_pPixmap->height());

	m_bNeedToRedraw = false;
	
}

void KviNotifierWindowTabs::markAllMessagesAsHistoric()
{
/*
	QMap<KviWindow *, KviNotifierWindowTab *>::Iterator tab;
	// Iterating every tab
	for (tab = m_tabMap.begin(); tab != m_tabMap.end(); ++tab) {
	
		if (!tab.value()) break;
		
		KviPtrList<KviNotifierMessage> * tmpMessageList = tab.value()->messageList();
		
		if (!tmpMessageList) break;
		
		for(KviNotifierMessage * m = tmpMessageList->last(); m; m = tmpMessageList->prev()) {
			if(m->historic()) break;;
			m->setHistoric();
		}
	}
*/
}

void KviNotifierWindowTabs::closeTab(KviWindow * pWnd)
{
	KviNotifierWindowTab * pTab = m_tabMap.find(pWnd).data();
	closeTab(pWnd, pTab);
}

void KviNotifierWindowTabs::closeTab(KviNotifierWindowTab * pTab)
{
	KviWindow * pWnd = pTab->wnd();
	closeTab(pWnd, pTab);
}

void KviNotifierWindowTabs::closeCurrentTab()
{
	// Paranoic checks...
	if (!m_pTabFocused) return; // The current tab is null? Please, kill me...
	KviNotifierWindowTab * pTab = m_pTabFocused;
	if (m_tabMap.isEmpty()) return; // Empty??? The World is ending...
	KviWindow * pWnd = pTab->wnd();
	if (!m_tabMap.contains(pWnd)) return; // The current tab is not on the map??? Call 911!!
	// End paranoic stuff, go back to sanity...
	
	closeTab(pWnd, pTab);
}

void KviNotifierWindowTabs::closeTab(KviWindow * pWnd, KviNotifierWindowTab * pTab)
{
	// Ok, we should be sure to delete the right tab...
	m_tabPtrList.removeRef(pTab);
	m_lastVisitedTabPtrList.removeRef(pTab);
	m_tabMap.remove(pWnd);
	delete pTab;
	
	if(m_tabMap.empty())
	{
		m_pTabFocused = 0;
		g_pNotifierWindow->showLineEdit(false);
		g_pNotifierWindow->doHide(false);
	} else {
	
		if (m_lastVisitedTabPtrList.count()) {
			m_pTabFocused = m_lastVisitedTabPtrList.getFirst();
		} else {
			m_pTabFocused = m_tabPtrList.getLast();
		}
			
		m_pTabFocused->setFocused(true);
	}
}

#include "m_notifierwindowtabs.moc"
