27 #define YUILogComponent "ncurses"
28 #include <yui/YUILog.h>
30 #include <yui/ncurses/YNCursesUI.h>
32 #include <yui/YMenuItem.h>
33 #include <yui/YSelectionWidget.h>
34 #include <yui/mga/YMGAMenuItem.h>
47 mutable chtype * prefix;
60 YMenuSeparator *separator =
dynamic_cast<YMenuSeparator *
>(yitem);
64 SetState( S_DISABELED );
68 YMGAMenuItem *mi =
dynamic_cast<YMGAMenuItem*
> (yitem);
73 yuiDebug() << mi->label() <<
" hidden" << std::endl;
76 else if ( !mi->enabled() )
78 yuiDebug() << mi->label() <<
" disabled" << std::endl;
79 SetState( S_DISABELED );
87 if ( yitem->hasChildren() )
88 { yuiDebug() << mi->label() <<
" has submenu" << std::endl;
89 Append(
new NCTableCol( NCstring( yitem->label() +
" ..." ) ) );
93 Append(
new NCTableCol( NCstring( yitem->label() ) ) );
105 YMenuItem * YItem()
const {
111 virtual void DrawAt( NCursesWindow & w,
const wrect at,
112 NCTableStyle & tableStyle,
115 YMenuSeparator *separator =
dynamic_cast<YMenuSeparator *
>(yitem);
118 w.move( at.Pos.L, at.Pos.C );
119 w.hline(ACS_HLINE, 0);
123 NClabel l(NCstring(yitem->label()));
125 yuiDebug() << yitem->label() <<
" hotcol: "<< l.hotpos() <<
" hotkey: " << l.hotkey() << std::endl;
128 w.bkgdset( tableStyle.hotBG( vstate, NCTableCol::PLAIN ) );
130 yuiDebug() <<
"tableStyle hotcol: " << tableStyle.listStyle().title <<
" bg: " << tableStyle.hotBG(vstate, tableStyle.HotCol()) << std::endl;
133 NCTableLine::DrawAt( w, at, tableStyle, active );
137 w.move(at.Pos.L, l.hotpos());
138 w.addch(l.hotkey() | A_UNDERLINE);
150 NCMenu::NCMenu( YWidget * parent )
151 : YTree( parent,
"", FALSE, FALSE )
152 , NCPadWidget( parent )
154 yuiDebug() << std::endl;
163 yuiDebug() << std::endl;
170 inline const NCMenuLine * NCMenu::getTreeLine(
unsigned idx )
const
173 return dynamic_cast<const NCMenuLine *
>( myPad()->GetLine( idx ) );
182 inline NCMenuLine * NCMenu::modifyTreeLine(
unsigned idx )
186 return dynamic_cast<NCMenuLine *
>( myPad()->ModifyLine( idx ) );
193 int NCMenu::preferredWidth()
196 wsze sze = wsze::max( defsze, wsze( 0, labelWidth() + 2 ) );
201 int NCMenu::preferredHeight()
204 wsze sze = wsze::max( defsze, wsze( 0, labelWidth() + 2 ) );
208 void NCMenu::setSize(
int newwidth,
int newheight )
210 wRelocate( wpos( 0 ), wsze( newheight, newwidth ) );
215 void NCMenu::setEnabled(
bool do_bv )
217 NCWidget::setEnabled( do_bv );
218 YWidget::setEnabled( do_bv );
222 YMenuItem * NCMenu::getCurrentItem()
const
224 YMenuItem * yitem = 0;
226 if ( myPad() && myPad()->GetCurrentLine() )
230 if ( cline && cline->isEnabeled())
231 yitem = cline->YItem();
234 yuiDebug() <<
"-> " << ( yitem ? yitem->label().c_str() :
"noitem" ) << std::endl;
239 void NCMenu::deselectAllItems()
241 YTree::deselectAllItems();
246 void NCMenu::selectItem( YItem *item,
bool selected )
251 YMenuItem * treeItem =
dynamic_cast<YMenuItem *
>( item );
252 YUI_CHECK_PTR( treeItem );
253 YMenuItem *citem = getCurrentItem();
256 int at = treeItem->index();
262 if ( treeItem == citem )
264 YTree::deselectAllItems();
268 YTree::selectItem ( treeItem,
false );
273 YTree::selectItem( treeItem, selected );
277 myPad()->ShowItem( getTreeLine( at ) );
286 void NCMenu::selectItem(
int index )
288 YItem * item = YTree::itemAt( index );
292 selectItem( item,
true );
295 YUI_THROW( YUIException(
"Can't find selected item" ) );
301 void NCMenu::rebuildTree()
311 NCPad * NCMenu::CreatePad()
313 wsze psze( defPadSze() );
314 NCPad * npad =
new NCTreePad( psze.H, psze.W, *
this );
315 npad->bkgd( listStyle().item.hint );
319 bool NCMenu::HasHotkey(
int key)
321 yuiDebug() << key << std::endl;
323 if ( key < 0 || UCHAR_MAX < key )
326 for (YItemIterator it=itemsBegin(); it!=itemsEnd(); it++)
328 NClabel label = NCstring((*it)->label());
330 yuiDebug() << label << std::endl;
331 if (label.hasHotkey() && (tolower( key ) == tolower(label.hotkey())))
338 NCursesEvent NCMenu::wHandleHotkey( wint_t key )
340 yuiDebug() <<
"Key: " << key << std::endl;
341 if ( key >= 0 && key < UCHAR_MAX )
343 int hkey = tolower( key );
344 for ( YItemIterator it = itemsBegin(); it < itemsEnd(); ++it )
346 YMGAMenuItem *mi =
dynamic_cast<YMGAMenuItem*
> (*it);
350 NClabel l (NCstring( mi->label() ));
352 yuiDebug() << mi->label() <<
" " << l <<
" hotpos: " << l.hotpos() <<
" hkey: " << l.hotkey() << std::endl;
353 if (tolower(l.hotkey()) == hkey)
355 selectItem(mi->index());
356 return wHandleInput( KEY_RETURN );
361 yuiDebug() << mi->label() <<
" disabled" << std::endl;
365 return NCursesEvent::none;
372 void NCMenu::CreateTreeLine( NCTreePad * pad, YItem * item )
376 item->setIndex( idx++ );
378 YMenuItem * treeItem =
dynamic_cast<YMenuItem *
>( item );
379 YUI_CHECK_PTR( treeItem );
382 int h = defsze.H > 8 ? 10 : defsze.H + 1;
384 int w = int(item->label().length()) <= defsze.W ? defsze.W : (item->label().length() > 39 ? 40 : item->label().length());
385 defsze = wsze( h, w );
390 if (item->selected())
393 int at = treeItem->index();
397 pad->ShowItem( getTreeLine( at ) );
404 YMenuItem * NCMenu::currentItem()
406 return getCurrentItem();
410 void NCMenu::DrawPad()
414 yuiWarning() <<
"PadWidget not yet created" << std::endl;
420 for ( YItemIterator it = itemsBegin(); it < itemsEnd(); ++it )
422 CreateTreeLine( myPad(), *it );
426 NCPadWidget::DrawPad();
431 NCursesEvent NCMenu::wHandleInput( wint_t key )
433 NCursesEvent ret = NCursesEvent::none;
434 YMenuItem * oldCurrentItem = getCurrentItem();
436 bool handled = handleInput( key );
437 const YItem * currentItem = getCurrentItem();
441 YMGAMenuItem *mi =
dynamic_cast<YMGAMenuItem*
>( getCurrentItem() );
456 return NCursesEvent::Activated;
460 ret = NCursesEvent::button;
466 YTree::selectItem(
const_cast<YItem *
>( currentItem ),
true );
468 if ( notify() && immediateMode() && ( oldCurrentItem != currentItem ) )
469 ret = NCursesEvent::SelectionChanged;
472 yuiDebug() <<
"Notify: " << ( notify() ?
"true" :
"false" ) <<
473 " Return event: " << ret.reason << std::endl;
483 void NCMenu::deleteAllItems()
485 YTree::deleteAllItems();
486 myPad()->ClearTable();