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.
168 lines
4.3 KiB
168 lines
4.3 KiB
/* ============================================================
|
|
* Author: Tom Albers <tomalbers@kde.nl>
|
|
* Date : 2005-01-01
|
|
* Description :
|
|
*
|
|
* Copyright 2005 by Tom Albers
|
|
*
|
|
* 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, or (at your option)
|
|
* 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.
|
|
*
|
|
* ============================================================ */
|
|
|
|
/** @file squeezedcombobox.cpp */
|
|
|
|
// TQt includes.
|
|
|
|
#include <tqlistbox.h>
|
|
#include <tqcombobox.h>
|
|
#include <tqpair.h>
|
|
#include <tqtimer.h>
|
|
#include <tqvaluelist.h>
|
|
#include <tqstyle.h>
|
|
#include <tqapplication.h>
|
|
#include <tqtooltip.h>
|
|
|
|
// Local includes.
|
|
|
|
#include "squeezedcombobox.h"
|
|
|
|
SqueezedComboBoxTip::SqueezedComboBoxTip( TQWidget * parent, SqueezedComboBox* name )
|
|
: TQToolTip( parent )
|
|
{
|
|
m_originalWidget = name;
|
|
}
|
|
|
|
void SqueezedComboBoxTip::maybeTip( const TQPoint &pos )
|
|
{
|
|
TQListBox* listBox = m_originalWidget->listBox();
|
|
if (!listBox)
|
|
return;
|
|
|
|
TQListBoxItem* selectedItem = listBox->itemAt( pos );
|
|
if (selectedItem)
|
|
{
|
|
TQRect positionToolTip = listBox->tqitemRect( selectedItem );
|
|
TQString toolTipText = m_originalWidget->itemHighlighted();
|
|
if (!toolTipText.isNull())
|
|
tip(positionToolTip, toolTipText);
|
|
}
|
|
}
|
|
|
|
SqueezedComboBox::SqueezedComboBox( TQWidget *parent, const char *name )
|
|
: TQComboBox( parent, name )
|
|
{
|
|
setMinimumWidth(100);
|
|
m_timer = new TQTimer(this);
|
|
m_tooltip = new SqueezedComboBoxTip( listBox()->viewport(), this );
|
|
|
|
connect(m_timer, TQT_SIGNAL(timeout()),
|
|
TQT_SLOT(slotTimeOut()));
|
|
connect(this, TQT_SIGNAL(activated( int )),
|
|
TQT_SLOT(slotUpdateToolTip( int )));
|
|
}
|
|
|
|
SqueezedComboBox::~SqueezedComboBox()
|
|
{
|
|
delete m_tooltip;
|
|
delete m_timer;
|
|
}
|
|
|
|
bool SqueezedComboBox::contains( const TQString& _text ) const
|
|
{
|
|
if ( _text.isEmpty() )
|
|
return false;
|
|
|
|
const int itemCount = count();
|
|
for (int i = 0; i < itemCount; ++i )
|
|
{
|
|
if ( text(i) == _text )
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
TQSize SqueezedComboBox::tqsizeHint() const
|
|
{
|
|
constPolish();
|
|
TQFontMetrics fm = fontMetrics();
|
|
|
|
int maxW = count() ? 18 : 7 * fm.width(TQChar('x')) + 18;
|
|
int maxH = TQMAX( fm.lineSpacing(), 14 ) + 2;
|
|
|
|
return tqstyle().tqsizeFromContents(TQStyle::CT_ComboBox, this,
|
|
TQSize(maxW, maxH)).
|
|
expandedTo(TQApplication::globalStrut());
|
|
}
|
|
|
|
void SqueezedComboBox::insertSqueezedItem(const TQString& newItem, int index)
|
|
{
|
|
m_originalItems[index] = newItem;
|
|
insertItem( squeezeText(newItem), index );
|
|
|
|
// if this is the first item, set the tooltip.
|
|
if (index == 0)
|
|
slotUpdateToolTip(0);
|
|
}
|
|
|
|
void SqueezedComboBox::resizeEvent ( TQResizeEvent * )
|
|
{
|
|
m_timer->start(200, true);
|
|
}
|
|
|
|
void SqueezedComboBox::slotTimeOut()
|
|
{
|
|
TQMapIterator<int,TQString> it;
|
|
for (it = m_originalItems.begin() ; it != m_originalItems.end();
|
|
++it)
|
|
{
|
|
changeItem( squeezeText( it.data() ), it.key() );
|
|
}
|
|
}
|
|
|
|
TQString SqueezedComboBox::squeezeText( const TQString& original)
|
|
{
|
|
// not the complete widgetSize is usable. Need to compensate for that.
|
|
int widgetSize = width()-30;
|
|
TQFontMetrics fm( fontMetrics() );
|
|
|
|
// If we can fit the full text, return that.
|
|
if (fm.width(original) < widgetSize)
|
|
return(original);
|
|
|
|
// We need to squeeze.
|
|
TQString sqItem = original; // prevent empty return value;
|
|
widgetSize = widgetSize-fm.width("...");
|
|
for (uint i = 0 ; i != original.length(); ++i)
|
|
{
|
|
if ( (int)fm.width(original.right(i)) > widgetSize)
|
|
{
|
|
sqItem = TQString("..." + original.right(--i));
|
|
break;
|
|
}
|
|
}
|
|
return sqItem;
|
|
}
|
|
|
|
void SqueezedComboBox::slotUpdateToolTip( int index )
|
|
{
|
|
TQToolTip::remove(this);
|
|
TQToolTip::add(this, m_originalItems[index]);
|
|
}
|
|
|
|
TQString SqueezedComboBox::itemHighlighted()
|
|
{
|
|
int curItem = this->listBox()->currentItem();
|
|
return m_originalItems[curItem];
|
|
}
|
|
|
|
#include "squeezedcombobox.moc"
|