Source Code (Use browser search to find items of interest.)

Class Index

kuser'KHeader (./kdeadmin/kuser/kheader.h:16)

class KHeader : public QFrame {
	Q_OBJECT

public:
	enum { Buttons = 1, Vertical = 2, Resizable = 4 };

	/**
	* The constructor for a KHeader widget. All parameters have a default of 0.
	* @Doc:
	* \begin{itemize}
	* \item { \tt The parent widget. }
	* \item { \tt The name of the widget. }
	* \item { \tt The number of headers (columns or rows). }
	* \item { \tt Flags: this parameter specifies whether the header widget
	* displays row (Vertical) or column headers, if the headers are resizable
	* (Resizable) and if they are selectable (Buttons). These flags are the
	* defaults used for creating headers when using setNumHeaders().
	* \end{itemize}
	*/
	KHeader( QWidget *parent = 0, const char *name = 0,
			 int numHeaders = 0, int aflags = 0 );

	virtual ~KHeader();

	/**
	* Set the number of headers.
	* To change the number of headers displayed in the widget,
	* you must call this method. It can be used to set the initial number
	* or dynamically change the number of headers displayed. The headers
	* are created using the default flags set by the construction of the
	* widget.
	*/
	void setNumHeaders( int numHeaders );

	/**
	* Return the number of headers set in the widget.
	*/
	int numHeaders();

	/**
	* Change/Set the width of a header.
	*/
	void setHeaderSize( int header, int width );

	/**
	* Set the text to display in the header, and the text alignment.
	* The default alignment is AlignCenter.
	*/
	void setHeaderLabel( int header, const char *text, int align = AlignCenter );

	/**
	* Set the flags for an individual header.  This can be used to override
	* the defaults supplied in the construction of the widget.
	*/
	void setHeaderFlags( int header, int flags );

	/**
	* Set the size and position (viewable area) of the widget.
	* The height of the widget is automatically calculated as the height
	* of the widget's font, plus a 4 pixel suround, for horizontal
	* instantiations (i.e. column headers).
	*/
	void setGeometry( int x, int y, int w, int h );

	/**
	* Set the size (viewable area) of the widget.
	* The height of the widget is automatically calculated as the height
	* of the widget's font, plus a 4 pixel suround, for horizontal
	* instantiations (i.e. column headers).
	*/
	virtual void resize( int w, int h );

signals:
	/**
	* The size of the given header has changed to size.
	*/
	void sizeChanged( int header, int size );

	/**
	* The size of the given header is changing, and is currently size.
	*/
	void sizeChanging( int header, int size );

	/**
	* The given header has been selected (clicked).
	*/
	void selected( int header );

public slots:
	/**
	* This slot changes the offset of the headers within the widget.
	* It is usually connected to a slider/scrollbar so if a table view
	* is scrolled, the scrolling action will also scroll the attached
	* headers.
	*/ 
	void setOrigin( int pos );

protected:
	virtual void paintEvent( QPaintEvent *pev );
	virtual void mousePressEvent( QMouseEvent *mev );
	virtual void mouseReleaseEvent( QMouseEvent *mev );
	virtual void enterEvent( QEvent *ev );
	virtual void leaveEvent( QEvent *ev );
	virtual void fontChange( const QFont &oldFont );

private:
	bool eventFilter( QObject *, QEvent * );
	void adjustHeaderSize( int start, int delta );

	QArray<class KHeaderItem*> labels;
	int divider;
	int divstart;
	int m_offset;
	int m_selected;
	int m_temp_sel;
	int m_flags;
	int m_resizing;
	QCursor m_defCursor;
};

kuser'KHeader::KHeader() (./kdeadmin/kuser/kheader.cpp:100)

KHeader::KHeader( QWidget *parent, const char *name, int numHeaders, int aflags )
	: QFrame( parent, name )
{
	labels.resize( 0 );
	m_offset = 0;
	m_selected = -1;
	m_temp_sel = -1;
	m_flags = aflags;
	divider = -1;
	m_resizing = FALSE;
	if( numHeaders != 0 )
        setNumHeaders( numHeaders );
	if( aflags & Resizable )
	{
		installEventFilter(this);
		setMouseTracking(TRUE);
		m_defCursor=cursor();
	}
}



kuser'KHeader::~KHeader() (./kdeadmin/kuser/kheader.cpp:121)

KHeader::~KHeader()
{
	for( uint i=0 ; i<labels.size() ; i++ )
		delete labels[ i ];
}



kuser'KHeader::setGeometry() (./kdeadmin/kuser/kheader.cpp:128)

void KHeader::setGeometry( int x, int y, int w, int h )
{
	if( m_flags & Vertical )
		QFrame::setGeometry( x, y, w, h );
	else
		QFrame::setGeometry( x, y, w, fontMetrics().height() + 4 );
}



kuser'KHeader::resize() (./kdeadmin/kuser/kheader.cpp:137)

void KHeader::resize( int w, int h )
{
	if( m_flags & Vertical )
		QFrame::resize( w, h );
	else
		QFrame::resize( w, fontMetrics().height() + 4 );
}



kuser'KHeader::fontChange() (./kdeadmin/kuser/kheader.cpp:146)

void KHeader::fontChange( const QFont & )
{
	if( !(m_flags & Vertical) )
		resize( width(), fontMetrics().height() + 4 );
}


kuser'KHeader::eventFilter() (./kdeadmin/kuser/kheader.cpp:152)

