You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
klamav/src/tabwidget.cpp

202 lines
6.0 KiB

/***************************************************************************
* Copyright (C) 2004 by Sashmit Bhaduri *
* smt@vfemail.net *
* *
* Licensed under GPL. *
***************************************************************************/
#include "tabwidget.h"
#include <tqstyle.h>
#include <tqclipboard.h>
#include <tqstringlist.h>
#include <tdeapplication.h>
#include <ktabbar.h>
#include <tdepopupmenu.h>
#include <tdelocale.h>
#include <kiconloader.h>
using namespace KlamAV;
TabWidget::TabWidget(TQWidget * parent, const char *name, TQStringList fixed)
:KTabWidget(parent, name), m_CurrentMaxLength(30)
{
fixedTabs = TQStringList(fixed);
setTabReorderingEnabled(true);
connect( this, SIGNAL( currentChanged(TQWidget *) ), this,
SLOT( slotTabChanged(TQWidget *) ) );
connect(this, SIGNAL(closeRequest(TQWidget*)), this, SLOT(slotCloseRequest(TQWidget*)));
//setHoverCloseButton(Settings::closeButtonOnTabs());
}
TabWidget::~TabWidget()
{
}
void TabWidget::slotSettingsChanged()
{
//if (hoverCloseButton() != Settings::closeButtonOnTabs())
// setHoverCloseButton(Settings::closeButtonOnTabs());
}
void TabWidget::addFrame(Frame *f)
{
if (!f || !f->widget()) return;
m_frames.insert(f->widget(), f);
addTab(f->widget(), f->title());
}
Frame *TabWidget::currentFrame()
{
TQWidget *w=currentPage();
if (!w) return 0;
return m_frames[w];
}
void TabWidget::slotTabChanged(TQWidget *w)
{
emit currentFrameChanged(m_frames[w]);
}
void TabWidget::removeFrame(Frame *f)
{
f->setCompleted();
m_frames.remove(f->widget());
removePage(f->widget());
setTitle( currentFrame()->title(), currentPage() );
}
// copied wholesale from KonqFrameTabs
unsigned int TabWidget::tabBarWidthForMaxChars( uint maxLength )
{
int hframe, overlap;
hframe = tabBar()->style().pixelMetric( TQStyle::PM_TabBarTabHSpace, this );
overlap = tabBar()->style().pixelMetric( TQStyle::PM_TabBarTabOverlap, this );
TQFontMetrics fm = tabBar()->fontMetrics();
int x = 0;
for( int i=0; i < count(); ++i ) {
Frame *f=m_frames[page(i)];
TQString newTitle=f->title();
if ( newTitle.length() > maxLength )
newTitle = newTitle.left( maxLength-3 ) + "...";
TQTab* tab = tabBar()->tabAt( i );
int lw = fm.width( newTitle );
int iw = 0;
if ( tab->iconSet() )
iw = tab->iconSet()->pixmap( TQIconSet::Small, TQIconSet::Normal ).width() + 4;
x += ( tabBar()->style().sizeFromContents( TQStyle::CT_TabBarTab, this, TQSize( TQMAX( lw + hframe + iw, TQApplication::globalStrut().width() ), 0 ), TQStyleOption( tab ) ) ).width();
}
return x;
}
void TabWidget::setTitle( const TQString &title , TQWidget* sender)
{
removeTabToolTip( sender );
Frame *f=m_frames[sender];
if (f)
f->setTitle(title);
uint lcw=0, rcw=0;
int tabBarHeight = tabBar()->sizeHint().height();
if ( cornerWidget( TopLeft ) && cornerWidget( TopLeft )->isVisible() )
lcw = TQMAX( cornerWidget( TopLeft )->width(), tabBarHeight );
if ( cornerWidget( TopRight ) && cornerWidget( TopRight )->isVisible() )
rcw = TQMAX( cornerWidget( TopRight )->width(), tabBarHeight );
uint maxTabBarWidth = width() - lcw - rcw;
uint newMaxLength=30;
for ( ; newMaxLength > 3; newMaxLength-- ) {
if ( tabBarWidthForMaxChars( newMaxLength ) < maxTabBarWidth )
break;
}
TQString newTitle = title;
if ( newTitle.length() > newMaxLength )
{
setTabToolTip( sender, newTitle );
newTitle = newTitle.left( newMaxLength-3 ) + "...";
}
newTitle.replace( '&', "&&" );
if ( tabLabel( sender ) != newTitle )
changeTab( sender, newTitle );
if( newMaxLength != m_CurrentMaxLength )
{
for( int i = 0; i < count(); ++i)
{
Frame *f=m_frames[page(i)];
newTitle=f->title();
removeTabToolTip( page( i ) );
if ( newTitle.length() > newMaxLength )
{
setTabToolTip( page( i ), newTitle );
newTitle = newTitle.left( newMaxLength-3 ) + "...";
}
newTitle.replace( '&', "&&" );
if ( newTitle != tabLabel( page( i ) ) )
changeTab( page( i ), newTitle );
}
m_CurrentMaxLength = newMaxLength;
}
}
void TabWidget::contextMenu(int i, const TQPoint &p)
{
currentItemId = i;
currentItem = page(i);
TDEPopupMenu popup;
int moveTabLeft = popup.insertItem( SmallIcon("back"), i18n("Move Tab &Left"), this, SLOT(slotMoveTabLeft()) );
int moveTabRight = popup.insertItem( SmallIcon("forward"), i18n("Move Tab &Right"), this, SLOT(slotMoveTabRight()) );
popup.insertSeparator();
int closeTab = popup.insertItem( SmallIcon("tab_remove"), i18n("Close Tab"), this, SLOT(slotCloseTab()) );
if(currentItemId == 0)
popup.setItemEnabled(moveTabLeft, false);
if(currentItemId == count() - 1)
popup.setItemEnabled(moveTabRight, false);
for( TQStringList::Iterator it = fixedTabs.begin(); it != fixedTabs.end(); ++it) {
if( TQString(*it) == label(currentItemId).replace('&',TQString::null) )
popup.setItemEnabled(closeTab, false);
}
popup.exec(p);
}
void TabWidget::slotMoveTabLeft() {
if( currentItemId > 0 )
moveTab(currentItemId, currentItemId-1);
}
void TabWidget::slotMoveTabRight() {
if( currentItemId < count() - 1 )
moveTab(currentItemId, currentItemId+1);
}
void TabWidget::slotCloseTab()
{
if(!currentItem) return;
removePage(currentItem);
emit tabClosed( currentItem->name() );
currentItem = 0;
}
void TabWidget::slotCloseRequest(TQWidget* widget)
{
if (m_frames.find(widget) != NULL)
removeFrame(m_frames.find(widget));
}
// vim: set et ts=4 sts=4 sw=4:
#include "tabwidget.moc"