27 #define YUILogComponent "ncurses"
28 #include <yui/YUILog.h>
30 #include "NCPopupMenu.h"
32 #include <yui/YMenuButton.h>
33 #include <yui/YTypes.h>
59 NCTable::NCTable( YWidget * parent,
60 YTableHeader * tableHeader,
62 : YTable( parent, tableHeader, multiSelection )
65 , _nestedItems( false )
67 , _multiSelect( multiSelection )
69 , _sortReverse( false )
93 vector<NCstring> headers;
94 headers.resize( _prefixCols + columns() );
96 for (
int i = 0; i < columns(); i++ )
98 int col = i + _prefixCols;
100 if ( hasColumn( i ) )
105 headers[ col ] = hdr;
109 hasHeadline = myPad()->SetHeadline( headers );
115 switch ( alignment( col ) )
117 case YAlignUnchanged:
return "L";
118 case YAlignBegin:
return "L";
119 case YAlignCenter:
return "C";
120 case YAlignEnd:
return "R";
131 NCTableLine * currentLine = myPad()->ModifyLine( index );
135 yuiWarning() <<
"No such line: " <<
wpos( index, col ) << newtext << endl;
143 yuiWarning() <<
"No such col: " <<
wpos( index, col ) << newtext << endl;
148 currentCol->SetLabel(
NCstring( newtext ) );
157 YUI_CHECK_PTR( changedCell );
159 YTableItem * ytableItem = changedCell->parent();
160 YUI_CHECK_PTR( ytableItem );
163 YUI_CHECK_PTR( tableLine );
169 tableCol->SetLabel( changedCell->label() );
174 yuiError() <<
"No column #" << changedCell->column()
175 <<
" in item " << ytableItem
183 YTableHeader * tableHeader =
new YTableHeader();
185 for (
unsigned i = 0; i < headers.size(); i++ )
187 tableHeader->addColumn( headers[ i ] );
190 YTable::setTableHeader( tableHeader );
198 vector<string> headers;
199 headers.resize( columns() );
201 for (
int col = 0; col < columns(); col++ )
203 headers[ col ] = header( col );
212 myPad()->ClearTable();
213 YTable::addItems( itemCollection );
221 sortItems( _lastSortCol, _sortReverse );
233 NCTableLine::STATE state )
235 if ( ! yitem->parent() )
236 YTable::addItem( yitem );
247 NCTableLine::STATE state )
249 if ( ! yitem->parent() )
250 YTable::addItem( yitem );
262 NCTableLine::STATE state )
264 YTableItem *item =
dynamic_cast<YTableItem *
>( yitem );
265 YUI_CHECK_PTR( item );
274 if ( parentLine || item->hasChildren() )
277 vector<NCTableCol*> cells;
282 cells.push_back(
new NCTableTag( yitem, yitem->selected() ) );
286 for ( YTableCellIterator it = item->cellsBegin(); it != item->cellsEnd(); ++it )
289 int index = myPad()->Lines();
290 item->setIndex( index );
302 YUI_CHECK_NEW( line );
303 myPad()->Append( line );
305 if ( item->selected() )
306 setCurrentItem( item->index() ) ;
310 for ( YItemIterator it = item->childrenBegin(); it != item->childrenEnd(); ++it )
312 addPadLine( line, *it, preventRedraw, state );
315 if ( ! preventRedraw )
322 myPad()->ClearTable();
323 _nestedItems = hasNestedItems( itemsBegin(), itemsEnd() );
325 for ( YItemConstIterator it = itemsBegin(); it != itemsEnd(); ++it )
336 return hasNestedItems( itemCollection.begin(), itemCollection.end() );
341 YItemConstIterator end )
const
343 for ( YItemConstIterator it = begin; it != end; ++it )
345 if ( (*it)->hasChildren() )
355 myPad()->ClearTable();
356 YTable::deleteAllItems();
359 _nestedItems =
false;
361 _sortReverse =
false;
367 if ( myPad()->empty() )
376 return keepSorting() ? getCurrentIndex() : myPad()->CurPos().L;
382 const NCTableLine * currentLine = myPad()->GetCurrentLine();
393 const NCTableLine * currentLine = myPad()->GetCurrentLine();
395 return currentLine ? currentLine->
index() : -1;
401 if ( myPad()->empty() )
402 myPad()->ScrlLine( 0 );
408 myPad()->ScrlLine( index );
417 YTableItem *item =
dynamic_cast<YTableItem *
>( yitem );
418 YUI_CHECK_PTR( item );
421 YUI_CHECK_PTR( line );
423 const NCTableLine *current_line = myPad()->GetLine( myPad()->CurPos().L );
424 YUI_CHECK_PTR( current_line );
428 if ( !selected && ( line == current_line ) )
435 setCurrentItem( line->
index() );
436 YTable::selectItem( item, selected );
441 YTable::selectItem( item, selected );
449 tagCell->SetSelected( selected );
465 const NCTableLine * currentLine = myPad()->GetCurrentLine();
468 YTable::selectItem( currentLine->
origItem(),
true );
476 setCurrentItem( -1 );
477 YTable::deselectAllItems();
481 YItemCollection itemCollection = YTable::selectedItems();
484 for ( YItemConstIterator it = itemCollection.begin();
485 it != itemCollection.end();
492 selectItem( *it,
false );
502 wsze sze = _bigList ? myPad()->tableSize() + 2 : wGetDefsze();
509 wsze sze = _bigList ? myPad()->tableSize() + 2 : wGetDefsze();
516 wRelocate(
wpos( 0 ),
wsze( newheight, newwidth ) );
523 NCPadWidget::setLabel(
NCstring( nlabel ) );
530 YTable::setEnabled( do_bv );
536 return myPad()->setItemByKey( key );
542 wsze psze( defPadSze() );
544 npad->
bkgd( listStyle().item.plain );
559 bool sendEvent =
false;
560 int currentIndex = getCurrentItem();
573 bool handled = handleInput( key );
580 if ( ! keepSorting() )
583 return NCursesEvent::none;
602 if ( notify() && sendEvent )
603 return NCursesEvent::ValueChanged;
611 if ( notify() && currentIndex != -1 )
612 return NCursesEvent::Activated;
617 if ( currentIndex != getCurrentItem() )
619 if ( notify() && immediateMode() )
620 ret = NCursesEvent::SelectionChanged;
632 YTableItem * item =
dynamic_cast<YTableItem *
>( getCurrentItemPointer() );
635 selectItem( item, !( item->selected() ) );
645 YItemCollection menuItems;
646 menuItems.reserve( columns() );
648 for (
int col = 0; col < columns(); col++ )
650 string hdr = header( col );
654 YMenuItem *item =
new YMenuItem( header( col ) ) ;
658 item->setIndex( col );
659 menuItems.push_back( item );
663 if ( ! menuItems.empty() )
670 wpos pos( ScreenPos() +
wpos( 2, 1 ) );
673 int sortCol = dialog->post();
676 YDialog::deleteTopmostDialog();
678 if ( sortCol != -1 && hasColumn( sortCol ) )
684 yuiDebug() <<
"Manually sorting by column #"
685 << sortCol <<
": " << header( sortCol )
688 _sortReverse = sortCol == _lastSortCol ?
689 ! _sortReverse :
false;
691 sortItems( sortCol, _sortReverse );
704 myPad()->ClearTable();
723 _sortStrategy->setSortCol( sortCol );
724 _sortStrategy->setReverse( reverse );
725 _lastSortCol = sortCol;
727 sortYItems( itemsBegin(), itemsEnd() );
739 for ( YItemIterator it = begin; it != end; ++it )
741 if ( (*it)->hasChildren() )
742 sortYItems( (*it)->childrenBegin(), (*it)->childrenEnd() );
746 _sortStrategy->sort( begin, end );
753 delete _sortStrategy;
755 _sortStrategy = newStrategy;