bool KHeader::eventFilter( QObject *obj, QEvent *ev )
{
	if( ev->type()==QEvent::MouseButtonPress && divider!=-1 ) {
		m_resizing=TRUE;
		return TRUE;
	}

	if( ev->type()==QEvent::MouseMove ) {
		QMouseEvent *mev = (QMouseEvent*)ev;
		if(m_resizing) {
			if( m_flags & Vertical ) {
				adjustHeaderSize( divider, mev->pos().y()-divstart );
				divstart = mev->pos().y();
			}
			else {
				adjustHeaderSize( divider, mev->pos().x()-divstart );
				divstart = mev->pos().x();
			}
			return TRUE;
		}
		else if( mev->button()==NoButton ) {
			// search labels to see if we are in range of a divider
			int pos = m_offset;
			int cur = m_flags&Vertical ? mev->y()+3 : mev->x()+3;
			divider = -1;
			for( uint i=0 ; i<labels.size() ; i++ ) {
				pos += labels[i]->size();
				if( cur>=pos && cur<pos+6 ) {
					setCursor(m_flags&Vertical ? sizeVerCursor : sizeHorCursor);
					divider = i;
					divstart = pos;
				}
			}
			if(divider==-1) setCursor(m_defCursor);
			return TRUE;
		}
	}

	if( ev->type()==QEvent::MouseButtonRelease && m_resizing ) {
		emit sizeChanged( divider, labels[divider]->size() );
		m_resizing = FALSE;
		return TRUE;
	}
	return FALSE;
}


kuser'KHeader::numHeaders() (./kdeadmin/kuser/kheader.cpp:198)

int KHeader::numHeaders()
{
	return labels.size();
}



kuser'KHeader::setNumHeaders() (./kdeadmin/kuser/kheader.cpp:204)

void KHeader::setNumHeaders( int numHeaders )
{
	ASSERT( numHeaders >= 0 );
	if( numHeaders < (int)labels.size() )
	{
		for( uint i=numHeaders ; i<labels.size() ; i++ )
		{
			delete labels[i];
		}
		labels.resize( numHeaders );
	}
	else if( numHeaders > (int)labels.size() )
	{
		int oldCount = labels.size();
		labels.resize( numHeaders );
		
		for( int i=oldCount ; i < numHeaders ; i++ )
		{
			labels[i] = new KHeaderItem( this, m_flags );
		}
	}
}



kuser'KHeader::setHeaderFlags() (./kdeadmin/kuser/kheader.cpp:228)

void KHeader::setHeaderFlags( int header, int aflags )
{
	ASSERT( header >= 0 );
	ASSERT( header < (int)labels.size() );

	labels[header]->setFlags( aflags );
}



kuser'KHeader::setHeaderSize() (./kdeadmin/kuser/kheader.cpp:237)

void KHeader::setHeaderSize( int header, int size )
{
	ASSERT( header >= 0 );
	ASSERT( header < (int)labels.size() );

	labels[header]->setSize( size );
	repaint();
	emit sizeChanged( header, size );
}



kuser'KHeader::adjustHeaderSize() (./kdeadmin/kuser/kheader.cpp:248)

void KHeader::adjustHeaderSize( int start, int delta )
{
	int pos = labels[start]->size()+delta;
	if( pos < 0 ) pos = 0;
	labels[start]->setSize( pos );
// There must be a better way!
// calculate the rectangle?
	repaint();
	emit sizeChanging( start, pos );
}



kuser'KHeader::setOrigin() (./kdeadmin/kuser/kheader.cpp:260)

void KHeader::setOrigin( int pos )
{
	m_offset = -pos;
	repaint();
}



kuser'KHeader::setHeaderLabel() (./kdeadmin/kuser/kheader.cpp:267)

void KHeader::setHeaderLabel( int header, const char *text, int align )
{
	labels[header]->setText( text, align );
}



kuser'KHeader::paintEvent() (./kdeadmin/kuser/kheader.cpp:273)

void KHeader::paintEvent( QPaintEvent * )
{
	QColorGroup g = colorGroup();

	QPainter paint;
	paint.begin( this );

	int pos = m_offset;
	for( int i=0 ; i<(int)labels.size(); i++ )
	{
		labels[i]->paint( &paint, &g, style(), pos, width(), height(), i==m_selected);
		pos += labels[i]->size();
	}

	paint.end();
}


kuser'KHeader::mousePressEvent() (./kdeadmin/kuser/kheader.cpp:290)

void KHeader::mousePressEvent( QMouseEvent *mev )
{
	int cur;
	if( m_flags & Vertical )
		cur = mev->y();
	else
		cur = mev->x();
	int pos = m_offset;
	for( uint i=0 ; i<labels.size() ; i++ )
	{
		pos += labels[i]->size();
		if( pos >= cur )
		{
			if( !(labels[i]->flags() & Buttons) )
				return;
			m_selected = i;
			break;
		}
	}
	repaint();
}


kuser'KHeader::mouseReleaseEvent() (./kdeadmin/kuser/kheader.cpp:312)

void KHeader::mouseReleaseEvent( QMouseEvent *mev )
{
	if( m_selected == -1 )
	{
		m_temp_sel = -1;
		return;
	}
	emit selected(m_selected);
	m_selected = -1;
	m_temp_sel = -1;
	repaint();
}


kuser'KHeader::enterEvent() (./kdeadmin/kuser/kheader.cpp:325)

void KHeader::enterEvent( QEvent * )
{
	m_selected = m_temp_sel;
	if( m_selected != -1 )
		repaint();
}


kuser'KHeader::leaveEvent() (./kdeadmin/kuser/kheader.cpp:332)

void KHeader::leaveEvent( QEvent * )
{
	m_temp_sel = m_selected;
	m_selected = -1;
	if( m_temp_sel != -1 )
		repaint();
}