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.
knmap/src/scanstack.cpp

197 lines
5.5 KiB

/***************************************************************************
* *
* Copyright (C) 2005, 2006 by Kevin Gilbert *
* kev.gilbert@cdu.edu.au *
* *
* 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 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. *
* *
* 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 <ntqdict.h>
#include <kdebug.h>
#include <tdelocale.h>
#include "htmlwidget.h"
#include "scanstack.h"
#include "scanwidget.h"
// constructor
// ===========
ScanStack::ScanStack( TQWidget* parent, const char* name )
: TQWidgetStack( parent, name ),
m_dictSize( 29 ),
m_firstScanWidget( NULL ),
m_widgetId( 1 )
{ m_scanWidgetDict = new TQDict<ScanWidget>( m_dictSize );
m_scanWidgetDict->setAutoDelete( true );
}
// appendAndRaiseWidget
// ====================
void ScanStack::appendAndRaiseWidget( ScanWidget* scanWidget )
{ addWidget( scanWidget, m_widgetId );
raiseWidget( m_widgetId );
m_widgetId++;
if( m_firstScanWidget == NULL )
m_firstScanWidget = scanWidget;
ushort index = m_scanWidgetDict->count( );
if( index == m_dictSize )
{ m_dictSize *= 2; // yes - i know it's supposed to be prime!
m_scanWidgetDict->resize( m_dictSize );
}
m_scanWidgetDict->insert( TQString::number( index ), scanWidget );
}
// appendHTMLWidget
// ================
void ScanStack::appendHTMLWidget( HTMLWidget* htmlWidget )
{ Q_ASSERT( m_widgetId == 1 );
addWidget( (TQWidget*) htmlWidget, m_widgetId++ );
}
// findScanWidget
// ==============
short ScanStack::findScanWidget( const ScanWidget* scanWidget )
{ ushort i;
for( resetScanWidgets( i ); moreScanWidgets( i ); nextScanWidget( i ))
if( scanWidget == currentScanWidget( i ))
return i;
return -1;
}
// indexOfVisibleScanWidget
// ========================
short ScanStack::indexOfVisibleScanWidget( )
{ ushort i;
for( resetScanWidgets( i ); moreScanWidgets( i ); nextScanWidget( i ))
if( isVisibleWidget( currentScanWidget( i )))
break;
if( !moreScanWidgets( i ))
{ Q_ASSERT( false );
return -1;
}
return i;
}
// makeScanWidgetVisible
// =====================
ScanWidget* ScanStack::makeScanWidgetVisible( const ushort index )
{ ScanWidget* current = scanWidget( index );
if( current == NULL )
Q_ASSERT( false );
else
{ current->ignoreTabChanges( true );
raiseWidget( current );
current->ignoreTabChanges( false );
}
return current;
}
// moveScanWidget
// ==============
ScanWidget* ScanStack::moveScanWidget( const ushort fromIndex )
{ short toIndex = indexOfVisibleScanWidget( );
if( toIndex < 0 )
return NULL;
ScanWidget* scanWidget = m_scanWidgetDict->take( TQString::number( fromIndex ));
if( fromIndex < toIndex )
for( ushort index = fromIndex + 1; index <= toIndex; index++ )
{ ScanWidget* scanWidget = m_scanWidgetDict->take( TQString::number( index ));
m_scanWidgetDict->insert( TQString::number( index - 1 ), scanWidget );
}
else
for( short index = fromIndex - 1; index >= toIndex; index-- )
{ ScanWidget* scanWidget = m_scanWidgetDict->take( TQString::number( index ));
m_scanWidgetDict->insert( TQString::number( index + 1 ), scanWidget );
}
m_scanWidgetDict->insert( TQString::number( toIndex ), scanWidget );
return scanWidget;
}
// removeScanWidget
// ================
void ScanStack::removeScanWidget( ScanWidget* scanWidgetToRemove )
{ ushort n = m_scanWidgetDict->count( );
if( n == 1 )
return;
short index = findScanWidget( scanWidgetToRemove );
if( index < 0 )
{ Q_ASSERT( false );
return;
}
m_scanWidgetDict->remove( TQString::number( index ));
for( ushort i = index + 1; i < n; i++ )
{ ScanWidget* scanWidget = m_scanWidgetDict->take( TQString::number( i ));
m_scanWidgetDict->insert( TQString::number( i - 1 ), scanWidget );
}
if( index >=short( m_scanWidgetDict->count( )))
index = m_scanWidgetDict->count( ) - 1;
ScanWidget* newVisibleWidget = scanWidget( index );
newVisibleWidget->ignoreTabChanges( true );
raiseWidget( newVisibleWidget );
newVisibleWidget->ignoreTabChanges( false );
}
// visibleWidget
// =============
ScanWidget* ScanStack::visibleWidget( )
{ return (ScanWidget*) TQWidgetStack::visibleWidget( );
}
// wrapText
// ========
void ScanStack::wrapText( const bool wrap )
{ ushort i;
for( resetScanWidgets( i ); moreScanWidgets( i ); nextScanWidget( i ))
currentScanWidget( i )->wrapText( wrap );
}
#include "scanstack.moc"