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

207 lines
6.2 KiB

/***************************************************************************
* Copyright (C) 2004 by Sashmit Bhaduri *
* smt@vfemail.net *
* *
* Licensed under GPL. *
***************************************************************************/
#include "tabwidget.h"
#include <tqstyle.h>
#include <tqclipboard.h>
#include <tdeapplication.h>
#include <ktabbar.h>
#include <tdepopupmenu.h>
#include <tdelocale.h>
#include <tdehtmlview.h>
#include <tdehtml_part.h>
#include <kiconloader.h>
//#include "akregatorconfig.h"
using namespace KlamAV;
TabWidget::TabWidget(TQWidget * parent, const char *name)
:KTabWidget(parent, name), m_CurrentMaxLength(30)
{
setTabReorderingEnabled(false);
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)
{
currentItem = page(i);
TDEPopupMenu popup;
//popup.insertTitle(tabLabel(currentItem));
//int detachTab = popup.insertItem( SmallIcon("tab_breakoff"), i18n("Detach Tab"), this, SLOT( slotDetachTab() ) );
//int copyLink = popup.insertItem( i18n("Copy Link Address"), this, SLOT( slotCopyLinkAddress() ) );
//popup.insertSeparator();
int closeTab = popup.insertItem( SmallIcon("tab_remove"), i18n("Close Tab"), this, SLOT( slotCloseTab() ) );
if(indexOf(currentItem) == 0) { // you can't detach or close articles tab..
// popup.setItemEnabled(detachTab, false);
popup.setItemEnabled(closeTab, false);
//popup.setItemEnabled(copyLink, false);
}
popup.exec(p);
}
void TabWidget::slotDetachTab()
{
if(!currentItem) return;
KURL url;
if (TDEHTMLView *view = dynamic_cast<TDEHTMLView*>(currentItem)) url = view->part()->url();
else return;
kapp->invokeBrowser(url.url(), "0");
removePage(currentItem);
delete currentItem;
currentItem = 0;
}
void TabWidget::slotCopyLinkAddress()
{
if(!currentItem) return;
KURL url;
if (TDEHTMLView *view = dynamic_cast<TDEHTMLView*>(currentItem)) url = view->part()->url();
else return;
TQClipboard *cb = TQApplication::clipboard();
if(cb) cb->setText(url.prettyURL());
}
void TabWidget::slotCloseTab()
{
if(!currentItem) return;
removePage(currentItem);
delete currentItem;
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"